# TikTok Transcript Scraper: Captions to Text, No Login (`themineworks/tiktok-transcript-scraper`) Actor

Get the transcript of any TikTok video from TikTok's own captions: plain text plus timed segments, language and caption source. Video links, share links, ids or a creator's latest videos. Videos without captions are free. No login, no speech to text fees.

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

## Pricing

from $1.25 / 1,000 transcripts

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: Captions to Text, No Login

[![120 TikTok videos checked in 62 seconds: transcripts from TikTok's own captions, free rows for videos without speech](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/tiktok-transcript-scraper-hero.png)](https://console.apify.com/actors/vVtbcBlWlBojJlWMR/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [YouTube Transcript](https://apify.com/themineworks/youtube-transcript-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [TikTok Scraper](https://apify.com/themineworks/tiktok-hashtag-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 140,000 runs across 170+ public actors.

Updated 20 Oct 2026: first release. Transcripts for TikTok video links, share links, video ids and a creator's latest videos, as plain text and timed segments, with the caption language and where the captions came from. Bookmark this Actor on its Store page so it is one click away next time.

### Why choose this actor?

- **The words spoken in the video, as text, in seconds.** TikTok makes captions for most videos with speech. This actor reads TikTok's own caption file and returns it as one plain text transcript plus every caption line with its start and end time. No audio download and no speech to text step: 40 video links took 39 seconds in our test.
- **A creator's latest videos, not just links you already have.** Give a username and the actor reads that creator's newest videos, up to 500, and returns a transcript for each one with captions. In our test, 6 creators and 120 videos took 62 seconds.
- **You pay only for transcripts.** A video with no captions (dance, music, no talking) gets a free row that says why. Private and deleted videos, wrong links, summary rows and duplicates are never charged, and a run where no video had captions pays nothing, not even the start fee. No TikTok account, cookies or API key.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/vVtbcBlWlBojJlWMR/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Social media and video family:** [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Instagram Followers & Following](https://apify.com/themineworks/instagram-followers-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Reddit Search Scraper](https://apify.com/themineworks/reddit-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the input (JSON view) and press Start. It returns the transcripts of two popular videos (118 million and 50 million views), 2 rows. It took 16 seconds in our test run:

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@mrbeast/video/7625263096117857567",
    "https://www.tiktok.com/@tiktok/video/7665823355194363167"
  ]
}
```

A video can be given as a full link (`tiktok.com/@user/video/<id>`), a share link from the app (`vm.tiktok.com/...`, `vt.tiktok.com/...` or `tiktok.com/t/...`), or just its id (`7625263096117857567`). The same video given twice is read once.

Apify's free plan includes $5 of credit every month, which covers about 2,700 transcripts at this actor's price.

#### Copy to your AI assistant

```text
themineworks/tiktok-transcript-scraper on Apify. Returns the transcript of TikTok videos from TikTok's own captions (plain text plus timed segments), for video links or a creator's latest videos, with no TikTok login. Call ApifyClient("TOKEN").actor("themineworks/tiktok-transcript-scraper").call(run_input={"videoUrls": ["https://www.tiktok.com/@mrbeast/video/7625263096117857567"]}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give videoUrls (list of TikTok video links, share links or video ids; up to 1000) and/or profiles (list of usernames or profile links; up to 100). Optional: maxVideosPerProfile (default 10, 1 to 500), language (caption language code such as "en" or "es"; blank = the language spoken), includeSegments (default true), includeSubtitleFiles (default false; adds vtt and srt strings), includeNoCaptionRows (default true), residentialFallback (default true). Transcript rows have no _type field and status "transcript" and carry video_id, video_url, input, author_username, author_nickname, author_id, author_verified, description, hashtags, description_language, created_utc, created_at, duration_sec, play_count, like_count, comment_count, share_count, save_count, music_title, music_author, is_ad, has_captions, language, language_code, caption_source (auto_captions, creator_subtitles or machine_translation), caption_source_code, caption_format, available_languages, transcript, segments [{start, end, text}], segment_count, word_count, char_count, transcript_duration_sec, scraped_at. Videos without captions get a row with _type "no_captions" and no_captions_reason; failures get _type "error" with error_type and reason; each run also writes a _type "summary" row and, when transcripts were delivered, an _type "info" row. Only transcript rows are charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~tiktok-transcript-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **TikTok's own captions, read as they are.** The actor downloads the WebVTT caption file TikTok made for the video and turns it into text. Nothing is transcribed again, so the words match what TikTok shows on screen when captions are on.
- **Plain text and timed lines.** `transcript` is the whole text in one string; `segments` lists every caption line with `start` and `end` in seconds; `includeSubtitleFiles` adds ready `.vtt` and `.srt` file contents.
- **Caption source in every row.** `caption_source` says whether the text is TikTok's auto captions (`auto_captions`), subtitles the creator added (`creator_subtitles`) or a machine translation (`machine_translation`). `available_languages` lists every caption language TikTok offers for the video.
- **Choose the language.** Leave `language` blank to get the captions in the language spoken. Set it (for example `en` or `es`) to get TikTok's translated captions when TikTok offers them.
- **Profiles by username.** Up to 100 creators per run and up to 500 latest videos each, read 15 videos per request.
- **Post details in the same row.** Author, description, hashtags, post date, duration, views, likes, comments, shares, saves and the sound used.

### How to use it

#### Basic: transcripts of videos you have

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@mrbeast/video/7625263096117857567",
    "https://vm.tiktok.com/ZMxxxxxxx/",
    "7665823355194363167"
  ]
}
```

One row per video. Videos with captions get `status: "transcript"`; videos without get a free `no_captions` row with the reason.

#### Content research: everything a creator said this month

```json
{
  "profiles": ["garyvee", "@hubermanlab"],
  "maxVideosPerProfile": 50,
  "includeSegments": false
}
```

The newest videos come first. Search the `transcript` column for a product name, a topic or a claim, and sort by `play_count` to see which talking points reached the most people.

#### Repurposing: turn your own TikToks into posts, threads or blog drafts

```json
{
  "profiles": ["<your username>"],
  "maxVideosPerProfile": 100
}
```

Each `transcript` is ready to paste into a writing tool or an AI assistant, with `description` and `hashtags` beside it.

#### Subtitles: VTT and SRT files for editing or reposting

```json
{
  "videoUrls": ["https://www.tiktok.com/@mrbeast/video/7625263096117857567"],
  "includeSubtitleFiles": true
}
```

`vtt` holds the caption file exactly as TikTok serves it, `srt` the same lines in SRT format. Save either field as a file to load it in a video editor.

#### Translation: English captions for videos in other languages

```json
{
  "profiles": ["<a creator who posts in Spanish>"],
  "maxVideosPerProfile": 30,
  "language": "en"
}
```

When TikTok has an English translation of a video's captions, that track is returned with `caption_source: "machine_translation"` and `requested_language_found: true`. When it does not, the original captions come back and `requested_language_found` is `false`.

#### AI datasets: spoken text with engagement numbers

```json
{
  "profiles": ["bbcnews", "nytimes", "neildegrassetyson"],
  "maxVideosPerProfile": 200,
  "includeNoCaptionRows": false
}
```

Only transcript rows are returned. `word_count`, `duration_sec`, `play_count` and `like_count` let you filter by length and reach before training or analysis.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `videoUrls` | array of strings | empty | TikTok video links, share links or video ids. Up to 1,000 per run. A profile link here is read as a profile. |
| `profiles` | array of strings | empty | Usernames (`garyvee` or `@garyvee`) or profile links. Up to 100 per run. |
| `maxVideosPerProfile` | integer | `10` | Latest videos to check per profile, 1 to 500. Videos without captions count toward it. |
| `language` | string | empty | Caption language code such as `en`, `es` or `eng-US`. Blank returns the language spoken. |
| `includeSegments` | boolean | `true` | Adds `segments`, every caption line with its start and end time. |
| `includeSubtitleFiles` | boolean | `false` | Adds `vtt` and `srt`, the captions as subtitle file contents. |
| `includeNoCaptionRows` | boolean | `true` | Adds a free row for each video without captions. |
| `residentialFallback` | boolean | `true` | Retries a request TikTok refused twice from a residential IP. Never changes what you pay. |

Give `videoUrls`, `profiles` or both.

### What data do you get?

One row per video. Transcript rows have no `_type` field and `status: "transcript"`; the no_captions, error, summary and info rows carry a `_type`, so a filter on `_type` separates them.

| Field | What it is |
|---|---|
| `status` | `transcript` on charged rows, `no_captions` or `error` on free ones |
| `video_id`, `video_url` | TikTok's video id and the link to the video |
| `input` | The link, id or `@username` the row came from |
| `author_username`, `author_nickname`, `author_id`, `author_verified` | The creator |
| `description`, `hashtags`, `description_language` | The text the creator posted with the video |
| `created_utc`, `created_at` | When it was posted (Unix seconds and ISO 8601, UTC) |
| `duration_sec` | Video length in seconds |
| `play_count`, `like_count`, `comment_count`, `share_count`, `save_count` | Counts when the row was read |
| `music_title`, `music_author` | The sound used |
| `is_ad` | True when TikTok marks the post as an ad or paid partnership |
| `has_captions` | True on transcript rows |
| `language`, `language_code` | The caption track used, e.g. `eng-US` and `en` |
| `requested_language_found` | Only when `language` is set: whether a track in that language was found |
| `caption_source`, `caption_source_code` | `auto_captions` (TikTok code `ASR`), `creator_subtitles` (`LC`) or `machine_translation` (`MT`) |
| `caption_format` | `webvtt` |
| `available_languages` | Every caption language TikTok offers for the video |
| `transcript` | The whole transcript as plain text |
| `segments` | Caption lines in order, each `{ start, end, text }` in seconds |
| `segment_count`, `word_count`, `char_count` | Size of the transcript |
| `transcript_duration_sec` | End time of the last caption line |
| `vtt`, `srt` | Subtitle file contents (with `includeSubtitleFiles`) |
| `scraped_at` | When the row was written |

**No captions rows** (`_type: "no_captions"`, never charged): the same post fields, `has_captions: false`, `no_captions_reason` in words and `no_captions_code` (`tiktok_reason_3` when TikTok found no speech, `tiktok_reason_<n>` for TikTok's other reason codes, `photo_post`, `caption_file_unavailable`, `empty_captions`).

**Error rows** (`_type: "error"`, never charged): `error_type` (`invalid_input`, `not_found`, `private`, `removed`, `banned`, `share_link_unresolved`, `blocked_or_failed`), `input`, `video_id` when known, and `reason`.

**Summary row** (`_type: "summary"`, never charged): `videos_requested`, `profiles_requested`, `profiles_read`, `videos_checked`, `transcripts_delivered`, `charged_for`, `no_captions`, `videos_failed`, `duplicates_skipped`, `caption_share`, `caption_sources`, `caption_languages`, `stopped_by_max_cost`, `rows_withheld_max_cost`, `shortfall_reason` when fewer transcripts came back than asked, and request and byte counts. The same summary is saved as the `OUTPUT` record of the run.

#### Stable fields for automations

These were present in every transcript row of our test runs (98 transcripts from 160 videos), and their names will not change:

| Field | What it is |
|---|---|
| `video_id` | The key to store and join on |
| `video_url` | Link to the video |
| `status` | `transcript` |
| `author_username` | Creator's username |
| `created_at` | Post time, ISO 8601 UTC |
| `language` | Caption track language |
| `caption_source` | Where the captions came from |
| `available_languages` | All caption languages |
| `transcript` | The text |
| `segment_count` | Caption lines |
| `word_count` | Words |
| `scraped_at` | Row time |

Optional, present only when TikTok has a value or you asked for it: `segments` (on by default), `vtt` and `srt`, `requested_language_found`, `description_language`, `music_title`, `music_author`, and the counts on posts where TikTok hides them.

#### Output examples

A transcript row from the "Try it" input above (test run, 20 Oct 2026, transcript and segments trimmed):

```json
{
  "status": "transcript",
  "video_id": "7665823355194363167",
  "video_url": "https://www.tiktok.com/@tiktok/video/7665823355194363167",
  "author_username": "tiktok",
  "author_nickname": "TikTok",
  "author_verified": true,
  "description": "@Josh Groban on authentically sharing the process, catch more on In The Mix with Jack Coyne, presented by @T-Mobile ",
  "created_at": "2026-07-23T20:30:08.000Z",
  "duration_sec": 47,
  "play_count": 50900000,
  "like_count": 134300,
  "comment_count": 2750,
  "share_count": 430,
  "save_count": 8612,
  "has_captions": true,
  "language": "eng-US",
  "language_code": "en",
  "caption_source": "auto_captions",
  "caption_source_code": "ASR",
  "caption_format": "webvtt",
  "available_languages": ["eng-US"],
  "transcript": "The old school way of growing up in this business was, like, you have to be that guy on the billboard, and you can't show the struggle. You can't show the dark days or the anxiety or the depression or whatever else. ...",
  "segments": [
    { "start": 0.06, "end": 2.58, "text": "The old school way of growing up in this business was, like," },
    { "start": 2.581, "end": 4.301, "text": "you have to be that guy on the billboard," }
  ],
  "segment_count": 23,
  "word_count": 189,
  "char_count": 962,
  "transcript_duration_sec": 43.401
}
```

A video without captions (a dance clip from a profile run; nothing charged):

```json
{
  "_type": "no_captions",
  "status": "no_captions",
  "video_id": "7697799680230575373",
  "author_username": "charlidamelio",
  "duration_sec": 10,
  "has_captions": false,
  "available_languages": [],
  "no_captions_reason": "TikTok found no speech to caption (music, sound only or no talking).",
  "no_captions_code": "tiktok_reason_3"
}
```

An error row for a video that does not exist (nothing charged):

```json
{ "_type": "error", "status": "error", "error_type": "not_found", "input": "https://www.tiktok.com/@nobody/video/7000000000000000001", "video_id": "7000000000000000001", "reason": "TikTok says this post is not found (status 10204, item doesn't exist). Nothing was charged." }
```

### Pricing

Pay per event: you pay for the transcripts you receive, plus a flat $0.003 per run, whatever memory you choose.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `transcript-scraped` | Once per transcript row stored in your dataset | $1.79 per 1,000 | $1.70 per 1,000 | $1.52 per 1,000 | $1.25 per 1,000 |
| `run-start` | Once per run, with the run's first transcript | $0.003 | $0.003 | $0.003 | $0.003 |

The price of one transcript is the price per 1,000 divided by 1,000. A run of 100 transcripts on the free plan costs $0.179 plus $0.003.

Never charged:

- videos TikTok has no captions for (each gets a `no_captions` row);
- private, deleted or missing videos and profiles, links that are not TikTok, and share links that cannot be opened (each gets an error row);
- the same video found twice in one run;
- the summary, info, error and no_captions rows;
- a run where no video returned a transcript: it pays no start fee either;
- anything past your "Max cost per run". The actor checks the budget before each transcript and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

### Run it on a schedule

1. Open the actor in Apify Console, set your input (for example a list of creators in `profiles` with `maxVideosPerProfile: 10`) and click **Save as a new task**.
2. In the task, open **Schedules**, click **Add schedule** and pick how often (every day at 08:00, every Monday and so on).
3. Optional: add an integration (Google Sheets, Slack, a webhook) so new transcripts land where your team works.

Each run reads the newest videos again. To keep only videos you have not stored yet, dedupe on `video_id` in your sheet or database.

### FAQ

#### Where does the transcript come from?

From TikTok itself. TikTok makes captions for most videos with speech (viewers see them with the CC button), and offers translated captions for some. The actor downloads that caption file and returns it as text and timed lines. It does not run its own speech recognition.

#### What share of videos has a transcript?

It depends on the creator. In our 20 Oct 2026 tests, 87% of 415 videos from talk based creators (news, science, podcasts, MrBeast) had captions, 78% of 40 random videos from them read one by one, and 56% of 120 videos from a mix that included dance and comedy creators. Videos with music only, no talking or very short clips usually have none, and those rows are free.

#### What if a video has no captions?

You get a free `no_captions` row with the post details and the reason TikTok gives, for example that it found no speech to caption. Turn off `includeNoCaptionRows` to get transcript rows only. This actor does not transcribe audio; for videos without captions, [Video Transcriber](https://apify.com/themineworks/instagram-tiktok-video-transcript?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) listens to the audio and returns a transcript.

#### How accurate are the transcripts?

They are TikTok's own captions, so they are as accurate as what TikTok shows on screen: good for clear speech, weaker for music, heavy accents or several people talking at once. `caption_source` tells you whether the text is TikTok's auto captions, the creator's own subtitles or a machine translation.

#### Which languages are supported?

Every language TikTok makes captions in. Without `language`, you get the captions in the language spoken in the video (`language` holds TikTok's code, such as `eng-US`, `spa-ES` or `rus-RU`). With `language`, you get that language when TikTok has a track for it.

#### How many videos per run, and how long does it take?

Up to 1,000 video links and 100 profiles of up to 500 videos each. In our tests: 16 seconds for the two video "Try it" input, 39 seconds for 40 video links, 62 seconds for 6 profiles of 20 videos each. Profiles are the faster route per video because TikTok returns 15 videos per request.

#### Do I need a TikTok account, cookies or a proxy?

No. The actor reads public videos the way a logged out visitor sees them. The proxy is included.

#### What happens with private or deleted videos?

A video that does not exist or was removed gets an error row (`not_found` or `removed`), a private one `private`, and none of them is charged. A private profile gets an error row too, since its videos cannot be read without logging in.

#### Which link formats work?

Video links (`tiktok.com/@user/video/<id>`, with or without the username and any `?` parameters), photo post links, embed links, `m.tiktok.com/v/<id>.html`, bare video ids, and share links from the app (`vm.tiktok.com/<code>`, `vt.tiktok.com/<code>`, `tiktok.com/t/<code>`). A profile link given in `videoUrls` is read as a profile.

#### Which TikTok actor should I use?

This one for what is said in the videos. [TikTok Scraper](https://apify.com/themineworks/tiktok-hashtag-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) to find videos by hashtag, keyword or trending. [TikTok Creator Scraper](https://apify.com/themineworks/tiktok-creator-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) for creator profiles and video stats. [TikTok Video Comments Scraper](https://apify.com/themineworks/tiktok-video-comments-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) for the comments under a video. [Video Transcriber](https://apify.com/themineworks/instagram-tiktok-video-transcript?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) when a video has no captions and you need its audio transcribed.

#### Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has two ready views: Transcripts and Captions per video. For subtitle files, turn on `includeSubtitleFiles` and save the `vtt` or `srt` field.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/tiktok-transcript-scraper

- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http tiktok-transcript-scraper "https://mcp.apify.com/?tools=themineworks/tiktok-transcript-scraper"`

#### Is it legal to scrape TikTok transcripts?

The actor reads only public videos and the captions TikTok shows to anyone without logging in. Transcripts are the creators' words; you are responsible for how you use them, including TikTok's terms, copyright and data protection law such as GDPR and CCPA. This is general information, not legal advice.

### Integrations

- **Google Sheets**: send each run's transcripts to a sheet with Apify's Google Sheets integration; one row per video fits a sheet as is.
- **Make, Zapier and n8n**: start a run and read its dataset with the Apify apps and nodes, for example "new videos from these creators, transcribed, to Notion".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Followers & Following](https://apify.com/themineworks/instagram-followers-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Search Scraper](https://apify.com/themineworks/reddit-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Twitter / X Scraper](https://apify.com/themineworks/twitter-x-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [YouTube Transcript](https://apify.com/themineworks/youtube-transcript-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Xiaohongshu (RED) Scraper](https://apify.com/themineworks/xiaohongshu-explore-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Telegram Channel Scraper](https://apify.com/themineworks/telegram-channel-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Telegram Channel Finder](https://apify.com/themineworks/telegram-channel-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Pinterest Profile Scraper](https://apify.com/themineworks/pinterest-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a video that should have a transcript but came back without one, or a link format that is not read? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.

*Give TikTok video links or usernames and get each video's transcript back as plain text and timed lines, with language, caption source and post details, no login.*

# Actor input Schema

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

The videos whose transcripts you want, one per line. Any of these forms works: https://www.tiktok.com/@mrbeast/video/7625263096117857567, a share link from the app (https://vm.tiktok.com/ZM.../ or https://www.tiktok.com/t/ZT.../), or just the video id 7625263096117857567. A profile link (https://www.tiktok.com/@garyvee) is read as a profile. Up to 1,000 links per run; the same video given twice is read once.

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

Optional. Usernames (garyvee or @garyvee) or profile links. The actor reads each creator's latest videos, newest first, up to maxVideosPerProfile, and returns a transcript for every one that has captions. Up to 100 profiles per run.

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

How many of each profile's latest videos to check, 1 to 500. Videos without captions count toward this number but are not charged. Example: 30.

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

Leave blank to get the captions in the language spoken in the video. Or give a language code such as en, es, fr or eng-US: when TikTok offers a caption track in that language (often a machine translation), it is used instead. When it does not, the original captions are returned and requested_language_found is false.

## `includeSegments` (type: `boolean`):

Add segments: every caption line with its start and end time in seconds. Turn off if you only need the plain text transcript.

## `includeSubtitleFiles` (type: `boolean`):

Add the captions as a WebVTT file (vtt, exactly as TikTok serves it) and an SRT file (srt) in each row, ready to save as .vtt or .srt.

## `includeNoCaptionRows` (type: `boolean`):

Add a free row (status no_captions, with the reason) for each video TikTok has no captions for, so you can see which videos had no speech. These rows are never charged. Turn off to get transcript rows only.

## `residentialFallback` (type: `boolean`):

Leave on. When TikTok refuses a request from a datacenter IP twice, try once more from a residential IP before giving up on that video. This never changes what you pay.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@mrbeast/video/7625263096117857567",
    "https://www.tiktok.com/@tiktok/video/7665823355194363167"
  ],
  "maxVideosPerProfile": 10,
  "includeSegments": true,
  "includeSubtitleFiles": false,
  "includeNoCaptionRows": true,
  "residentialFallback": true
}
```

# Actor output Schema

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

No description

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

No description

# 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 = {
    "videoUrls": [
        "https://www.tiktok.com/@mrbeast/video/7625263096117857567",
        "https://www.tiktok.com/@tiktok/video/7665823355194363167"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/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 = { "videoUrls": [
        "https://www.tiktok.com/@mrbeast/video/7625263096117857567",
        "https://www.tiktok.com/@tiktok/video/7665823355194363167",
    ] }

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

```

## MCP server setup

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