# TikTok Transcript Scraper: Captions + AI Speech-to-Text (`parseforge/tiktok-transcript-scraper`) Actor

Extract TikTok video transcripts as clean text and timestamped segments. Uses TikTok captions and AI speech-to-text when none exist. Export CSV, Excel, JSON, XML.

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

## Pricing

from $1.50 / 1,000 video transcript 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

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v3.webp)

## 🎙️ TikTok Transcript Scraper

> 🚀 **Export TikTok video transcripts in seconds.** Paste video links and get the spoken words of every video as clean text plus timestamped segments, next to 31 columns of video, author and engagement data. When TikTok has no captions for a video, AI speech-to-text listens to the audio and fills the gap. 5 videos take about 5 seconds.

This Actor opens each TikTok video the way a logged out visitor does, reads TikTok's own caption track when the video has one, and turns it into a plain transcript and a list of phrases with start and end seconds. The text sits directly in the dataset, so there are no subtitle files to download and parse. For videos TikTok never captioned, the Actor sends the audio to a speech-to-text model and returns the same structure, with the detected language.

That second step matters more than it sounds. In our tests only about a third of TikTok videos carried captions: music clips, short clips and videos using a licensed sound usually have none. Caption-only tools return empty rows for those. Every row here says where its text came from (`TikTok auto-captions`, `TikTok creator captions` or `AI transcription`), so you always know how far to trust it.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Content marketers and social media managers | Turn winning TikToks into blog posts, newsletters and scripts |
| Brand and trend analysts | See what creators actually say about a product or topic |
| AI and data teams | Feed clean, timestamped TikTok speech into LLM and RAG pipelines |
| Agencies and creators | Study the hooks and scripts of top performing videos in a niche |
| SEO and keyword researchers | Mine spoken keywords from high view videos |
| Researchers and journalists | Archive and quote spoken content from public TikTok accounts |

### 📋 What the TikTok Transcript Scraper does

1. Accepts TikTok video links, one per line: full links, short `vm.tiktok.com` share links or bare video IDs. Duplicates are processed once.
2. Loads each public video page and reads the video, author, stats and sound data TikTok ships with it.
3. Downloads TikTok's caption track when one exists (auto-generated or written by the creator) and converts it to a transcript and timestamped segments.
4. For videos without captions, runs AI speech-to-text on the audio and returns the transcript, segments and detected language (mode **TikTok captions, AI transcription when a video has none**).
5. Emits one row per video with the transcript first and the engagement stats beside it, and one free error row for every link that is deleted, private or region locked.

> 💡 **Why it matters:** a transcript tool is only as good as its coverage. TikTok publishes captions for a minority of videos, so a caption-only scraper silently hands back empty rows for most of a typical list. Here every video gets a transcript attempt, and the `transcriptSource` column tells you which engine produced it.

### 🎬 Full Demo (🚧 Coming soon)

### 📊 Output

Each dataset row is one TikTok video. 31 columns per row.

| Field | Type | Description |
|---|---|---|
| 🖼 `imageUrl` | string | Video cover image |
| 📝 `caption` | string | The creator's post text, with hashtags and mentions |
| 🔗 `url` | string | Canonical video URL |
| 🆔 `id` | string | TikTok video ID |
| 🗣 `transcript` | string | Full spoken transcript as one clean text, or `N/A` when the video has no speech |
| 🎙 `transcriptSource` | string | `TikTok auto-captions`, `TikTok creator captions`, `AI transcription` or `None` |
| 🌐 `transcriptLanguage` | string | Language of the transcript (ISO 639-1, for example `en`, `es`) |
| 🔢 `transcriptWordCount` | number | Words in the transcript |
| ℹ️ `transcriptNote` | string | Why a transcript is missing, when it is (`No speech detected`, `TikTok has no captions for this video`...) |
| 💬 `hasTikTokCaptions` | string | `Yes` when TikTok itself captioned the video |
| 🗂 `captionLanguages` | array | Caption tracks TikTok offers, such as `eng-US` |
| ⏱ `durationSeconds` | number | Video length |
| 📅 `publishedAt` | string | Upload date and time (ISO 8601) |
| 👤 `authorUsername` | string | Creator handle |
| 🪪 `authorName` | string | Creator display name |
| ✅ `authorVerified` | string | `Yes` or `No` |
| 👥 `authorFollowers` | number | Creator's follower count |
| 🔗 `authorUrl` | string | Creator profile URL |
| 👁 `views` | number | Play count |
| ❤️ `likes` | number | Like count |
| 💭 `comments` | number | Comment count |
| 🔁 `shares` | number | Share count |
| 🔖 `saves` | number | Times saved to favourites |
| 🔤 `captionTextLanguage` | string | Language TikTok detected for the post text |
| 🎵 `musicTitle` | string | Sound used in the video |
| 🎤 `musicAuthor` | string | Author of the sound |
| 🎧 `isOriginalSound` | string | `Yes` when the creator recorded the sound |
| #️⃣ `hashtags` | array | Hashtags in the post |
| ⏲ `segments` | array | Phrases with `start`, `end` (seconds) and `text` |
| 🕒 `scrapedAt` | string | When the row was collected |
| ❌ `error` | string | Populated only on failed rows |

#### Real sample records

Three rows from a verification run: a video with TikTok auto-captions, a video with no captions transcribed by AI, and a longer captioned video.

```json
{
  "imageUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/oEfzYdICCJBwEAKi8ViqnEAUALANIwB6CLAKTA~tplv-tiktokx-origin.image?dr=9636&x-expires=1790438400&x-signature=WaPBrTXqbKKZSxiuCVI0QMLhp4A%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
  "caption": "How cute 😍 Does anyone else have a staffy that use to be this small??? #staffy #puppy #adorable #cute #vet",
  "url": "https://www.tiktok.com/@albionparkgerringongvet/video/7458054754124549384",
  "id": "7458054754124549384",
  "transcript": "Sweet, yummy. Oh, you're too cute.",
  "transcriptSource": "TikTok auto-captions",
  "transcriptLanguage": "en",
  "transcriptWordCount": 6,
  "transcriptNote": "N/A",
  "hasTikTokCaptions": "Yes",
  "captionLanguages": [
    "eng-US"
  ],
  "durationSeconds": 21,
  "publishedAt": "2025-01-09T23:01:36.000Z",
  "authorUsername": "albionparkgerringongvet",
  "authorName": "Albion Park and Gerringong Vet",
  "authorVerified": "No",
  "authorFollowers": 17000,
  "authorUrl": "https://www.tiktok.com/@albionparkgerringongvet",
  "views": 7600000,
  "likes": 1200000,
  "comments": 7952,
  "shares": 132600,
  "saves": 76607,
  "captionTextLanguage": "en",
  "musicTitle": "Come and Get Your Love",
  "musicAuthor": "Redbone",
  "isOriginalSound": "No",
  "hashtags": [
    "staffy",
    "puppy",
    "adorable",
    "cute",
    "vet"
  ],
  "segments": [
    {
      "start": 7,
      "end": 7.8,
      "text": "Sweet,"
    },
    {
      "start": 9.16,
      "end": 9.96,
      "text": "yummy."
    },
    {
      "start": 14.92,
      "end": 17.42,
      "text": "Oh, you're too cute."
    }
  ],
  "scrapedAt": "2026-09-24T16:51:55.470Z",
  "error": null
}
```

```json
{
  "imageUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/osPmQaUGeRkKsEGfQyALMPswIeK4ofIFdCL3PA~tplv-tiktokx-origin.image?dr=9636&x-expires=1790438400&x-signature=LGPpS2Gz0j2JLr2Oe9btZwdkp9E%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
  "caption": "Watch these little fluffballs play, cuddle, and melt hearts instantly They are looking for loving families who can give them a safe and happy forever home Sweet, playful, and full of love - these babies are ready to bring joy into someone's life Serious adopters only - message for details #shitzupuppies #Shitzu #shihtzupuppy #PuppyLove #shitzulovers @Ignacio González @sandee❤️👑 @LollyKaye @Maggie @Kristal @GiGi @Lilo @Brooke @Michele Araújo @consuelo lozano @Evie 🌻",
  "url": "https://www.tiktok.com/@shitzupuppies11/video/7642374094767279391",
  "id": "7642374094767279391",
  "transcript": "That's better, baby, there's a big smile. Let's all sit together for a while. You calm down, baby, you settle down, just to keep smiling, there's no need to frown.",
  "transcriptSource": "AI transcription",
  "transcriptLanguage": "en",
  "transcriptWordCount": 30,
  "transcriptNote": "N/A",
  "hasTikTokCaptions": "No",
  "captionLanguages": [],
  "durationSeconds": 20,
  "publishedAt": "2026-05-21T15:54:51.000Z",
  "authorUsername": "shitzupuppies11",
  "authorName": "Shitzupuppies",
  "authorVerified": "No",
  "authorFollowers": 309,
  "authorUrl": "https://www.tiktok.com/@shitzupuppies11",
  "views": 18700,
  "likes": 369,
  "comments": 53,
  "shares": 95,
  "saves": 35,
  "captionTextLanguage": "en",
  "musicTitle": "original sound",
  "musicAuthor": "Shitzupuppies",
  "isOriginalSound": "Yes",
  "hashtags": [
    "shitzupuppies",
    "shitzu",
    "shihtzupuppy",
    "puppylove",
    "shitzulovers"
  ],
  "segments": [
    {
      "start": 1.46,
      "end": 6.85,
      "text": "That's better, baby, there's a big smile."
    },
    {
      "start": 6.85,
      "end": 10.96,
      "text": "Let's all sit together for a while."
    },
    {
      "start": 10.96,
      "end": 19.99,
      "text": "You calm down, baby, you settle down, just to keep smiling, there's no need to frown."
    }
  ],
  "scrapedAt": "2026-09-24T16:51:57.881Z",
  "error": null
}
```

```json
{
  "imageUrl": "https://p16-common-sign.tiktokcdn-us.com/tos-useast2a-p-0037-euttp/a2dbd6095bc141b1893d396f8f29b152_1708531074~tplv-tiktokx-origin.image?dr=9636&x-expires=1790438400&x-signature=D9McojRi1LMpaG8MRIyQWXjK%2Fx8%3D&t=4d5b0474&ps=13740610&shp=81f88b70&shcp=43f4a2f9&idc=useast5",
  "caption": "wanna work work with us? 🤔 #fyp #prague #praha #job #protebe",
  "url": "https://www.tiktok.com/@apifylife/video/7338085038258457889",
  "id": "7338085038258457889",
  "transcript": "Hi, we're appetite. Of course it took us half a year to get what we actually do. Basically we were about the web scraping and browser animation tools. We're appetite. Of course. We have the best office in the center of crack. We're appetite. Of course we have a limited access to snacks, ice cream, why drinks, fruits and sauvagee. We're apple pie. Of course you can work anytime or anywhere. We're apple pie. Of course. We get free lunches daily. We're apple pie and we're hiring! Check out this link to see all the open positions!",
  "transcriptSource": "TikTok auto-captions",
  "transcriptLanguage": "en",
  "transcriptWordCount": 97,
  "transcriptNote": "N/A",
  "hasTikTokCaptions": "Yes",
  "captionLanguages": [
    "eng-US"
  ],
  "durationSeconds": 32,
  "publishedAt": "2024-02-21T15:57:51.000Z",
  "authorUsername": "apifylife",
  "authorName": "apifylife",
  "authorVerified": "No",
  "authorFollowers": 192,
  "authorUrl": "https://www.tiktok.com/@apifylife",
  "views": 15200,
  "likes": 267,
  "comments": 18,
  "shares": 43,
  "saves": 117,
  "captionTextLanguage": "en",
  "musicTitle": "original sound",
  "musicAuthor": "apifylife",
  "isOriginalSound": "Yes",
  "hashtags": [
    "fyp",
    "prague",
    "praha",
    "job",
    "protebe"
  ],
  "segments": [
    {
      "start": 0,
      "end": 1.88,
      "text": "Hi, we're appetite. Of course"
    },
    {
      "start": 1.88,
      "end": 4.12,
      "text": "it took us half a year to get what we actually do."
    },
    {
      "start": 4.12,
      "end": 5.44,
      "text": "Basically we were about the web"
    },
    {
      "start": 5.44,
      "end": 7.06,
      "text": "scraping and browser animation tools."
    },
    {
      "start": 7.24,
      "end": 8.56,
      "text": "We're appetite. Of course."
    },
    {
      "start": 8.56,
      "end": 10.4,
      "text": "We have the best office in the center of crack."
    },
    {
      "start": 10.4,
      "end": 11.46,
      "text": "We're appetite."
    },
    {
      "start": 11.48,
      "end": 13.88,
      "text": "Of course we have a limited access to snacks,"
    },
    {
      "start": 13.88,
      "end": 15.34,
      "text": "ice cream, why"
    },
    {
      "start": 16.68,
      "end": 19.98,
      "text": "drinks, fruits and sauvagee."
    },
    {
      "start": 20.24,
      "end": 21.08,
      "text": "We're apple pie."
    },
    {
      "start": 21.08,
      "end": 23.84,
      "text": "Of course you can work anytime or anywhere."
    },
    {
      "start": 23.84,
      "end": 27.1,
      "text": "We're apple pie. Of course. We get free lunches daily."
    },
    {
      "start": 27.52,
      "end": 29.22,
      "text": "We're apple pie and we're hiring!"
    },
    {
      "start": 29.56,
      "end": 31.66,
      "text": "Check out this link to see all the open positions!"
    }
  ],
  "scrapedAt": "2026-09-24T16:51:55.441Z",
  "error": null
}
```

Notice the third record: TikTok's own auto-captions heard the company name "Apify" as "appetite" and "apple pie". The **AI transcription for every video** mode exists for exactly this case, when you need the most accurate text rather than TikTok's captions.

### ✨ Why choose this Actor

- **The transcript is in the row.** Plain text in `transcript` and phrase-level timing in `segments`, right in the dataset. No `.vtt` files to download from a separate store and parse before you can use them.
- **Coverage beyond TikTok's captions.** TikTok captioned roughly one video in three in our tests. AI speech-to-text transcribes the rest from the audio, with the language detected automatically (the sample runs included Spanish audio on an English captioned post).
- **You always know the source.** `transcriptSource` separates TikTok auto-captions, creator-written captions and AI transcripts, and `transcriptNote` explains every empty transcript.
- **Video context on every row.** Views, likes, comments, shares, saves, publish date, duration, author, followers, sound and hashtags come with each transcript, so you can rank what was said by how it performed.
- **Any link format.** Full links, `vm.tiktok.com` share links and bare IDs, deduplicated by video ID.
- **Honest failures, never charged.** Deleted, private and region locked videos come back as error rows with the reason, and error rows are free.
- **Fast.** Plain HTTP against TikTok's server rendered pages, several videos at a time. The 5 video verification run finished in about 5 seconds, and 34 caption-only videos took 11 seconds.
- **No login and no cookies from you.** Only public videos, read the way a logged out visitor sees them.

### 📈 How it compares to alternatives

| | This Actor | Caption-only transcript tools | File-based transcript extractors | Manual copying |
|---|---|---|---|---|
| Transcript text inside the dataset | Yes | Varies | No, links to .vtt/.txt files | Yes |
| Timestamped segments | Yes, per phrase | Sometimes | Inside the .vtt file | No |
| Videos without TikTok captions | AI transcription | Empty row | AI transcription | Type it yourself |
| Source of each transcript labelled | Yes | No | Partly | N/A |
| Detected language | Yes | Caption track language | Yes | N/A |
| Engagement and author data | 31 columns | Varies | Yes | No |
| Short links and bare IDs | Yes | Varies | Full URLs | N/A |
| Photo posts (slideshows) | Free error row, no audio | Varies | No text | N/A |

The public page exposes only the original language caption track. Translated caption tracks are not published to logged out visitors, so this Actor does not return them. AI transcripts reflect whatever can be heard, which can include the lyrics of a song playing in the video.

### 🚀 How to use

1. Create a free Apify account. New accounts include $5 of free platform credit, which is plenty to try this out: [console.apify.com/sign-up](https://console.apify.com/sign-up?fpr=vmoqkp)
2. Open the Actor and go to the Input tab.
3. Paste TikTok video links, one per line:
   - `https://www.tiktok.com/@apifylife/video/7338085038258457889`
   - `https://vm.tiktok.com/...` share links work too
4. Set how many videos to process with **Max Items**.
5. Pick a **Transcript source**: TikTok captions with AI fallback (default), TikTok captions only, or AI for every video.
6. Click **Start**. The log prints each video's word count and source as it lands.
7. Open the **Dataset** tab and download as CSV, Excel, JSON or XML, or pull it from the API.

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@apifylife/video/7338085038258457889",
    "https://www.tiktok.com/@albionparkgerringongvet/video/7458054754124549384"
  ],
  "maxItems": 100,
  "transcriptionMode": "SUBTITLES_THEN_AI",
  "includeSegments": true
}
```

### 💼 Business use cases

#### Content repurposing at scale

Pick the 50 best performing videos of a creator or a campaign, run them through the Actor and hand `transcript` straight to your writers or an LLM. Each row keeps `views`, `likes` and `shares`, so you repurpose what actually worked instead of what was merely posted.

#### Hook and script research

The first segments of each video are its hook. Sort by `views`, read the first two or three entries of `segments` and you have a swipe file of openings that stopped the scroll in your niche, with the exact second each line lands.

#### Brand and product monitoring

Collect the videos that mention your product and read what creators say out loud, not only what they write in the caption. `transcriptLanguage` lets you route Spanish, Portuguese or German videos to the right team, and `authorFollowers` separates big voices from small ones.

#### AI and search pipelines

Clean text plus timed segments is the shape embedding and retrieval pipelines want. Load `segments` into a vector store and link each answer back to the second of the video it came from, with `url` and `publishedAt` for citations.

### 🔌 Automating TikTok Transcript Scraper

- **Make** and **Zapier**: trigger a run when a new TikTok link lands in a sheet or a form, then push the transcript into Notion, Airtable or your CMS.
- **Slack**: post the transcript of every new competitor video into a channel for the content team.
- **Airbyte**: sync datasets into Snowflake, BigQuery or Postgres and join them with your social analytics.
- **GitHub**: schedule runs from Actions and keep versioned transcript archives.
- **Google Drive**: drop a CSV or Google Sheet into a shared folder after every run.
- **API and webhooks**: every run emits a dataset ID. Subscribe to the run succeeded webhook and pull the rows into any system you already run.

### 🌟 Beyond business use cases

- **Research**: study language, misinformation or public health messaging in short form video with searchable, timestamped text.
- **Personal**: save the recipe, the workout or the tutorial someone explained in a video as text you can actually search.
- **Non-profit**: monitor how causes and campaigns are discussed on TikTok, in several languages.
- **Experimentation**: build a small corpus of spoken TikTok language for classification, summarisation or topic modelling experiments.

### 🤖 Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or any assistant to get help designing your run:

> I am using the ParseForge TikTok Transcript Scraper on Apify. It accepts TikTok video URLs and returns one row per video with 31 fields, including transcript (plain text), segments (start, end, text), transcriptSource (TikTok auto-captions, TikTok creator captions, AI transcription or None), transcriptLanguage, views, likes, comments, shares, saves, publishedAt, durationSeconds, authorUsername, authorFollowers, musicTitle and hashtags. TikTok captions exist for only part of the videos; AI transcription covers the rest. Help me design a run and an analysis to answer this question: \[your question here].

### ❓ Frequently Asked Questions

**🔐 Do I need a TikTok account or cookies?**
No. The Actor reads public video pages exactly as a logged out visitor sees them. Private videos cannot be read.

**🗣 What is the difference between captions and AI transcription?**
Captions are the text track TikTok publishes with a video, either generated automatically or written by the creator. AI transcription is produced by this Actor from the video's audio when you choose a mode that includes it. Both come back in the same `transcript` and `segments` columns, labelled by `transcriptSource`.

**📉 Why do so many videos have no TikTok captions?**
TikTok only captions part of its catalogue. In our tests about one video in three had a caption track. Music and dance clips, very short clips and videos using a licensed sound are the most likely to have none. That is why the default mode adds AI transcription.

**🔇 Why is a transcript `N/A`?**
Read `transcriptNote`: the video has no speech (`No speech detected`), TikTok has no captions and AI transcription was not requested, or the audio could not be retrieved. The row still carries all the video data.

**🎵 Can song lyrics appear in an AI transcript?**
Yes. Speech-to-text transcribes what can be heard, and a song playing in the video is part of that. TikTok's own captions usually skip music.

**🌍 Which languages are supported?**
TikTok captions come in the video's original language. AI transcription detects the spoken language automatically and transcribes it as spoken, without translating.

**⏱ Are the timestamps exact?**
For TikTok captions they are TikTok's own timings. For AI transcripts they are the model's estimates and can drift by a second or so.

**🖼 Do photo posts (slideshows) work?**
Photo posts have no spoken audio, so they return a free error row explaining that there is nothing to transcribe.

**🌐 Do I need a proxy?**
No for normal runs: TikTok video pages load without one. For very large batches, or if a video is locked to a region, switch on Apify Proxy and pick a country.

**⏳ How long can a video be?**
TikTok captions work for any length. AI transcription handles videos up to 15 minutes; longer videos keep their captions if TikTok has them and are otherwise flagged in `transcriptNote`.

**💵 How much does it cost?**
It is pay per event. Each video row costs $0.003 on the free Apify plan tier and less on higher tiers (down to $0.0005), with the TikTok captions included. AI speech-to-text, only when a video has no captions or you ask for it, adds $0.02 per started minute of video (down to $0.009). Error rows are free, and there is no run-start fee. Choose **TikTok captions only** to pay for the video rows alone.

**📥 What export formats are supported?**
CSV, Excel, JSON, XML, plus direct API access and integrations with Make, Zapier, Airbyte, Slack, Google Drive and more.

**⚖️ Is this legal?**
The Actor reads publicly available videos. You are responsible for how you use the transcripts, including copyright, privacy law and TikTok's terms where they apply to you.

### 🔌 Integrate with any app

Every run writes to an Apify dataset reachable through a REST API, so the output drops into whatever you already use. Native integrations cover Make, Zapier, Airbyte, Slack, Google Drive, GitHub, Google Sheets and webhooks, and the API covers everything else.

### 🔗 Recommended Actors

- [TikTok Profile Scraper - Bio, Counts & Videos](https://apify.com/parseforge/tiktok-profile-scraper) - collect a creator's video links, then transcribe them here.
- [TikTok Comments Scraper](https://apify.com/parseforge/tiktok-comments-scraper) - what viewers answered to what was said.
- [TikTok Hashtag Scraper - View Counts & Top Posts](https://apify.com/parseforge/tiktok-hashtag-analytics-scraper) - find the top videos of a hashtag to feed into this Actor.
- [YouTube Transcript Scraper - Timestamped Segments](https://apify.com/parseforge/youtube-transcript-scraper) - the same timestamped transcripts for YouTube videos.
- [Instagram Reel Scraper - Views, Audio & Captions](https://apify.com/parseforge/instagram-reel-scraper) - short form video data from Instagram.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** independent tool, not affiliated with TikTok or ByteDance; only publicly available data.

# Actor input Schema

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

Links to TikTok videos, one per line. Full links (https://www.tiktok.com/@user/video/7338085038258457889), short share links (https://vm.tiktok.com/...) and bare video IDs all work. Duplicates are processed once.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `transcriptionMode` (type: `string`):

Where the transcript comes from. TikTok only publishes captions for part of its videos (about a third in our tests). AI transcription listens to the audio of the videos without captions and is charged per started minute of video ($). Videos with no speech return an empty transcript.

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

Adds a segments list to each row with the start and end second of every phrase. Turn off for a lighter export when you only need the full text.

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

TikTok video pages load without a proxy. Switch on Apify Proxy for very large batches or if you see repeated load errors.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.tiktok.com/@apifylife/video/7338085038258457889",
    "https://www.tiktok.com/@albionparkgerringongvet/video/7458054754124549384",
    "https://www.tiktok.com/@shitzupuppies11/video/7642374094767279391",
    "https://www.tiktok.com/@lifesrad/video/7382596369933946155",
    "https://www.tiktok.com/@sxylaaaaa/video/7677709437271821581"
  ],
  "maxItems": 10,
  "transcriptionMode": "SUBTITLES_THEN_AI",
  "includeSegments": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Transcript, source, language and key video stats

## `fullData` (type: `string`):

Complete dataset with all 31 fields

# 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/@apifylife/video/7338085038258457889",
        "https://www.tiktok.com/@albionparkgerringongvet/video/7458054754124549384",
        "https://www.tiktok.com/@shitzupuppies11/video/7642374094767279391",
        "https://www.tiktok.com/@lifesrad/video/7382596369933946155",
        "https://www.tiktok.com/@sxylaaaaa/video/7677709437271821581"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/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/@apifylife/video/7338085038258457889",
        "https://www.tiktok.com/@albionparkgerringongvet/video/7458054754124549384",
        "https://www.tiktok.com/@shitzupuppies11/video/7642374094767279391",
        "https://www.tiktok.com/@lifesrad/video/7382596369933946155",
        "https://www.tiktok.com/@sxylaaaaa/video/7677709437271821581",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/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/@apifylife/video/7338085038258457889",
    "https://www.tiktok.com/@albionparkgerringongvet/video/7458054754124549384",
    "https://www.tiktok.com/@shitzupuppies11/video/7642374094767279391",
    "https://www.tiktok.com/@lifesrad/video/7382596369933946155",
    "https://www.tiktok.com/@sxylaaaaa/video/7677709437271821581"
  ],
  "maxItems": 10
}' |
apify call parseforge/tiktok-transcript-scraper --silent --output-dataset

```

## MCP server setup

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