Brand Identity API
Registering a brand’s trust posture is normally scattered across six unrelated flows — a 10DLC brand + campaign, a toll-free verification, a WhatsApp Business verification, an RCS agent verification, branded calling (RCD/CNAM), and per-number regulatory KYC. Brand Identity doesn’t replace any of those registration flows; it reads the current status of each one and rolls them into a single trust score plus a prioritized list of what to do next, so a tenant can see “how verified am I, everywhere” at a glance instead of checking six settings pages. Base path:/api/v1/brand-identity
Authentication: API key (X-API-Key) or session JWT. Any authenticated role (owner, admin, developer, viewer) can read the status.
Channels covered
Each channel is scored independently, then combined into the overall posture:
Each channel reports one of five states:
not_started, in_progress, verified, action_required, or unavailable (the underlying subsystem couldn’t be reached this call — it degrades that one channel rather than failing the whole response).
Read the status
No typed SDK helper wraps this endpoint yet, so each language uses the SDK’s genericrequest() escape hatch — same auth, same automatic 429/5xx retry with backoff, same { data, meta } envelope as a raw curl call.
/api/v1 — drop the /api/v1 prefix there; curl and the Node client take the full path.
trustScore is verified / applicable (rounded to an integer 0–100); a channel in unavailable doesn’t count against the score. nextActions is sorted so the highest-priority gaps (urgent before todo) appear first — this is what the dashboard’s brand-trust widget renders directly.
Degraded response — one subsystem down
Every per-channel read is fail-soft: when a source subsystem can’t be reached (here the RCS business-messaging service is down), the response still returns200, that channel reports unavailable, and it is dropped from the score — the remaining channels still report normally:
applicabledrops from 6 to 5 —unavailablechannels are excluded from scoring, sotrustScorerecomputes against the channels that did answer (3 verified of 5 applicable →60). A subsystem outage never drags the score down.overallStatestill reflects the channels that answered. If every source read failed,applicableis0andoverallStateisunavailablewithtrustScore: 0— distinguish that case from “nothing verified yet” by checkingapplicable, not the score.
unavailable — the state is transient and self-clears once the underlying subsystem answers again. Poll with ordinary backoff; do not treat it as proof a registration was lost.
Errors
All errors ship the same envelope:
The SDK escape hatches handle the common call/retry shape themselves: a
429 is retried automatically up to the SDK’s retry budget, then surfaced as a rate-limit error (OrbitRateLimitError in Node, Python, Ruby, and PHP, orbit.IsRateLimit(err) in Go). A raw-curl caller must honor the Retry-After header on its own. A single degraded channel is never an error — it arrives as a 200 with state: "unavailable" (above).
See also
- Brand identity & trust score concept — what the score means and how to run it in ops
- Node SDK — the client behind the
request()calls above; Python, Go, Ruby, and PHP ship the same escape hatch - 10DLC registration guide — register the 10DLC brand this endpoint reads status from
- WhatsApp Business setup
- Numbers → regulatory preview
- Compliance → sender-ID registration