Skip to main content
GET
Tweet subtitles API for X video captions and text
1 credit when a track comes back · All plans from $0.00012/credit
Tweet subtitles returns the caption tracks of one public tweet’s videos. The endpoint is GET /api/v1/x/tweets/{id}/subtitles.
Use GET /x/tweets/{id}/subtitles when you need what a tweet’s video says as text. Each track holds its language, its timed cues, and the full text as one line. A call that returns a track costs 1 credit. A tweet without captions costs nothing.

Build a transcript from the tracks

Read text for the whole transcript as one line. Read cues for timed lines, to show beside a player or to cut clips. A video can hold several tracks, one per language. Pick a track by language. autoGenerated is true when X transcribed the audio itself. An uploaded caption file has autoGenerated: false and its file name in name. A long video splits its captions into files. Xquik reads the first 50 files of a track and sets truncated to true past that. A tweet with no video, or a video without captions, returns "tracks": [].

Path parameters

string
required
Post ID or URL-encoded post URL, such as x.com/nasa/status/20. See path IDs.

Headers

string
Full account key. Sessions and OAuth also work.
string
Bearer xq_your_guest_key_here for paid_reads.

Response

200 OK

object
The caption tracks of the tweet’s videos. Subtitles object fields.
string
ID of the tweet.
object[]
Caption tracks. Empty when no video has captions. Track object fields.
string
Media key of the video, as media rows carry it.
string
Language code of the track, in lowercase.
string
Track name the uploader or X gave it.
boolean
true when X transcribed the audio itself.
string
Link to the track’s first WebVTT file.
string
Every cue’s text in order, as one line.
boolean
true when the track holds more than 50 caption files. The cues then cover the first 50.
object[]
Timed captions in order. Each cue has startMs and endMs in milliseconds, and text with a line break between lines.

400 Invalid tweet ID

The provided tweet ID is empty or not a valid format.

401 Unauthenticated

Missing or invalid API key. Check the x-api-key header value.

402 Payment required

Account keys get account options. Guest keys get guest top-up only. No checkout starts automatically. Confirm any payment action.

404 Tweet not found

X has no such tweet. The author may have deleted it, or the account is private.

502 X API unavailable

The read service returned an error. Retry after a short delay.

503 Service busy

X did not serve a caption file in time, or Xquik is busy. Retry after a short delay. The request costs nothing.

429 Rate limit exceeded

You exceeded your tier rate limit. Wait for the Retry-After header before retrying.

424 Dependency failed

The normalized v1 response contract can return 424 when the read service is unavailable.

Tweet subtitles API questions

How do I get the transcript of a Twitter video with an API?

Call GET /x/tweets/{id}/subtitles with the tweet ID or URL. Read subtitles.tracks[0].text for the transcript.

Does it work for videos without uploaded captions?

Yes, when X transcribed the audio itself. Those tracks have autoGenerated: true. A video X has no captions for returns no track.

Which format are the captions in?

Each cue has a start and an end in milliseconds, and its text. url links to the track’s first WebVTT file on X’s video host.

How much does a tweet’s subtitles call cost?

A call that returns at least 1 track costs 1 credit. A tweet without captions costs nothing. A refused or failed request costs nothing.

Does Xquik transcribe the audio?

No. Xquik reads the caption tracks X serves with the video.

Does this replace X’s official API?

No. This page documents Xquik, an independent third-party service. It does not document X’s official API.
Next steps. Get tweet reads the tweet’s fields as JSON, or Download media saves its photos and videos.