1. Tutorials
  2. How to scrape YouTube video transcript
  3. JavaScript

How to scrape YouTube video transcript with JavaScript

A JavaScript script that fetches YouTube video transcript and saves them to a file.

Get an API key; the examples use api.socialscrape.dev.

Set up

You need Node 18 or newer. It has fetch built in, so there is nothing to install.

1export SOCIALSCRAPE_API_KEY=ss_live_...

The script

Save as scrape.mjs and run node scrape.mjs. It calls GET /v1/youtube/video/transcript.

1import { writeFileSync } from "node:fs";23const BASE = "https://api.socialscrape.dev/v1/youtube/video/transcript";4const KEY = process.env.SOCIALSCRAPE_API_KEY;5const PARAMS = {6  id: "dQw4w9WgXcQ",7  language: "de",8};910// Follow a path through nested objects; undefined if any step is missing or null.11const pick = (obj, ...path) => path.reduce((o, k) => (o == null ? undefined : o[k]), obj);12const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));1314// One request. Failures cost nothing; retry the ones the API marks retryable.15async function get(params) {16  for (let attempt = 0; attempt < 3; attempt++) {17    const url = new URL(BASE);18    url.search = new URLSearchParams(params).toString();19    const body = await (await fetch(url, { headers: { "x-api-key": KEY } })).json();20    if (body.ok) return body;21    const { code, message, retryable } = body.error;22    if (!retryable || attempt === 2) throw new Error(`${code}: ${message}`);23    await sleep(2 ** attempt * 1000);24  }25}2627const body = await get(PARAMS);28const data = body.data;2930writeFileSync("out.json", JSON.stringify(data, null, 2));31console.log("text:", String(pick(data, "text")).slice(0, 200));32console.log(`saved out.json, credits left: ${body.credits_remaining}`);

How it works

  1. get() sends one request and retries the failures the API marks retryable. A failed request costs nothing.
  2. The result is one object in data.
  3. pick() reads nested fields and gives undefined instead of crashing when the platform returned null.
  4. The whole object goes to out.json and a few fields are printed.

What you get back

These fields come from a recorded sample. The full field list is on the endpoint page.

SampleFields in the script
1{2  "text": "Uns beiden ist die Liebe nicht fremd Du kennst die Regeln genau wie ich Für mich zählst nur du Das kriegst du sonst von keinem hier Ich will dir sagen, wie i..."3}

The short version

Without paging, saving or retries, the request is this.

1const url = new URL("https://api.socialscrape.dev/v1/youtube/video/transcript");2url.search = new URLSearchParams({3  id: "dQw4w9WgXcQ",4  language: "de",5}).toString();6const res = await fetch(url, {7  headers: { "x-api-key": process.env.SOCIALSCRAPE_API_KEY },8});9const body = await res.json();1011if (body.ok) {12  console.log(body.data);13} else {14  console.error(body.error.code, body.error.message);15}

With the SDK

The JavaScript client does the retries for you: see the SDKs.

1import { SocialScrape } from "socialscrape";23const client = new SocialScrape(); // reads SOCIALSCRAPE_API_KEY45const res = await client.youtube.videoTranscript({ id: "dQw4w9WgXcQ", language: "de" });6console.log(res.data);7console.log(res.credits_charged, res.credits_remaining);

What it costs

1 credit for captions; AI transcription 1 up to 2 minutes, then 5 per started minute of the whole video. A failed request costs nothing. Add max_age_days to reuse a cached result for 0 credits. Results are kept 30 days.

Next