video-transcript

Reach for this when a video needs to become text: a pasted YouTube link or ID, a transcribe/summarize/translate request, mining a video for facts, or a bare URL shared with 'what d…

artemchuikin

@artemchuikin

Install

$ openclaw skills install @artemchuikin/video-transcript

Video Transcript

Extract transcripts from videos via TranscriptOut.com.

Setup

If $TRANSCRIPTOUT_API_KEY is not set, read references/auth-setup.md and follow the instructions there to get and store the key.

Required Header

Every request needs one header:

  • Authorization: Bearer $TRANSCRIPTOUT_API_KEY

Every response is one JSON envelope. Success: {"ok": true, "request_id": "...", "data": {...}}. Error: {"ok": false, "code": "...", "detail": "...", "request_id": "..."}. Branch on the machine-readable code, not on the human text. The remaining credit balance rides in the X-Credits-Remaining response header.

GET /v1/transcript · 1 credit

Fetch the transcript of any YouTube video.

curl -s "https://api.transcriptout.com/v1/transcript?video=VIDEO_URL_OR_ID&format=text" \
  -H "Authorization: Bearer $TRANSCRIPTOUT_API_KEY"

Accepts full URLs (youtube.com/watch?v=ID), short URLs (youtu.be/ID), shorts (youtube.com/shorts/ID), or bare video IDs.

Default for agents: use format=text unless you need timestamps. Plain text is the cheapest form to reason over. Use format=json to cite or seek to exact moments. Add video_metadata=true when the title/channel is also wanted: same call, same 1 credit.

ParamRequiredDefaultValues
videoyes-YouTube URL (full/short/shorts) or 11-char video ID
langnoenlanguage code of the track (en, de, ...)
formatnojsonjson, text, srt, vtt, srv3
kindnomanual if presentmanual, auto
segmentnoauto tracks: 180 (80 for srt/vtt). Manual tracks keep the author's lines20-5000, max characters per segment
video_metadatanofalsetrue adds data.metadata (title, channel, duration, views) for the same 1 credit
downloadnofalsetrue returns the raw file instead of the JSON envelope (text/srt/vtt/srv3 only)

segment controls the size of the pieces: 500-1500 characters makes chunks with enough context for embeddings and retrieval. Left out, an auto-generated track is cut into ~180-character segments and a manual track is returned exactly as its author broke it.

Response for format=json. With format=text/srt/vtt/srv3 the transcript field is one string in that format:

{
  "ok": true,
  "request_id": "req_...",
  "data": {
    "video_id": "dQw4w9WgXcQ",
    "language": "en",
    "kind": "manual",
    "transcript": [
      { "text": "Never gonna give you up", "start": 18.0, "duration": 4.12 },
      { "text": "Never gonna let you down", "start": 22.12, "duration": 3.85 }
    ],
    "available_langs": [
      { "code": "en", "kind": "manual", "name": "English" },
      { "code": "en", "kind": "auto", "name": "English (auto-generated)" }
    ]
  }
}

Tips

  • format=text is the cheapest form to reason over. Ask for json only when timestamps matter.
  • Transcript AND title/channel wanted? One call: video_metadata=true. Never a separate /v1/video first.
  • Transcribe last: search and listings are for choosing, and pulling transcripts for a whole results page nobody asked to read is the fastest way to burn a balance.

Errors

CodeMeaningAction
400/422Bad parameterFix the request. Credit refunded automatically
401Bad or missing API keyCheck the key. It must start with sk_
402Out of creditstranscriptout.com/billing
404No captions on that language/track, or bad IDDefinitive answer, do not retry. Try another lang or kind=auto. Billed
410Video removedDo not retry
451Age-restricted or members-onlyDo not retry
429Rate limit (200 req/min per key)Wait, respect Retry-After. Refunded
502Failed on YouTube's sideOne retry is reasonable. Billed
503Service at capacityRetry after Retry-After. Refunded

Every error body carries a machine-readable code and a request_id. Include the request_id when contacting support.

Top skills in this category