Scribiz YouTube captions API

The YouTube captions API from Scribiz — 6 operation(s) for youtube captions.

GitHub OpenAPI

Operations 7

POST /v1/youtube-captions/preview Discover and quote raw YouTube captions #
POST /v1/youtube-captions/batches Queue selected videos for raw caption retrieval #
DELETE /v1/youtube-captions/batches/{id} Cancel unresolved caption items #
GET /v1/youtube-captions/batches/{id} Read private paged caption progress #
POST /v1/youtube-captions/batches/{id}/resume Retry unfinished retrievable items #
GET /v1/youtube-captions/batches/{id}/items/{index}/result Read one private canonical raw caption result #
GET /v1/youtube-captions/batches/{id}/export Stream ordered private caption exports #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/scribiz:scribiz-youtube-captions-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

scribiz-youtube-captions-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Scribiz YouTube captions API
  version: 1.0.0
  description: 'Operations tagged YouTube captions across 2 of this provider''s published API definitions: openapi.json, scribiz-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
  url: https://scribiz.com/api
tags:
- name: YouTube captions
paths:
  /v1/youtube-captions/preview:
    post:
      operationId: previewYouTubeCaptions
      security:
      - apiKey: []
      - bearer: []
      - cookie: []
      summary: Discover and quote raw YouTube captions
      tags:
      - YouTube captions
      description: Requires an account. Accepts video, playlist, channel and multiple links. Returns ordered selectable metadata, discovery errors/truncation, cached/new counts and maximum cost. No video/audio downloads or model work.
      requestBody:
        content:
          application/json:
            schema:
              additionalProperties: false
              properties:
                language:
                  description: Original caption language preference; no translation.
                  type: string
                urls:
                  items:
                    maxLength: 2048
                    type: string
                  maxItems: 1000
                  minItems: 1
                  type: array
                limit:
                  maximum: 1000
                  minimum: 1
                  type: integer
              required:
              - urls
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  limits:
                    properties:
                      acquisition:
                        properties:
                          reached:
                            type: boolean
                          resets_at:
                            description: Next midnight UTC in epoch milliseconds.
                            type: integer
                        required:
                        - reached
                        - resets_at
                        type: object
                      max_batch_items:
                        type: integer
                      max_items:
                        type: integer
                    required:
                    - acquisition
                    - max_batch_items
                    - max_items
                    type: object
                type: object
          description: Selection and maximum quote.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '410':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
  /v1/youtube-captions/batches:
    post:
      operationId: createYouTubeCaptionBatch
      security:
      - apiKey: []
      - bearer: []
      - cookie: []
      summary: Queue selected videos for raw caption retrieval
      tags:
      - YouTube captions
      description: Submit the selected individual video URLs from preview. One new successfully delivered caption transcript uses one caption credit regardless of duration; failed/partial/canceled/cached/already-delivered results use zero. Caption reservations are atomic and separate from media minutes. Daily retrieval limits produce retryable RATE_LIMIT item errors with no caption charge; resume after midnight UTC. Maximum 1,000 selected videos; two batches/account.
      parameters:
      - in: header
        name: Idempotency-Key
        required: false
        schema:
          maxLength: 200
          type: string
      requestBody:
        content:
          application/json:
            schema:
              additionalProperties: false
              properties:
                language:
                  description: Original caption language preference; no translation.
                  type: string
                urls:
                  items:
                    maxLength: 2048
                    type: string
                  maxItems: 1000
                  minItems: 1
                  type: array
              required:
              - urls
              type: object
        required: true
      responses:
        '202':
          content:
            application/json:
              schema:
                properties:
                  batch_id:
                    type: string
                  caption_credits_charged:
                    type: integer
                  counts:
                    description: Total and per-status item counts.
                    type: object
                  created_at:
                    type: integer
                  estimate:
                    description: Maximum caption credits including successful deliveries and remaining reservations. One credit per new success; minutes are zero.
                    type: object
                  expires_at:
                    type: integer
                  items:
                    items:
                      description: Ordered item metadata/status/error, has_result, cache_hit, caption_credits_charged, minutes_charged; transcript bodies are exported separately.
                      type: object
                    type: array
                  language:
                    type: string
                  minutes_charged:
                    const: 0
                  next_cursor:
                    type: string
                  status:
                    enum:
                    - queued
                    - running
                    - completed
                    - canceled
                required:
                - batch_id
                - status
                - counts
                - items
                - minutes_charged
                - estimate
                - expires_at
                type: object
          description: Queued or idempotently replayed batch.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Not enough unreserved caption credits.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '410':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Invalid selection or reused idempotency key.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
  /v1/youtube-captions/batches/{id}:
    delete:
      operationId: cancelYouTubeCaptionBatch
      security:
      - apiKey: []
      - bearer: []
      - cookie: []
      summary: Cancel unresolved caption items
      tags:
      - YouTube captions
      description: Retains completed results and their charges; releases all unresolved reservations. Does not erase delivered results.
      parameters:
      - description: The owner-scoped caption batch id.
        in: path
        name: id
        required: true
        schema:
          type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  batch_id:
                    type: string
                  caption_credits_charged:
                    type: integer
                  counts:
                    description: Total and per-status item counts.
                    type: object
                  created_at:
                    type: integer
                  estimate:
                    description: Maximum caption credits including successful deliveries and remaining reservations. One credit per new success; minutes are zero.
                    type: object
                  expires_at:
                    type: integer
                  items:
                    items:
                      description: Ordered item metadata/status/error, has_result, cache_hit, caption_credits_charged, minutes_charged; transcript bodies are exported separately.
                      type: object
                    type: array
                  language:
                    type: string
                  minutes_charged:
                    const: 0
                  next_cursor:
                    type: string
                  status:
                    enum:
                    - queued
                    - running
                    - completed
                    - canceled
                required:
                - batch_id
                - status
                - counts
                - items
                - minutes_charged
                - estimate
                - expires_at
                type: object
          description: Canceled batch snapshot.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '410':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
    get:
      operationId: getYouTubeCaptionBatch
      security:
      - apiKey: []
      - bearer: []
      - cookie: []
      summary: Read private paged caption progress
      tags:
      - YouTube captions
      parameters:
      - description: The owner-scoped caption batch id.
        in: path
        name: id
        required: true
        schema:
          type: string
      - description: Next item index returned as next_cursor.
        in: query
        name: cursor
        schema:
          type: string
      - in: query
        name: limit
        schema:
          default: 100
          maximum: 100
          minimum: 1
          type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  batch_id:
                    type: string
                  caption_credits_charged:
                    type: integer
                  counts:
                    description: Total and per-status item counts.
                    type: object
                  created_at:
                    type: integer
                  estimate:
                    description: Maximum caption credits including successful deliveries and remaining reservations. One credit per new success; minutes are zero.
                    type: object
                  expires_at:
                    type: integer
                  items:
                    items:
                      description: Ordered item metadata/status/error, has_result, cache_hit, caption_credits_charged, minutes_charged; transcript bodies are exported separately.
                      type: object
                    type: array
                  language:
                    type: string
                  minutes_charged:
                    const: 0
                  next_cursor:
                    type: string
                  status:
                    enum:
                    - queued
                    - running
                    - completed
                    - canceled
                required:
                - batch_id
                - status
                - counts
                - items
                - minutes_charged
                - estimate
                - expires_at
                type: object
          description: Batch snapshot.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '410':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
  /v1/youtube-captions/batches/{id}/resume:
    post:
      operationId: resumeYouTubeCaptionBatch
      security:
      - apiKey: []
      - bearer: []
      - cookie: []
      summary: Retry unfinished retrievable items
      tags:
      - YouTube captions
      description: Completed/canceled batches only. Retries retryable failures, partial items and canceled items; successful items are retained and never charged again. indexes narrows selection. A fresh quote reserves only unpaid items.
      parameters:
      - description: The owner-scoped caption batch id.
        in: path
        name: id
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              additionalProperties: false
              properties:
                indexes:
                  items:
                    maximum: 999
                    minimum: 0
                    type: integer
                  maxItems: 1000
                  type: array
              type: object
        required: false
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  batch_id:
                    type: string
                  caption_credits_charged:
                    type: integer
                  counts:
                    description: Total and per-status item counts.
                    type: object
                  created_at:
                    type: integer
                  estimate:
                    description: Maximum caption credits including successful deliveries and remaining reservations. One credit per new success; minutes are zero.
                    type: object
                  expires_at:
                    type: integer
                  items:
                    items:
                      description: Ordered item metadata/status/error, has_result, cache_hit, caption_credits_charged, minutes_charged; transcript bodies are exported separately.
                      type: object
                    type: array
                  language:
                    type: string
                  minutes_charged:
                    const: 0
                  next_cursor:
                    type: string
                  status:
                    enum:
                    - queued
                    - running
                    - completed
                    - canceled
                required:
                - batch_id
                - status
                - counts
                - items
                - minutes_charged
                - estimate
                - expires_at
                type: object
          description: Resumed snapshot.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Not enough unreserved caption credits.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Batch is still running.
        '410':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
  /v1/youtube-captions/batches/{id}/items/{index}/result:
    get:
      operationId: getYouTubeCaptionResult
      security:
      - apiKey: []
      - bearer: []
      - cookie: []
      summary: Read one private canonical raw caption result
      tags:
      - YouTube captions
      description: Returns the stored VideoContext without upstream calls or charges. Owner, expiry and takedown checks apply.
      parameters:
      - description: The owner-scoped caption batch id.
        in: path
        name: id
        required: true
        schema:
          type: string
      - in: path
        name: index
        required: true
        schema:
          maximum: 999
          minimum: 0
          type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Context'
          description: Raw caption context.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Result is not ready.
        '410':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
  /v1/youtube-captions/batches/{id}/export:
    get:
      operationId: exportYouTubeCaptionBatch
      security:
      - apiKey: []
      - bearer: []
      - cookie: []
      summary: Stream ordered private caption exports
      tags:
      - YouTube captions
      description: TXT/Markdown combined output, ZIP with per-video TXT/SRT and JSON/CSV manifest, or JSON/CSV manifest only. index selects one completed item; SRT/VTT require index. Rechecks ownership, expiry and takedowns while streaming. Exporting is free.
      parameters:
      - description: The owner-scoped caption batch id.
        in: path
        name: id
        required: true
        schema:
          type: string
      - in: query
        name: format
        schema:
          default: zip
          enum:
          - zip
          - md
          - txt
          - csv
          - json
          - srt
          - vtt
      - in: query
        name: index
        schema:
          maximum: 999
          minimum: 0
          type: integer
      responses:
        '200':
          content:
            application/octet-stream:
              schema:
                format: binary
                type: string
          description: Private streamed attachment.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Selected item has no completed result.
        '410':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Request refused.
    servers:
    - description: 'The one public base for every client: https://scribiz.com/api (Better Auth at /api/auth, remote MCP at https://scribiz.com/mcp). The proxy routes both paths to this API.'
      url: https://scribiz.com/api
components:
  schemas:
    Error:
      properties:
        error:
          additionalProperties: true
          properties:
            code:
              description: snake_case.
              type: string
            engineCode:
              description: The engine's own code (QUOTA, SOURCE_UNAVAILABLE, ...) when there is one.
              type: string
            hint:
              type: string
            message:
              type: string
          required:
          - code
          - message
          type: object
      required:
      - error
      type: object
    Context:
      description: 'The result of a video: transcript, what was on screen, summary and chapters. Times are seconds. The same JSON the CLI writes with --format json.'
      properties:
        coverage:
          type: object
        id:
          description: youtube:<id>, instagram:<id>, ... or local:<key> for an upload.
          type: string
        meta:
          type: object
        produced:
          type: object
        schema:
          const: 1
        source:
          type: object
        synthesis:
          type:
          - object
          - 'null'
        tiers:
          items:
            type: object
          type: array
        transcript:
          type:
          - object
          - 'null'
        usage:
          type: object
        visual:
          type:
          - object
          - 'null'
        warnings:
          items:
            type: object
          type: array
      required:
      - schema
      - id
      - meta
      - source
      - transcript
      - visual
      - synthesis
      - tiers
      - usage
      - warnings
      type: object
  securitySchemes:
    apiKey:
      description: 'An API key (sbz_live_...), as X-API-Key. Keys are made in the dashboard or by `scribiz login`. Each key has one scope, named in an operation''s security requirement. `all`: Everything a key can do: start jobs, upload, ask, cancel, the Gemini proxy and listing keys. Includes read. `mcp`: The remote MCP server at /mcp. Includes read. `read`: Read jobs and their events.'
      in: header
      name: X-API-Key
      type: apiKey
      x-scopes:
        all: 'Everything a key can do: start jobs, upload, ask, cancel, the Gemini proxy and listing keys. Includes read.'
        mcp: The remote MCP server at /mcp. Includes read.
        read: Read jobs and their events.
    bearer:
      description: 'An API key (sbz_live_...) or a session token from the device flow. Each key has one scope, named in an operation''s security requirement. `all`: Everything a key can do: start jobs, upload, ask, cancel, the Gemini proxy and listing keys. Includes read. `mcp`: The remote MCP server at /mcp. Includes read. `read`: Read jobs and their events. A session token has every scope.'
      scheme: bearer
      type: http
      x-scopes:
        all: 'Everything a key can do: start jobs, upload, ask, cancel, the Gemini proxy and listing keys. Includes read.'
        mcp: The remote MCP server at /mcp. Includes read.
        read: Read jobs and their events.
    cookie:
      description: The browser session (same-origin /api/*).
      in: cookie
      name: better-auth.session_token
      type: apiKey
x-refined-from:
- openapi.json
- scribiz-openapi.json