# Tiktok Transcript Scraper (`scrapevanta/tiktok-transcript-scraper`) Actor

🎥 Tiktok Transcript Scraper extracts accurate TikTok video transcripts fast. Perfect for content analysis, SEO insights, captions & research. 🚀 Save time, boost workflows, and unlock speech-to-text data!

- **URL**: https://apify.com/scrapevanta/tiktok-transcript-scraper.md
- **Developed by:** [ScrapeVanta](https://apify.com/scrapevanta) (community)
- **Categories:** Social media, SEO tools, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.99 / 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.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Tiktok Transcript Scraper

Return a **transcript of a TikTok video** from the caption track it publishes - no API key, no transcription service.

### What you get

- **Human-written subtitles told apart from machine ones**, with the text as prose and as timed cues.
- **Real metadata**: title, uploader, upload date, duration, and the view, like and comment counts the site publishes.
- **A per-URL result**, so one bad link no longer ends the run.
- **Failed URLs are returned but never billed** - see below.

### Input

| Field | Type | Required | What it does |
| --- | --- | --- | --- |
| `startUrls` | array | yes | The a transcript of a TikTok video to process. Accepts plain URLs or objects with a "url" key. |
| `preferredLanguages` | array | no | Language codes to fetch, for example en, es. Leave empty for every track the video has. |
| `includeAutoCaptions` | boolean | no | Machine-generated captions. They are marked `isAutomatic` so they can be told apart from subtitles a human wrote. |
| `proxyConfiguration` | object | no | The run rotates through a few IPs from this configuration when a site refuses one. TikTok refuses datacenter addresses outright, so a residential group matters here. |

### Which captions you actually get

Caption tracks come in three kinds and they are not equivalent:

- **Human-written subtitles** - what the uploader supplied.
- **Speech-recognised captions** - the site's transcription of the audio, in
  the language it is spoken in.
- **Machine translations** - that recognised track put through translation.

They were previously returned as one undifferentiated list. Each track now says
which it is. That matters for volume as well as accuracy: measured on one
YouTube video, the full track list was **6,599 entries**, because YouTube ships
a translation for every language pair. The record carries a summary of what is
available rather than thousands of rows, and by default fetches what the video
really has - the human-written tracks plus the recognised speech - instead of
every translation.

Consecutive repeated lines are collapsed, which is what rolling auto-captions
produce, so the text reads as prose rather than as a stutter.

### You are not charged for a URL that failed

Every previous version of this Actor pushed its error rows with
`charged_event_name="result"` - the same paid event a successful result uses.
A run over a hundred dead links cost exactly as much as a run over a hundred
live ones.

Failures are still returned, because you need to know which URLs did not work,
but they are not billed. Each one says what kind of failure it was and what to
do about it:

| `failureKind` | What it means |
| --- | --- |
| `ip-blocked` | The site refused this run's IP. Enable a residential proxy. |
| `geo-blocked` | Not available from that country. Set a proxy country. |
| `login-required` | Private, or the site wants a signed-in session. |
| `removed` | The media no longer exists at that URL. |
| `no-media` | A real page, but it carries no downloadable media. |
| `age-restricted` | Gated behind an age check. |
| `unsupported` | Not a URL this Actor can resolve. |
| `network` | A transient failure. Running it again may work. |

`ip-blocked`, `geo-blocked` and `network` are retried on a different IP before
being reported. A removed video is not - it will still be removed.

### Proxy

The run rotates through a few IPs from your proxy configuration and moves to a
new one when a site refuses the current one. TikTok in particular refuses
datacenter addresses outright - measured, a direct request returns *"Your IP
address is blocked from accessing this post"* - so a residential group is worth
setting for it.

### What it cannot do

- It does not sign in, so anything behind a login stays behind it.
- It resolves what the site publishes. A site that changes its delivery can break resolution until the underlying extractor catches up.
- Downloading media may be restricted by the source site's terms and by copyright. You are responsible for having the right to download and use what you fetch.

# Actor input Schema

## `startUrls` (type: `array`):

The a transcript of a TikTok video to process. Accepts plain URLs or objects with a "url" key.

## `preferredLanguages` (type: `array`):

Language codes to fetch, for example en, es. Leave empty for every track the video has.

## `includeAutoCaptions` (type: `boolean`):

Machine-generated captions. They are marked `isAutomatic` so they can be told apart from subtitles a human wrote.

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

The run rotates through a few IPs from this configuration when a site refuses one. TikTok refuses datacenter addresses outright, so a residential group matters here.

## Actor input object example

```json
{
  "preferredLanguages": [],
  "includeAutoCaptions": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped results, one dataset item per result.

# 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 = {};

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

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

```

## MCP server setup

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