Skip to main content
POST
/
streams
Create stream
curl --request POST \
  --url https://api.overshoot.ai/v1/streams \
  --header 'Authorization: Bearer <token>'
{
  "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "state": "active",
  "publish": {
    "type": "livekit",
    "url": "<string>",
    "token": "<string>"
  },
  "expires_at_ms": 123,
  "ttl_seconds": 123
}

Documentation Index

Fetch the complete documentation index at: https://docs.overshoot.ai/llms.txt

Use this file to discover all available pages before exploring further.

What you get

The response carries:
  • id — pass this in every later URL: /v1/streams/{id}/... plus stream URLs you embed in chat completion messages.
  • publish.url + publish.token — feed these to a LiveKit client SDK to connect a video source. Any LiveKit publisher works (browser, native, server-to-server). The token is short-lived; use the one returned by /keepalive if your publisher reconnects later.
  • expires_at_ms + ttl_seconds — the lease deadline. Call /keepalive before it elapses (every ~2 minutes is safe). After expiry the stream’s state flips to ended and stays there.
The stream sits in active state immediately, even before the first frame arrives. GET /streams/{id} returns last_frame_at_ms: null until a publisher actually delivers a frame.

Authorizations

Authorization
string
header
required

All requests must include Authorization: Bearer <api_key>. Get a key from the Overshoot dashboard. Listing models (GET /models) does not require auth.

Response

Stream created.

id
string<uuid>
required

Unique stream identifier. Use this in every subsequent stream URL.

state
enum<string>
required

Always active for a freshly created stream.

Available options:
active
publish
object
required

WebRTC publish target. Connect with the LiveKit client SDK.

expires_at_ms
integer
required

Wall-clock Unix ms when the lease will expire if not renewed via /keepalive.

ttl_seconds
integer
required

Lease TTL in seconds. Currently 300 for all streams.