Resources
Changelog
All notable changes to the TwinTone API (v1) are documented here. Entries are dated and grouped by Added / Changed / Fixed.
2026-10-24
Changed
- A test key only sees and ends test-key streams.
GET /streams,GET /streams/{id},DELETE /streams/{id}andGET /analyticswith att_test_key now reach only streams started with a test key. Your real streams are left out of its lists and analytics, and reading or ending one returns404 not_found. Before, a test key could read the brand's real streams and end them, which stopped the broadcast. The MCP tools follow the same rule. Live keys are unchanged.
Fixed
- The MCP tools and these docs now describe billing the way streams are
counted.
start_streamdescribed a separate per-minute charge, andend_streamandDELETE /streams/{id}said ending a stream stops billing. API streams use your plan's streaming minutes, and a live-key stream counts the fullduration_minutesit booked once it is live, so ending it early does not give minutes back. Test-key streams use no minutes. Billing itself has not changed.
2026-10-23
Added
warningson stream start. A live-keyPOST /streamsfor a brand with no connected channel that has a stream key still starts, but the201response now includes ano_broadcast_destinationwarning: the stream reaches no platform until a channel is connected.
Changed
- Test keys are free. Any account with a confirmed email can create a
tt_test_key in the dashboard, with no plan. Live keys still need the Growth plan or above (402 plan_required). - Test-key streams have their own concurrency limit. Up to 3 per brand, counted separately from live streams, and each ends on its own after 30 minutes.
- Webhook limits. At most 10 active webhooks per brand
(
409 webhook_limit), and up to 1,000 waiting deliveries per brand. Delivery now takes turns across brands, so one brand's backlog can no longer hold up other brands' events. GET /creatorsrejects an invalid key. Sending no key still returns the public list. Sending anAuthorizationheader that doesn't validate now returns401 unauthorizedinstead of the public list, so a mistyped key is caught on the first call.
2026-10-12
Added
- MCP server —
POST /api/mcpis now a working remote MCP server over the Streamable HTTP transport (JSON responses, stateless). It exposes five tools that wrap the v1 REST endpoints:list_creators,list_streams,get_stream(Read) andstart_stream(billable sensitive write),end_stream(destructive write). Both write tools requireconfirm: true. See MCP server.
Changed
- API streams use plan minutes only. A leftover balance check could reject
a live stream with
402 insufficient_creditseven though API streams have never been charged to a credit balance. That check is removed;insufficient_creditsis no longer returned byPOST /streams. - Pricing page now lists the plans that include API access and explains
how minutes are counted: a live stream counts its booked
duration_minutesonce it goeslive.
Fixed
402 no_minutesis documented. It is returned when your plan's minutes for the billing period are used up (the 2026-09-12 entry said it didn't exist; it does).- Docs said test keys need no plan. Creating any key, test or live, needs the Growth plan or above.
kickremoved from the documentedplatformvalues; it isn't available to live-commerce brands (403 vertical_mismatch).DELETE /streams/{id}now stops the broadcast. Before, it only marked the streamended; on a live key the broadcast kept running on the platform until its booked duration ran out. It now stops the broadcast first. If that can't be confirmed it returns502 stop_failedand the stream stayslive, so you can retry.- Live-key starts fire
stream.started. Only test keys sent it before. POST /streamsreturns the real status. Live keys returnedpreparingwhile the stream was alreadylive; the response now matches.
2026-09-12
Changed
- API keys moved in the dashboard — they now live under the sidebar
DEVELOPERS → API Keys section (with Usage and Docs), no longer under
Billing or Settings. All docs cross-references updated. API Keys and
Webhooks also appear as tabs of the dedicated
/dashboard/apihub. - Pricing page rewritten — API streams draw on the same plan minutes as
dashboard streams; the previous per-minute tier table and credit-wallet
model never shipped and is removed. Live keys still require the Growth plan
or above (
402 plan_required); test keys remain free.
Fixed
- Error reference no longer lists
insufficient_credits/no_minutes— neither code exists in the API; the only 402 isplan_required.
2026-09-04
Fixed
- The OpenAPI spec is now downloadable directly from the docs site (/openapi.yaml) — the spec was previously only reachable via a private GitHub link.
- Rate-limit docs no longer promise a
Retry-Afterheader the API doesn't send. - Clarified that
cryptoin the webhook signature examples is Node's standard hashing library (not cryptocurrency), and corrected the webhook testing notes.
2026-08-07
v1 — initial release
The TwinTone API launches in early access. Endpoints are stable but the surface area is intentionally small; webhook event taxonomies are versioned so additions never break existing integrations.
Added
- Streams — programmatic control of AI-hosted live streams:
POST /api/v1/streams— start a stream (agent dispatch, lifecyclepreparing → live → ended | error).GET /api/v1/streams— list your brand's streams withstatus/limit/offsetfilters.GET /api/v1/streams/{id}— full stream detail including event history.DELETE /api/v1/streams/{id}— end a live stream.
- Analytics —
GET /api/v1/analyticswithperiod(24h/7d/30d) and per-stream filters; platform breakdown and per-stream rows included. - Webhooks —
POST/GET/DELETE /api/v1/webhookswithstream.started,stream.ended, andstream.errorevents, HMAC-SHA256 signature verification (X-TwinTone-Signature), 5-minute replay window, and up to 5 retries with exponential backoff. - Scoped API keys —
tt_live_…/tt_test_…keys with least-privilege scopes (streams:read,streams:write,analytics:read,webhooks:write), created in the dashboard's DEVELOPERS → API Keys section. - Test mode —
tt_test_keys simulate the full request/response lifecycle with no agent dispatch and no billing, so integrations can be built and verified for free. - Unified error envelope — every error returns
{ "error": { "code", "message" } }with stable codes (missing_fields,invalid_fields,invalid_creator,unauthorized,insufficient_scope,vertical_mismatch,not_found,rate_limited,concurrency_limit,db_error,launch_failed). - Brand vertical locking — a stream's
verticalmust match the brand's configured vertical, otherwise the request fails withvertical_mismatch.
Changed
- Nothing — this is the initial release.
Fixed
- Nothing — this is the initial release.
Documentation is versioned with the API. Check this page for updates, or see API pricing and Errors & rate limits for the current contract.
Was this page helpful?