# TikTok Transcript Scraper - AI Subtitles & Metrics (`apinator/tiktok-transcript-scraper`) Actor

TikTok transcript scraper: transcribe any TikTok video with AI into clean text with timestamps and SRT/VTT subtitles, plus ready-made metrics (engagement rate, hook, views per day, TikTok categories, carousel photo text). Pay only for what you get.

- **URL**: https://apify.com/apinator/tiktok-transcript-scraper.md
- **Developed by:** [Apinator](https://apify.com/apinator) (community)
- **Categories:** Social media, AI
- **Stats:** 2 total users, 1 monthly users, 87.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $13.00 / 1,000 transcribed videos

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 Scraper

Get the **TikTok transcript** of any video or photo post as **clean text for AI**, plus **all the data and ready-made metrics** a marketer needs: timestamps, SRT/VTT subtitles, engagement rate, hook, views per day, TikTok's own categories and search keywords, author stats, and the text written on carousel photos.

**You only pay for what you receive.** Broken links, blocked requests and failed transcriptions are free.

### Use cases

- **Repurpose videos**: turn TikTok videos into blog posts, newsletters, captions or scripts.
- **Feed AI tools**: give ChatGPT, Claude or your own agent the exact words of a video, not a guess from the title.
- **Study competitors**: read what the best videos in your niche say in the first seconds (`hook`) and how they ask for action.
- **Subtitles**: download ready SRT or VTT files for editing or translation.
- **Research and monitoring**: collect what creators say about a brand, a product or a topic, with views and engagement next to each quote.
- **Carousels**: get the text written on TikTok photo posts, which other tools skip.

### What you get for each video

| Group | Fields |
|---|---|
| Transcript | `transcript` (clean text), `segments` (text with start/end seconds), `srt`, `vtt`, `language`, `transcriptSource` |
| Video data | `views`, `likes`, `comments`, `shares`, `saves`, `durationSec`, `createdAt`, `description`, `hashtags`, `mentions` (comma-separated), `musicTitle`, `musicAuthor`, `musicIsOriginal`, `musicIsCopyrighted` |
| Author | `authorFollowers`, `authorVerified`, `authorBio`, `authorAvatar`, `authorVideoCount`, `authorTotalLikes`, `authorIsSeller` (TikTok Shop) |
| TikTok signals | `tiktokCategories` (TikTok's own topic labels), `tiktokSearchKeywords` (search terms TikTok suggests for the video), `isAd`, `isAiGenerated`, `language`, `locationCreated`, `anchors` (attached links) |
| Ready-made metrics | `engagementRate`, `commentRate`, `shareRate`, `likeToCommentRatio`, `viewsPerFollower`, `viewsPerDay`, `postHour` and `postWeekday` (in your timezone), `hook` (opening line), `wordsPerMinute`, `talkRatio`, `callToAction` |
| Photo posts (carousels) | `isSlideshow`, `slideshowImages`, `slideshowHeadlines` (the big text on each photo), `slideshowText` (cleaned), `slideshowTextRaw` (everything read) |
| Optional files | `thumbnailFile` (cover that does not expire), `videoFile` |
| Result | `status` and a plain-English `error` when something went wrong |

Metrics are computed with fixed, documented formulas (no AI guessing), so they are consistent across runs. Every row has the same flat keys, so CSV and Excel exports stay clean: lists are joined into one cell, and only `segments` (the transcript with timestamps) stays a list for JSON users. In a spreadsheet, use `srt` or `vtt` instead.

### How to transcribe a TikTok video

1. Paste one or more TikTok links in **TikTok links**. Lists and text copied from a CSV or JSON file work too: every TikTok link found is used and duplicates are removed. Short links from the app (`vm.tiktok.com/...`) and photo links (`/photo/...`) are fixed automatically.
2. Optionally set **Your timezone** (e.g. `Europe/Rome`) to get posting hour and weekday in your local time.
3. Run. Each video becomes one row in the dataset: export as JSON, CSV or Excel, or send it to your tools.

#### Example input

```json
{
  "links": [
    "https://www.tiktok.com/@nasa/video/7686893699099413773",
    "https://vm.tiktok.com/ZMexample/"
  ],
  "timezone": "America/New_York",
  "transcribeMusic": false,
  "downloadThumbnail": false
}
```

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| Transcribed video | $0.025 | video listened to and transcribed, first minute included; videos with no speech pay this too (no extra minutes) |
| Extra minute | $0.01 | each minute after the first, rounded to the nearest (1:29 = 1 minute, 1:30 = 2) |
| Photo text | $0.005 | per carousel photo read |
| Saved video file | $0.003 | optional |
| Run start | $0.005 per GB of memory | once per run: $0.01 with the default 2 GB (Apify counts the start per GB) |
| Invalid link, unavailable video, blocked by TikTok, transcription failed, spending limit reached, saved thumbnail | **free** | |

**Free Apify plan:** demo mode, up to 5 runs a month with 3 videos each, up to 3 minutes long, enough to try it. Any paid Apify plan removes the limit.

Prices shown are for the Apify Free plan: transcribed videos and extra minutes get cheaper on paid Apify plans (down to $0.011 per video).
Example: 100 one-minute videos cost about $2.50.

The run respects your spending limit: when it is reached, remaining videos are returned as `limit_reached` and not charged.

### Example output

```json
{
  "url": "https://www.tiktok.com/@MS4wLjABAAAAU9BRVzC8oCaegVnia8IbqWhPb_-dbU7s00Y3wS1_Nx8g5RUaYvyXrpejgjdxTwd6/video/7686893699099413773",
  "videoId": "7686893699099413773",
  "author": "nasa",
  "createdAt": "2026-09-18T16:00:00Z",
  "durationSec": 92,
  "views": 186700,
  "likes": 12200,
  "comments": 412,
  "shares": 462,
  "saves": 975,
  "description": "Another big week in the sky and beyond at NASA 🚀   🔭 Roman gets a major mission-life boost 🏈 NASA takes to the skies over Pittsburgh 🌕 Artemis III booster stacking nears completion   Here’s what’s new in your NASA Minute!",
  "hashtags": "",
  "musicTitle": "original sound - NASA",
  "musicAuthor": "NASA",
  "musicIsOriginal": false,
  "musicIsCopyrighted": false,
  "authorFollowers": 1800000,
  "authorVerified": true,
  "isAd": false,
  "isAiGenerated": false,
  "locationCreated": "US",
  "tiktokCategories": "Science, Education, Culture & Education & Technology",
  "tiktokSearchKeywords": "nasa space, nasa rocket, artemis, sky",
  "language": "en",
  "transcript": "From the skies over Pittsburgh to the path back to the moon, NASA's mission kept moving forward this week.  Here's what's new in your NASA Minute. NASA's Nancy Grace Roman Space Telescope is off to an excellent start. Th…",
  "segments": [
    {
      "start": 0.18,
      "end": 6.96,
      "text": "From the skies over Pittsburgh to the path back to the moon, NASA's mission kept moving forward this week.  Here's what's new in your NASA Minute."
    },
    {
      "start": 7.2,
      "end": 11.32,
      "text": "NASA's Nancy Grace Roman Space Telescope is off to an excellent start."
    }
  ],
  "transcriptSource": "ai",
  "engagementRate": 0.07,
  "commentRate": 0.00221,
  "shareRate": 0.00247,
  "likeToCommentRatio": 29.6,
  "viewsPerFollower": 0.104,
  "viewsPerDay": 26749,
  "postHour": 18,
  "postWeekday": "Friday",
  "hashtagCount": 0,
  "hook": "From the skies over Pittsburgh to the path back to the moon, NASA's mission kept moving forward this week.",
  "wordsPerMinute": 179,
  "talkRatio": 0.8,
  "callToAction": "",
  "status": "ok",
  "error": ""
}
```

### Result statuses and errors

| Status | Meaning | Charged | What to do |
|---|---|---|---|
| `ok` | transcript and data returned | yes | |
| `silent` | no speech (music or silence); data and metrics returned | yes, as a transcribed video (first minute only) | turn on **Transcribe songs too** if you want lyrics |
| `unavailable` | the video was removed, is private or region-locked | no | check the link in a browser |
| `invalid_link` | not a TikTok video or photo link | no | paste the full video link |
| `blocked` | TikTok refused the request after 3 attempts from different addresses | no | run again later |
| `transcription_failed` | the speech-to-text service failed and TikTok had no captions | no | run the same link again |
| `limit_reached` | your spending limit was reached | no | raise the limit in the run options |
| `free_plan_limit` | free Apify plan: demo limit reached (runs, videos or video length) | no | subscribe to any paid Apify plan |

### Use with AI agents (Claude, ChatGPT, Cursor)

AI assistants can run this scraper through the [Apify MCP server](https://mcp.apify.com), the bridge that lets them use Apify Store tools. Add it to your assistant with this address:

```
https://mcp.apify.com?tools=apinator/tiktok-transcript-scraper
```

Then paste a prompt like this one:

```
Use the TikTok Transcript Scraper (apinator/tiktok-transcript-scraper) on these links:
<your TikTok links>
For each video give me the transcript, the hook, views and engagement rate,
then summarize the 3 main ideas and list the calls to action.
```

The output is plain JSON with stable field names, so agents can read it without extra parsing.

Agents can also pay per run on their own with x402 or Skyfire, without an Apify account.

### Use with n8n, Make and Zapier

- **n8n**: use the Apify node, choose *Run an Actor and get dataset*, pick `apinator/tiktok-transcript-scraper` and pass the links as JSON input.
- **Make** and **Zapier**: use the Apify app, action *Run an Actor*, then *Get dataset items*.
- **API**: start a run with a POST request to the Actor endpoint and read the dataset; every Apify client (Python, JavaScript) works the same way.

A typical flow: a new link in a Google Sheet → run the scraper → write transcript and metrics back to the sheet.

### FAQ

#### How accurate is the transcript?

Speech is transcribed by AI, with timestamps for each sentence. If the AI step fails and TikTok has its own captions, those are used instead: `transcriptSource` tells you which one you got (`ai` or `tiktok_captions`).

#### What about songs?

Videos with only a song are marked `silent` by default: the song title and artist are in `musicTitle` and `musicAuthor`. Turn on **Transcribe songs too** to get the lyrics.

#### What if there is music behind the speech?

Background music is ignored: in our tests the speaker was transcribed correctly even with a sung song at the same volume.

#### Which languages work?

Speech is detected automatically in most languages; you can force one with **Force language**. Text on photos is read best in Latin-script languages and Chinese.

#### How is photo text cleaned?

Design elements (like buttons, counters and usernames in screenshots) are filtered out of `slideshowText` with fixed rules. If you need everything, use `slideshowTextRaw`.

#### Why do thumbnail links stop working?

`thumbnail` and `slideshowImages` are TikTok links that stop working after hours or days. Turn on **Save thumbnail** for a permanent copy. Saved files are kept for Apify's default storage period.

#### How many videos can I run?

One or thousands: links are processed in parallel. Set a spending limit if you want a hard cap.

#### Is it legal to scrape TikTok?

This scraper reads only public videos, the same ones anyone can watch without logging in. It does not collect private data such as emails or phone numbers. Transcripts may contain personal data spoken in the video: if you store or publish them, follow the privacy rules that apply to you (for example GDPR in the EU). When in doubt, ask a lawyer.

This is an unofficial tool: it is not affiliated with, endorsed or sponsored by TikTok or ByteDance. To keep the scraper reliable, each run sends us anonymous counts only (videos processed, videos blocked); never your input, links or results.

### Whole profiles

To get every video of a creator, with a profile report (engagement, views per follower, best time to post) and a daily "only new videos" feed, use [TikTok Profile Scraper](https://apify.com/apinator/tiktok-profile-scraper).

### Support and feedback

Something missing or not working? Open an issue on the **Issues** tab: we read every one. Feature requests are welcome too.

# Actor input Schema

## `links` (type: `array`):

One or more TikTok video or photo links. Paste lists or text from CSV/JSON: every TikTok link found is used, duplicates removed.

## `transcribeMusic` (type: `boolean`):

By default videos with only music are marked silent. Turn on to transcribe sung lyrics.

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

Optional ISO code (e.g. en, it, es). Empty = detected automatically.

## `timezone` (type: `string`):

IANA name, e.g. Europe/Rome. Used for postHour and postWeekday.

## `downloadThumbnail` (type: `boolean`):

Store the cover image with a link that does not expire (paid extra).

## `downloadVideo` (type: `boolean`):

Store the video file (paid extra).

## Actor input object example

```json
{
  "links": [
    "https://www.tiktok.com/@nasa/video/7686893699099413773"
  ],
  "transcribeMusic": false,
  "timezone": "UTC",
  "downloadThumbnail": false,
  "downloadVideo": false
}
```

# Actor output Schema

## `results` (type: `string`):

Every row: one per video. Flat keys, same for every row.

## `overview` (type: `string`):

The main fields as a table view.

## `csv` (type: `string`):

Same rows as a spreadsheet.

## `files` (type: `string`):

Thumbnails and video files, when you turn them on.

# 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 = {
    "links": [
        "https://www.tiktok.com/@nasa/video/7686893699099413773"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("apinator/tiktok-transcript-scraper").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 = { "links": ["https://www.tiktok.com/@nasa/video/7686893699099413773"] }

# Run the Actor and wait for it to finish
run = client.actor("apinator/tiktok-transcript-scraper").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 '{
  "links": [
    "https://www.tiktok.com/@nasa/video/7686893699099413773"
  ]
}' |
apify call apinator/tiktok-transcript-scraper --silent --output-dataset

```

## MCP server setup

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

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/3JFbRcLBkDRtqi02c/builds/hzjf1NAnquiVJm9Lr/openapi.json
