> **For coding agents and LLMs:** This is one page from the Social Fetch docs (markdown export). For curated orientation and workflow guidance, start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for agent onboarding and crawl rules, use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for the full endpoint list with links to pages like this one, use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt); for one platform's parameters and curls, use [`/llms-{platform}.txt`](https://www.socialfetch.dev/llms-tiktok.txt); use [`/llms.json`](https://www.socialfetch.dev/llms.json) when you need structured JSON for tool registration.

## This page

- **On-site (HTML):** [https://www.socialfetch.dev/docs/recipes/video-transcription](https://www.socialfetch.dev/docs/recipes/video-transcription)
- **Markdown (.mdx) URL:** [https://www.socialfetch.dev/docs/recipes/video-transcription.mdx](https://www.socialfetch.dev/docs/recipes/video-transcription.mdx)

## API base URL and authentication

- **API origin (from OpenAPI `servers`):** `https://api.socialfetch.dev`
- **Authentication:** send `x-api-key: sfk_...` on `/v1/**` routes unless the operation is explicitly anonymous (check OpenAPI `security`, the [API reference hub](https://www.socialfetch.dev/docs/api.mdx), [`/llms.txt`](https://www.socialfetch.dev/llms.txt), or [`/llms.json`](https://www.socialfetch.dev/llms.json) for each route).
- **OpenAPI JSON:** [https://www.socialfetch.dev/openapi.json](https://www.socialfetch.dev/openapi.json)

## Recommended docs entrypoints (this site)

- [Documentation overview](https://www.socialfetch.dev/docs.mdx) — top-level orientation (markdown).
- [Quickstart](https://www.socialfetch.dev/docs/quickstart.mdx) — authenticate with `x-api-key`, validate auth with `whoami`, and understand the JSON envelope.
- [SDK](https://www.socialfetch.dev/docs/sdk.mdx) — official TypeScript SDK guide, including `SocialFetchClient`, `Result`, and `unwrap()`.
- [SDK reference](https://www.socialfetch.dev/docs/sdk-reference.mdx) — exhaustive SDK method inventory and route mapping for agents, tooling, and power users.
- [Choose the right endpoint](https://www.socialfetch.dev/docs/choose-endpoint.mdx) — task-oriented route selection for smoke tests, profiles, list endpoints, and single-item lookups.
- [Capability matrix](https://www.socialfetch.dev/docs/capability-matrix.mdx) — fast comparison of identifiers, pagination, outcomes, media download, and SDK coverage.
- [Recipes](https://www.socialfetch.dev/docs/recipes.mdx) — copyable workflows (brand monitoring, transcripts, Ad Library, creator scoring, Reddit research) with credit callouts and SDK examples.
- [Integrations](https://www.socialfetch.dev/docs/integrations.mdx) — MCP for AI clients, n8n verified node, Apify Store Actors, SDK, and REST API connection paths.
- [MCP product page](https://www.socialfetch.dev/mcp) — hosted MCP overview, OAuth, Skills install.
- [MCP integration](https://www.socialfetch.dev/docs/integrations/mcp.mdx) — hosted `/mcp` server, OAuth, Cursor/VS Code/Claude install snippets, 137 endpoint tools, plus docs_search/docs_read for implementation help.
- [n8n integration](https://www.socialfetch.dev/docs/integrations/n8n.mdx) — install `n8n-nodes-socialfetch`, credentials, and workflow examples.
- [Apify integration](https://www.socialfetch.dev/docs/integrations/apify.mdx) — Store Actors under @social-fetch, PPE billing, dataset export, and quick start.
- [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt) — every documented operation with a direct link to that route's agent-readable markdown page (prefer this over parsing OpenAPI).
- [`/llms-{platform}.txt`](https://www.socialfetch.dev/llms-tiktok.txt) — per-platform endpoint files generated from OpenAPI (parameters, credits, curls).
- [`/agents.txt`](https://www.socialfetch.dev/agents.txt) — agent crawl/onboarding file with capabilities, auth rules, and allowlist.
- [`/llms.json`](https://www.socialfetch.dev/llms.json) — structured machine-readable operation inventory with parameter names, pagination, outcomes, credits, and SDK mapping.
- [API reference hub](https://www.socialfetch.dev/docs/api.mdx) — human-friendly index of operations with links into generated pages.
- [Errors](https://www.socialfetch.dev/docs/errors.mdx) — shared error envelope and HTTP status guidance.
- [Credits](https://www.socialfetch.dev/docs/credits.mdx) — metering, `402`, and planning batch jobs.
- Outcome semantics such as `found`, `not_found`, and `private` are documented in [Errors](https://www.socialfetch.dev/docs/errors.mdx) and on operation pages when present in the OpenAPI contract.

## Markdown docs convention

- Every docs page has a markdown twin: append **`.mdx`** to the docs pathname (for example `/docs/quickstart` → `/docs/quickstart.mdx`).
- Agents that send `Accept: text/markdown` on `/docs/**` HTML URLs may receive markdown directly (same URL, `Vary: Accept`).

---
# Video transcription pipeline (https://www.socialfetch.dev/docs/recipes/video-transcription)

Turn public video URLs into text you can store, search, or feed to an LLM. Three platforms, three routes, one auth header. Response shapes differ; normalize in your app.

**You'll need** an [API key](https://app.socialfetch.dev/api-keys) and the [TypeScript SDK](/docs/sdk). MCP tools map 1:1 to these routes after OAuth.

Credit budget

  YouTube and Instagram transcripts are typically **1 credit** per completed lookup. TikTok is **1 credit**, or **up to 11** when `useAiFallback=true` (base +10). Completed `not_found` attempts still bill. `lookup_failed` / `503` do not.

Pre-check with [`GET /v1/balance`](/docs/api/v1/balance) before large batches.

Routes

| Platform                          | Route                                                                               | SDK                                                                    | Notes                                                                  |
| --------------------------------- | ----------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| [YouTube](/platforms/youtube)     | [`GET /v1/youtube/videos/transcript`](/docs/api/v1/youtube/videos/transcript/get)   | `client.youtube.getVideoTranscript({ url, language? })`                | `segments` + `plainText`; video can be `found` with `transcript: null` |
| [TikTok](/platforms/tiktok)       | [`GET /v1/tiktok/videos/transcript`](/docs/api/v1/tiktok/videos/transcript/get)     | `client.tiktok.getVideoTranscript({ url, language?, useAiFallback? })` | WebVTT in `transcript.content`                                         |
| [Instagram](/platforms/instagram) | [`GET /v1/instagram/posts/transcript`](/docs/api/v1/instagram/posts/transcript/get) | `client.instagram.getPostTranscript({ url })`                          | Plain text rows in `transcripts[]`                                     |

Also available when you need them: [Twitter tweet transcript](/docs/api/v1/twitter/tweets/transcript/get) (video tweets, \~2 min max), [Facebook post transcript](/docs/api/v1/facebook/posts/transcript/get), [Reddit post transcript](/docs/api/v1/reddit/posts/transcript/get), [LinkedIn post transcript](/docs/api/v1/linkedin/posts/transcript/get).

Worker sketch

```ts
import { SocialFetchClient } from "@socialfetch/sdk";

const client = new SocialFetchClient({
  apiKey: process.env.SOCIALFETCH_API_KEY!,
});

type Platform = "youtube" | "tiktok" | "instagram";

function detectPlatform(url: string): Platform | null {
  if (url.includes("youtube.com") || url.includes("youtu.be")) return "youtube";
  if (url.includes("tiktok.com")) return "tiktok";
  if (url.includes("instagram.com")) return "instagram";
  return null;
}

async function transcribe(url: string, useAiFallback = false) {
  const platform = detectPlatform(url);
  if (!platform) throw new Error("unsupported_url");

  const result =
    platform === "youtube"
      ? await client.youtube.getVideoTranscript({ url })
      : platform === "tiktok"
        ? await client.tiktok.getVideoTranscript({ url, useAiFallback })
        : await client.instagram.getPostTranscript({ url });

  if (!result.ok) {
    return { ok: false as const, error: result.error };
  }

  const { data, meta } = result.value;
  return {
    ok: true as const,
    platform,
    lookupStatus: data.lookupStatus,
    creditsCharged: meta.creditsCharged,
    requestId: meta.requestId,
    data,
  };
}
```

Enable TikTok `useAiFallback` only when caption tracks are missing and you accept the surcharge. Do not flip it on for every URL by default.

Normalize for RAG

Store plain text for embeddings. Keep timed segments / WebVTT if you need clip boundaries. Chunk with overlap and attach `url`, `platform`, and `language` as metadata.

Deep dive: [How to get YouTube, TikTok & Instagram transcripts](/guides/how-to-get-youtube-and-tiktok-transcripts).

Related

* [Credits](/docs/credits) · [Errors](/docs/errors) · [SDK](/docs/sdk) · [MCP](/docs/integrations/mcp)
* [Ask](/docs/api/v1/ask/post) — useful when you have a URL but are unsure which transcript route to call