Skip to content

Changelog

Notable, developer-facing changes to the Omni Octo API, MCP servers, and these docs. Newest first. Dates are UTC.

2026-08-01 — Reassigning who answers a channel

Section titled “2026-08-01 — Reassigning who answers a channel”
  • MCP: deploy_agent accepts take_over_inbound. A channel has at most one agent that answers inbound traffic, while many can share it to send or dial out. Previously deploy_agent could only claim that inbound seat when it was empty: deploying to a channel another agent already answers returned outbound-only, and there was no parameter that changed the outcome. Pass take_over_inbound: true to move the seat to the agent you are deploying. The displaced agent stays deployed and keeps its outbound capability — only who answers changes — and the response names it in replacedAgentId.
  • The default is unchanged and stays false. Deploying to an occupied channel still grants outbound only, so a routine deploy can never silently redirect live inbound traffic away from a working agent. Requires channel_id; the legacy channel type parameter does not identify a channel row to own and is rejected.
  • config does not control routing. It is opaque per-deployment JSON. config: { inbound: true } and similar were accepted and ignored; use take_over_inbound instead.

2026-07-28 — Outbound compliance + AI disclosure

Section titled “2026-07-28 — Outbound compliance + AI disclosure”
  • Launching an outbound campaign can now return 409. Before a workspace launches its first outbound campaign of any type (voice, SMS, or WhatsApp), an owner or admin must accept the Outbound Calling Compliance acknowledgment. POST /api/campaigns/ (non-draft) and POST /api/campaigns/{id}/start return { "error": "outbound_compliance_required", "version": "…" } until they do. Handle it by surfacing the message rather than retrying — acceptance is a human action at Settings → Compliance → Outbound compliance, and there is deliberately no API or tool that performs it. Drafts are never gated, so draft: true keeps working; only the launch is blocked.
  • Voice agents can speak an AI + call-recording disclosure. A per-agent notice delivered before anything else on the call, either synthesized from editable text or played from an uploaded recording (which is the only way to guarantee verbatim wording on realtime voice pipelines). Agents created from now on default to on; agents that existed before this shipped default to off and opt in, so no deployed agent changes what it says to callers without its operator doing it.
  • MCP: get_agent now returns a disclosure blockenabled, applies, spoken_text, mode, using_default_text, and a plain-language note. Read it instead of the raw columns: a null disclosure_text means “use the platform default”, not “say nothing”, and applies: false distinguishes a text-only agent from a voice agent with the safeguard switched off.
  • MCP: update_agent accepts disclosureEnabled, disclosureText, and disclosureRecordingId. Turning the disclosure off is supported — it is opt-out by design — but you remain responsible for AI-disclosure and recording-consent law wherever you call. A recording id must belong to your workspace and be of kind disclosure; voicemail-drop clips are a separate kind and are rejected.
  • Delete or modify many resources in one call. New workspace tools — delete_conversations, delete_channels, delete_contacts, delete_campaigns, undeploy_agents, and cancel_campaigns — act on many matching rows at once (callable over the MCP servers and the OpenAI-compatible API). Each takes either a filter or an explicit ids list. This replaces the old behavior where “clean up all matching X” fanned out into one risky call — and one confirmation — per item.
  • One confirmation for the whole batch. A bulk delete parks a single confirmation stating the count and a sample, not N sequential asks. See Confirmations.
  • Guardrails. A full-workspace { all: true } filter requires a matching confirm_count; a confirmation is drift-aborted if the matching set grows

    10% before you reply; delete_campaigns skips running campaigns unless you opt in; delete_contacts is a recoverable soft delete.

  • Subscribe to workspace events. Agents can now listen for state changes they didn’t initiate. Register signed, retried outbound webhooks with /v1/webhooks, or hold open a GET /v1/events SSE stream with a resume cursor. Both carry the same snake_case event envelope.
  • Event catalog. conversation.created, turn.completed, confirmation.requested, confirmation.resolved, spend.recorded, run.completed. See Events & webhooks.
  • Signed & replayable. Deliveries use the Standard Webhooks (svix) signature scheme; the SSE feed replays a durable, cursor-paginated log via ?after= / Last-Event-ID so a reconnecting client never misses an event.
  • Search & buy phone numbers. Octo can now search available phone numbers and purchase them directly — the tools are in the workspace catalog (so they’re callable over the MCP servers and the OpenAI-compatible API) and the routes are in the Platform API reference under /api/phone-numbers.
  • Spend-gated purchase. Buying a number is a spend action, so it parks for explicit confirmation like every other risky action — the purchase only fires after you reply YES <code>. See Confirmations.
  • Credits, not dollars. Availability results and prices are quoted in workspace credits; the underlying USD cost is never exposed on any customer surface.
  • Regulatory routing. Only US and CA are instant-purchase. For other countries Octo links you to the in-app regulatory-approval flow rather than an external carrier dashboard.
  • Rate-limit headers on every response. The OpenAI-compatible /v1 API now returns X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset on success as well as on 429, so an agent can pace itself proactively instead of only reacting to Retry-After. See Rate limits.
  • Self-correcting error envelope. Errors keep the OpenAI shape (message, type, param, code) and now add hint and docs_url on the auth, rate-limit, and server-error paths so a caller can recover without a human. See Errors.
  • Skills catalog. A machine-readable task catalog is published at /.well-known/skills/index.json — each entry links to markdown instructions for a common job (authenticate, create a key, handle confirmations, respect rate limits, connect MCP, …). See Agent resources.
  • Docs site. Launched docs.omniocto.com covering the three Octo surfaces: the OpenAI-compatible /v1 API, the MCP servers, and the platform REST API, with interactive API references.
  • Agent-readable docs. Added /llms.txt, /llms-full.txt, a raw-markdown view for every page (append .md to any URL), and OpenAPI JSON for both APIs.
  • Docs-search MCP. A live MCP server (/mcp-docs) with search_docs and get_doc so an agent can query these docs in context.
  • OpenAI-compatible API. /v1/responses, /v1/chat/completions, and /v1/models, callable by pointing any OpenAI client at the Octo base_url and an sk-octo_ key. SSE streaming, background mode, Idempotency-Key replay, and previous_response_id continuation.
  • API keys in the dashboard. Create and revoke sk-octo_ keys from Settings → API Keys. See Get an API key.