Overview
The platform telephony plane (client.telephony.*) maps your phone numbers to
voice agents on backend-core’s /api/v2/platform/telephony/* surface. The
primary flow is attach a number to an agent — what telephony calls the
Leg-B termination (Unpod’s SuperSBC routes the inbound call through to your
agent on LiveKit).
You list your org’s numbers, then attach one or many to an agent. The
underlying voice bridge is resolved for you (hidden) — you work with numbers and
agents, not bridges.
This plane (
client.telephony.*) is distinct from the Speech Stack management
plane at client.numbers / client.trunks. The
telephony plane is Org-Handle-scoped and requires proxy/JWT auth — it is not
reachable in direct/Bearer mode.Concepts
| Concept | What it is |
|---|---|
| Leg B (agent attach) | SuperSBC → agent/LiveKit. The primary flow — numbers.attach(..., agent_id=...). |
| Leg A (BYO carrier) | Your own SIP carrier → SuperSBC. The carrier leg is the hardcoded SuperSBC default today; bringing your own carrier (client.telephony.trunks.*) is future/beta. |
agent_id | The agent handle a number routes to. Optional — attach now, bind an agent later. |
| Bridge | The voice bridge a number rides on. Auto-resolved and hidden — one number maps to one bridge. |
Authenticate
The telephony plane is org-scoped. Authenticate with a JWT and your org handle:List Numbers
Number fields
| Field | Type | Description |
|---|---|---|
id | int | Telephony number ID |
number | str | E.164 format, e.g. +14155550100 |
state | str | None | NOT_ASSIGNED, ASSIGNED, … |
country | str | None | ISO 3166-1 alpha-2 country code |
Attach Numbers to an Agent
Map one or more numbers to an agent. The bridge is resolved automatically; each number reports its own outcome (partial-success), so one bad id never fails the rest.Result fields
| Field | Type | Description |
|---|---|---|
agent_id | str | None | The agent the numbers were bound to (echoes the request). |
numbers | list[NumberResult] | Per-number outcome (see below). |
message | str | None | Human-readable summary. |
NumberResult:
| Field | Type | Description |
|---|---|---|
number_id | int | The number’s ID. |
number | str | None | E.164, on success. |
connection_state | str | None | Lifecycle state (e.g. NOT_LINKED, PENDING_VERIFY). |
agent_id | str | None | The bound agent, on success. |
ok | bool | True if this number was attached. |
error | str | None | Why it failed, when ok is False. |
The agent attach returns the per-number lifecycle — there is no carrier
origin_endpoint. That belongs to the BYO-carrier (Leg-A) path below.agent_id is optional
Omit agent_id to wire a number for agent use without binding an agent yet —
bind one later by calling attach again with the same number and an agent_id:
Check the Lifecycle
Bring Your Own Carrier (Leg A) — Future / Beta
Bringing your own SIP carrier (client.telephony.trunks.*) wires the Leg-A
carrier leg. Today that leg is the hardcoded SuperSBC default, so this surface is
future/beta — prefer the agent attach above for production. When enabled, the
flow is: create a trunk, attach numbers, and point your carrier at the returned
origin endpoint.
Common Patterns
Attach the first available number to an agent
Attach many numbers to one agent
Next Steps
Agents
Build the agent your numbers route to.
Numbers
Acquire and manage numbers from the dashboard.