Skip to main content

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.

The core primitive in Overshoot is the Stream. Clients connect any live video source to Overshoot via the Stream. Creating one is straightforward — call /streams with an API key:
curl -X POST https://api.overshoot.ai/v1/streams \
  -H "Authorization: Bearer $OVERSHOOT_API_KEY"
This returns a stream_id and a LiveKit room. Use any LiveKit SDK to join the room and publish your video into it. Our media gateway joins the same room, ingests your stream, and prepares it for inference.
{
  "id": "2ea5a604-d225-4cd2-82ac-b907cb0b4f63",
  "state": "active",
  "publish": {
    "type": "livekit",
    "url": "wss://livekit.overshoot.ai",
    "token": "ey...k"
  },
  "expires_at_ms": 1777529931184,
  "ttl_seconds": 300
}
A Stream holds the state of your live feed as long as it’s alive. Read on for how to keep one alive, and how to kill it.

Stream state

The Stream holds your video as long as it’s alive. If you push no frames, it sits empty. To check the state (e.g. frames received, recent FPS, time to expiry, etc.), call:
curl https://api.overshoot.ai/v1/streams/{stream_id} \
  -H "Authorization: Bearer $OVERSHOOT_API_KEY"
{
  "id": "2ea5a604-d225-4cd2-82ac-b907cb0b4f63",
  "state": "active",
  "stream_time_ms": 12480,
  "first_frame_at_ms": 1777529631184,
  "last_frame_at_ms":  1777529643664,
  "last_frame_index": 312,
  "recent_fps": 25.0,
  "retained_frame_count": 312,
  "evicted_frame_count": 0,
  "expires_at_ms": 1777529931184,
  "ttl_seconds": 300
}
A Stream ends when it expires (5 min idle), gets DELETEd, or gets reaped by the system. Once state flips to ended, it stays ended — there is no resume.

How to keep a stream alive

When Overshoot starts ingesting your stream, we run a fair amount of processing in the background to make every frame available for any model. To avoid leaking sessions, a stream will expire after 5 minutes. To keep it alive, call /keepalive with your stream_id regularly. Every 2 minutes is a safe cadence.
curl -X POST https://api.overshoot.ai/v1/streams/{stream_id}/keepalive \
  -H "Authorization: Bearer $OVERSHOOT_API_KEY"
Each keepalive returns a fresh LiveKit token. Save it — if your publisher disconnects from the room, you’ll need it to rejoin without recreating the stream.

How to kill a stream

DELETE it.
curl -X DELETE https://api.overshoot.ai/v1/streams/{stream_id} \
  -H "Authorization: Bearer $OVERSHOOT_API_KEY"