Skip to main content

Troubleshooting: alphanumeric sender ID rejected before send

Orbit evaluates one alphanumeric-sender gate before the message is accepted for delivery. Send with a branded from (for example "MyBrand") that the account cannot prove, and POST /api/v1/messages/sms rejects the request synchronously — the message is never queued and never handed to the carrier. Three error codes come out of that gate: two permanent (fix the sender), one transient (retry). In the dashboard’s compose-SMS dialog the same gate runs client-side: the send button warns and refuses the submission instead of surfacing the error after the fact, with a shortcut to sender registration.

Match the code to its meaning

The first two are always HTTP 422 on the SMS send surface. They are permanent gates: sending the same request again returns the same code and burns your rate-limit budget without changing the outcome. Senders that skip this gate entirely — phone numbers (E.164, MSISDN, or a short code, whose ownership is proven separately), the fixed platform default "Devotel", and the shared platform sender pool — never raise these three codes. The gate applies when you type a custom alphanumeric brand into from.

Reproduce the rejection

Send an SMS with an alphanumeric from that is not in the account’s approved sender-ID list:
An unregistered sender comes back with HTTP 422 and this body:
A sender that is registered but still under review returns SENDER_ID_NOT_APPROVED with "status": "pending" (or "rejected" / "expired") inside error.details. When the approval check cannot be performed at all, the gate fails closed and returns HTTP 503 with SENDER_ID_CHECK_UNAVAILABLE:

Fix per code

Register the sender ID

SENDER_ID_NOT_REGISTERED means the value you sent has never been submitted for the account. Registration is tenant-owned and self-service:
  1. Upload the compliance documents the destination country requires (the per-country document list is in Country Compliance Requirements).
  2. Submit the sender ID for the destination countries via POST /compliance/sender-id-registrations, or from Settings → Sender IDs in the dashboard.
  3. Send again once the destination country entry reaches approved.
Registration is an idempotent upsert: re-submitting keeps countries already at approved and returns rejected / expired entries to pending for a fresh review. The full pending → approved / rejected / expired lifecycle is documented on Sender-ID Registration. If you do not need the brand on this send, switch from to an owned phone number or drop it and let the platform default apply — both paths skip the alphanumeric gate.

Wait for approval

SENDER_ID_NOT_APPROVED means a row exists but has not cleared review. The error.details.status field names the current state:
  • pending — awaiting review. Do not retry the send. Poll the entry with GET /compliance/sender-id-registrations (or watch Settings → Sender IDs in the dashboard) and retry the send only after it flips to approved.
  • rejected — the reviewer left a reason on the entry. Fix what it names, re-submit (the upsert returns it to pending), and wait.
  • expired — the approval lapsed. Re-submit for a fresh review.
Retrying the send while the status is pending never clears the gate — the send and the registration review are independent, so a retry loop only re-trips the 422.

Retry the check

SENDER_ID_CHECK_UNAVAILABLE (503) is the transient member of the family: the gate could not read the approval state and closed rather than guess. It is safe to retry:
  1. Retry the same request after a short backoff (seconds, not milliseconds — the check depends on normal service health to recover).
  2. Use exponential backoff with a retry budget, like the pattern in Troubleshooting: cooldown and rate-limit 429s (branch on res.status === 503 instead of 429).
  3. If 503s persist for more than a few minutes, check the status page before treating it as a sender problem. A persistent 503 on every sender points at platform health, not at your registration.

Distinguish from the country-specific codes

Brazil, Singapore, Saudi Arabia, and the UAE block unregistered alphanumeric senders with their own codes — MESSAGING_BR_SENDER_NOT_REGISTERED, MESSAGING_SG_SENDER_NOT_REGISTERED, MESSAGING_SA_SENDER_NOT_REGISTERED, and MESSAGING_AE_SENDER_NOT_REGISTERED — which fire when the destination country enforces registration even though a status on the account looks coherent. Those, plus the India DLT regime and the strict-mode SENDER_INVALID_FOR_DESTINATION 422s, are covered on Troubleshoot a pending number or Sender ID. The three codes on this page are the generic gate: they fire on any destination, before any country rule runs.

Escalation

Escalate to support when you have done the fix above and it cannot land — a registration stuck at pending well past the country’s normal lead time, a rejected reason you cannot resolve with the documents you hold, or 503s that outlast a status-page window. Include:
  1. The sender ID value (exactly as sent in from) and the destination country.
  2. The sender-ID registration state — copy the entry’s current status from Settings → Sender IDs or GET /compliance/sender-id-registrations.
  3. The message ID or request ID from a rejected send (error code and meta.request_id), and the timestamp with timezone.
A reviewer can pull the registration packet and the send attempt directly from those three.