> **For coding agents and LLMs:** This is one published Social Fetch blog post (markdown export). Product docs and API orientation live in [`/llms.txt`](https://www.socialfetch.dev/llms.txt). The HTML article is at the on-site URL below.

## This page

- **On-site (HTML):** [https://www.socialfetch.dev/blog/free-tiktok-youtube-transcript-tools](https://www.socialfetch.dev/blog/free-tiktok-youtube-transcript-tools)
- **Markdown (.mdx) URL:** [https://www.socialfetch.dev/blog/free-tiktok-youtube-transcript-tools.mdx](https://www.socialfetch.dev/blog/free-tiktok-youtube-transcript-tools.mdx)
- **Blog:** [https://www.socialfetch.dev/blog](https://www.socialfetch.dev/blog)

---

# Free TikTok and YouTube transcript tools

You need the spoken text from one video: a quote for a doc, a sanity check on what a creator said, a chunk for an LLM prompt. You do not need a batch worker, a database, or an API key for that.

We run a [free tools](/tools) hub with browser helpers for TikTok and YouTube transcripts. Paste a URL, click a button, copy plain text. No account needed for a spot check.

That is the whole product for a spot check. The rest of this post covers when that is enough, when it is not, and what the tools will not do.

## When the browser tool is enough

Use the free pages when the job is narrow and human: one URL on your clipboard right now, a quick check that a video has captions before you spend credits in a script, or a handful of links for a slide deck rather than a nightly cron over ten thousand URLs.

Start from the hub at `[/tools](/tools)`, or go straight to the tool you need:

- [Free TikTok transcript generator](/tools/tiktok-transcript) accepts standard `/@user/video/…` links, `vm.tiktok.com` short links, and embed URLs.
- [Free YouTube transcript extractor](/tools/youtube-transcript) accepts watch URLs, `youtu.be` links, Shorts, and embed links.

Both pages use the production transcript routes. Your browser is the caller instead of a server with an API key. You get the same caption resolution logic. You do not get unlimited throughput.

> **Rule of thumb**
>
> If you would not put the job on a cron schedule, the browser tool is probably fine. If your product depends on the output, move to the API before you promise a ship date.

## When you need the API

The free pages are rate-limited by design. Move to programmatic calls when you need volume (dozens or hundreds of URLs in one sitting), automation (nightly pulls, webhook handlers, agent loops), or structured output (WebVTT timing cues, millisecond segments, `lookupStatus` in your warehouse instead of pasted plain text).

The browser tools only read existing caption tracks on TikTok. The API accepts `useAiFallback=true` to transcribe audio when no captions exist (+10 credits on a completed lookup). Instagram Reels transcripts are API-only at `GET /v1/instagram/posts/transcript`, with the same auth header and billing model as TikTok and YouTube.

New accounts get 100 free API credits (no card). That is enough to prototype a batch job before you buy a credit pack.

```bash
curl -sS \
  -H "x-api-key: $SOCIALFETCH_API_KEY" \
  "https://api.socialfetch.dev/v1/youtube/videos/transcript?url=https://www.youtube.com/watch?v=dQw4w9WgXcQ"
```

For TikTok with AI fallback when captions are missing:

```bash
curl -sS \
  -H "x-api-key: $SOCIALFETCH_API_KEY" \
  "https://api.socialfetch.dev/v1/tiktok/videos/transcript?url=https://www.tiktok.com/@creator/video/7123456789012345678&useAiFallback=true"
```

Full parameter lists: [YouTube transcript](/docs/api/v1/youtube/videos/transcript/get), [TikTok transcript](/docs/api/v1/tiktok/videos/transcript/get). Auth and error shapes: [Quickstart](/docs/quickstart).

## Caption limits and free lookup caps

We would rather tell you the edge cases upfront than have you discover them mid-demo.

### Manual vs auto captions

Neither YouTube nor TikTok labels tracks as "manual" or "auto" in the response. You get whatever caption file the platform exposes, creator-uploaded or platform speech-to-text. On the API, pass `language=en` when several tracks exist and you need a specific one. There is no "manual only" switch.

YouTube can return `lookupStatus: "found"` with `transcript: null`. The video resolved, but no caption track exists. Common on music-only uploads or when the creator disabled captions. That is "no text available," not a broken lookup.

TikTok is stricter. A large share of videos never had captions enabled. Without AI fallback, those come back as `not_found`.

### AI fallback is API-only

The free browser tools do not run AI transcription. They read existing tracks and return plain text for copying. If you need text from uncaptioned TikToks, call the API with `useAiFallback=true`. That costs 11 credits on a completed lookup (1 base + 10 for fallback). Use it when you need every video in a batch. Skip it when you would rather drop clips without captions.

### Turnstile and per-IP caps

Free lookups are capped per IP address and gated behind Cloudflare Turnstile so the pages stay fast for everyone. That works for a spot check or a dozen URLs. It is not a batch worker.

Scripts, browser extensions, and rapid-fire submits will hit the cap quickly. If you are automating, use an API key from your backend. Paid routes have no request quotas — credits are the only limit. Under extreme concurrency you may get `503` with `Retry-After` (not charged). For large backfills we suggest staying under ~500 concurrent requests.

### Billing on the API path

Credits charge on completed lookups. Reconcile against `meta.creditsCharged`, not your request count. Full rules: [Credits](/docs/credits).

| Outcome | Charged? |
| --- | --- |
| Pre-send validation error (malformed URL) | No |
| `lookup_failed` / HTTP`503` | No |
| HTTP `200` +`lookupStatus: "not_found"` | Yes |
| HTTP `200` +`lookupStatus: "found"` | Yes |

Branch on `data.lookupStatus` in code. HTTP `200` does not mean you got text. We have seen production bugs from teams who assumed it did.

## Browser tool vs API

The free pages and the API use the same transcript routes. When you outgrow pasting URLs in a browser, you do not learn a second system. Add an `x-api-key` header and call those paths from a worker.

Next steps:

1. [TikTok transcript API](/docs/api/v1/tiktok/videos/transcript/get): WebVTT in `transcript.content`, optional AI fallback.
2. [YouTube transcript API](/docs/api/v1/youtube/videos/transcript/get): `plainText` plus `segments` with `startMs` / `endMs`.
3. [Quickstart](/docs/quickstart): auth headers, error envelope, `meta.requestId` for support tickets.
4. [Pricing](/pricing): model credit usage before you parallelize a big backfill.

For a full walkthrough across YouTube, TikTok, and Instagram (caption quirks, batch patterns, RAG chunking), see [How to Get YouTube, TikTok & Instagram Transcripts with One API](/guides/how-to-get-youtube-and-tiktok-transcripts).

Try a URL in the browser first if you want to see what comes back. When the job needs to run on its own, call the API from your backend.
