# TikTok Transcript & Instagram Reels Transcript (`fetchmint/tiktok-reels-transcript`) Actor

TikTok and Instagram Reels transcripts (plus YouTube Shorts) as text, timestamped segments or SRT. No login or API key. Platform captions first, AI speech-to-text only when there are none.

- **URL**: https://apify.com/fetchmint/tiktok-reels-transcript.md
- **Developed by:** [Fetchmint](https://apify.com/fetchmint) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 transcript from captions

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Transcript & Instagram Reels Transcript (+ YouTube Shorts)

Get a **TikTok transcript**, **Instagram Reels transcript**, or **YouTube Shorts
transcript** as clean text, timestamped segments, or an **SRT subtitle file**,
from a plain list of video URLs. Mix all three platforms in one run. No login,
no cookies, no API key.

Built for **video-to-text** pipelines: AI/RAG ingestion, content repurposing
(turn a Reel into a blog post or newsletter), competitor and trend research,
and subtitles for re-uploads. Works the same when called by an AI agent over
Apify's MCP server.

### Why it's cheap

Most transcript tools run AI speech-to-text on every video. But TikTok and
YouTube already publish captions for most videos. This Actor reads those
captions first (a few KB, no audio download) and only runs AI transcription
when a video has none. You pay for what was actually needed, at your Apify
discount tier (set by your Apify plan):

| What happened | Free | Bronze & Silver | Gold and up |
|---|---|---|---|
| TikTok video with captions | **$0.0025** | **$0.002** | **$0.0015** |
| YouTube Short with captions | $0.004 | $0.004 | $0.004 |
| No captions, so AI transcribed the audio (all Instagram Reels, some TikToks), per started minute of video | $0.008 | $0.008 | $0.008 |
| Failed video, bad URL, or no speech found | free | free | free |

Each run also has a start fee of $0.0003 per GB of memory (up to 1 GB counts once).
With AI fallback on (the default) a run uses 4 GB, so **$0.0012 per run**; with
`aiFallback` off it uses 1 GB, so $0.0003. Batch your URLs to spread it.

Example: 100 TikToks with captions in one run on the Free tier cost
100 x $0.0025 + $0.0012 = **$0.25**.

### What you get (one item per URL)

```json
{
    "url": "https://www.tiktok.com/@nasa/video/7689547576265149710",
    "platform": "tiktok",
    "videoId": "7689547576265149710",
    "author": "nasa",
    "durationSec": 121,
    "language": "eng-US",
    "source": "captions",
    "text": "Full transcript as one string...",
    "segments": [{"start": 0.0, "end": 2.4, "text": "First caption line"}],
    "srt": "1\n00:00:00,000 --> 00:00:02,400\nFirst caption line\n",
    "output": "Full transcript as one string...",
    "success": true
}
```

- `source`: `captions` (the platform's own captions), `ai` (AI speech-to-text),
  or `none` (nothing found; see `error`).
- `text`, `segments` and `srt` are always included. `output` repeats the one you
  picked in `outputFormat`, for tools that want a single field.
- A bad or deleted URL gets an item with `success: false` and an `error`; it
  never stops the rest of the run.

### Input

```json
{
    "urls": [
        "https://www.tiktok.com/@nasa/video/7689547576265149710",
        "https://www.youtube.com/shorts/DBhAROQM51E",
        "https://www.instagram.com/reel/DduQxrBjnsB/"
    ]
}
```

| Field | Default | Notes |
|---|---|---|
| `urls` | required | TikTok, Instagram Reel/post, or YouTube Shorts URLs |
| `language` | `"auto"` | `auto` = each video's original language. Or an ISO code (`en`, `es`, `pt`...) to prefer that caption track; YouTube can translate into it |
| `aiFallback` | `true` | Transcribe the audio with AI when a video has no captions |
| `localModelSize` | `"base"` | AI model: `base` (more accurate) or `tiny` (a bit faster). Same price |
| `outputFormat` | `"text"` | Which of `text` / `segments` / `srt` goes into `output` |
| `proxyConfiguration` | Apify residential | Used only when a platform blocks direct requests |

### How it works

1. **Captions first.** TikTok's own captions (present on most talking videos)
   and YouTube's captions, original language by default.
2. **AI fallback.** No captions (Instagram never publishes them)? The Actor
   downloads the smallest audio track and transcribes it with Whisper
   (`faster-whisper`, running inside the Actor; by default your audio isn't
   sent to any third-party API). Music-only clips come back empty and free
   instead of with made-up text.
3. **Cheapest route that works.** TikTok and Instagram are fetched directly;
   the residential proxy is used for YouTube and as a retry, which keeps
   prices low.

### Tips

- Batch your URLs: one run with 100 URLs is faster and cheaper than 100 runs.
- For English subtitles of non-English YouTube Shorts, set `language` to `en`.
- Set a maximum cost per run in Apify; the Actor stops cleanly when it's reached
  and never starts an AI transcription it can't finish within it.

### Using it from an AI agent / MCP

Available through [Apify's MCP server](https://docs.apify.com/platform/integrations/mcp)
like any Store Actor. An agent passes a list of URLs and gets structured
transcripts back.

### Limits

- Private, deleted, age-restricted or region-locked videos can't be read.
- Instagram occasionally rate-limits; failed items say so and cost nothing.
- AI transcripts are good on clear speech and weaker over loud music or
  overlapping voices.

### Running locally

```bash
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt   # plus ffmpeg for the AI path

mkdir -p storage/key_value_stores/default
echo '{"urls": ["https://www.youtube.com/shorts/DBhAROQM51E"]}' > storage/key_value_stores/default/INPUT.json
APIFY_LOCAL_STORAGE_DIR=./storage python -m src
```

Results land in `storage/datasets/default/`.

***

Not affiliated with or endorsed by TikTok/ByteDance, Instagram/Meta or YouTube/Google. Trademarks belong to their owners.

# Actor input Schema

## `urls` (type: `array`):

TikTok, Instagram Reel/post, or YouTube Shorts URLs. Mix platforms freely. One dataset item is produced per URL; a failure on one URL never stops the others.

## `language` (type: `string`):

Leave as "auto" to get each video's original language (recommended: fastest and most reliable). Set an ISO-639-1 code (e.g. "en", "es", "pt") to prefer that caption language when the platform offers it; YouTube can machine-translate its captions into it. Falls back to the original language when the requested one is unavailable.

## `aiFallback` (type: `boolean`):

If a video has no platform captions, download its audio and transcribe it with AI speech-to-text. Billed per started minute of video (transcript-ai-minute event). Videos with captions are never sent to AI.

## `sttBackend` (type: `string`):

"auto" uses a local faster-whisper model inside the Actor (no external API). OpenAI gpt-4o-mini-transcribe is used only when the Actor owner has configured it and you are on a paid Apify plan.

## `localModelSize` (type: `string`):

Local faster-whisper model for the AI path. "base" (default) is noticeably more accurate; "tiny" is a little faster. Same price either way.

## `outputFormat` (type: `string`):

Which representation is copied into the top-level "output" field for convenience. All three (text, segments, srt) are always included in every dataset item regardless of this setting.

## `proxyConfiguration` (type: `object`):

Used only when a platform blocks direct requests (YouTube always does; TikTok and Instagram sometimes). Defaults to Apify's residential proxy. Set to no proxy to force direct requests only.

## Actor input object example

```json
{
  "urls": [
    "https://www.tiktok.com/@nasa/video/7689547576265149710",
    "https://www.tiktok.com/@mrbeast/video/7689134313044184351"
  ],
  "language": "auto",
  "aiFallback": true,
  "sttBackend": "auto",
  "localModelSize": "base",
  "outputFormat": "text",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `transcripts` (type: `string`):

All transcript items from this run (one per input URL), as JSON. Fields: url, platform, videoId, author, durationSec, language, source, text, segments\[{start,end,text}], srt, output, success, error.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.tiktok.com/@nasa/video/7689547576265149710",
        "https://www.tiktok.com/@mrbeast/video/7689134313044184351"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetchmint/tiktok-reels-transcript").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": [
        "https://www.tiktok.com/@nasa/video/7689547576265149710",
        "https://www.tiktok.com/@mrbeast/video/7689134313044184351",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("fetchmint/tiktok-reels-transcript").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.tiktok.com/@nasa/video/7689547576265149710",
    "https://www.tiktok.com/@mrbeast/video/7689134313044184351"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call fetchmint/tiktok-reels-transcript --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetchmint/tiktok-reels-transcript"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1wKLqIzAGNUbriNYG/builds/Dlsm7yCi2Qon0chgh/openapi.json
