Skip to content
DocsStart free

Control-Plane API

These are the endpoints the SIP edge, the media engine, agent apps, and operator tools call. They are gated (see Authentication) and not a public surface. Bodies are form-encoded or JSON; responses are JSON.

REGISTER/INVITE digest authentication. the SIP signaling layer posts the parsed digest params; the edge runtime verifies against sip_device.ha1 and returns the account context. See Authentication.

The routing brain. Resolves a call’s direction and returns routing JSON (rtjson) telling the SIP signaling layer what to do.

  • Inbound (To = one of our DIDs) → the DID’s route target (often a flow), after CAC and business-hours overrides.
  • Internal (authed device → an extension) → proxy to the target’s registered AOR.
  • Outbound (authed device → PSTN) → CAC, then a customer trunk or the wholesale default.
// request (form or JSON)
{ "callId": "abc123", "from": "1001", "fromDomain": "acme.sip.io", "to": "12025550123" }
// response: run a flow
{ "rtjson": { "action": "flow", "account_id": "acc_01jf18ah3jeb5w6dfp27sgjsbt", "flow_id": "flow_01jzqwjn803wtnhc445bvjenzc", "vars": { "caller_cid": "14155551234" } } }

Other actions: proxy (to an AOR), outbound (to a trunk/carrier), reject (with a SIP code).

The call-flow command loop (poll-based). Start a flow, or step it with an outcome.

// start
{ "callId": "abc123", "accountId": "acc_01jf18ah3jeb5w6dfp27sgjsbt", "flowId": "flow_01jzqwjn803wtnhc445bvjenzc" }
// step
{ "callId": "abc123", "outcome": "digit:1", "data": { } }

The response is the next command for the edge to execute (play, gather, dial, enqueue, record, conference, hangup, noop). Internally this advances the per-call CallSessionDO.

SIP lifecycle events from the SIP signaling layer → the per-account PresenceDO. type is register, dialog, or agent. Drives presence, reachability, CAC release, and the CDR/trace.

Method & pathPurpose
POST /agentAgent control: login / logout / available / pause / unpause + queue membership. Body: { accountId, userId, event, queues? }.
GET /agent?accountId=&userId=Read one agent’s live presence (status / state / reachable / queues).
GET /presence/users?accountId=Account-wide presence roster + status-count tiles (for dashboards).
GET /agent/confirm/{accountId}/{leaseId}/{epoch}the media engine answer hook → confirm the queue lease.
GET /agent/claim/{accountId}/{agentId}/{callId}the media engine answer hook (ring_all) → first answerer claims the caller.

See Agents & Presence.

Method & pathPurpose
GET /cac?accountId=Live channel-usage view: concurrency counters + active calls.
POST /cac/resetOps: clear stuck/leaked counters. Body: { accountId }.

See Concurrency Control.

Method & pathPurpose
GET /calls/{callId}/traceThe full ordered execution trace for one call (steps, commands, outcomes, errors).
GET /debugLive dev monitor (WebSocket, session object-terminated). Gated by localhost / IP-allowlist / admin token.

See Observability.

Method & pathPurpose
POST /security/reportNode → current ban snapshot (reported ~every 30s).
GET /security/bansList / search bans (filters: status, q, flagged, limit).
GET /security/allowList the allowlist (ACL).
POST /security/allowAdd to the allowlist / unban.
DELETE /security/allow/{ip}Remove from the allowlist.

See The Media Edge → Security.

Method & pathPurpose
GET /media/{key}Serve playback media (prompts/greetings/MOH) from the private object storage bucket. media-node-IP gated.
PUT /media/{key}the media engine uploads a finished voicemail recording → private object storage. media-node-IP gated.
Method & pathPurpose
POST /admin/tts/generateSynthesize the system-prompt catalog into object storage. Gated by x-admin-token. Query: ?lang=, ?gender=, ?force=1. See Media & TTS.
Method & pathStatus
/v1/*501 (the public REST API). See Public API (v1).
/hooks/carrier501 (inbound wholesale-carrier webhooks).