youtube-transcript
Fetches YouTube video transcripts and saves them as clean text. Uses API or local tools to ensure quality output.
What it does
This tool extracts the spoken text from a YouTube video and saves it to a plain text file. It first tries to use a service called DeepAPI, and if that doesn't work, it uses a tool called yt-dlp.
When to use it
- ✓When you want the text from a YouTube video to read or copy.
- ✓When you need the captions of a video for better understanding.
- ✓When you want the spoken content of a video without having to watch it.
Example of what to ask your AI
“Get me the transcript for the YouTube video: [video link]”
Want more? Open the sections below.
How to use
The easiest way: copy the message below and paste it into Claude, ChatGPT, Cursor or any AI. It reads the skill and follows the instructions.
Skill link
Ready-to-paste message
How it works
The AI accesses the YouTube video and fetches the captions or transcribed audio. It then cleans up this text and saves it into a file.
Installation
Easiest way: copy the skill link and paste it into Claude, ChatGPT or Cursor asking it to follow the instructions.
In the terminal (Claude Code, Codex, Cursor), in your project folder:
npx skills add sickn33/agentic-awesome-skills --skill youtube-transcriptOr download just the file:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/youtube-transcript/SKILL.md -o SKILL.mdTechnical content (original SKILL.md)
Original text by the author, straight from GitHub.
YouTube Transcript (via DeepAPI, yt-dlp fallback)
When to Use
- Use when the user asks for a YouTube transcript, captions, subtitles, or spoken-content extraction.
- Use when DeepAPI or a local fallback can fetch the transcript safely.
Fetch a YouTube video's transcript and save a clean raw .txt file. Primary path is DeepAPI POST /v1/scrape/youtube/transcript. It runs server-side, so it avoids the local-IP bot flagging that plagues yt-dlp.
Save location
- If the user is in a real project/working dir → save there.
- Otherwise (no dir given, or cwd makes no sense) → save to
~/Downloads. - Always name the file
Channel_Titlewith spaces replaced by_(e.g.David_Ondrej_title_of_video.txt). If metadata is unavailable, fall back to the video ID.
Primary path — DeepAPI
DEEPAPI_API_KEY must already be present in the environment. Do not read shell
startup files or print secrets:
test -n "$DEEPAPI_API_KEY" || { echo "DEEPAPI_API_KEY is not set"; exit 1; }
BASE=${DEEPAPI_API_BASE_URL:-https://deepapi.co}
Run the scrape (keep the Idempotency-Key; retries must reuse the SAME one):
IDK=$(uuidgen)
curl -s --max-time 120 "$BASE/v1/scrape/youtube/transcript" \
-H "Authorization: Bearer $DEEPAPI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $IDK" \
-d '{"url": "VIDEO_URL", "maxCostUsd": "0.05", "waitForFinishSecs": 60}' \
> /tmp/yt_transcript.json
- Non-English videos: add
"language": "de"(etc.) to the body. status: running→ waitnext.afterSecs, thencurl "$BASE$(jq -r '.next.path' /tmp/yt_transcript.json)" -H "Authorization: Bearer $KEY"untilsucceededorfailed.
Extract the text and save it:
jq -r '.status' /tmp/yt_transcript.json # succeeded | running | failed
jq -r '.output[0].text' /tmp/yt_transcript.json > "$OUT/$NAME.txt"
jq -r '.debitMicrousd' /tmp/yt_transcript.json # cost (50000 = $0.05)
.output[0].segments also has timed segments (startSecs, durationSecs, text) if the user wants timestamps. Empty output = video has no captions; report it, don't retry.
For the Channel_Title filename, get metadata with a quick yt-dlp --print "%(channel)s|%(title)s" --skip-download "URL"; if that fails, use the video ID.
When to fall back to yt-dlp
DEEPAPI_API_KEYmissing from the environment.- HTTP 402
insufficient_credits(tell the user to top up at deepapi.co/credits first; fall back only if they're unavailable). - DeepAPI request
failedtwice.
Tell the user whenever you fall back — a fallback means the product missed a real use case.
Fallback path — yt-dlp (local)
OUT="$(pwd)" # or ~/Downloads if cwd makes no sense
META=$(yt-dlp --print "%(channel)s|%(title)s" --skip-download "URL")
NAME=$(echo "$META" | tr '| ' '__' | tr -cd '[:alnum:]_.-') # "Channel_Title", spaces -> _, strip unsafe chars
yt-dlp --skip-download --write-subs --write-auto-subs \
--sub-langs "en.*" --sub-format json3 \
-o "$OUT/$NAME.%(ext)s" "URL"
- Fall back
channel→uploader→uploader_idifchannelis null. --skip-download= captions only.--write-subs+--write-auto-subs= manual first, auto as fallback.- Always use
json3, never VTT/SRT — auto VTT repeats every line twice (rolling captions).
Flatten json3 → raw text:
python3 - "$OUT" <<'PY'
import json, html, re, glob, sys, pathlib
f = glob.glob(sys.argv[1] + "/*.json3")
if not f: sys.exit("no json3 file")
data = json.load(open(f[0], encoding="utf-8"))
parts = ["".join(s.get("utf8","") for s in e.get("segs") or []) for e in data.get("events", [])]
txt = re.sub(r"\s+", " ", html.unescape(" ".join(p.strip() for p in parts if p.strip()))).strip()
out = pathlib.Path(f[0]).with_suffix(".txt")
out.write_text(txt, encoding="utf-8"); print(out)
PY
yt-dlp failure handling
- Non-English / unknown language: run
yt-dlp --list-subs "URL"first, then set--sub-langs. - Newer yt-dlp may need
denoon PATH for YouTube extraction. - On first failure: run
yt-dlp -Uonce, retry once, then stop. - 429 / "Sign in to confirm you're not a bot" = IP flagged. STOP — do NOT retry in a loop (makes it worse).
- Never fall back to downloading audio for Whisper unless the user explicitly asks.
Output
Report the saved path; print the text if short. If DeepAPI was used, also report the cost in dollars.
Limitations
…
FAQ
What happens if the video has no captions?
If the video has no captions available, the tool will report that it couldn't extract the text.
Where will the text file be saved?
The file will be saved in your Downloads folder, or in your project folder if you are working on one. The filename will be the channel and video title, with spaces replaced by underscores.
Does the tool cost anything?
The DeepAPI service might have a very small cost (less than 5 cents per video), which the AI will report. If using the local tool (yt-dlp), there is usually no cost.
Details
Original description by the author
Fetch YouTube transcripts through DeepAPI or local fallback tooling and save clean text output.
Popularity
- GitHub stars
- 48k
- Ranking position
- #4619
- License
- MIT
- Updated
- 10/15/2026
Comments
- …
More skills from this repository
00-andruia-consultant
Helps your agent start or improve AI projects. It analyzes code, suggests tools, and creates action plans in Spanish.
sickn33/agentic-awesome-skills
007
Lets your agent perform security audits and threat modeling. It's useful for protecting projects against attacks and vulnerabilities.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Helps your agent create or improve AI tools. It defines how tools work, writes documentation, and validates the structure.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Lets your agent create a summary about a specific industry. It's useful for understanding the context, rules, usage patterns, and risks of a project, using reliable sources.
sickn33/agentic-awesome-skills
Similar skills
dashboard-builder
Helps your agent create useful monitoring dashboards. It turns data into charts that answer important system questions.
affaan-m/ECC
dev-team
Simulates a collaborative development team where different roles respond to a problem together. It's useful for getting multiple perspectives without manually switching agents.
affaan-m/ECC
ecc-council
Has your agent convene a four-voice council for difficult decisions. It's useful when there are multiple good options and debate is needed before choosing.
affaan-m/ECC