Kenso

Email copy lints

The Email copy lints endpoints of the Kenso API.

AI1 endpointKen-Version: 2026-11-02AuthenticationWorkspacesErrors

Send the step's subject, its body (plain text or the editor's HTML), its stepOrder (1, the default, is the first email; 2 and up are follow-ups), variables (the AI variable names that have a personalization prompt), customVariableKeys (the campaign's registered custom variable keys) and isFinanceVertical (true for a finance, insurance, real-estate or lending client, whose domain words then do not count toward the MEDIUM budget). Returns every rule in a fixed order, each pass, fail (severity reject or flag) or skipped, with the text it matched; passed is false when any rule failed at reject. The same input always returns the same result. No model runs, so it does not judge whether a claim is true, an offer is clear or a CTA asks for the real offer: that is the review's reading (and the email-copy-grades grade). Rules: subject 1-60 characters; body 40-180 words; static words 50-80 on email 1 and 30-60 on a follow-up (over is reject, under is flag); no em dash; at most one link, https, no shortener, no web address as link text; no [square bracket], TODO or TBD placeholder; every {lead variable} accepted by the sequence save (custom keys only when listed in customVariableKeys), no {a|b} spintax and no {sender_signature}; lead variables that often render blank (flag); every {{AI variable}} named in variables (skipped when variables is omitted); on email 1 a static opener that names a number, name or place (flag), has no first person, praise or hedging, and runs 8-20 words (flag), and a next sentence that does not jump to a generic statement (flag); spam tiers: a NEVER word or fake Re:/Fwd: rejects, one HIGH word flags and two reject, three MEDIUM words reject, any tiered word, $, % or two numbers in the subject rejects, and an ALL CAPS word, more than one !, or !!! / ??? rejects. Requires campaigns view. A blank body, a body over 20,000 characters, a subject over 1,000, a stepOrder outside 1-30, or more than 100 variables or customVariableKeys is 400.

Parameters

Name
In
Type
Required
Description
Ken-Version
In: header
string, one of: 2026-11-02, 1.1
required
The API version: a dated version (YYYY-MM-DD), or 1.1, another name for the first dated version. Without it the request uses your API key's pinned version; an unpinned key reaches the legacy shape of the same path. 1.0 selects the legacy shape explicitly.
X-Ken-Workspace-Id
In: header
integer (int64)
optional
Workspace to act in. Required when your credential can reach more than one workspace (otherwise 400 workspace_required).

Request body

application/json, optional.

Field
Type
Required
Description
subject
string
optional
The step's subject line. Empty fails subject_length.
body
string
optional
The step's body, plain text or the editor's HTML. Required, at most 20,000 characters.
stepOrder
integer (int32)
optional
The step's position: 1 (the default) is the first email, 2 and up are follow-ups.
variables
array of string
optional
Each AI variable name that has a personalization prompt (First Line). Omit it to skip the AI variable coverage rule.
customVariableKeys
array of string
optional
The campaign's registered custom variable keys (industry_note). A {key} merge field passes only when its key is listed, matched as the sequence save matches it.
isFinanceVertical
boolean
optional
True when the client is in finance, insurance, real estate or lending: insurance, mortgage, loans, investment and rates then do not count toward the body's MEDIUM spam budget. Defaults to false.

Response 200

data is a EmailCopyLintModel.

Field
Type
Description
passed
boolean
True when no rule failed at reject severity.
rejectCount
integer (int32)
flagCount
integer (int32)
wordCount
integer (int32)
Words in the whole body, greeting through signature and PS.
staticWordCount
integer (int32)
Words of prose and CTA, without the greeting, AI variable lines, signature or PS.
linkCount
integer (int32)
firstLine
string
The static opener the first-line rules read. Absent on a follow-up or when the opener is an AI variable.
rules
array of EmailCopyLintRuleModel
Every rule, always in the same order.
Request
curl -X POST "https://api.ken.so/v1/email-copy-lints" \
  -H "Authorization: Bearer $KEN_API_KEY" \
  -H "Ken-Version: 2026-11-02" \
  -H "X-Ken-Workspace-Id: $KEN_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{
  "subject": "string",
  "body": "string",
  "stepOrder": 1,
  "variables": [
    "string"
  ],
  "customVariableKeys": [
    "string"
  ],
  "isFinanceVertical": true
}'
Response 200
{
  "success": true,
  "data": {
    "passed": true,
    "rejectCount": 1,
    "flagCount": 1,
    "wordCount": 1,
    "staticWordCount": 1,
    "linkCount": 1,
    "firstLine": "string",
    "rules": [
      {
        "rule": "string",
        "status": "string",
        "severity": "string",
        "message": "string",
        "matches": [
          "string"
        ]
      }
    ]
  }
}