# TikTok Profile Transcripts - Video Transcript Timestamps (`snow_leo_data/tiktok-transcript-scraper`) Actor

Extract the text of TikTok videos from the platform's own caption file, not from speech recognition: 11 videos in 5 seconds. Full transcripts with timestamped segments, for profiles or single video URLs. Videos without captions come back with the reason named.

- **URL**: https://apify.com/snow_leo_data/tiktok-transcript-scraper.md
- **Developed by:** [Snow Leo Data](https://apify.com/snow_leo_data) (community)
- **Categories:** Social media, Videos, For creators
- **Stats:** 3 total users, 3 monthly users, 92.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.55 / 1,000 video rows

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

The spoken text of a TikTok video as plain text **and** as timestamped
segments, with the video's own metrics next to it.

No login, no cookies, no speech recognition.

### Why it is fast and cheap

The transcript is not computed. TikTok publishes a caption file for videos that
have captions, and this Actor reads that file. Measured from the Apify cloud on
18 Sep 2026: a track is `webvtt`, the one measured weighed 2 040 bytes, and it
carries the language, the size and a signed link.

That is why a run of **11 videos finished in 5 seconds**. Tools that transcribe
audio have to download and process the video; this one downloads a small text
file.

The signed link expires, so the file is fetched during the run. You get the
text, not a link that will be dead by the time you open it.

### What you get, and what you do not

The same cloud run: **11 rows, 6 with a real transcript** (205 and 226 words
among them), **5 videos carried no captions at all**.

A video without captions is **not dropped in silence**. It comes back as a row
with `has_transcript: false` and `skip_reason: no-captions-on-this-video`, and
it is not charged as a transcript. You can see exactly which of your links had
nothing to give, instead of wondering why your output is short.

**This is the honest limit of the whole niche:** no tool can return a
transcript for a video that has no captions, and about half the videos of an
active account do not have them.

### A row

`video_id`, `video_url`, `description`, `created_at`, `duration_seconds`,
`author_unique_id`, `author_nickname`, `author_verified`, `play_count`,
`digg_count`, `comment_count`, `share_count`, `hashtags`, `mentions`,
`has_transcript`, `language`, `caption_languages`, `caption_tracks`,
`transcript`, `word_count`, `segment_count`, `segments`, `skip_reason`.

`segments` holds `{start, end, text}` in seconds — the part you need to cut
clips, find the hook, or line the text up with the video.

### Input

| Field | What it does |
|---|---|
| Video URLs | Links to single videos |
| Profiles | Accounts to take the latest videos from |
| Max videos per profile | TikTok serves 10 to 13 to a signed-out reader |
| Languages | Preferred caption languages, e.g. `eng-US` |
| Only videos with a transcript | Drop the ones that have no captions |
| Include timestamped segments | Add `segments` next to the full text |
| Min words, Transcript contains | Keep only what matters |

### Empty runs

A run that collects nothing **charges nothing** and says why by name in the log
and in the `REPORT` record: nothing was asked for, no value was a TikTok link
or an account, or every row was removed by your filters.

# Actor input Schema

## `videoUrls` (type: `array`):

Links to TikTok videos, for example https://www.tiktok.com/@nasa/video/7686548688113503502.

## `profiles` (type: `array`):

Accounts to take the latest videos from: a handle, an @handle or a profile link.

## `maxVideosPerProfile` (type: `integer`):

TikTok serves 10 to 13 recent videos per profile to a signed-out reader, so a higher number cannot add more.

## `languages` (type: `array`):

Preferred caption languages, for example eng-US or eng. Leave empty to take the first track the video offers.

## `onlyWithTranscript` (type: `boolean`):

Drop videos that carry no captions. Off by default, so you can see which videos have none and why.

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

Add the per-line segments with start and end seconds next to the full text.

## `minWords` (type: `integer`):

Keep transcripts with at least this many words.

## `textContains` (type: `string`):

Keep videos whose transcript contains this, case-insensitive.

## `maxItems` (type: `integer`):

Hard stop on billed rows. 0 means no limit.

## `timeoutSeconds` (type: `integer`):

How long one request to TikTok may take before it is retried.

## Actor input object example

```json
{
  "profiles": [
    "nasa"
  ],
  "maxVideosPerProfile": 12,
  "onlyWithTranscript": false,
  "includeTimestamps": true,
  "minWords": 0,
  "maxItems": 50,
  "timeoutSeconds": 30
}
```

# Actor output Schema

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

All collected rows

# 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 = {
    "profiles": [
        "nasa"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("snow_leo_data/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 = { "profiles": ["nasa"] }

# Run the Actor and wait for it to finish
run = client.actor("snow_leo_data/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 '{
  "profiles": [
    "nasa"
  ]
}' |
apify call snow_leo_data/tiktok-transcript-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,snow_leo_data/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/gBuyzDGpGe7I9mZX9/builds/seXQtqwwp9v9psHZJ/openapi.json
