{
  "id": "CMP-DESC-LEN",
  "slug": "cmp-desc-len",
  "title": "Campaign description must be 40–4096 characters",
  "statement": "The campaign description must be at least 40 and at most 4096 characters.",
  "rationale": "The published bound is 40 to 4096 characters, and anything near the floor cannot contain the audience, content and opt-in source a reviewer needs. Enforcing the real bound rather than a guessed heuristic also prevents the opposite failure, where a long, thorough description is silently truncated on submission.",
  "layer": "CAMPAIGN",
  "layerSlug": "campaign",
  "object": "campaign.description",
  "severity": "BLOCKING",
  "detectability": [
    "DETERMINISTIC"
  ],
  "failureClass": "RETRY_FIELD",
  "authorities": [
    "Twilio",
    "TCR"
  ],
  "codes": [
    {
      "provider": "Twilio",
      "code": "30886",
      "remediable": true,
      "generation": "gen1"
    }
  ],
  "applicabilityText": "Applies to every 10DLC registration.",
  "universal": true,
  "remediation": "Expand the description to explain who receives the messages, what they contain, and how recipients opted in. Aim well above the 40-character floor.",
  "example": "Acme Coffee sends weekly promotional offers, new product announcements, and loyalty rewards updates to customers who opted in via the checkout consent checkbox at acmecoffee.com.",
  "notes": "The current contentFlags scanner uses a 40/100 heuristic with no upper bound — this replaces the guess with the published bound.",
  "catalogIds": [
    "CMP-001"
  ],
  "phase": "approval",
  "automated": true,
  "url": "https://ekas.io/rules/10dlc/campaign/cmp-desc-len/",
  "markdown": "https://ekas.io/rules/10dlc/campaign/cmp-desc-len.md",
  "registry": "https://ekas.io/rules/10dlc/",
  "updated": "2026-07-25",
  "licence": "CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/"
}
