Outbound caller IDs
A caller ID is the number presented to the person you call. Outbound presentation works two ways on Orbit:- Orbit-hosted numbers — numbers you purchased or ported into Orbit. An active org-hosted number attests at level A on US outbound traffic and always presents without verification steps.
- Verified caller IDs (register-and-confirm) — a personal or partner phone number you control outside Orbit. You register it here and prove control with a one-time code so Orbit can present it as your caller ID.
/api/v1/voice/caller-ids
Authentication: Clerk session (Authorization: Bearer <token>) or API key (X-API-Key). Reads accept any voice scope; register, confirm, resend, and revoke require voice:write.
1. Register a caller ID
POST /api/v1/voice/caller-ids/verify registers the number and sends a
one-time code to its handset — by voice call (TTS readback) or SMS. You choose
the channel.
cURL
phone_number— the E.164 number to verify (8–20 characters, digits with optional leading+).friendly_name— optional operator label (≤120 characters) shown in the dashboard table. It is a label for you, not a CNAM string — it never displays on the recipient handset.channel—voiceorsms. Only the two PSTN-backed channels are accepted; a verified caller ID proves control of the number, so an off-network channel such as WhatsApp or email is rejected with422.
verified number for a different friendly name returns
409; revoke the existing row first. A previously-revoked row for the same
number is re-claimed by the new registration instead of creating a duplicate.
The one-time code is dispatched through Orbit’s outbound voice/SMS path —
the same Orbit-hosted carrier path every other outbound call uses. Nothing
in the verification flow touches a third-party carrier account you would
need to configure.
2. Confirm the code
POST /api/v1/voice/caller-ids/confirm submits the code the handset
received. A correct code moves the row to verified and opens the number for
outbound presentation.
cURL
422 and decrements the challenge’s attempt budget —
enough wrong attempts or an elapsed expires_at flips the row to expired,
at which point only a resend or fresh registration moves it forward. A
verified row ignores further codes (409).
3. Verification statuses
Every row moves through one lifecycle you can watch in the dashboard (Voice → Caller IDs) or read overGET /api/v1/voice/caller-ids:
Read the list with:
cURL
challenge_channel, last_challenge_at, and
challenge_attempts alongside the status, so a stuck registration shows
whether the code went out and how many wrong attempts burned the budget.
verification_id is projected on pending/verifying rows only — that is
what lets the dashboard deep-link the confirm step without a fresh dispatch.
4. Resend and revoke
Re-deliver the one-time code for apending/verifying row when the handset
did not receive it:
cURL
429 with details.window_seconds you can render as a
cooldown. Resend on a verified or revoked row returns 409 — the
challenge is settled.
Remove a number from the presentation pool with:
cURL
204. The row goes to revoked and stops being eligible for
outbound presentation; registering the same number again re-claims it through
a fresh verification.
5. How presentation resolves on a call
A verified caller ID is one pool your outbound calls can draw from; your Orbit-hosted numbers are the other. Presentation follows the same precedence on every outbound call — API-initiated calls, the browser softphone, dialer campaigns:- Owned Orbit-hosted number — when your org owns an active number in the destination’s presence pool, an owned number wins and the call attests at level A.
- Verified external caller ID — a presented
cid_*number you verified here resolves against your verified list; a delegate certificate you registered raises that number from C to B attestation (never A — A is ownership-only by design). - Default fallback — with neither match, the platform default fallback number applies and the call attests at C.
callerIdNumber in POST /api/v1/voice/softphone/register is the number
their browser calls present from, chosen from your owned pool or verified
caller IDs. A queue- or agent-level override is the softphone/dialer field
that picks one row over another at dial time — there is no separate global
default endpoint to set.
6. CNAM and STIR/SHAKEN interaction
Caller ID verification and CNAM are separate controls that compose on the recipient handset:- The verified caller ID decides which number is presented and feeds STIR/SHAKEN attestation resolution (owned → A, verified-with-certificate → B, fallback → C).
- The CNAM registration decides what name carriers display alongside that number, gated on carrier propagation of the LIDB write.
7. Troubleshoot presentation-blocked calls
When outbound calls present the wrong number — or the recipient sees the fallback instead of your caller ID — walk the list in order:Every control on this page is tenant-owned. Orbit registers the caller ID
you prove control of, applies the attestation level your ownership earns,
and enforces your per-DID inbound floor — it does not impose a presentation
posture on your traffic. Regulatory compliance for how you present caller ID
on outbound calls stays your responsibility.
Deep dives
- CNAM & caller ID — register the branded name carriers display
- STIR/SHAKEN attestation — how attestation levels resolve and what you control
- Voice queues — route inbound callers to staffed queues
- SIP trunk setup — bring-your-own-carrier trunks with attestation on US outbound
- Number masking — present a masked number on two-party sessions