Skip to main content
A session is one submitted game and everything the pipeline produced for it. The same object shape is returned by every endpoint and inside every webhook event, so you parse it once.

Sources

POST /v1/sessions takes a source. type is optional — Hooper derives it from the URL, and a Veo link is always routed to the Veo path even if you say url.
Two calls: create an upload, PUT the bytes to the returned resumable URL, then submit.
Submitting before the bytes have landed returns 409 upload_incomplete.

Options

Limits

The API accepts the same envelope a Hooper mobile recording produces: Where the size is knowable at submit (an upload’s blob size, a URL’s Content-Length) an oversize video is refused with 400 video_too_large and nothing is held. Resolution is only known once the video is downloaded and probed; if it exceeds the limit the session ends in failed with error.code = "video_too_large", the credit hold is voided (nothing is charged) and any uploaded bytes are deleted.

Lifecycle

A job that never reports back is swept after 24 hours: the session fails with error.code = "timeout", the hold is voided, and you still receive a session.failed event.

The session object

Things worth knowing:
  • Highlights are the product. Each is a cut clip linked to its shot and its player (the scorer).
  • Embedded lists cap at 100 items. has_more: true means page the url with limit / offset.
  • Cross-links are ids: shot.highlighthl_…, shot.players.scorer / highlight.playerplr_… matching players.data[].id.
  • A queued, processing or failed session has the same keys with empty lists — never a missing field.
  • Attribution ignores tags the pipeline marked invalid, using the same rule as the box score, so a shot’s players and a player’s stats always agree.

Idempotency

Send an Idempotency-Key header (any string ≤ 255 chars) on POST /v1/sessions. Replaying the same key with the same body within 24 hours returns the original response with an Idempotent-Replayed: true header; the same key with a different body returns 400 idempotency_key_reused. Concurrent requests with the same key are safe: exactly one session is created, and the others receive its response (or a retryable 409 idempotency_key_in_progress if it hasn’t finished yet). Retrying a 5xx with the same key is also safe — the replay finishes any step the failed attempt left undone. Use your own match id.