Douyin Transcript API – AI Speech to Text & Subtitles avatar

Douyin Transcript API – AI Speech to Text & Subtitles

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Douyin Transcript API – AI Speech to Text & Subtitles

Douyin Transcript API – AI Speech to Text & Subtitles

Transcribe public Douyin videos into AI-generated text, timestamped segments, SRT, and WebVTT. Supports short links, share text, batch processing, optional translation, and video metadata.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

LanceAPI

LanceAPI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Douyin Transcripts Scraper API

Turn public Douyin videos into AI-generated transcripts — even when no native subtitle track is available.

Submit a public Douyin video URL, short link, copied share text, or aweme ID. Get speech-to-text as plain text, timestamped segments, SRT, WebVTT, or any combination from one transcription pass. Optionally add a translation plus available video, creator, engagement, and temporary media metadata.

This is an unofficial Actor and is not affiliated with or endorsed by Douyin or ByteDance.

At a glance

  • AI transcription: creates a transcript directly from spoken audio; no native subtitle track is required.
  • One pass, four formats: text, timestamped segments, SRT, and WebVTT are generated from the same transcription.
  • Optional translation: the original-language transcript is always retained.
  • Batch processing: submit up to 200 URLs in one run.
  • Structured output: receive Dataset/API records with transcript, status, errors, and optional metadata.
  • Billing: successful results and started transcription minutes; translation is charged only when requested and completed.

Quick start

  1. Add one or more public Douyin video inputs.
  2. Choose the transcript formats you need.
  3. Optionally enable translation and choose its target language.
  4. Start the Actor and open the Dataset.
{
"urls": ["https://www.douyin.com/video/7534679152504376595"],
"formats": ["text", "segments", "srt", "vtt"],
"translate": false,
"targetLanguage": "en",
"includeMediaMetadata": true
}

Short output example

The example below is based on a real public Douyin video. Temporary media URLs are shortened because they expire.

{
"inputUrl": "0.71 09/04 :9pm K@w.se uSL:/ # 媒体原创 大型机械已推进至西藏吉隆口岸受灾核心区,现场正加快搜寻失联人员的痕迹。# 直击第一线 https://v.douyin.com/mi-Dvafw0HI/ 复制此链接,打开Dou音搜索,直接观看视频!",
"normalizedUrl": "https://www.douyin.com/jingxuan?modal_id=7680748547309915428",
"awemeId": "7680748547309915428",
"success": true,
"status": "success",
"content": {
"id": "7680748547309915428",
"type": "video",
"title": "#媒体原创 大型机械已推进至西藏吉隆口岸受灾核心区,现场正加快搜寻失联人员的痕迹。#直击第一线",
"description": "#媒体原创 大型机械已推进至西藏吉隆口岸受灾核心区,现场正加快搜寻失联人员的痕迹。#直击第一线",
"publishedAt": "2026-09-02T01:47:12.000Z",
"durationSeconds": 26.05
},
"media": {
"videoUrl": "https://...",
"smallVideoUrl": "https://...",
"audioUrl": null,
"coverUrl": "https://...",
"mediaUrlsTemporary": true
},
"author": {
"nickname": "央视网",
"avatarUrl": "https://...",
"followerCount": 72894152,
"totalFavorited": 3325968064
},
"engagement": {
"playCount": 0,
"likeCount": 1400,
"commentCount": 44,
"shareCount": 20,
"collectCount": 90
},
"transcript": {
"source": "asr",
"language": "zh",
"characterCount": 113,
"text": "我现在验试在吉隆口岸受灾的核心区 这个红色挖机往前大概目测只有20米的距离 这个平台也就是现在有着五星红旗在飘扬的地方 就是此前的吉隆口岸的连检大楼 来自于移民警察还有消防的力量 现在正在人机配合 大家在加快搜寻试炼人员的痕迹",
"segments": [
{ "id": 0, "start": 0, "end": 3.66, "text": "我现在验试在吉隆口岸受灾的核心区" },
{ "id": 1, "start": 3.66, "end": 8.94, "text": "这个红色挖机往前大概目测只有20米的距离" },
{ "id": 2, "start": 8.94, "end": 13.8, "text": "这个平台也就是现在有着五星红旗在飘扬的地方" },
{ "id": 3, "start": 13.8, "end": 18.28, "text": "就是此前的吉隆口岸的连检大楼" },
{ "id": 4, "start": 18.28, "end": 20.78, "text": "来自于移民警察还有消防的力量" },
{ "id": 5, "start": 20.78, "end": 22.6, "text": "现在正在人机配合" },
{ "id": 6, "start": 22.6, "end": 26.08, "text": "大家在加快搜寻试炼人员的痕迹" }
]
},
"translation": null,
"error": null,
"scrapedAt": "2026-09-02T03:49:38.005Z"
}

playCount: 0 above is a value supplied by Douyin for that item, not a placeholder. Unknown optional numeric metadata is returned as null. The example requests text and segments; srt and vtt are included when selected.

Key features

  • Flexible input resolution: accepts supported URLs, short links, copied share text, and aweme IDs.
  • Canonical deduplication: equivalent inputs are processed once by aweme ID.
  • Isolated batch failures: an inaccessible video does not stop the rest of the batch.
  • Optional metadata: include best-effort content, media, creator, and engagement fields.
  • Dataset/API-ready records: consume structured transcript, status, and error data in automations.

Input reference

FieldTypeRequiredDefault / PrefillLimitsDescription
urlsarray of stringsYesExample URL prefilled in Console1–200 itemsPublic Douyin video inputs. Blank strings are ignored.
formatsarrayNotext, segmentsOne or more: text, segments, srt, vttOutput formats to derive from the transcript.
translatebooleanNofalseAdd a translated transcript without replacing the source transcript.
targetLanguagestringNoenOne supported target belowUsed only when translate is true.
includeMediaMetadatabooleanNotrueInclude available content, media, author, and engagement fields.

Translation targets

CodeLanguageCodeLanguage
enEnglishesSpanish
ptPortuguesefrFrench
deGermanitItalian
jaJapanesekoKorean
zh-CNChinese (Simplified)zh-TWChinese (Traditional)
arArabichiHindi
ruRussianidIndonesian
trTurkishviVietnamese
thThainlDutch
plPolishukUkrainian

Supported Douyin inputs

InputExample
Video URLhttps://www.douyin.com/video/{awemeId}
Note URLhttps://www.douyin.com/note/{awemeId}
Modal URLhttps://www.douyin.com/jingxuan?modal_id={awemeId} or https://www.douyin.com/discover?modal_id={awemeId}
Short linkSupported https://v.douyin.com/... redirects
Copied share textAny text containing a supported URL
Aweme IDA bare numeric aweme ID

/note/ inputs are accepted only when they resolve to a video or other audio-capable post. Search pages, profiles, comments, private content, and image-only posts are not supported.

Output reference

Each unique resolved aweme ID produces one Dataset record. Results can finish in a different order from the input list, so match records by inputUrl or awemeId rather than Dataset position.

FieldTypeDescription
inputUrlstringThe submitted input after basic normalization.
normalizedUrlstring or nullCanonical Douyin URL used for resolution when available.
awemeIdstring or nullCanonical resolved Douyin content ID.
successbooleanWhether transcription succeeded. true includes partial_success.
statusstringProcessing outcome; see Status and billing.
contentobject or nullVideo identity, type, title/description, publication time, and duration when metadata is enabled and available.
mediaobject or nullDirect audio/video/cover URLs and mediaUrlsTemporary when enabled and available.
authorobject or nullCreator information when enabled and available.
engagementobject or nullPlay, like, comment, share, and collect counts when enabled and available.
transcriptobject or nullOriginal-language transcript after successful ASR.
translationobject or nullOptional target-language transcript.
errorobject or nullPublic error details for unsuccessful or partial items.
scrapedAtISO 8601 stringTime the Dataset item was produced.

When includeMediaMetadata is false, content, media, author, and engagement are omitted from the record. Metadata is best effort: unavailable fields can be null, and temporary direct media URLs may expire.

Transcript and translation objects

FieldMeaning
sourceasr for the source transcript; translation for a translated transcript.
languageDetected spoken language for transcript, or requested target language for translation.
characterCountUnicode code-point count of complete text, including spaces and punctuation.
textFull transcript, included when text is selected.
segmentsTimed { id, start, end, text } entries in seconds, included when segments is selected.
srtComplete SubRip document, included when srt is selected.
vttComplete WebVTT document, included when vtt is selected.

All selected formats are derived from the same canonical transcript and timestamps. Selecting all four formats creates one transcription job and one transcript charge—not four.

Translation

Translation starts from the completed source transcript. It never replaces the original transcript and does not send the media through a second transcription pass.

  • If translate is false, translation is null.
  • If the detected language already matches targetLanguage, the Actor reuses the source content and creates no translation charge.
  • Simplified Chinese (zh-CN) and Traditional Chinese (zh-TW) are distinct targets.
  • If translation fails after a transcript is produced, the item remains usable: success is true, status is partial_success, translation is null, and error.code is TRANSLATION_FAILED.
  • Translation units are calculated from the original transcript's characterCount, never the translated character count.

Status and billing

Statuses

StatusMeaning
successTranscription and any requested translation completed.
partial_successTranscription completed, but optional translation failed.
invalid_inputThe input does not contain a supported Douyin input.
unsupported_urlThe Douyin URL is not a supported, audio-capable content type.
not_found, unavailable, private_contentThe content cannot be accessed.
blocked, rate_limitedDouyin rejected or throttled the resolver request.
media_resolve_failed, media_unavailable, no_audioNo usable media source was produced.
no_speechThe speech service reported no detectable speech.
transcription_timeout, transcription_failedSpeech recognition did not produce a usable transcript.
upstream_error, internal_errorNo more specific safe classification was available.

For partial_success, error.code is TRANSLATION_FAILED; it is not a top-level status value.

When events are charged

The Actor uses the billing events result, transcript, and translation.

Outcometranscriptresulttranslation
Resolution fails before ASR, including no_audioNoNoNo
ASR is submitted but fails or reports no_speechYesNoNo
Transcript succeeds; no translation requestedYesYesNo
Transcript succeeds; translation fails (partial_success)YesYesNo
Transcript and required translation succeedYesYesYes
Duplicate input resolving to an already processed aweme IDNoNoNo

Transcript billing begins immediately before the media is submitted to speech recognition, because upstream processing starts at submission. A successful transcript creates a result event even when optional translation later fails. Translation is charged only after the required translation succeeds. Extra requested formats and audio-to-video fallback do not create another transcript event.

Pricing

ServiceFreeStarterScaleBusiness
Successful results / 1,000$1.00$1.00$1.00$1.00
Transcript / 1,000 started minutes$7.00$6.50$6.00$5.00
Translation / started 1,000 source characters$0.10$0.09$0.08$0.07

Prices are applied per event unit: one successful result is $0.001 on every plan; transcript time rounds up to a started minute; translation characters round up to a started 1,000-character unit.

Resolution failures and canonical duplicates are not charged. Once media is submitted to speech recognition, started transcription minutes are chargeable even if transcription later fails or reports no speech.

Example 1 — 45-second video, no translation

  • Transcript: 1 started minute
  • Result: 1 successful result
  • Translation: 0 units

On the Free plan: $0.007 transcript + $0.001 result = $0.008.

Example 2 — 125-second video with translation

125 seconds rounds up to 3 started minutes. If the source transcript contains 1,650 characters, translation uses 2 started 1,000-character units. Add one successful result. For example, on the Free plan this is $0.021 transcript + $0.200 translation + $0.001 result = $0.222.

Limits

  • The Input Schema accepts 1–200 URLs.
  • Non-paying runs can process up to 5 URLs.
  • Paying runs can process up to 200 URLs.
  • Process public, accessible, audio-capable Douyin posts only.

API usage

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('lance_api/douyin-transcripts-scraper-api').call({
urls: ['https://www.douyin.com/video/7534679152504376595'],
formats: ['text', 'segments', 'srt'],
translate: false,
includeMediaMetadata: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('lance_api/douyin-transcripts-scraper-api').call(run_input={
'urls': ['https://www.douyin.com/video/7534679152504376595'],
'formats': ['text', 'segments'],
'translate': False,
'includeMediaMetadata': True,
})
print(client.dataset(run['defaultDatasetId']).list_items().items)

cURL

curl "https://api.apify.com/v2/acts/lance_api~douyin-transcripts-scraper-api/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"urls":["https://www.douyin.com/video/7534679152504376595"],"formats":["text","segments"]}'

For long videos or batches, use the asynchronous Actor API to avoid client-side timeouts.

Use cases

  • Create subtitles or captions for public Douyin videos.
  • Feed spoken-video content into AI/LLM workflows, semantic search, or knowledge bases.
  • Research creator messaging, themes, and public social-video trends.
  • Build searchable archives with timestamps for review and clip finding.
  • Localize public-video transcripts for multilingual editorial or research workflows.
  • Automate transcript collection in Apify API and MCP-compatible workflows.

FAQ

Does this extract Douyin's own subtitles?

No. The Actor generates a new transcript from spoken audio with AI speech recognition. It does not require or claim a native public subtitle track.

Do text, segments, SRT, and WebVTT cost four times?

No. All selected formats come from one ASR pass, so they create one transcript event.

Can I translate a video into another language?

Yes. Enable translate and choose a supported targetLanguage. The source transcript stays in transcript; the translated version is returned in translation.

Is translation charged when the source already uses my target language?

No. The Actor reuses the source transcript and does not create a translation event.

What happens if translation fails?

The source transcript is preserved. The item is returned with success: true, status: "partial_success", translation: null, and a structured translation error; no translation event is charged.

Are duplicate inputs charged twice?

No. Inputs resolving to the same aweme ID are processed and charged once.

No. The Actor is designed for supported public Douyin content and does not require you to provide a Douyin login Cookie.

Am I charged if transcription fails?

If resolution fails before media is submitted to speech recognition, there is no transcript charge. Once ASR processing starts, started transcription minutes are billed because upstream processing cost has begun—even if transcription later fails or reports no speech. No successful result event is charged in that case.

The post may be unavailable, private, unsupported, image-only, missing usable media, or contain no detectable speech. Check status and error in the Dataset item.

Are the media URLs permanent?

No. Direct media URLs are resolved at run time, are marked mediaUrlsTemporary: true, and may expire.

Yes, if the note resolves to a video or another audio-capable post. Image-only posts cannot be transcribed.

Does metadata failure make the transcript fail?

No. Metadata is best effort. Missing optional fields are returned as null when available without changing a successful transcript.

AI agents and MCP

Use this Actor through the Apify API, or through the Apify MCP Server in compatible AI-agent workflows. The Actor returns structured transcript and status data that an agent can use for downstream analysis, search, or automation.

Responsible use

Process only public videos you are permitted to use. Respect applicable laws, platform terms, copyright, privacy, and data-protection obligations. Do not submit private content, account credentials, or private cookies.

Support

For reproducible bug reports, include the public input URL, Apify run ID, item status, and error code. Do not send account credentials or private cookies. Contact lanceapi2026@hotmail.com or use the Actor page's issue/support channel.