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: 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