SIP credentials: provision digest-verified device identities
A SIP credential is the identity one device — a desk phone, a desktop or
mobile SIP app, or a browser softphone — uses to register with Orbit and
place or receive calls. This guide is the entry point for the feature
family: what a credential is, the provision → configure → rotate flow,
how the digest handshake verifies each registration, and the limits that
bound it. Worked examples at the end cover a desk phone and a browser
softphone step by step.
1. What a SIP credential is
A SIP credential is a password-bearing registration identity. It lets a
SIP user agent prove who it is to the voice edge so it can hold a live
binding, ring on inbound calls, and dial out. It is a different kind of
secret from the two identities it is most often confused with:
- An API key authenticates your code against the REST API. It never
registers a device and a device never uses it.
- A SIP trunk authenticates one PBX or carrier system to another,
system to system. A SIP credential authenticates one user agent — one
phone or softphone — to Orbit. If you are interconnecting a PBX, you
want the SIP trunks guide instead.
Each credential has a username derived from your organization and a
label you pick (01h8x2j4-front-desk shape) and a password Orbit
generates. The username stays stable for the credential’s whole life;
the password is shown exactly once at creation and replaced by rotation.
On top of the identity, a credential carries tenant-owned limits —
allowed source IPs, a User-Agent lock, an outbound country block list, a
daily spend cap, a concurrent-call cap — all of which you manage
yourself. The full lifecycle model is SIP credential
lifecycle.
Manage credentials under Voice → Extensions in the dashboard, or
through the public API at /api/v1/sip-credentials
(reference). List, get, create,
update, and rotate are all parity between the two surfaces; create,
update, rotate, and delete require an owner or admin role.
The plaintext password appears exactly once, in the create (or rotate)
response. Save it immediately — it is not recoverable afterwards. If it
is lost, rotate the credential and configure the device with the new
password.
The flow is the same three steps for every device class:
- Create.
POST /api/v1/sip-credentials with a label (and any
limits you want on day one). The response carries the username, the
one-time plaintext password, and the connection details — the SIP
server host, ports, digest realm, transport, and media policy.
- Hand it to the device. Copy the connection details into the
desk phone or softphone’s SIP account settings. Within seconds the
device REGISTERs, the credential’s
last_register_at flips from
null to the current time, and its registered flag goes true.
- Rotate on a schedule or on suspicion.
POST /api/v1/sip-credentials/:id/rotate mints a new password and revokes
the old one immediately. The username does not change, so the device
only needs its password field updated — nothing else in its
configuration moves.
Rotation is deliberately cheap, so use it: when a device is lost or an
employee leaves, rotate instead of deleting and recreating, and the
label, extension number, and limits survive.
The create response fields map onto the device’s SIP account settings
like this:
sip_server and sip_realm are legitimately different values: the
server is the network host the device sends packets to; the realm is the
identity domain the voice edge challenges digest authentication with.
Clients that have one combined “domain” field only need the server.
If you manage a fleet of physical handsets, skip the manual copy-paste
entirely: desk-phone zero-touch provisioning
registers the phone’s MAC, and the handset pulls rendered config —
including its paired SIP credential — from the provisioning URL on first
boot.
3. Digest verification: how REGISTER is checked
A device never sends its password. SIP digest authentication is a
challenge–response exchange: the voice edge answers a bare REGISTER
with a 401 carrying a one-time nonce, and the device retries with a
response hash computed over the stored secret, the nonce, and the
request. The edge re-computes the hash and only accepts the binding if
it matches. A captured response cannot be replayed against a fresh
nonce, and a stolen username alone registers nothing.
Create and rotation store the long-lived half of the secret (the
HA1 hash over username:realm:password) in two algorithm variants,
so the edge can answer both legacy MD5 challenges and SHA-256
challenges — older handsets typically do MD5, newer clients can upgrade
to SHA-256.
Watch these failure signals when a device refuses to register; each maps
to a distinct cause, and all are visible on the credential’s dashboard
row and in the audit feed:
- 401 / 403 with no binding — the digest does not verify. Usually a
mistyped password or a password that was rotated while the old one is
still configured on the device.
- Realm mismatch — the device answered the challenge against the
wrong realm. Check that any separate realm/domain field on the device
holds
sip_realm exactly as returned.
- Disabled or expired — the credential itself is blocking the
registration (
enabled: false, or an expiresAt that has passed).
Re-enable or clear the expiry before touching the device.
ip_locked — the source address is outside the credential’s
allowedIpCidrs list. Add the network’s CIDR or clear the list.
ua_locked — the User-Agent lock on the credential does not match
the client’s User-Agent header. Relax the lock or match the client.
- Unsupported algorithm — the device insists on a digest algorithm
no stored hash can answer. Update the client firmware to gain SHA-256
support.
Why each gate exists and the exact verification math each layer
recomputes is laid out in SIP digest verification
model. Once the digest
verifies, inbound routing fans out to every device the credential holds
a registration on; that model is Inbound voice
routing.
4. Operational limits: caps, cooldowns, and the rotation lifecycle
The limits below are all tenant-owned controls — you set and clear every
one of them on your own credentials.
- Per-credential caps. A concurrent-call cap (1–100 simultaneous
outbound calls) and an optional registration cap on how many
distinct endpoints may hold live bindings at once. Both are enforced
per credential; leave them unset for no cap. A blocked outbound call
returns an accurate SIP status (403 / 402), never a silent drop.
- Create and rotate rate limits. Creating a credential and rotating
a password are each limited to 10 requests per hour per workspace;
force-unregister is limited to 30 per hour. Size bulk fleet
rollouts around those ceilings — the desk-phone bulk
import CSV path has its own
50-phones-per-hour window.
- Expiry. Set
expiresAt for contractor or seasonal devices; the
credential stops authenticating after the timestamp without a manual
revoke.
- Disable vs delete.
PATCH with enabled: false suspends the
credential: registrations and inbound/outbound calls stop, but the
row, its limits, and its audit history survive. DELETE soft-deletes
it and revokes immediately; hard delete is deliberately not exposed so
the audit trail survives.
- Force-unregister.
POST /:id/unregister evicts live REGISTER
bindings right now — for a stolen device or a binding stuck behind a
NAT edge. The device re-registers on its next refresh (~60 seconds)
unless you also disabled the credential, so pair the two when the
goal is a real disconnect.
- Rotation lifecycle. Rotation replaces only the password hashes.
Every limit, the extension number, the username, and the label
survive, so a scheduled rotation (or an emergency one on suspicion)
never re-opens configuration drift. Devices registered on the old
password fall off on their next keepalive cycle — typically under 60
seconds — and re-register with the new password once configured.
Every create, update, rotation, unregister, and delete lands in the
audit log with the username and label, so a credential fleet stays
observable across its lifecycle.
5. Worked example: desk-phone provisioning
Provision a Yealink on the front desk, locked to the office network.
-
Create the credential with extension, forward target, and an IP
allow-list:
-
Save the
password from the 201 response immediately — it never
appears again.
-
On the phone’s web UI under Account → Register: User Name
and Authenticate Name = the
username; Password = the saved
password; SIP Server Host = sip.orbit.devotel.io;
Port = 5061; Transport = TLS.
-
Confirm. The account row shows Registered within seconds; the
credential’s
registered flag and last_register_at confirm it from
the platform side. A REGISTER from any address outside
203.0.113.0/24 is refused as ip_locked.
For a fleet rollout, pair each handset by MAC instead and let it pull
this configuration itself: desk-phone zero-touch
provisioning.
6. Worked example: browser softphone provisioning
Put a colleague on a softphone in their browser — the dashboard’s
built-in phone or a third-party WebRTC client that REGISTERs over SIP.
-
Create the credential, naming the person and giving the device a
reachability extension:
-
Save the one-time
password, then open the softphone’s SIP account
settings: Username = the username value, Password = the
saved password, Domain = sip.orbit.devotel.io, Port =
5061, Transport = TLS, Media = SRTP (mandatory).
-
The account flips to Registered in seconds. Colleagues reach it
at extension
205; inbound DID calls fork onto it alongside any desk
phone paired to the same credential. The User-Agent lock means a
leaked password cannot be used from a different SIP client.
If you want an in-dashboard calling surface with no SIP client at all,
the Browser Softphone rides the
signed-in dashboard session instead of a SIP REGISTER — pick that when
the operator already works in the dashboard.
See also