{
  "id": "CMP-LINK-DECL",
  "slug": "cmp-link-decl",
  "title": "embeddedLink must match whether samples actually contain links",
  "statement": "The embeddedLink attribute must be true when any sample contains a URL, and a sample must contain a URL when it is declared true.",
  "rationale": "The embedded-link attribute drives carrier filtering, so a mismatch between the declaration and the samples misroutes the campaign's traffic. It fails in both directions: undeclared links look like evasion, and a declared-but-absent link means the campaign was registered for treatment it does not need.",
  "layer": "CAMPAIGN",
  "layerSlug": "campaign",
  "object": "campaign.embedded_link + campaign.sample[]",
  "severity": "BLOCKING",
  "detectability": [
    "DETERMINISTIC"
  ],
  "failureClass": "RETRY_FIELD",
  "authorities": [
    "TCR",
    "Twilio",
    "AWS",
    "Bandwidth"
  ],
  "applicabilityText": "Applies to every 10DLC registration.",
  "universal": true,
  "remediation": "Set the \"messages contain links\" flag to match your sample messages, in both directions.",
  "example": "Samples contain https://acmecoffee.com/sale → set \"messages contain links\" to true.",
  "notes": "Bidirectional. The current contentFlags scanner only checks one direction, and does so with a stateful /g regex.",
  "catalogIds": [
    "MSG-118"
  ],
  "phase": "approval",
  "automated": true,
  "url": "https://ekas.io/rules/10dlc/campaign/cmp-link-decl/",
  "markdown": "https://ekas.io/rules/10dlc/campaign/cmp-link-decl.md",
  "registry": "https://ekas.io/rules/10dlc/",
  "updated": "2026-07-25",
  "licence": "CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/"
}
