Email copy lints
The Email copy lints endpoints of the Kenso API.
Lint sequencer email copy against the email-review rules
/v1/email-copy-lintsemail-copy-lints.lintSend 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
400 workspace_required).Request body
application/json, optional.
subject_length.First Line). Omit it to skip the AI variable coverage rule.industry_note). A {key} merge field passes only when its key is listed, matched as the sequence save matches it.Response 200
data is a EmailCopyLintModel.
reject severity.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
}'{
"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"
]
}
]
}
}