---
title: "Extract up to 10 video URLs in one call"
method: POST
path: "/v1/batch"
---

# Extract up to 10 video URLs in one call

`POST /v1/batch`

## Request

- Base URL: `https://framefetch.net`
- URL: `https://framefetch.net/v1/batch`
- Auth: HTTP bearer

Fans out to the same engine as /v1/extract with bounded concurrency. Each url is SSRF-validated and processed independently: a failing url returns { url, ok:false, error } without failing the batch. Billed per SUCCESSFUL item at that item's own cost; failed items are not billed. Auth, balance and rate-limit are enforced once at the batch level (one rate token per call). Frames/text_overlay need a per-url frames spec, which batch does not accept — request those via /v1/extract.

## Request body

- BatchRequest
  - `urls` string[], required: 1–10 supported-platform video URLs.
  - `fields` string[]: Applied to every url. digest, delta, structured, audio_digest, comments and comment_sentiment work in batch (audio_digest always uses the default "alloy" voice — batch does not accept a top-level voice or translate param; comments always uses the default cap of 30 — batch does not accept a top-level comments_cap); frames/text_overlay need a per-url frames spec (not accepted here) — use /v1/extract for those.

## Response `200`

Per-url results, in input order

- BatchResult
  - `results` object[]: One entry per input url, in order. On ok:true the ExtractResult fields are spread alongside url and ok; on ok:false an error object is included instead.
    - `url` string, required
    - `ok` boolean, required
    - `error` object
      - `code` string
      - `message` string
      - `hint` string

## Other responses

- `400`: Error envelope
- `401`: Error envelope
- `402`: Error envelope
- `429`: Error envelope

---

[API](https://skmtc.dev/framefetch/apis/framefetch-api.md) · [All operations](https://skmtc.dev/framefetch/apis/framefetch-api/llms.txt) · [OpenAPI document](https://skmtc.dev/framefetch/apis/framefetch-api/revisions/5584e8eb9bf5?raw)
