---
title: "Create an idempotent bulk transcript job of up to 500 videos"
method: POST
path: "/v1/jobs"
tags: ["Bulk jobs"]
---

# Create an idempotent bulk transcript job of up to 500 videos

`POST /v1/jobs`

## Request

- Base URL: `https://api.scripthaul.com`
- URL: `https://api.scripthaul.com/v1/jobs`
- Auth: HTTP bearer

With translate=true, each video whose captions YouTube declines to translate is delivered in the job's language for 300 credits per started 10,000 characters of transcript (at most 1,500), on top of the delivery credit, labelled translation: served; nothing extra is charged when it cannot be delivered. That price is never part of the job's reservation. An Idempotency-Key replay keeps the stored choice.

## Headers

- `Idempotency-Key` string

## Request body

- JobCreate
  - `input` string, required: YouTube channel, playlist, video URL, or list: key
  - `contents` 'all' | 'videos' | 'shorts'
  - `offset` integer
  - `video_ids` string[]
  - `format` 'json' | 'clean' | 'timestamped' | 'both' | 'srt' | 'vtt' | 'md'
  - `view` 'clean' | 'timestamped' | 'both'
  - `language` string
  - `fallback` boolean
  - `translate` boolean: When YouTube declines to translate a video's captions, deliver the requested language anyway for 300 credits per started 10,000 characters of transcript (at most 1,500), on top of the delivery credit; nothing extra is charged when it cannot be delivered.
  - `webhook_url` string, uri

## Response `202`

Job accepted, with cold credits reserved when known

## Other responses

- `400`: Typed API error
- `401`: Typed API error
- `402`: Typed API error
- `403`: Typed API error
- `429`: Typed API error

---

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