> 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.

# Deprecation Notices

> Index of Atoms API endpoints that are deprecated or scheduled for removal, with the migration target for each.

This page lists Atoms API endpoints that are deprecated. Each row shows the current status, the migration target, and, once fixed, the sunset date.

## How to read this page

* **Deprecated**: the endpoint still works, but new integrations should use the migration target. Deprecated endpoints return the header `Deprecation: true`.
* **Rejects with 409**: the endpoint returns HTTP `409` with an `error_type` field naming the migration reason, and does not process the request. Migrate immediately.
* **Removed**: the endpoint no longer exists. Requests return HTTP `404`.

When an endpoint has a fixed removal date, the response also carries a `Sunset:` header with the RFC 7231-formatted timestamp.

> **Note**
>
> Deprecation state is machine-readable via the `Deprecation`, `Sunset`, and (for `409` responses) the JSON body's `error_type` field. Log these in your integration so you can pull affected code paths automatically.

## Currently deprecated

### Agents

| Endpoint                                                     | Deprecated since | Status             | Migrate to                                                                                                                                        |
| ------------------------------------------------------------ | ---------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PATCH /agent/{id}` (in-place config edits)                  | 2026-04-20       | Rejects with `400` | Fork a draft via the branch API, edit, publish. See [versioning lifecycle](/voice-agents/developer-guide/build/agent-crews/versioning-lifecycle). |
| `PATCH /workflow/{workflowId}` (direct workflow graph edits) | 2026-06-11       | Rejects with `400` | Same as above. Edit the `workflow` field on a draft, then publish.                                                                                |

### Widget

Widget endpoints control the embeddable chat widget and its avatar. Configure the widget from the dashboard.

| Endpoint                                | Deprecated since | Removed from reference | Status                                                                       | Migrate to                             |
| --------------------------------------- | ---------------- | ---------------------- | ---------------------------------------------------------------------------- | -------------------------------------- |
| `GET /agent/{id}/widget-config`         | 2026-08-13       | 2026-09-16             | Removed from platform (returns `404`)                                        | Dashboard: **Agent → Widget**          |
| `PATCH /agent/{id}/widget-config`       | 2026-08-13       | 2026-09-16             | Removed from platform (returns `404`)                                        | Dashboard: **Agent → Widget**          |
| `POST /agent/{id}/avatar/presigned-url` | 2026-08-13       | 2026-09-16             | Route still live (returns `400` on invalid body); hidden from reference only | Dashboard: **Agent → Widget → Avatar** |

The `widgetConfig` field on the agent DTO is unchanged and safe to ignore for API-only integrations.

### Agent Versioning: Drafts (v1)

**All entries below rejected on launch of the v2 branch model with `409 versioning_v2_migration_required`.**

| Endpoint                                    | Status             | Migrate to                                                                 |
| ------------------------------------------- | ------------------ | -------------------------------------------------------------------------- |
| `POST /agent/{id}/drafts`                   | Rejects with `409` | `PUT /agent/{id}/branches/{branchId}/draft`                                |
| `GET /agent/{id}/drafts`                    | Rejects with `409` | `GET /agent/{id}/branches` (`openDraftId` / `hasOpenDraft` on each branch) |
| `PATCH /agent/{id}/drafts/{draftId}`        | Rejects with `409` | Not migrated. Drafts are no longer independently named.                    |
| `DELETE /agent/{id}/drafts/{draftId}`       | Rejects with `409` | `DELETE /agent/{id}/branches/{branchId}/draft`                             |
| `POST /agent/{id}/drafts/{draftId}/publish` | Rejects with `409` | `POST /agent/{id}/branches/{branchId}/draft/publish`                       |
| `PATCH /agent/{id}/drafts/{draftId}/config` | Rejects with `409` | `PUT /agent/{id}/branches/{branchId}/draft`                                |

**Kept unchanged** during the coexistence window (\~1 month post-launch), then removed:

| Endpoint                                      | Status                   | Migrate to                                                                 |
| --------------------------------------------- | ------------------------ | -------------------------------------------------------------------------- |
| `GET /agent/{id}/drafts/{draftId}`            | Deprecated (still works) | `GET /agent/{id}/branches/{branchId}/draft`                                |
| `GET /agent/{id}/drafts/{draftId}/diff`       | Deprecated (still works) | `GET /agent/{id}/diff?a=<branchId>:draft&b=<revisionId>`                   |
| `POST /agent/{id}/drafts/{draftId}/test-call` | Deprecated (still works) | `POST /agent/{id}/branches/{branchId}/test-call` with `includeDraft: true` |

### Agent Versioning: Versions (v1)

**Rejected on launch of the v2 branch model with `409 versioning_v2_migration_required`.**

| Endpoint                                          | Status                                | Migrate to                                                                                                           |
| ------------------------------------------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `GET /agent/{id}/versions`                        | Rejects with `409`                    | `GET /agent/{id}/branches/{branchId}/revisions`                                                                      |
| `PATCH /agent/{id}/versions/{versionId}`          | Rejects with `409` (external callers) | Metadata edits removed on v2. Set `label` at publish via `POST .../draft/publish`.                                   |
| `PATCH /agent/{id}/versions/{versionId}/activate` | Rejects with `409`                    | `POST /agent/{id}/branches/{branchId}/live` or `POST /agent/{id}/branches/{branchId}/revisions/{revisionId}/restore` |

**Kept unchanged** during the coexistence window (\~1 month post-launch), then removed. A v1 `versionId` equals its migrated `revisionId`, so IDs stored by existing integrations continue to resolve.

| Endpoint                                          | Status                   | Migrate to                                                         |
| ------------------------------------------------- | ------------------------ | ------------------------------------------------------------------ |
| `GET /agent/{id}/versions/{versionId}`            | Deprecated (still works) | `GET /agent/{id}/branches/{branchId}/revisions/{revisionId}`       |
| `GET /agent/{id}/versions/diff`                   | Deprecated (still works) | `GET /agent/{id}/diff?a=<revisionId>&b=<revisionId>`               |
| `POST /agent/{id}/versions/{versionId}/test-call` | Deprecated (still works) | `POST /agent/{id}/branches/{branchId}/test-call` with `revisionId` |

Full migration walkthrough with worked examples: [v1 → v2 migration guide](/api-reference/deprecations/agent-versioning-migration).

### Telephony (trunks & caller IDs rework)

**Deprecated at the release of the trunks rework (2026-09-05).** Everything below keeps working for **45 days from that release**, then is removed in one change; the removal will be announced in the [changelog](/changelog/voice-agents). Deprecated endpoint responses carry `Deprecation: true`. Full walkthrough: [Telephony migration guide](/api-reference/deprecations/telephony-migration).

> **Warning**
>
> One behavior change in this rework was **removed outright, not deprecated**: an outbound call that named no from-number used to fall back to a Smallest-managed shared number and still return `200`. That fallback is gone. During the migration window such a call dials from the agent's attached caller IDs (with a `Deprecation: true` response header); an agent with none attached gets `400` `"No caller ID for this call — pass a number to dial from, or attach a caller ID to the agent"`. Fix it by passing `fromNumber` on every call, or attaching a caller ID under the agent's **Telephony** tab → **Dials from**. Note that attaching a number under **Answers on** (or via the legacy `telephonyProductId` field) creates an inbound binding only and does not satisfy this.

| Endpoint / field                                                             | Status                                                                                                                | Migrate to                                                                           |
| ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| `POST /product/import-phone-number`                                          | Deprecated (still works; creates both trunks)                                                                         | `POST /sip-trunk/inbound` + `POST /sip-trunk/outbound`                               |
| `telephonyProductId` on `PATCH /agent/{agentId}`                             | Deprecated (still works, applied as answer sources)                                                                   | `POST /agent/{agentId}/answers`                                                      |
| `telephonyProductId` on `POST /agent`                                        | Silently ignored (stripped; no bindings, no `Deprecation` header)                                                     | `POST /agent/{agentId}/answers` after create                                         |
| `allowInboundCall` on `POST`/`PATCH /agent`                                  | Deprecated (`false` still works as a kill switch; `true` undoes a previous `false`, otherwise no effect)              | Detach the number via `DELETE /agent/{agentId}/answers/{sourceId}`                   |
| `fromProductId` on `POST /conversation/outbound`                             | Deprecated (still works as an alias)                                                                                  | `fromNumber`                                                                         |
| Omitting the from-number on `POST /conversation/outbound`                    | Deprecated (works via the agent's attached caller IDs during the window; such calls respond with `Deprecation: true`) | Always send `fromNumber`                                                             |
| `GET`/`POST /agent/{agentId}/caller-ids`, `DELETE .../caller-ids/{sourceId}` | Deprecated at introduction (the compatibility bridge; responses carry `Deprecation: true`)                            | Pass `fromNumber` per call instead of attaching defaults                             |
| `phoneNumberIds` on `POST /campaign`                                         | Deprecated (still works; resolved to numbers)                                                                         | `fromNumbers`                                                                        |
| Omitting `fromNumbers` on `POST /campaign`                                   | Works only when `phoneNumberIds` is sent instead; omitting both is refused                                            | `fromNumbers` becomes required                                                       |
| `agentId` on number reads                                                    | Present during the window (now means "the agent that answers")                                                        | The `agent` object on `GET /product/phone-numbers` and `GET /sip-trunk/inbound` rows |
| `customProducts` on `GET /product/all-numbers`                               | Present during the window (derived live from your trunks)                                                             | `GET /sip-trunk/inbound` and `GET /sip-trunk/outbound`                               |
| `productType: "custom"` records                                              | Present during the window (pointer records)                                                                           | Trunk resources                                                                      |

## Recently removed

Endpoints that returned `404` after removal.

| Endpoint                          | Removed    | Notes                                                                                                                                    |
| --------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `GET /agent/{id}/resolved-config` | 2026-06-01 | Unused by the console. The same data is served inline on `GET /agent/{id}?draftId=X`, which merges `_resolvedConfig` into the agent DTO. |

## Reporting a break

If a v1 endpoint you rely on returns `409` unexpectedly or you spot a mapping error on this page, open a ticket and quote the endpoint path and the `error_type` from the response body. That's the minimum needed to trace and reroute.