One URL in. Clean JSON out.
Pass the URL of a video tweet and get the spoken words back as text. Read the next paragraph before you build against this: transcription here is subtitle-based, and X video almost never carries subtitles, so in practice this endpoint returns 404 for the overwhelming majority of X content. It is documented because the path exists and the price is set, not because it works today.
Availability: Caption-dependent: transcripts are available only when the video has captions on X, which most videos don't. When no captions exist the API returns a 404 no-transcript error, and failed calls are never charged.
The difference
On the left, what a headless browser hands you. On the right, what the endpoint hands you.
<article data-testid="tweet" class="css-175oi2r r-1adg3ll r-1ny4l3l"><div class="css-175oi2r r-18u37iz"><div dir="ltr" class="css-901oao r-1nao33i">Shipping notes: response times are down 40% after this week's cache work.</div></div><div role="group" aria-label="90211 views, 1211 likes, 204 reposts" class="css-175oi2r r-1kbdv8c"><div data-testid="like"><span class="css-1jxf684">1,211</span></div><div data-testid="retweet"><span>204</span></div></div><time datetime="2026-07-06T08:15:00.000Z">8h</time><script>window.__INITIAL_STATE__={"entities":{"tweets":{"entities":{"186112... {"data": {"platform": "twitter","entity_id": "1861122334455667788","language": "en","source": "audio","text": "Today I want to show you the three settings everyone ignores when they set this up for the first time...","segments": [{"start": 0,"end": 3.2,"text": "Today I want to show you the three settings"},{"start": 3.2,"end": 5.9,"text": "everyone ignores when they set this up"}]},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
When a transcript exists, you get one object: the full text as a single string, an optional array of timestamped segments, the detected language code, and a source marker saying where the words came from. Nothing else. There are no view counts, no author block, no tweet text — that lives on the X Post Stats API.
When no transcript exists, you get a 404 with an error body and no charge. That is the normal outcome on X. Our transcription runs off captions the platform already carries; it does not listen to audio. TikTok ships subtitles inside its own data and transcribes reliably. X does not, so there is usually nothing to read.
Transcripts, once stored, never expire. The endpoint is in the immutable cache class: the second call for the same video is served from our own corpus in milliseconds and returns text, segments and language. Spoken words do not change, so there is no staleness question here and no reason to ever pass fresh=true.
Where the words came from: "upstream" for platform-supplied captions, "whisper" for an audio pass. Present on every successful response, including repeat calls served from the stored corpus — it records how the transcript was originally produced, not how this particular call was answered.
Pricing
A successful transcript is 7 credits — about 3.5¢ on the monthly plan, or roughly 143 videos for $5 — but most X videos carry no captions, and calls that return nothing are never charged.
Estimate only, on a full-year basis. 7 credits per returned video. Monthly: $5 per 1,000 credits with $4/1,000 top-ups. Annual: $54 per 12,000 credits with $3/1,000 top-ups. We show whichever plan is cheaper for your annual volume, divided by 12. Failed calls are never charged; cache hits cost the same as fresh calls.
Entry price, side by side
Credits are not equivalent units across vendors — each meters differently. Price your own workload on both before deciding on entry price alone. At high volume, several of these are cheaper per credit than we are.
Engineering notes
We document exactly how every endpoint behaves — nulls, caching, billing — so what you ship on day one is still running in month six. No surprises, no support tickets.
Transcription is captions-only. The pipeline looks for a subtitle track the platform already publishes and converts it to text. If there is no track, the call ends in a 404 rather than falling back to listening to the audio.
X is the worst platform for this. Subtitle tracks are rare there, and unlike TikTok the scrape does not surface them in a form we can read. Assume 404 as the default response and treat a successful transcript as a lucky exception. If your project depends on X video text, this endpoint is not a foundation you should build on.
A 404 is not billed. You can point this at a list of URLs to measure your own hit rate and only pay for the ones that return text. Same for 422 and upstream failures — errors never draw down credits.
Successful calls cost 7 credits per video, whether the transcript is fetched for the first time or served from the stored corpus.
The timestamped segments array is only populated when a transcript is produced by an audio pass. Caption-derived transcripts arrive as flat text with no timing, so segments comes back null. Write your consumer to read text first and treat segments as an optional extra, not a guarantee.
The same applies to language: subtitle sources sometimes carry no language tag, in which case the field is null rather than guessed.
The unit is a video. A text-only tweet, an image post or a quote tweet with no attached video has nothing to transcribe and will not produce a transcript. Filter your URL list with the X Post Stats API first if you are not sure which posts carry video.
Everything here is read from publicly visible pages with no session. Protected accounts, deleted posts and anything behind a login are unreachable by design. There is no setting that changes this.
Questions
Usually no. This endpoint reads subtitle tracks that the platform already publishes, and X video very rarely carries one. The call is real and priced, but in practice it returns 404 for the large majority of video tweets. If transcripts are central to your project, TikTok is the platform where this capability actually holds up, and our TikTok Transcript API covers it.
Because the video has no caption track. Our transcription is subtitles-only: we convert captions the platform ships into text, and we do not run speech-to-text over the audio. When there is no track, there is no transcript to return, so the endpoint answers 404 rather than inventing text or returning a partial object. The call is not charged.
Not currently. The pipeline supports an audio transcription leg, but it is switched off for launch, so X video is served by captions alone. That decision is why the honest answer on this page is that the endpoint mostly does not return anything. If that changes, the response shape stays the same and segments starts arriving populated.
7 credits per video on a successful call. Credits are $0.005 each on the monthly plan and $0.0045 on annual, so roughly 3.5 cents. Repeat calls for the same video cost the same 7 credits even though they are served instantly from stored text. Calls that return 404 because no transcript exists are free.
Not on this platform. The segments array carries { start, end, text } objects in seconds, but it is only filled in when a transcript comes from an audio pass. Caption-derived transcripts arrive as one continuous string with segments set to null. Since X transcripts are caption-derived when they appear at all, expect flat text.
It is cached permanently and it never goes stale. Transcripts sit in an immutable corpus with no expiry, because the words in a published video do not change. The first successful call stores the text; every later call for that video is a lookup returning in milliseconds. There is no reason to pass fresh=true on this endpoint.
Depends what you actually need. For engagement numbers and post text, the X Post Stats API returns the tweet itself. For a feed of an account's recent posts, the X User Tweets API returns a batch of them in one call. If you specifically need spoken words from social video, run your pipeline against TikTok, where caption coverage is good, and treat X as text-only.
Next
100 trial credits on signup — no card, key on screen immediately.