# Douyin Transcript Scraper — Speech to Text, SRT & VTT (`memo23/douyin-transcript-scraper`) Actor

Turn Douyin videos into transcripts: paste URLs, v.douyin.com share links, share text or video ids and get the spoken text, timestamped segments, SRT and WebVTT plus title, author, stats and duration. Works on videos without any subtitle track. Pay per video and per transcribed minute.

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

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Douyin Transcript Scraper — Speech to Text, SRT & VTT

Paste Douyin links — full URLs, `v.douyin.com` short links, the whole share text copied from the app, or bare video ids — and get back what is actually said in each video: plain text, timestamped segments, SRT and WebVTT subtitles, plus the video's title, author, engagement stats and duration. No Douyin login, no cookies, nothing to configure.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-douyin-transcript.png)

### What it does

1. **Takes any input shape.** A full `douyin.com/video/…` URL, a short share link, the entire share blob ("0.71 09/04 … 复制此链接，打开Dou音搜索…") — the actor finds the link inside it — or a 19-digit video id. Up to 200 per run, deduplicated.
2. **Resolves each video and loads its metadata**: title, author (nickname, uid), likes, comments, shares, favourites, duration, post date, cover and media links. Two independent data routes back this step, so one blocked lane does not fail your run.
3. **Transcribes the speech.** Native caption tracks are used when the video has one; most Douyin videos don't, so the actor runs AI speech-to-text on the audio. Mandarin and dialects are handled; music-only and silent videos are detected and never billed a transcription minute.
4. **Returns every format from one pass**: plain text, timestamped segments, SRT and WebVTT. Export JSON, CSV or Excel, or pull rows through the API.

### Sample output

A real row (CCTV's coverage of the Gyirong port rescue):

```json
{
  "input": "https://v.douyin.com/mi-Dvafw0HI/",
  "awemeId": "7680748547309915428",
  "url": "https://www.douyin.com/video/7680748547309915428",
  "success": true,
  "title": "#媒体原创 大型机械已推进至西藏吉隆口岸受灾核心区，现场正加快搜寻失联人员的痕迹。#直击第一线",
  "author": { "nickname": "央视网", "secUid": "MS4wLjABAAAA…" },
  "stats": { "likes": 15087, "comments": 79, "shares": 272, "collects": 1490 },
  "durationSeconds": 26,
  "transcriptSource": "speech-to-text",
  "transcriptText": "我现在的位置在吉隆口岸受灾的核心区 这个红色标记 往前大概目测只有20米的距离…",
  "transcript": [
    { "text": "我现在的位置在吉隆口岸受灾的核心区", "startMs": 0, "endMs": 3520 }
  ],
  "transcript_srt": "1\n00:00:00,000 --> 00:00:03,520\n我现在的位置在吉隆口岸受灾的核心区\n…",
  "transcript_vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:03.520\n…"
}
```

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `videos` | array | — | Video URLs, short links, share texts or ids — one per entry. |
| `transcriptFormats` | array | `text, segments, srt` | Which renditions to include. All come from one transcription pass; picking more costs nothing extra. |
| `translateTo` | string | — | Translate the transcript into this language (`en`, `es`, `pt-BR`…). Original is always retained; translated SRT/VTT keep the source timings. |
| `includeMetadata` | boolean | `true` | Author, stats, cover and media links on every row. |

### Pricing

| Event | Price | When |
|---|---|---|
| Actor start | $0.005 | Per run, per GB of memory |
| Video processed | $0.001 | Each video delivered with its metadata |
| Transcription | $0.005 / started minute | Only when a transcript is delivered |
| Translation | $0.02 / started 1,000 source characters | Only when a translation is delivered — never when the video already speaks the target language |

A typical 1-minute Douyin video costs **$0.006**, or **$0.026** with an English translation. A batch of 100 short videos ≈ **$0.60–0.70**. Videos that produce no transcript (deleted, silent, music-only) bill no transcription minutes, and failed lookups bill nothing at all.

### Honest notes

- **Transcription quality is speech-to-text quality.** Clear speech transcribes well; heavy background music, crosstalk and strong dialects lower accuracy. Timestamps come from the recognizer and are accurate to the segment.
- **Media URLs in the output expire.** Douyin signs its CDN links for hours, not days — use them right away or re-run.
- **Length limits**: videos up to 30 minutes on a paid Apify plan, up to 5 minutes on the free plan.
- **Music-only videos**: voice detection drops them before transcription, so you pay the $0.001 result fee and zero minutes.

### FAQ

**Do I need a Douyin account or cookies?** No. Only public videos are read, with no login anywhere in the pipeline.

**Does it work outside China?** Yes — that is the point. The actor runs from international infrastructure and needs no Chinese IP, SIM or app install.

**Can I paste the share text directly from the Douyin app?** Yes. Copy the share blob as-is; the actor extracts the link from the text. `/note/` links work too.

**Can I get the transcript in English?** Set `translateTo: "en"` (or any language code). You get `transcriptTranslated` segments with the original timings — so the translated SRT/VTT drop straight onto the video — while the original-language transcript stays on the row. If the video already speaks your target language, nothing is translated and nothing is billed.

**What language is the output?** Whatever is spoken — the recognizer detects it. Most Douyin content is Mandarin. Pair the transcript with your own translation step if you need English.

**Is this legal?** The actor reads publicly available videos. You are responsible for using the data in compliance with the source platform's terms and your local regulations.

### For AI agents & automation

Rows are flat JSON with stable field names (`transcriptText`, `transcript`, `transcript_srt`, `transcriptTranslatedText`), so the dataset drops straight into RAG pipelines, agent tools and MCP-compatible workflows: run the actor through the Apify API, read the dataset, feed the text to your model. Batch up to 200 videos per run and dedupe is automatic.

### Related actors

- [YouTube Transcript Scraper](https://apify.com/memo23/youtube-transcript-scraper) — same pipeline for YouTube, with Whisper fallback
- [Instagram Transcripts](https://apify.com/memo23/instagram-video-transcripts-scraper) — Reels and video transcripts
- [TikTok scrapers](https://apify.com/memo23) — search, profiles, posts and comments

### Support

Issues and feature requests via the actor's **Issues** tab — answered within a day.

# Actor input Schema

## `videos` (type: `array`):

One entry per video, in any of these shapes: a full URL (`https://www.douyin.com/video/74…`), a `v.douyin.com/…` share link, the WHOLE share text copied from the app (the actor finds the link inside it), or a bare video id.

## `transcriptFormats` (type: `array`):

All renditions come from one transcription pass — picking more costs nothing extra.

## `translateTo` (type: `string`):

Language code to translate the transcript into, e.g. `en`, `es`, `pt-BR`. The original-language transcript is always retained, translated SRT/VTT keep the source timings, and nothing is billed when the video already speaks the target language.

## `includeMetadata` (type: `boolean`):

Author, engagement stats, cover and media links on every row.

## `proxy` (type: `object`):

Leave empty — the actor manages its own network routes.

## Actor input object example

```json
{
  "videos": [
    "https://www.douyin.com/video/7680748547309915428"
  ],
  "transcriptFormats": [
    "text",
    "segments",
    "srt"
  ],
  "includeMetadata": true
}
```

# Actor output Schema

## `results` (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 = {
    "videos": [
        "https://www.douyin.com/video/7680748547309915428"
    ],
    "transcriptFormats": [
        "text",
        "segments",
        "srt"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/douyin-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 = {
    "videos": ["https://www.douyin.com/video/7680748547309915428"],
    "transcriptFormats": [
        "text",
        "segments",
        "srt",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/douyin-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 '{
  "videos": [
    "https://www.douyin.com/video/7680748547309915428"
  ],
  "transcriptFormats": [
    "text",
    "segments",
    "srt"
  ]
}' |
apify call memo23/douyin-transcript-scraper --silent --output-dataset

```

## MCP server setup

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