Xiaohongshu (RedNote) AI Transcript API – Video to Text avatar

Xiaohongshu (RedNote) AI Transcript API – Video to Text

Pricing

from $17.00 / 1,000 url processings

Go to Apify Store
Xiaohongshu (RedNote) AI Transcript API – Video to Text

Xiaohongshu (RedNote) AI Transcript API – Video to Text

Transcribe public Xiaohongshu (RedNote) videos with AI. Get clean text, timestamped segments, SRT and WebVTT subtitles, with optional translation, metadata, and downloadable video URLs.

Pricing

from $17.00 / 1,000 url processings

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

Share

RedNote (Xiaohongshu) AI Transcript API – No xsec_token Required

Convert public RedNote/Xiaohongshu videos into clean text, timestamped segments, SRT, and WebVTT subtitles—with optional translation, note metadata, and downloadable video URLs.

No xsec_token is required for normal use. If you already have a valid token for a public note, provide it in the URL or through the optional xsecToken input.

Submit a 24-character note ID, full Xiaohongshu URL, supported XHS short link, or app share text. Process 1–1,000 inputs and receive one structured Dataset record per item. Select only the transcript formats and optional features your workflow needs.

Pay only for the processing you use: note resolution, AI transcription by started media minute, optional translation by character volume, and an optional downloadable-video URL add-on.

  • One transcription, four output formats: get plain text, timestamped segments, SRT, and WebVTT without paying for four separate transcriptions
  • Optional translation preserves the original transcript
  • AI-minute visibility whenever an AI transcription charge occurs, plus translation-unit visibility on completed translations
  • Optional metadata and downloadable video URL output
  • Batch processing with isolated failures and duplicate-aware billing

✨ Key features

AI transcript from RedNote video audio

Convert spoken RedNote/Xiaohongshu video content into clean text for search, research, indexing, accessibility, and downstream AI workflows.

Four transcript formats from one result

Return plain text, timestamped segments, SRT subtitles, and WebVTT subtitles from the same transcription. Selecting multiple formats does not create additional AI-minute charges.

Optional translation that preserves the source

Translate the completed speech transcript to a selected language while keeping the original transcript unchanged. Translation never overwrites the source-language result.

Flexible public-note inputs

Accept note IDs, supported full URLs, xhslink.com/xhslink.cn short links, Markdown-wrapped links, and complete app share text.

Output controls for cleaner datasets

Turn note metadata off when you need only speech text. Request a downloadable video URL only when the downstream workflow needs the media address.

Batch up to 1,000 inputs

Process large lists with bounded concurrency. One failed, deleted, inaccessible, image-only, or silent item does not stop the remaining inputs.

Duplicate-aware processing and billing

Every submitted input receives a Dataset record. Equivalent notes are processed and charged only once; later records are marked with duplicate and duplicateOf.

🚀 Quick start

Use the Actor in Apify Console:

  1. Add a public video note ID or supported URL to urls.
  2. Click Start.
  3. Open the run's Dataset.
  4. Read transcript.text.
  5. Enable subtitles, translation, metadata, or downloadable video URLs only when needed.

The smallest valid input is:

{
"urls": ["6a87dbad0000000005030ca4"]
}

By default, the Actor returns text and segments, includes note metadata, does not translate, and does not return the paid downloadable video URL add-on.

Supported RedNote / Xiaohongshu inputs

The Actor accepts:

  • A 24-character hexadecimal note ID, such as 6a87dbad0000000005030ca4
  • https://www.xiaohongshu.com/explore/{noteId}
  • https://www.xiaohongshu.com/discovery/item/{noteId}
  • https://www.xiaohongshu.com/red_video/{noteId}
  • HTTP or HTTPS short links from xhslink.com and xhslink.cn
  • Complete app share text containing a supported link
  • Markdown-wrapped supported links

A note ID is usually the cleanest input. Find it in a supported note URL after /explore/, /discovery/item/, or /red_video/, or in the noteId/id field returned by another RedNote search or user-notes workflow.

Profile URLs, user pages, search pages, and unrelated Xiaohongshu pages are unsupported. Image-only notes can be submitted but cannot produce a transcript and return unsupported_note_type.

Short-link redirects, tracking parameters, and equivalent supported paths are normalized to a canonical explore URL. Duplicate detection uses the canonical note ID.

Note IDs and xsec_token

xsec_token is optional, and normal use does not require it. The Actor can use a valid token already present in a supported public note URL, or you can provide one through the separate xsecToken field.

If both are supplied, the separate xsecToken field takes precedence over the URL token. The separate field applies to the whole run, so keep note-specific tokens in their matching URLs for mixed batches. An absent token is allowed. An expired or invalid supplied token can cause a resolution failure.

The separate xsecToken field is not returned in Dataset records, and request URLs are sanitized before logging. Because input preserves the submitted value, a token embedded directly in a submitted URL remains visible in that record's input field.

Input

FieldTypeRequiredDefaultLimitsDescription
urlsstring[]YesNone1–1,000 itemsNote IDs, supported full URLs, short links, Markdown links, or app share text. Items are normalized and deduplicated by canonical note identity.
xsecTokenstringNoEmptyOne run-level valueOptional token for the same public note. Overrides a token in the URL. For mixed batches with note-specific tokens, keep each token in its matching URL. Missing tokens are allowed; invalid, expired, or mismatched tokens can cause resolution failure.
formatsstring[]No['text', 'segments']Unique values from text, segments, srt, vttSelect transcript and translation representations. An empty array also falls back to text and segments.
includeMediaMetadatabooleanNotrueInclude title, description, author, engagement, and tags. Turn off for a smaller transcript-focused record.
includeVideoUrlbooleanNofalsePaid add-on. Return media.videoUrl when a downloadable URL is successfully available. No returned URL means no video URL charge.
translatebooleanNofalseAdd a translated copy while preserving the original transcript. No translation service or translation charge is used when disabled.
targetLanguagestringNoenOne supported dropdown valueTranslation target. Used only when translate is true; users select a language name in the Console.
webSessionstringNoEmptyOne run-level valueOptional Xiaohongshu web_session value for direct requests to public content you are authorized to access. Most users do not need it. It does not automate login, access private content, or bypass access controls.

The target-language dropdown includes English, Simplified and Traditional Chinese, Japanese, Korean, Spanish, French, German, Portuguese, Italian, Dutch, Russian, Ukrainian, Polish, Czech, Swedish, Danish, Finnish, Norwegian, Turkish, Arabic, Hebrew, Hindi, Bengali, Indonesian, Malay, Thai, Vietnamese, Filipino, Greek, Romanian, and Hungarian.

Only need the transcript? Turn metadata and the downloadable video URL off.

Need subtitles? Add srt or vtt to formats.

Need translation? Enable it only when needed; the original transcript remains available.

Input examples

All transcript formats

{
"urls": ["6a87dbad0000000005030ca4"],
"formats": ["text", "segments", "srt", "vtt"],
"includeMediaMetadata": false
}

Translate to English

{
"urls": ["6a87dbad0000000005030ca4"],
"formats": ["text", "segments", "srt"],
"translate": true,
"targetLanguage": "en"
}

Include metadata and downloadable video URL

{
"urls": ["https://www.xiaohongshu.com/explore/6a87dbad0000000005030ca4"],
"formats": ["text"],
"includeMediaMetadata": true,
"includeVideoUrl": true
}

Batch input

{
"urls": [
"6a87dbad0000000005030ca4",
"https://www.xiaohongshu.com/red_video/6a84418900000000270212b1",
"https://www.xiaohongshu.com/explore/6a840ef900000000270231e6"
],
"formats": ["text"],
"includeMediaMetadata": false
}

Transcript formats

All selected formats are generated from the same speech-recognition result. Asking for four formats does not mean four transcriptions and does not multiply ai-transcription-minute billing.

text

Plain transcript text for LLM prompts, search, indexing, summaries, and content databases.

segments

Timestamped speech segments for quote extraction, timeline analysis, editing, and synchronization. start and end are measured in seconds.

srt

SubRip subtitle text generated locally from the returned segments. Timestamps use HH:MM:SS,mmm.

vtt

WebVTT subtitle text generated locally from the same segments. Suitable for web players and accessibility workflows; timestamps use HH:MM:SS.mmm.

Translation

Translation is optional and disabled by default.

  • The source-language result always remains in transcript.
  • The translated copy is returned in translation and never overwrites transcript.
  • translation.language is the selected target language.
  • Translation uses the same selected formats, including translated text, segments, SRT, and VTT when requested.
  • Translated segments preserve the original segment timestamps and order.
  • Only speech transcript content is translated; note title, caption, author, tags, and other metadata are not translated.
  • Long transcripts are processed in ordered batches while preserving segment order.
  • If translation fails after transcription succeeds, the result remains successful with status: "partial_success", the original transcript is kept, and translation is null.
  • A failed translation does not emit a translation charge.
  • When both the recognized language and target are English, the original transcript is reused with language en, and translation units are 0.

Successful actual translation is billed from the original transcript's Unicode character count:

translationUnits = max(1, ceil(originalTranscriptCharacters / 1,000))

Examples: 1–1,000 characters use 1 unit; 1,001–2,000 use 2 units; 2,001–3,000 use 3 units. English-to-English reuse uses 0 units.

Short output example

{
"input": "6a87dbad0000000005030ca4",
"normalizedUrl": "https://www.xiaohongshu.com/explore/6a87dbad0000000005030ca4",
"success": true,
"status": "success",
"noteId": "6a87dbad0000000005030ca4",
"media": {
"durationSeconds": 61,
"coverUrl": "https://sns-webpic.example/cover.webp"
},
"transcript": {
"source": "ai_transcription",
"language": "zh",
"text": "Example transcript text.",
"segments": [
{ "start": 0, "end": 3.4, "text": "Example transcript text." }
]
},
"translation": null,
"billing": {
"billableMinutes": 2
},
"scrapedAt": "2026-08-22T03:00:00.000Z"
}

Output

Results are written to the default Dataset in input order. Every submitted input receives one record, including failures and duplicates.

success: true means the video reached a valid processed transcript outcome. This includes status: "no_speech", where the media was processed successfully but contained no detectable speech.

Metadata, downloadable video URL, transcript formats, and translation fields follow the selected input switches. Optional or unavailable fields are omitted unless the documented behavior uses null, such as translation.

Complete output field reference

Core processing

FieldTypeAvailabilityMeaning
inputstringAlwaysExact submitted input value.
normalizedUrlstringProcessed transcript resultsCanonical explore URL without tracking parameters.
successbooleanAlwaystrue for completed transcript processing, including no_speech and partial_success.
statusstringAlwaysStable overall outcome. See Status values.
noteIdstringProcessed transcript resultsCanonical RedNote/Xiaohongshu note ID.
scrapedAtstringProcessed transcript resultsUTC ISO 8601 result timestamp.

Content metadata

The content object is omitted when includeMediaMetadata is false.

FieldTypeAvailabilityMeaning
content.titlestringMetadata enabledNative note title; can be an empty string.
content.descriptionstringMetadata enabledNative note description/caption.
content.author.userIdstringMetadata enabledXiaohongshu user ID; can be empty if unavailable.
content.author.nicknamestringMetadata enabledAuthor display name.
content.author.avatarUrlstringWhen availableDirect avatar URL.
content.author.profileUrlstring | nullMetadata enabledLocally generated public profile URL, or null without a user ID.
content.author.redIdstringWhen availableSource-provided Red ID.
content.author.verifiedbooleanWhen availableSource-provided verification flag.
content.engagement.likesnumberMetadata enabledNormalized like count.
content.engagement.commentsnumberMetadata enabledNormalized comment count.
content.engagement.collectsnumberMetadata enabledNormalized collection/save count.
content.engagement.sharesnumberMetadata enabledNormalized share count.
content.tagsobject[]Metadata enabledNative topic/tag list.
content.tags[].idstringWhen availableSource tag ID.
content.tags[].namestringPer tagTag name.

Media

FieldTypeAvailabilityMeaning
media.durationSecondsnumberProcessed transcript resultsSource media duration in seconds.
media.coverUrlstringWhen availableDirect note/video cover URL.
media.videoUrlstringWhen requested and availableOptional downloadable video URL. Omitted when includeVideoUrl is false or no downloadable URL is returned.

The Actor returns URLs; it does not permanently host the source video.

Transcript

FieldTypeAvailabilityMeaning
transcript.sourcestringProcessed transcript resultsai_transcription.
transcript.languagestringWhen detectedRecognized source-language code.
transcript.textstringWhen text selectedPlain source-language transcript. Can be empty for no_speech.
transcript.segmentsobject[]When segments selectedTimestamped source-language segments.
transcript.segments[].startnumberPer segmentStart time in seconds.
transcript.segments[].endnumberPer segmentEnd time in seconds.
transcript.segments[].textstringPer segmentSegment text.
transcript.srtstringWhen srt selectedLocally generated SRT subtitle content.
transcript.vttstringWhen vtt selectedLocally generated WebVTT subtitle content.

Translation

translation is null when translation is disabled, skipped for no_speech, or fails. When present, it follows the selected formats.

FieldTypeAvailabilityMeaning
translation.sourcestringTranslation presenttranslation.
translation.languagestringTranslation presentSelected target-language code.
translation.textstringtext selectedTranslated transcript text.
translation.segmentsobject[]segments selectedTranslated segments preserving source timestamps.
translation.segments[].startnumberPer segmentOriginal segment start in seconds.
translation.segments[].endnumberPer segmentOriginal segment end in seconds.
translation.segments[].textstringPer segmentTranslated segment text.
translation.srtstringsrt selectedSRT generated from translated segments.
translation.vttstringvtt selectedWebVTT generated from translated segments.

Billing visibility

FieldTypeAvailabilityMeaning
billing.billableMinutesintegerWhenever ai-transcription-minute was chargedStarted media minutes charged for the canonical item. Minimum 1. It remains present on transcription_failed and transcription_timeout records when media submission had already incurred the AI charge.
billing.translationCharactersintegerSuccessful translation or English reuseUnicode character count of the original transcript text.
billing.translationUnitsintegerSuccessful translation or English reuseStarted 1,000-character units; 0 for English-to-English reuse.

The output has no separate base-processing or video-URL billing indicator. Their event conditions are documented in Pricing.

Duplicate and error fields

FieldTypeAvailabilityMeaning
duplicatebooleanDuplicate inputstrue when the canonical note was already processed earlier in the run.
duplicateOfstringDuplicate inputsOriginal input value of the first matching record.
error.codestringFailed or partial resultsStable machine-readable error code.
error.messagestringFailed or partial resultsSafe user-facing explanation.

Status values

StatusMeaningTranscriptTranslationBilling
successSpeech processing completed with transcript content.PresentPresent or nullBase + AI minutes; optional successful add-ons
no_speechMedia was processed but no speech was detected. Valid processed result.Empty selected fieldsnullBase + AI minutes; optional video URL if returned
partial_successTranscript succeeded but optional translation failed.PreservednullBase + AI minutes; no translation charge; optional video URL if returned
invalid_inputInput was empty, malformed, or could not become a note URL.NoneNoneNo charge
unsupported_urlDomain, protocol, or Xiaohongshu path is unsupported.NoneNoneNo charge
short_link_resolution_failedA supported short link could not be resolved.NoneNoneNo charge
note_not_foundCanonical input was valid, but the note was missing or unavailable.NoneNoneBase processing only
access_deniedCanonical input was valid, but the public request was denied.NoneNoneBase processing only
page_fetch_failedCanonical input was valid, but note data retrieval failed.NoneNoneBase processing only
parse_failedCanonical input was valid, but returned note data could not be parsed.NoneNoneBase processing only
unsupported_note_typeThe note is image-only or otherwise not a video.NoneNoneBase processing only
media_not_foundVideo note was found but no usable speech media was available.NoneNoneBase processing only
transcription_failedSpeech recognition could not start or complete.NoneNoneBase; AI minutes only if media submission began
transcription_timeoutSpeech recognition timed out after media submission.NoneNoneBase + AI minutes
internal_errorUnexpected per-input processing error.NoneNoneDepends on the completed processing stage

Only statuses reachable in the current Transcript Actor are listed here.

Error codes

Error codeStatusMeaning
EMPTY_INPUTinvalid_inputThe item was empty.
URL_NOT_FOUNDinvalid_inputNo supported note URL or note ID was found.
INVALID_URLinvalid_inputExtracted URL syntax was invalid.
INPUT_REQUIRES_RESOLVABLE_URLinvalid_inputInput could not be converted into a public note URL.
UNSUPPORTED_PROTOCOLunsupported_urlProtocol is not HTTP or HTTPS.
UNSUPPORTED_DOMAINunsupported_urlDomain is unsupported.
UNSUPPORTED_PATHunsupported_urlURL is not a supported note page.
SHORT_LINK_RESOLUTION_FAILEDshort_link_resolution_failedShort-link redirect failed or returned an invalid destination.
NOTE_NOT_FOUNDnote_not_foundNote was missing or unavailable.
ACCESS_DENIEDaccess_deniedPublic note request was denied.
PAGE_FETCH_FAILEDpage_fetch_failedPublic note page could not be fetched after retries.
INITIAL_STATE_NOT_FOUNDparse_failedExpected public note state was missing.
INITIAL_STATE_INVALIDparse_failedPublic note state was incomplete or invalid.
NOTE_DATA_INVALIDparse_failedNote data had an unexpected structure.
NOT_A_VIDEO_NOTEunsupported_note_typeThe note contains no video to transcribe.
VIDEO_MEDIA_NOT_FOUNDmedia_not_foundNo usable public speech media was found.
TRANSCRIPTION_FAILEDtranscription_failedSpeech recognition could not process the media.
TRANSCRIPTION_TIMEOUTtranscription_timeoutSpeech recognition timed out.
TRANSLATION_FAILEDpartial_successTranscript succeeded, but optional translation failed.
INTERNAL_ERRORinternal_errorUnexpected per-input processing error.

Output examples

Successful transcript with all formats

{
"input": "6a87dbad0000000005030ca4",
"normalizedUrl": "https://www.xiaohongshu.com/explore/6a87dbad0000000005030ca4",
"success": true,
"status": "success",
"noteId": "6a87dbad0000000005030ca4",
"media": {
"durationSeconds": 61,
"coverUrl": "https://sns-webpic.example/cover.webp"
},
"transcript": {
"source": "ai_transcription",
"language": "zh",
"text": "大家好,今天我们来聊这个话题。",
"segments": [
{ "start": 0, "end": 3.45, "text": "大家好,今天我们来聊这个话题。" }
],
"srt": "1\n00:00:00,000 --> 00:00:03,450\n大家好,今天我们来聊这个话题。",
"vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:03.450\n大家好,今天我们来聊这个话题。"
},
"translation": null,
"billing": { "billableMinutes": 2 },
"scrapedAt": "2026-08-22T03:00:00.000Z"
}

No speech

{
"input": "6a87dbad0000000005030ca4",
"normalizedUrl": "https://www.xiaohongshu.com/explore/6a87dbad0000000005030ca4",
"success": true,
"status": "no_speech",
"noteId": "6a87dbad0000000005030ca4",
"media": { "durationSeconds": 61 },
"transcript": {
"source": "ai_transcription",
"text": "",
"segments": []
},
"translation": null,
"billing": { "billableMinutes": 2 },
"scrapedAt": "2026-08-22T03:00:00.000Z"
}

no_speech is a valid processed result, not a system failure. AI minutes are charged because the media was processed for speech recognition.

Translation success

{
"input": "6a87dbad0000000005030ca4",
"normalizedUrl": "https://www.xiaohongshu.com/explore/6a87dbad0000000005030ca4",
"success": true,
"status": "success",
"noteId": "6a87dbad0000000005030ca4",
"media": { "durationSeconds": 61 },
"transcript": {
"source": "ai_transcription",
"language": "zh",
"text": "大家好,今天我们来聊这个话题。"
},
"translation": {
"source": "translation",
"language": "en",
"text": "Hello everyone. Today we are discussing this topic."
},
"billing": {
"billableMinutes": 2,
"translationCharacters": 15,
"translationUnits": 1
},
"scrapedAt": "2026-08-22T03:00:00.000Z"
}

Translation failure with preserved transcript

{
"input": "6a87dbad0000000005030ca4",
"normalizedUrl": "https://www.xiaohongshu.com/explore/6a87dbad0000000005030ca4",
"success": true,
"status": "partial_success",
"noteId": "6a87dbad0000000005030ca4",
"media": { "durationSeconds": 61 },
"transcript": {
"source": "ai_transcription",
"language": "zh",
"text": "大家好,今天我们来聊这个话题。"
},
"translation": null,
"billing": { "billableMinutes": 2 },
"error": {
"code": "TRANSLATION_FAILED",
"message": "The transcript was created, but its optional translation could not be completed."
},
"scrapedAt": "2026-08-22T03:00:00.000Z"
}

Optional downloadable video URL success

{
"input": "6a87dbad0000000005030ca4",
"normalizedUrl": "https://www.xiaohongshu.com/explore/6a87dbad0000000005030ca4",
"success": true,
"status": "success",
"noteId": "6a87dbad0000000005030ca4",
"media": {
"videoUrl": "https://sns-video.example/video.mp4",
"durationSeconds": 61,
"coverUrl": "https://sns-webpic.example/cover.webp"
},
"transcript": {
"source": "ai_transcription",
"language": "en",
"text": "Example transcript."
},
"translation": null,
"billing": { "billableMinutes": 2 },
"scrapedAt": "2026-08-22T03:00:00.000Z"
}

Image-only note

{
"input": "6a840ef900000000270231e6",
"success": false,
"status": "unsupported_note_type",
"error": {
"code": "NOT_A_VIDEO_NOTE",
"message": "This RedNote post does not contain a video to transcribe."
}
}

Invalid input

{
"input": "https://www.xiaohongshu.com/user/profile/example",
"success": false,
"status": "unsupported_url",
"error": {
"code": "UNSUPPORTED_PATH",
"message": "This Xiaohongshu URL is not a supported note page."
}
}

Missing or inaccessible note

{
"input": "6a67603c000000000503be3f",
"success": false,
"status": "note_not_found",
"error": {
"code": "NOTE_NOT_FOUND",
"message": "The RedNote note could not be found or is no longer publicly accessible."
}
}

Transcription timeout after media submission

{
"input": "6a87dbad0000000005030ca4",
"success": false,
"status": "transcription_timeout",
"billing": { "billableMinutes": 2 },
"error": {
"code": "TRANSCRIPTION_TIMEOUT",
"message": "Speech recognition timed out."
}
}

API usage

The Actor slug is lance_api/rednote-video-ai-transcript-scraper-api.

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('lance_api/rednote-video-ai-transcript-scraper-api').call({
urls: ['6a87dbad0000000005030ca4'],
formats: ['text', 'segments'],
includeMediaMetadata: false,
translate: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]?.transcript?.text);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("lance_api/rednote-video-ai-transcript-scraper-api").call(run_input={
"urls": ["6a87dbad0000000005030ca4"],
"formats": ["text", "segments"],
"includeMediaMetadata": False,
"translate": False,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items[0].get("transcript", {}).get("text"))

cURL

This synchronous endpoint runs the Actor and returns the default Dataset items:

curl -X POST \
"https://api.apify.com/v2/acts/lance_api~rednote-video-ai-transcript-scraper-api/run-sync-get-dataset-items?format=json" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"urls": ["6a87dbad0000000005030ca4"],
"formats": ["text", "segments"],
"includeMediaMetadata": false,
"translate": false
}'

In the returned JSON array, read [0].transcript.text.

💰 Simple, transparent pricing

RedNote note processing starts from $0.017 per canonical operation ($17 per 1,000), while AI transcription starts from $0.003 per started media minute — $3 per 1,000 started media minutes with eligible Apify Store discounts.

Optional translation starts from $0.07 per started 1,000 Unicode characters, and downloadable video URLs start from $0.017 per successful URL ($17 per 1,000).

A 1,600-character transcript uses 2 translation units: $0.14 at the lowest eligible rate or $0.20 at the standard Free rate.

Standard Free pricing is:

  • Note processing: $0.020 per canonical operation — $20 per 1,000
  • AI transcription: $0.006 per started media minute — $6 per 1,000 started media minutes
  • Translation: $0.10 per started 1,000-character unit
  • Optional downloadable video URL: $0.020 per successful URL — $20 per 1,000

Check the Actor's Pricing tab for the current rate available to your Apify plan.

What triggers each charge?

  • url-processing: once when a normalized canonical input begins note/media resolution. Invalid or unsupported inputs and failed short-link normalization are not charged. A valid canonical input that later proves missing, inaccessible, image-only, media-less, or unparseable still uses this base operation.
  • ai-transcription-minute: one unit for each started media minute after usable media is ready for speech recognition. 0:011:00 = 1 minute, 1:012:00 = 2 minutes, and 61 seconds = 2 minutes. Once submitted, silence, music, no detected speech, timeout, or recognition failure can still consume the charged AI minutes.
  • translation-1k-characters: charged only after actual translation succeeds, using the original transcript's Unicode character count rounded up to started 1,000-character units. English-to-English reuse and failed translation use 0 units.
  • video-url-result: charged once only when includeVideoUrl: true, transcription reaches a completed transcript outcome (success, no_speech, or partial_success), and a downloadable media.videoUrl is returned. No returned URL means no video URL charge.

Duplicate-only records do not repeat any of the canonical item's charges. Choose one transcript format or all four—the AI transcription charge is the same.

Use cases

  • RedNote video transcription: Convert spoken public video content into reusable text.
  • Subtitle generation: Create SRT or WebVTT content for editing, review, or accessible playback.
  • Content research: Build timestamped datasets for reviewing public RedNote/Xiaohongshu videos.
  • Creator and competitor research: Collect authorized public speech and metadata for downstream analysis.
  • Searchable transcript databases: Index transcript text and segments in your own search system.
  • International content analysis: Add optional translated transcripts while retaining the original language.
  • AI and RAG workflows: Supply source transcripts and timestamps as context for downstream LLM systems.
  • API automation: Connect video-to-text processing to n8n, Make, Zapier, backend jobs, or data pipelines.

How it works

  1. Parse the note ID, full URL, short link, Markdown link, or app share text.
  2. Normalize the input and deduplicate equivalent note identities.
  3. Resolve publicly accessible video media.
  4. Submit usable media for AI speech recognition.
  5. Generate the selected text, segments, SRT, and WebVTT representations.
  6. Optionally translate the completed transcript while preserving source timestamps.
  7. Optionally return a downloadable video URL.
  8. Save one normalized Dataset record per submitted input.

🤖 Use with AI agents

Use this Actor through the Apify MCP Server from ChatGPT, Claude, Cursor, Codex, or another MCP-compatible client. MCP runs use the same Actor pricing as normal Apify runs.

Example prompt:

Use the Apify Actor lance_api/rednote-video-ai-transcript-scraper-api to transcribe these public RedNote/Xiaohongshu video notes. Return the original language, plain transcript text, timestamped segments, and SRT subtitles. Translate to English only when requested, and include billable AI minutes and translation units in the summary.

FAQ

Which RedNote/Xiaohongshu URLs are supported?

Supported note paths are /explore/{id}, /discovery/item/{id}, and /red_video/{id}. The Actor also accepts xhslink.com/xhslink.cn short links and app share text containing a supported link.

Can I submit note IDs directly?

Yes. A 24-character hexadecimal note ID is the preferred input.

Can I process up to 1,000 notes?

Yes. urls accepts 1–1,000 items, and every submitted item receives one Dataset record.

What transcript formats are available?

Plain text, timestamped segments, srt, and vtt.

Do four transcript formats cost four times?

No. All selected formats are generated from one transcription result and share the same AI-minute charge.

What happens when a video has only music or silence?

It can return success: true and status: "no_speech" with empty transcript content. AI minutes are still charged because the media was processed.

How are AI minutes calculated?

Each started media minute is one unit: up to 60 seconds is 1, 61–120 seconds is 2, and so on. The implementation uses max(1, ceil(durationSeconds / 60)).

How is translation charged?

Only successful actual translation is charged. Units are the original transcript's Unicode character count rounded up per started 1,000 characters. English-to-English reuse is free.

Does translation replace the original transcript?

No. transcript always remains the source-language result; translation is an additional object.

What happens if translation fails?

The original transcript remains available, status becomes partial_success, translation is null, and no translation event is charged.

Do I pay for an image-only note?

It uses one base url-processing operation after canonical resolution starts, but it has no AI-minute, translation, or video URL charge.

How much does the optional video URL cost?

Standard Free pricing is $0.020 per successful URL ($20 per 1,000); the lowest eligible rate starts from $0.017 per URL ($17 per 1,000).

Does requesting a video URL always produce a charge?

No. includeVideoUrl must be enabled and a downloadable URL must be returned after a completed transcript outcome (success, no_speech, or partial_success). Otherwise there is no video-url-result charge.

Are media URLs permanent?

No. RedNote/Xiaohongshu CDN URLs can contain temporary signatures and can expire. Copy permitted media to your own storage when you need long-term access.

Do I need xsec_token?

Usually not. Provide a valid matching token only when you already have one for a public note that requires it. The separate field overrides a token in the URL.

Do I need webSession?

Usually not. It is optional and should only be used for direct public-page requests with a session you are authorized to use. It does not automate login, access private content, or bypass access controls.

Can AI agents use this Actor?

Yes. Use lance_api/rednote-video-ai-transcript-scraper-api through the Apify API or Apify MCP Server.

Limitations

  • Publicly accessible content only; no login automation or access-control bypass
  • Image-only notes cannot produce transcripts
  • Deleted, unavailable, or restricted notes can fail
  • Profile, user, and search pages are unsupported
  • Short-link handling depends on a valid redirect response
  • xsec_token values can expire or become invalid
  • Background music, noise, overlapping speakers, accents, and audio quality can affect recognition
  • Silence or music-only media can return no_speech
  • Returned CDN media URLs can expire or stop working
  • Optional note metadata can be empty, null, or omitted
  • The Actor does not permanently host the source media
  • Platform or speech-recognition changes can temporarily affect results

Public data and responsible use

Use this Actor only for lawful access to public content. Respect RedNote/Xiaohongshu terms, Apify terms, copyright, privacy, and applicable law. Do not use it for harassment, spam, unlawful profiling, attempts to obtain non-public information, or access-control bypass.

Support

For help, contact lanceapi2026@hotmail.com and include:

  • Apify Run ID
  • A note ID or public URL
  • Returned status, error.code, and error.message
  • Expected result and actual result

Do not send Apify tokens, cookies, sessions, API keys, or passwords.