SIP credentials API
Issue SIP credentials so a third-party softphone (Linphone, Zoiper, Bria, MicroSIP) or a hardware desk phone (Yealink, Grandstream) can register with Orbit’s voice edge and place or receive calls on your numbers. This page manages individual devices. For trunk-to-trunk connectivity between your PBX and Orbit, use the SIP trunks resource on the Voice API instead. Base path:/api/v1/sip-credentials
Authentication: API key (X-API-Key) or session JWT. Creating and modifying credentials requires an admin or owner key; reads also work with developer and viewer keys.
Quickstart: create a credential
POST a label and get back everything the device needs — username, a one-time password, and the connection details:
password immediately — it appears only in this response and in rotate responses. Every later read omits it. If it is lost, call POST /{id}/rotate for a new one.
The username is derived from your organization and the label, so it stays stable when you rotate the password — registered devices only need the password field updated.
Configure the softphone or desk phone
Map the response fields to the device’s SIP account settings. The labels differ per client; the values do not.sip_server and sip_realm are deliberately different values. sip_server is the network host the device sends REGISTER packets to; sip_realm is the digest realm the voice edge challenges with. Devices that ask for only one “domain” field work either way — the realm is only needed when a client separates the two.
Linphone (desktop or mobile)
- Open Settings → SIP accounts → Add account.
- Username: the
usernamevalue. Password: the saved one-time password. - Domain / Server:
sip.orbit.devotel.io(no port suffix; set the port separately). - Transport: TLS, port
5061. If TLS fails on an old network, fall back to TCP on5060. - Save. Within a few seconds the account shows Registered.
last_register_aton the credential flips fromnullto the current time.
Zoiper
- Choose Add account → SIP.
- Account name / username: the
usernamevalue; password: the saved password. - Domain:
sip.orbit.devotel.io, port:5061, transport: TLS. - Leave outbound proxy empty — the server field above is sufficient.
- The status line turns green when the REGISTER is accepted.
Bria
- Account → SIP account → New.
- User ID: the
username; Password: the saved password; Domain:sip.orbit.devotel.io. - Under Advanced → Transport, pick TLS with port
5061. Under Security, set media encryption to SRTP (mandatory — the edge refuses unencrypted media). - Register. If Bria reports a certificate warning, switch your device clock to automatic and retry.
Yealink T46U (and similar desk phones)
- Browse to the phone’s web UI → Account → Register.
- Register Status: Enabled. Label / Display Name: anything human-readable.
- User Name + Authenticate Name: the
usernamevalue. Password: the saved password. - SIP Server 1 · Host:
sip.orbit.devotel.io, Port:5061, Transport: TLS. - Press Confirm; the account row shows Registered within a few seconds.
extensionNumber and the optional forward targets when you create the credential if you want the device reachable by short extension and covered on busy/no-answer/offline:
List and read credentials
List returns a cursor-paginated page; read returns one credential. Neither ever includes password material.meta.pagination.cursor as the cursor query parameter until has_more is false. Default page size is 25; the maximum is 200.
Get a single credential — including the connection details a fresh device needs:
Lifecycle recipes
Disable or re-label a credential (PATCH)
Send only the fields you want to change. Sendnull on a nullable field to clear it. dnd: true makes inbound calls skip the device without touching its registration.
username is immutable by design — relabeling never breaks registered devices.
Rotate the password (POST /rotate)
Replaces the password immediately; the old one stops authenticating. The username is unchanged, so only the password field needs updating on the device.Force unregister sessions (POST /unregister)
Evicts the device’s active REGISTER bindings. The device re-registers on its next refresh (about 60 seconds for most clients), so combine withenabled: false for a permanent disconnect:
Delete (DELETE)
Soft-deletes the credential — REGISTERs stop immediately and the audit trail is kept. Returns204 No Content with no body. Call unregister first if the device is actively ringing a call you want dropped.
Try it from the SDKs
There is no dedicatedsipCredentials resource in the SDKs yet — use the generic request helper, which carries the same auth, retries, and idempotency handling as the typed resources.
Node.js
Python
Troubleshooting
REGISTER returns 407 (Proxy Authentication Required) or repeated 401s. The digest was computed against the wrong realm. Configure the device withsip_realm (orbit.devotel.io) where it asks for a realm or domain, and keep sip_server (sip.orbit.devotel.io) in the server/proxy field. The two values are different by design; mixing them up fails every REGISTER. If the client has no separate realm field, it already uses the right one from the challenge.
REGISTER never arrives (timeout, no response).
The device is trying the wrong host or transport. Use sip_server from the response — never orbit.devotel.io, which is the app ingress and answers no SIP. Try TLS/5061 first; fall back to TCP/5060.
The password copy is lost.
Read endpoints never return it. Call POST /{id}/rotate and copy the new password value from that response.
A credential exists but inbound never rings, or last_register_at stays null.
No device has successfully registered. Check the client’s status screen, then confirm NAT/firewall egress below.
NAT and firewall egress.
The device must reach the SIP edge outbound on UDP/TCP 5060 and TLS 5061, and the media path negotiates SRTP. Corporate firewalls that block non-80/443 egress drop REGISTER silently. Home routers with aggressive NAT timing sometimes hold a stale binding — a POST /{id}/unregister call clears the server-side binding and the next refresh re-registers cleanly.
422 VALIDATION_ERROR.
The response names the offending field in error.details.issues. Common causes: extensionNumber outside 2–8 characters of digits/*/#, a defaultCallerIdE164 that is not E.164, or a country code that is not ISO alpha-2.
409 CONFLICT.
Another credential already has this label or extension. Pick a different one, or update the existing credential instead.
403 FORBIDDEN on create or PATCH.
defaultCallerIdE164 must be a number your organization owns. The check always applies unless outboundCallerIdMode is inherit_org.
409 or 429 on rotate.
Create and rotate accept a small number of requests per hour per organization. Rotate instead of re-creating, and keep automated rotations behind a queue if you manage many devices.
See also
- Voice API — programmatic call control once the device is registered
- Browser softphone SDK — for an in-browser softphone via the web SDK
- Pagination guide — cursor semantics for the list endpoint