Skip to main content

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 generic request() escape hatch — same auth, same automatic 429/5xx retry with backoff, same { data, meta } envelope as a raw curl call.
The Python, Go, Ruby, and PHP clients address paths relative to /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 returns 200, that channel reports unavailable, and it is dropped from the score — the remaining channels still report normally:
Two things to read off the summary in a degraded call:
  • applicable drops from 6 to 5 — unavailable channels are excluded from scoring, so trustScore recomputes against the channels that did answer (3 verified of 5 applicable → 60). A subsystem outage never drags the score down.
  • overallState still reflects the channels that answered. If every source read failed, applicable is 0 and overallState is unavailable with trustScore: 0 — distinguish that case from “nothing verified yet” by checking applicable, not the score.
Retry the call on 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