x402 v2 · Base mainnet · USDC

Captions in every language. One call.

Your agent sends a link to a video or audio file and gets timed SRT and WebVTT subtitles back: the spoken language plus any translations it asks for, including regional ones like Québécois French. Pay per minute in USDC. No account, no upload step.

Today we visit Quebec City in winter.
Aujourd'hui, on visite Québec en hiver.

Pricing

Captions$0.05 / minute in the spoken language (57 languages, auto-detected).
Translations+$0.02 / minute per extra language, up to 5 per video.
Fair billing$0.10 minimum, up to 30 minutes. Exact quote before you pay; charged only on success.

Caption a video

GET https://caption402.com/api/captions?url=https://example.com/video.mp4&translate=fr-CA,es

→ 402 Payment Required (exact price from the video's length) → pay with any x402 client → 200
{ "language": "en", "duration_s": 21.2, "cues": 5,
  "captions": {
    "en":    { "srt": "1\n00:00:00,400 --> 00:00:02,910\nWelcome to our travel channel.\n...", "vtt": "WEBVTT...", "srt_url": "...", "vtt_url": "..." },
    "fr-CA": { "srt": "1\n00:00:00,400 --> 00:00:02,910\nBienvenue sur notre chaîne de voyage.\n...", ... },
    "es":    { ... } },
  "text": "Welcome to our travel channel. Today we visit Quebec City in winter. ..." }

Subtitles follow broadcast habits: at most two lines of about 42 characters, cues of up to 6 seconds, split at sentence ends. Translations keep the exact same timing. Add vocabulary= with names or product terms to spell them right, or include_words=1 for word-level timestamps.

Free before paying: see a sample result · languages · price check: /api/captions/quote?url=...&translate=...

Quick start (Node)

import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const pay = wrapFetchWithPayment(fetch, new x402Client().register("eip155:*", new ExactEvmScheme(privateKeyToAccount(process.env.AGENT_KEY))));
const r = await pay("https://caption402.com/api/captions?url=" + encodeURIComponent("https://example.com/video.mp4") + "&translate=fr-CA");
const { captions } = await r.json();   // captions.en.srt, captions["fr-CA"].vtt ...

Rules

Direct links to media files only (mp4, mov, webm, mkv, mp3, m4a, wav, ogg...). Links to YouTube, TikTok, Netflix and other streaming or social platforms are refused. Only submit media you own or have the right to caption. Invalid links, unreadable files and failed jobs are never charged. Terms of use · Abuse and copyright reports: abuse@caption402.com

For agents

/llms.txt · Agent skill · /.well-known/x402 · /openapi.json