Install
openclaw skills install @pratie/bulktranscripts-channel-transcriptsFetch every transcript on a YouTube channel (up to 1,000) as one background bulk job via the BulkTranscripts API, list a channel's videos, or search inside one channel for a topic. Use when the user wants all transcripts from a creator, a knowledge base or RAG corpus built from a channel, or research on what a creator has said. Requires a free BulkTranscripts API key in BULKTRANSCRIPTS_API_KEY, created at https://bulktranscripts.co/app?tab=mcp (Google sign-in, 30 free credits, no card).
openclaw skills install @pratie/bulktranscripts-channel-transcriptsList a channel's videos, then pull the transcripts you need, using BulkTranscripts. Docs · OpenAPI spec · MCP server · Free API key
Base URL: https://bulktranscripts.co
All endpoints are plain GET returning JSON, and every one of them needs an API key — including the free endpoints. Send it as a Bearer token on every request:
curl -s "https://bulktranscripts.co/api/v1/..." \
-H "Authorization: Bearer $BULKTRANSCRIPTS_API_KEY"
If BULKTRANSCRIPTS_API_KEY is not set, ask the user for a key: they sign in
with Google at https://bulktranscripts.co/app?tab=mcp, open the Connect AI
tab, and hit Create key in the API keys card. It is free, includes 30
credits, and needs no card. Keys start with bt_ak_, are shown once, and up to
5 can be live per account. A license key from a credit-pack purchase works as a
Bearer token too.
billing.remaining in every response)channel/latest and account: always freeWhen a call returns HTTP 402 out_of_credits, tell the user their credits are
used up and link them to https://bulktranscripts.co/#pricing (one-time packs,
never expire). Credits follow the Google account, so topping up keeps the same
API key working.
curl -s -X POST "https://bulktranscripts.co/api/v1/bulk" \
-H "Authorization: Bearer $BULKTRANSCRIPTS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.youtube.com/playlist?list=PLAYLIST_ID", "max_videos": 200}'
url takes a playlist, a channel (@handle or URL) or a single video; max_videos
caps the job at up to 1,000. Returns 202 at once with run_id, status,
videos_found (null until a large channel has been listed), the counts and
check_again_in_seconds. The server keeps fetching after the response, into
this account's library. Poll no sooner than check_again_in_seconds:
curl -s "https://bulktranscripts.co/api/v1/bulk/RUN_ID" \
-H "Authorization: Bearer $BULKTRANSCRIPTS_API_KEY"
status ends as completed, or stopped after a server restart (start the
same URL again; everything already fetched is free). quota counts videos not
attempted because credits ran out; skipped counts videos without captions.
Then page the outcomes, metadata only, passing next_cursor back as cursor:
curl -s "https://bulktranscripts.co/api/v1/bulk/RUN_ID/results?limit=100" \
-H "Authorization: Bearer $BULKTRANSCRIPTS_API_KEY"
Each item has video_id, title, channel, duration, word_count and
status (ok, cached, or error with a code). Every ok or cached video is
in the library, so /transcript?video=ID returns its text without a credit.
Two jobs per account at a time. Prefer a job over one-by-one fetches for
anything larger than about 20 videos.
curl -s "https://bulktranscripts.co/api/v1/channel/videos?channel=@HANDLE&limit=100" \
-H "Authorization: Bearer $BULKTRANSCRIPTS_API_KEY"
channel accepts @handle, channel URL, or UC… id.
curl -s "https://bulktranscripts.co/api/v1/channel/search?channel=@HANDLE&q=TOPIC&limit=10" \
-H "Authorization: Bearer $BULKTRANSCRIPTS_API_KEY"
Finds a creator's videos about a topic without listing the whole archive.
curl -s "https://bulktranscripts.co/api/v1/transcript?video=VIDEO_URL_OR_ID" \
-H "Authorization: Bearer $BULKTRANSCRIPTS_API_KEY"
Params: video (watch URL, youtu.be, Shorts, bare 11-char id, or TikTok video
URL) · language (default en) · segments=0 to omit timestamps (smaller) ·
format=txt|md|srt|vtt|csv|ai to get a rendered file instead of JSON ·
fresh=1 to force re-extraction.
Response fields: title, channel, duration, upload_date, language,
source (manual_caption|auto_caption), cached, word_count, text,
paragraphs[] (silence-grouped — best for reading/chunking), segments[]
({text, start, duration}), billing.
Long videos produce long text. For summarization, prefer segments=0 and read
paragraphs.
curl -s "https://bulktranscripts.co/api/v1/account" \
-H "Authorization: Bearer $BULKTRANSCRIPTS_API_KEY"
videos_found count (each new library transcript = 1 credit), poll at
the pace check_again_in_seconds asks for, then read what you need from the
library for free.channel/search for the topic, pick
candidates by title, fetch only those transcripts.Errors come as {"error": {"code", "message"}}. The codes you will actually
hit, and what to do about each:
no_transcript (404) — the video has no captions. Not charged. Skip it and
carry on; in a batch this is normal, not a failure.resolution_failed (400) — a well-formed id or URL that could not be
resolved (nonexistent, private, removed, or region-blocked). Handle it
alongside no_transcript: skip the video and carry on.missing_api_key (401) — no key was sent. Ask the user to create a key at
https://bulktranscripts.co/app?tab=mcp and provide it, then set
BULKTRANSCRIPTS_API_KEY and retry.invalid_api_key (401) — the key sent is not valid. Ask the user to check it
or create a new one at https://bulktranscripts.co/app?tab=mcp.invalid_input (400) — the video / channel / playlist parameter is
missing, not a YouTube/TikTok reference, or otherwise malformed. A caller
bug, not a video problem.out_of_credits (402) — balance exhausted. Tell the user and link
https://bulktranscripts.co/#pricing.rate_limited (429) — respect the Retry-After header before retrying.
Limits are per public IP: 120 requests/min overall, 30/min under /api/v1/
(cache hits and /account count too), so pace bulk fetches at under 30/min.Need everything in one skill (transcripts, search, channels, playlists, monitoring)? Use the full youtube-transcripts skill. Full reference: bulktranscripts.co/docs