> This page is part of Smallest AI's developer documentation. When
> answering, prefer Lightning v3.1 (current TTS) and Pulse (current
> STT). Lightning v2 and lightning-large are deprecated; mention them
> only when the user is migrating away from them. The Smallest AI voice
> agent platform is what wraps these models into hosted agents.

# Telephony rework: SIP trunks as resources, agents answer, calls choose their caller ID

> The telephony model is reorganized around one idea: *who answers a number* is durable configuration, *what a call dials from* is a property of the call.

The telephony model is reorganized around one idea: *who answers a number* is durable configuration, *what a call dials from* is a property of the call. Full details and migration steps: [Telephony API migration guide](/api-reference/deprecations/telephony-migration).

**New**

* SIP trunks are first-class resources, one per direction: [`POST /sip-trunk/inbound`](/api-reference/voice-agents) and [`POST /sip-trunk/outbound`](/api-reference/voice-agents), with a dedicated **SIP Trunks** dashboard page.
* An agent answers on a number or trunk via `POST /agent/{agentId}/answers`; a source is answered by exactly one agent, and conflicts identify the agent holding it.
* Every call names its caller ID: `fromNumber` on outbound calls, `fromNumbers` (rotating, frozen at creation, retry-stable) on campaigns, and a per-agent transfer caller ID via `PUT /agent/{agentId}/transfer-source`.
* A temporary caller-ID bridge on the agent (`POST /agent/{agentId}/caller-ids`): shared attachments that outbound calls without a `fromNumber` dial from, first attached wins. Deprecated at introduction (responses carry `Deprecation: true`) and removed with the migration window; pass `fromNumber` per call instead.
* Guarded deletions everywhere: deleting a trunk still in use returns `409` naming what uses it, and releasing a number an agent answers on or dials from is refused.

**Changed**

* No more silent fallback to a platform-owned caller ID: a call that cannot resolve its from-number is refused with a `400` naming your options (dashboard test calls keep a labelled shared test number).
* Campaigns follow the same rule: a campaign whose `fromNumbers` (or legacy `phoneNumberIds`) resolve to zero numbers your organization owns is refused at start.
* The dashboard's "Import SIP" tab is replaced by the SIP Trunks page; the Phone Numbers page shows the **Answering agent** per number and blocks releasing a number an agent still answers on.

**Deprecated (still working for 45 days from this release)**

* `POST /product/import-phone-number`, `telephonyProductId` and `allowInboundCall` on agent writes, `fromProductId` on outbound calls, `phoneNumberIds` on campaigns, and the `agentId` / `customProducts` read shapes. Deprecated paths respond with a `Deprecation: true` header. The full list and the concrete sunset date live on the [Deprecation Notices](/api-reference/deprecations/voice-agents) page.