Deprecation Notices

View as Markdown

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.

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

EndpointDeprecated sinceStatusMigrate to
PATCH /agent/{id} (in-place config edits)2026-04-20Rejects with 400Fork a draft via the branch API, edit, publish. See versioning lifecycle.
PATCH /workflow/{workflowId} (direct workflow graph edits)2026-06-11Rejects with 400Same as above. Edit the workflow field on a draft, then publish.

Widget

Widget endpoints control the embeddable chat widget and its avatar. They are hidden from the API-reference sidebar and are not part of the customer-facing REST surface; configure the widget from the dashboard. The endpoints still return 200 for existing integrations.

EndpointDeprecated sinceStatusMigrate to
GET /agent/{id}/widget-config2026-08-13Deprecated (still works)Dashboard: Agent → Widget
PATCH /agent/{id}/widget-config2026-08-13Deprecated (still works)Dashboard: Agent → Widget
POST /agent/{id}/avatar/presigned-url2026-08-13Deprecated (still works)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.

EndpointStatusMigrate to
POST /agent/{id}/draftsRejects with 409PUT /agent/{id}/branches/{branchId}/draft
GET /agent/{id}/draftsRejects with 409GET /agent/{id}/branches (openDraftId / hasOpenDraft on each branch)
PATCH /agent/{id}/drafts/{draftId}Rejects with 409Not migrated. Drafts are no longer independently named.
DELETE /agent/{id}/drafts/{draftId}Rejects with 409DELETE /agent/{id}/branches/{branchId}/draft
POST /agent/{id}/drafts/{draftId}/publishRejects with 409POST /agent/{id}/branches/{branchId}/draft/publish
PATCH /agent/{id}/drafts/{draftId}/configRejects with 409PUT /agent/{id}/branches/{branchId}/draft

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

EndpointStatusMigrate to
GET /agent/{id}/drafts/{draftId}Deprecated (still works)GET /agent/{id}/branches/{branchId}/draft
GET /agent/{id}/drafts/{draftId}/diffDeprecated (still works)GET /agent/{id}/diff?a=<branchId>:draft&b=<revisionId>
POST /agent/{id}/drafts/{draftId}/test-callDeprecated (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.

EndpointStatusMigrate to
GET /agent/{id}/versionsRejects with 409GET /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}/activateRejects with 409POST /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.

EndpointStatusMigrate to
GET /agent/{id}/versions/{versionId}Deprecated (still works)GET /agent/{id}/branches/{branchId}/revisions/{revisionId}
GET /agent/{id}/versions/diffDeprecated (still works)GET /agent/{id}/diff?a=<revisionId>&b=<revisionId>
POST /agent/{id}/versions/{versionId}/test-callDeprecated (still works)POST /agent/{id}/branches/{branchId}/test-call with revisionId

Full migration walkthrough with worked examples: v1 → v2 migration guide.

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. Deprecated endpoint responses carry Deprecation: true. Full walkthrough: Telephony migration guide.

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 / fieldStatusMigrate to
POST /product/import-phone-numberDeprecated (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 /agentSilently ignored (stripped; no bindings, no Deprecation header)POST /agent/{agentId}/answers after create
allowInboundCall on POST/PATCH /agentDeprecated (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/outboundDeprecated (still works as an alias)fromNumber
Omitting the from-number on POST /conversation/outboundDeprecated (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 /campaignDeprecated (still works; resolved to numbers)fromNumbers
Omitting fromNumbers on POST /campaignWorks only when phoneNumberIds is sent instead; omitting both is refusedfromNumbers becomes required
agentId on number readsPresent 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-numbersPresent during the window (derived live from your trunks)GET /sip-trunk/inbound and GET /sip-trunk/outbound
productType: "custom" recordsPresent during the window (pointer records)Trunk resources

Recently removed

Endpoints that returned 404 after removal.

EndpointRemovedNotes
GET /agent/{id}/resolved-config2026-06-01Unused 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.