TwinToneTwinToneAPI Docs

API reference

Streams

Programmatic control of AI-hosted live streams.

MethodPathScope
POST/api/v1/streamsstreams:write
GET/api/v1/streamsstreams:read
GET/api/v1/streams/{id}streams:read
DELETE/api/v1/streams/{id}streams:write

Stream lifecycle

preparing → live → ended ↘ error
StatusMeaningFields populated
preparingStream created, agent is being dispatched to the room.stream_id, room_name, created_at
liveAvatar is streaming to the platform. Billing starts here.+ started_at, viewer_count (live-updating)
endedStream finished (via DELETE, the agent, or the platform). Billing stops.+ ended_at, final viewer_count
errorSomething failed. Inspect events on GET /streams/{id}.+ ended_at, error events

Start a stream

POST /api/v1/streams

Request body

FieldTypeRequiredNotes
creator_idstringCreator to host (see your dashboard marketplace).
product_namestringProduct/game being featured.
platformstringyoutube, tiktok, twitch, kick, facebook, instagram.
scriptstringTalking points / script seed for the host.
verticalstringlive-commerce or igaming. Must match your brand's vertical.

Response 201 Created

{ "stream_id": "a1b2c3d4-e5f6-…", "status": "preparing", "room_name": "stream-a1b2c3d4", "ws_url": "wss://…livekit…", "viewer_token": null, "created_at": "2026-08-07T10:00:00.000Z" }

Test keys: with tt_test_… the stream returns status: "live" immediately (plus "test": true, ws_url: null) — no agent dispatch, no billing — so you can build the full lifecycle integration, including DELETE, without a real stream.

Errors: 400 missing_fields · 400 invalid_creator · 401 unauthorized · 402 plan_required · 403 vertical_mismatch · 429 rate_limited · 429 concurrency_limit


List streams

GET /api/v1/streams?status=live&limit=20&offset=0

ParamDefaultNotes
statusallFilter: preparing, live, ended, error.
limit20Max 100.
offset0For pagination.

Response 200

{ "streams": [ { "id": "…", "status": "live", "platform": "youtube",} ], "total": 47, "limit": 20, "offset": 0 }

Results are newest-first and scoped to your brand.


Get a stream

GET /api/v1/streams/{id}

Response 200

{ "stream_id": "a1b2c3d4-…", "status": "live", "creator_id": "mila", "product_name": "Radiance Serum", "platform": "youtube", "vertical": "live-commerce", "viewer_count": 312, "started_at": "2026-08-07T10:00:14.000Z", "ended_at": null, "room_name": "stream-a1b2c3d4", "events": [ { "type": "stream.started", "created_at": "…" }, { "type": "stream.first_purchase", "created_at": "…" } ] }

404 if the stream doesn't exist or belongs to another brand.


End a stream

DELETE /api/v1/streams/{id}

Ends a live stream immediately and stops billing.

Response 200

{ "stream_id": "a1b2c3d4-…", "status": "ended", "ended_at": "2026-08-07T11:30:00.000Z" }

404 if the stream isn't found or isn't live.

Was this page helpful?