{
  "id": "BRD-194",
  "slug": "brd-194",
  "title": "Subscribe to brand status events instead of polling",
  "statement": "Brand status changes should be received as events on a webhook rather than discovered by polling.",
  "rationale": "Brand verification is asynchronous and can take days, and the event carries the granular failure reason that the status field alone does not — so a poller sees a state change with no explanation and has to guess at the cause. It also determines how quickly the campaign goes in behind it: an event-driven flow submits the moment the brand is ready, and a nightly poll can waste most of a day.",
  "layer": "BRAND",
  "layerSlug": "brand",
  "object": "the webhook configuration",
  "severity": "HIGH",
  "detectability": [
    "DETERMINISTIC"
  ],
  "failureClass": "TERMINAL_EXTERNAL",
  "authorities": [
    "TCR",
    "Twilio",
    "Telnyx"
  ],
  "applicabilityText": "Applies to every 10DLC registration.",
  "universal": true,
  "remediation": "Subscribe to the brand identity status event and read the failure reason from its payload. Wait for the event before making the next call rather than polling on a timer. Done when a brand state change arrives as a webhook carrying the reason.",
  "notes": "Absorbs BRD-193, which names the webhook carrying the granular failure reason, and OPS-347, which adds waiting for the event before the next call. The webhook belongs to the integration rather than to a registration, so where it is not reported this is undecided rather than passing — the product should ask rather than assume.",
  "catalogIds": [
    "BRD-193",
    "OPS-347"
  ],
  "phase": "approval",
  "automated": true,
  "attestation": {
    "question": "Are brand status changes arriving on a webhook that carries the failure reason, rather than being discovered by polling?",
    "howToCheck": [
      "Subscribe to the brand identity status event and read the granular failure reason from its payload — the status field alone does not carry it.",
      "Wait for the event before making the next call rather than polling on a timer."
    ],
    "failureLooksLike": "A poller sees a state change with no explanation and guesses at the cause, and a nightly poll wastes most of a day before the campaign goes in behind it."
  },
  "url": "https://ekas.io/rules/10dlc/brand/brd-194/",
  "markdown": "https://ekas.io/rules/10dlc/brand/brd-194.md",
  "registry": "https://ekas.io/rules/10dlc/",
  "updated": "2026-07-25",
  "licence": "CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/"
}
