---
title: "Twitter/X Transcript API"
method: GET
path: "/v1/twitter/transcript"
tags: ["Twitter / X"]
---

# Twitter/X Transcript API

`GET /v1/twitter/transcript`

## Request

- Base URL: `https://api.captapi.com`
- URL: `https://api.captapi.com/v1/twitter/transcript`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Tweet text as a transcript — timingSource none (not speech-to-text).

Paste a public tweet URL and get the tweet body as structured text. timingSource is always "none" today — syndication text only, not speech-to-text or captions. When timingSource is "none", segment start/duration/timestamp are omitted (returned only when timingSource is "captions"). Paragraph-split transcriptSegments include index, wordCount, charStart/charEnd; estimatedReadSeconds is a top-level 200 wpm estimate — never inside duration. The dead segments count key is gone (same as reddit/post-transcript). Flat 1 credit.

Docs: https://captapi.com/apis/twitter-transcript

## Query parameters

- `url` string, required
- `cache` boolean

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `platform` string: Platform identifier for this response (matches the endpoint's platform).
    - `url` string: Canonical URL of the item.
    - `tweetId` string: Tweet id. Example: "2078224758781751775".
    - `transcript` string: Complete text transcript (file-upload endpoints). Timed caption/ASR endpoints use text instead.
    - `transcriptSegments` object[]
      - `text` string: Text content.
      - `index` integer: 0-based segment order.
      - `wordCount` integer: Word count (emoji-only tokens count as 0; URLs count as 1).
      - `charStart` integer: Start offset into transcript (transcript.slice(charStart, charEnd) === text).
      - `charEnd` integer: End offset into transcript (exclusive).
    - `wordCount` integer: Word count (emoji-only tokens count as 0; URLs count as 1).
    - `segments` integer: Timed caption/ASR: array of {text,startMs,endMs}. File-upload video-transcript: segment count. Sponsor endpoints: sponsor segment list.
    - `author` object
      - `username` string: Account username / handle.
      - `displayName` string: Display name of the account. Canonical across profile endpoints (prefer over name).
      - `url` string: Canonical URL of the item.
      - `verified` boolean: Whether the account is verified on this platform.
      - `profileImage` string: Profile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release).
    - `publishedAt` string: Publish date (ISO 8601) when the platform exposes an absolute timestamp.
    - `timingSource` string: Always "none" today. "captions" is reserved — do not branch on it; nothing emits it yet.
    - `estimatedReadSeconds` integer: Whole-transcript reading-time estimate at 200 wpm. Not per-segment duration.

## Other responses

- `400`: Bad request: wrong platform URL, unknown endpoint, or an invalid parameter value. Not billed.
- `401`: Missing, invalid or revoked API key. Not billed.
- `402`: Not enough credits for this request. Not billed.
- `404`: The resource does not exist or is not public. Not billed.
- `422`: A required parameter is missing or has the wrong type. Not billed.
- `429`: Rate limit reached. Wait for Retry-After seconds. Not billed.
- `502`: The platform could not be reached or returned nothing usable. Retryable, not billed. 503 and 504 use the same envelope.

---

[API](https://skmtc.dev/captapi/apis/captapi-api.md) · [All operations](https://skmtc.dev/captapi/apis/captapi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/captapi/apis/captapi-api/revisions/c9b9ac5ff1bd?raw)
