# Best TikTok Transcripts Scraper (`crawl_craft/best-tiktok-transcripts-scraper`) Actor

Typing out what a TikTok says takes forever. Paste video or photo links and get clean transcripts with timestamps, word timing, translations and on-screen text, plus plays, likes, shares and creator stats. Bulk links, typed errors, live results.

- **URL**: https://apify.com/crawl_craft/best-tiktok-transcripts-scraper.md
- **Developed by:** [Crawl Craft](https://apify.com/crawl_craft) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.20 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### 🚀 What is Best TikTok Transcripts Scraper?

Best TikTok Transcripts Scraper is an Apify Actor that turns TikTok video and photo links into structured transcripts. For each post you get the spoken text, its language and source, timed segments, and word timing when TikTok has it. Caption, hashtags, on-screen text, stats and creator details arrive in the same row.

Tired of retyping what a creator says? Paste your links, press **Start**, and rows appear in the output tables as each post is read. Looking for a TikTok transcript scraper that keeps text, timing and stats together? That is what each row holds.

- 📝 **Clean transcript text:** the spoken text joined from the timed segments, with whitespace cleaned.
- 🕒 **Timed segments:** start and end seconds per segment, plus word timing when TikTok provides it.
- 🌍 **Translations:** pick one of 16 target languages to get TikTok's own translation when it exists.
- 📊 **Stats and creators:** plays, likes, comments, shares, saves and a creator profile per post.
- 📦 **Separate tables:** transcripts, segments, videos, creators, media links and errors each get their own table.
- 🔗 **Bulk links:** use it as a TikTok transcripts converter for a whole list at once, duplicates are skipped.

To start, click **Try for free**, paste TikTok links into **urls**, and press **Start**.

### 📊 What data can you extract from TikTok?

Every post becomes one row that you can export as JSON, CSV or Excel. The table lists each field with the exact name from the dataset schema, covering TikTok video transcripts, timed captions, post details and creator data.

| Field | Description | Example |
|---|---|---|
| `id` | TikTok post id. | 7488736374602927402 |
| `url` | Public link to the post. | https://www.tiktok.com/@user/video/7488736374602927402 |
| `post_type` | `video` or `photo`. | video |
| `transcript` | Clean TikTok transcript text of the post. | - |
| `transcript_language` | Language code of the transcript. | en |
| `transcript_source` | `creator_captions`, `auto_captions` or `machine_translation`. | auto_captions |
| `transcript_is_translation` | True when TikTok machine-translated the transcript. | - |
| `transcript_word_count` | Words in the transcript. | 25 |
| `transcript_note` | Extra remark, for example a translation fallback. | - |
| `no_transcript_reason` | Why there is no transcript for this post. | - |
| `available_languages` | Caption languages TikTok offered. | - |
| `segments` | Timestamped transcript segments (start, end, text). | - |
| `words` | Word-level timings when TikTok has them. | - |
| `webvtt` | Raw WebVTT captions. | - |
| `caption` | Post caption. | - |
| `title` | Photo post title. | - |
| `hashtags` | Hashtags used. | - |
| `mentions` | Accounts mentioned. | - |
| `on_screen_text` | Text stickers shown on the post. | - |
| `duration_seconds` | Video length in seconds. | - |
| `created_at` | UTC time the post was published. | - |
| `caption_language` | Language of the caption. | - |
| `is_ad` | Flagged as an ad. | - |
| `is_ai_generated` | Flagged as AI generated. | - |
| `location_created` | Country code the post was created in. | - |
| `content_labels` | TikTok content labels. | - |
| `comments_enabled` | Comments are open. | - |
| `duet_enabled` | Duets are allowed. | - |
| `stitch_enabled` | Stitches are allowed. | - |
| `image_count` | Images in a photo post. | - |
| `stats` | plays, likes, comments, shares, saves, reposts, engagement_rate_pct. | - |
| `author` | Creator profile and follower stats. | - |
| `music` | Sound used in the post. | - |
| `media` | Cover, video, music and image links. | - |
| `error` | Filled when the post could not be read: code and message. | - |
| `scraped_at` | UTC time the post was read. | 2026-10-21T19:57:05Z |

### 💡 Use cases for TikTok transcript data

- **Transcribe TikTok video to text for notes and search:** keep `transcript` and `transcript_language` next to the post `url`, so a spoken idea is easy to find later. Each post is a TikTok video to text record you can filter by `post_type`.
- **Run TikTok competitor analysis:** compare `stats` (plays, likes, shares, saves, engagement_rate_pct) with the `author` followers across rivals' posts.
- **Start a TikTok content analysis:** read `caption`, `hashtags`, `on_screen_text` and `transcript` together to see what a niche says and shows.
- **Do TikTok creator research:** use `author` (followers, following, total likes, video count, verified) and `music` to shortlist creators before you reach out.
- **Spot a TikTok trend research signal:** count `hashtags` and `music` titles over `created_at` dates across the posts you collect.
- **Plan TikTok content repurposing:** turn `segments` into blog drafts, scripts or newsletter quotes with the start and end seconds as anchors.
- **Build TikTok transcripts for AI training and search indexes:** `transcript` is clean text with a `transcript_word_count`, ready to pass to your own pipeline.
- **Translate TikTok video to English for review:** set `transcriptLanguage` to `en` and the `transcript_is_translation` field shows when TikTok's translation was used.
- **Start a TikTok video subtitles download for accessibility checks:** the `webvtt` field keeps the raw captions of each post.

### 🛠️ How to scrape TikTok transcripts

This TikTok transcripts tool runs from the Apify Console without code. Open the Actor page to run a TikTok transcript online:

1. Create a free Apify account and log in.
2. Open Best TikTok Transcripts Scraper.
3. Add your video, photo or short links to **urls** (one per line).
4. Choose **Transcript language** and tick the extras you want.
5. Click **Start** and watch the log for each finished post.
6. Open the **Output** tab and pick a table.
7. Download the data as JSON, CSV or Excel.

#### How to get TikTok transcript data for many links

Collect bulk TikTok transcripts by adding one link per line to `urls`. Duplicate posts are skipped, and invalid entries become rows in the errors table.

#### How to get the full transcript of a TikTok video

Paste one video link and leave `transcriptLanguage` on `original`. The `transcript` field holds the full spoken text, and `segments` holds the same text in timed pieces.

#### How to get TikTok transcripts with timestamps

Keep `includeTimestamps` on. It adds `segments`, `words` and `webvtt` to each row. Turn it off if you only need the plain text.

#### How to translate TikTok video to Spanish or another language

Set `transcriptLanguage` to `es`, or to any other language in the list. TikTok provides the translation only for some posts. When it does not, the row keeps the original language and `transcript_note` says so.

#### How to transcribe TikTok link to text

Paste the link, including short share links such as vm.tiktok.com or tiktok.com/t/, or a numeric post id. Press **Start** and read the `transcript` field in the first row.

#### How to run a TikTok subtitles download

Leave `includeTimestamps` on and export the **Transcripts** table. The `webvtt` column holds the raw captions as text.

#### How to use the TikTok transcript extractor on short links

Short links are resolved to the post first. A short link that has expired becomes an error row with the code `short_link_expired`, so the rest of the list still runs.

### 💰 How much does it cost to scrape TikTok transcripts?

Best TikTok Transcripts Scraper uses pay per event. One result is one saved post, and the price per 1,000 results depends on your Apify plan tier:

| Apify plan tier | Price per 1,000 results |
|---|---|
| Free | $3 |
| Bronze | $2.7 |
| Silver | $2.5 |
| Gold / Platinum / Diamond | $2.2 |

A post that ends in an error row is saved but not charged. A post without captions is still saved and counts as a result. There is also a small Actor Start event of $0.00005 per run start. See the Pricing tab for current rates.

### ⬇️ Input

The only required input is `urls`. As a TikTok transcripts extractor it accepts video links, photo links, short share links and numeric post ids. Paste the links for your TikTok video transcript scraper run, then pick the extras. Think of it as a TikTok video to text converter that takes links instead of uploaded files.

![Best TikTok Transcripts Scraper input form with TikTok video links and transcript language](IMAGE_URL_PLACEHOLDER)

Example input (the pre-filled links of the input form):

```json
{
  "urls": [
    "https://www.tiktok.com/@stoolpresidente/video/7488736374602927402",
    "https://www.tiktok.com/@renreports/video/7307726351291960622"
  ],
  "transcriptLanguage": "original",
  "includeTimestamps": true,
  "includeVideoDetails": true,
  "includeMediaUrls": false,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

| Field | Type | Description |
|---|---|---|
| `urls` | array, required | One or many TikTok video or photo links, short share links or numeric post ids. |
| `transcriptLanguage` | string | `original` (default) or one of `en`, `es`, `fr`, `pt`, `ar`, `zh`, `de`, `ja`, `ko`, `it`, `ru`, `id`, `hi`, `tr`, `vi`, `th`. |
| `includeTimestamps` | boolean | Adds timed segments, word-level timing when available and the raw WebVTT captions. Default on. |
| `includeVideoDetails` | boolean | Adds caption, hashtags, on-screen text, stats, creator profile and music. Default on. |
| `includeMediaUrls` | boolean | Adds cover, video, music and slideshow image links. They expire within hours. Default off. |
| `proxyConfiguration` | object | Optional proxy settings. Leave the default if you are unsure. |

Tip: start with two or three links to check the fields before you run a long list.

### ⬆️ Output

The scraped results are shown as a dataset in the **Storage** tab. The table view is for convenience and doesn't show **all the fields**.

![Best TikTok Transcripts Scraper output table with transcript, language and source](IMAGE_URL_PLACEHOLDER)

Each run builds a TikTok transcripts dataset with an overview table plus one table per section: **Transcripts**, **Timed segments**, **Video details**, **Creators**, **Media links** and **Errors**. A **Run summary** holds the counts for the run. Start a TikTok transcripts export from the Storage tab, or use it as a TikTok transcripts downloader by choosing JSON, CSV or Excel.

The caption field makes it a TikTok caption extractor too, and the webvtt field turns a run into a TikTok subtitle scraper.

Example transcript record (values from the dataset schema examples, not a captured run):

```json
{
  "id": "7488736374602927402",
  "url": "https://www.tiktok.com/@user/video/7488736374602927402",
  "post_type": "video",
  "transcript_language": "en",
  "transcript_source": "auto_captions",
  "transcript_word_count": 25,
  "scraped_at": "2026-10-21T19:57:05Z"
}
```

Example row of the timed segments table (schema example values):

```json
{
  "id": "7488736374602927402",
  "post_type": "video",
  "index": 1,
  "start": 0.38,
  "end": 3.6
}
```

### ⚠️ Limitations and error handling

A TikTok transcription scraper can only return what TikTok publishes. Posts without captions are saved without a transcript, and `no_transcript_reason` says why. Only public posts are read. Media links expire within hours, and one run uses one transcript language.

| `no_transcript_reason` | Meaning |
|---|---|
| `photo_post` | The post is a photo post, so there is no spoken text. |
| `no_captions` | TikTok offers no captions for this post. |
| `caption_file_unreachable` | TikTok lists captions, but the file could not be downloaded. |
| `no_captions_in_requested_language` | No captions exist in the language you asked for. |

When a post cannot be read, its row has an `error` object with a `code` and a `message`. These rows are not charged and also appear in the **Errors** table.

| `error.code` | What to do |
|---|---|
| `invalid_input` | Check the entry: it must be a TikTok video or photo link, short link or numeric id. |
| `short_link_expired` | Open the short link in a browser and paste the full post link. |
| `video_not_found` | The video or account no longer exists. |
| `video_deleted` | The video was deleted. |
| `private_video` | Only the creator can see the post. |
| `friends_only` | Only the creator's friends can see the post. |
| `subscribers_only` | Only paying subscribers can see the post. |
| `blocked` | The creator blocked the viewer the Actor reads as. |
| `age_restricted` | The post is hidden from logged-out viewers. |
| `region_blocked` | The post is not available in the region the Actor runs from. |
| `under_review` | TikTok is reviewing the post. Try again later. |
| `unavailable` | TikTok hides or has removed the post. |
| `unreadable_page` | The post could not be read right now. Try again later. |
| `access_denied` | The post could not be reached. Wait and try again, or set a proxy. |
| `transport_error` | The connection to TikTok failed. Check the proxy settings or network and try again. |
| `scrape_error` | An unexpected problem occurred for this post. Try again later. |

### 🔌 Integrating Best TikTok Transcripts Scraper with other apps

Best TikTok Transcripts Scraper runs through the Apify platform, so you can start it from the Console, by API, on a schedule or from a webhook.

- **Schedule it:** use [Apify Schedules](https://docs.apify.com/platform/schedules) to re-read the same list of links every day or week. This Actor has no monitor mode, so each scheduled run reads the links you give it and saves fresh rows with a new `scraped_at`.
- **Trigger a webhook:** use [webhooks](https://docs.apify.com/platform/integrations/webhooks) to tell your own service when a run finishes.
- **Connect other apps:** send results on with the [Apify integrations](https://docs.apify.com/platform/integrations) for tools such as Make, Zapier or Google Sheets.
- **Call the API:** developers who need a TikTok transcript API can start runs over HTTP. The API tab shows ready JavaScript, Python and CLI snippets, and the same input JSON works for the TikTok transcripts API call.
- **Use it from an AI client:** connect the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) to let an agent find and run the Actor.

### 🔗 More Apify Actors by crawl_craft

| Actor | What it extracts | When to use it |
|---|---|---|
| [TikTok Transcript Scraper](https://apify.com/crawl_craft/tiktok-transcript-scraper) | TikTok transcripts with video and author data. | Compare its Store page and input form with this Actor before you choose. |
| [TikTok Video Scraper](https://apify.com/crawl_craft/tiktok-video-scraper) | Video stats, captions, hashtags, author and music data, plus downloads. | Use it when your goal is video stats and downloads from video URLs. |
| [TikTok User Search Scraper](https://apify.com/crawl_craft/tiktok-user-search-scraper) | Public TikTok profiles found by keyword. | Use it to discover creators by keyword, with bio, followers and verified status. |

### ⚖️ Is it legal to scrape TikTok?

TikTok transcript scraping should cover public posts only, and Best TikTok Transcripts Scraper reads public posts and returns an error row for private ones. Results can still contain personal data such as usernames, so only collect it with a legitimate reason, consider GDPR and the platform's terms, and consult a lawyer if you are unsure. Read Apify's posts on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) and [ethical web scraping](https://blog.apify.com/what-is-ethical-web-scraping-and-how-do-you-do-it/).

### ❓ FAQ

#### How much does it cost to use Best TikTok Transcripts Scraper?

It is pay per event, from $2.2 to $3 per 1,000 results depending on your plan tier, plus a small Actor Start event. See the Pricing tab for current rates.

#### Do I need a TikTok account, cookies or an API key?

No. The input has no login, cookie or API key field. You only add links and choose options.

#### Does every TikTok video have a transcript?

No. Only posts that have captions on TikTok do. Other posts are still saved, and `no_transcript_reason` explains why.

#### Is this a TikTok transcript generator that listens to the audio?

No. It reads the captions TikTok already holds for a post, whether the creator wrote them or TikTok generated them. The `transcript_source` field tells you which.

#### Can I do a TikTok transcript download as CSV or JSON?

Yes. Export TikTok transcripts to CSV, JSON or Excel from the Storage tab after the run.

#### Do photo posts work?

Yes, they are accepted. Photo posts carry no spoken audio, so the row usually has no transcript and `no_transcript_reason` says so, while `title`, `on_screen_text`, `image_count` and `stats` are filled when available.

#### Do I need proxies?

No. Proxy settings are optional, and the default setting leaves your own proxy off. Pick one only if you have a specific need.

#### How many links can I add?

The Actor sets no limit on the number of links. If you set a maximum spend for the run, it stops cleanly at that limit and keeps everything saved so far.

### 💬 Your feedback

Found a problem or need another field? Open an issue in the Issues tab of the Actor page. For a custom solution, write to hello.crawlcraft@gmail.com.

# Actor input Schema

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

One or many TikTok video or photo links, short share links (vm.tiktok.com, tiktok.com/t/) or numeric post ids. Bulk input is supported.

## `transcriptLanguage` (type: `string`):

original = the language spoken in the post. Pick another language to get TikTok's own translation when it exists; otherwise the original is returned and the row says so.

## `includeTimestamps` (type: `boolean`):

Add timed segments, word-level timing (when available) and the raw WebVTT captions.

## `includeVideoDetails` (type: `boolean`):

Add caption, hashtags, on-screen text, stats (plays, likes, comments, shares, saves), creator profile and music.

## `includeMediaUrls` (type: `boolean`):

Add cover, video, music and slideshow image links. Links expire within hours.

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

Optional. Choose the proxy settings for your run. Leave the default if you are unsure.

## Actor input object example

```json
{
  "urls": [
    "https://www.tiktok.com/@stoolpresidente/video/7488736374602927402",
    "https://www.tiktok.com/@renreports/video/7307726351291960622"
  ],
  "transcriptLanguage": "original",
  "includeTimestamps": true,
  "includeVideoDetails": true,
  "includeMediaUrls": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every post with its transcript and details.

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

Transcript text, language and source per post.

## `segments` (type: `string`):

One row per timed transcript segment.

## `videos` (type: `string`):

Caption, hashtags, stats and music per post.

## `creators` (type: `string`):

Creator profile and follower stats per post.

## `media` (type: `string`):

Cover, video, music and image links per post.

## `errors` (type: `string`):

Inputs that could not be read.

## `summary` (type: `string`):

Counts for this run.

# 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/@stoolpresidente/video/7488736374602927402",
        "https://www.tiktok.com/@renreports/video/7307726351291960622"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawl_craft/best-tiktok-transcripts-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 = {
    "urls": [
        "https://www.tiktok.com/@stoolpresidente/video/7488736374602927402",
        "https://www.tiktok.com/@renreports/video/7307726351291960622",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("crawl_craft/best-tiktok-transcripts-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 '{
  "urls": [
    "https://www.tiktok.com/@stoolpresidente/video/7488736374602927402",
    "https://www.tiktok.com/@renreports/video/7307726351291960622"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call crawl_craft/best-tiktok-transcripts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawl_craft/best-tiktok-transcripts-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/OtUwRZbJekEmqgCEr/builds/vE6ALEBt7JBn00MRR/openapi.json
