Twitter/X User Tweets API
Most popular public tweets from a Twitter/X profile (~100 cap) — not chronological. Text, author, engagement, hashtags, media. Flat 2 credits.
GET request to /v1/twitter/user-tweets that responds with clean JSON and costs 2 credits. Pass cache=true for a free 24h cache hit; default is always fresh. Start with 100 free credits — no credit card.What is the Twitter/X User Tweets API?
Pass a profile URL or @handle and get the tweets Twitter's public timeline embed exposes as clean JSON. Important: this is not a chronological or latest feed — Twitter publicly returns on the order of ~100 of the account's most popular posts. Do not use this endpoint to detect new tweets. There is no cursor, so hasMore is always false; the envelope names the window instead (requested / listingHits / truncatedReason): truncatedReason=limit means the embed holds more (raise limit, up to listingHits), popular-window means it ran out below your limit. Each tweet uses the shared contract: ISO-8601 publishedAt, author, engagement{likes,replies,retweets,quotes} — views and bookmarks are omitted on this surface (syndication never exposes them; community-tweets / tweet-details do via GraphQL), isReply / isRetweet / isQuote, conversationId, source when present, hashtags[] and media[]. Flat 2 credits per call. Pass cache=true to serve from the 24h shared cache (0 credits on hit); default is always fresh. Empty verdicts are honest 200s at 0 credits: truncatedReason no-tweets (profile reports 0 tweets) or embed-empty (the embed renders the account without posts — deterministic, retrying does not change it). When the embed does not answer at all (transport miss, or the 45s ceiling), the last answer we fetched for that handle in the previous 26h is replayed as stale:true / cached:true with fetchedAt (scrape time) and servedAt, plus a note, at 0 credits — the popular window moves slowly, so yesterday's snapshot beats a retryable 502. Only a handle with no snapshot gets the 502/503.
Moving off Nitter? See what this endpoint can and cannot replace. Nitter alternative
Moving this call from ScrapeCreators? Here is the endpoint-by-endpoint map. ScrapeCreators alternative
What you get
- Most popular public tweets (~100 Twitter cap) — not latest/chronological
- requested / listingHits / truncatedReason=limit | popular-window (hasMore false: no cursor)
- engagement{likes,replies,retweets,quotes} — views/bookmarks omitted (unreachable)
- isReply / isRetweet / isQuote on every row
- Embed miss → labelled stale replay (26h last-good, fetchedAt/servedAt, 0 credits) before any 5xx
- Flat 2 credits per call; empty verdicts and stale replays are 0
Try it
Fill in the parameters below and copy a ready-to-run request, or open the live Playground to run it against your account (no API key paste).
Parameters
curl "https://api.captapi.com/v1/twitter/user-tweets?url=https%3A%2F%2Fx.com%2FNASA" \
-H "Authorization: Bearer capt_live_..."
# or: -H "x-api-key: capt_live_..."Edit the parameters and the code updates instantly. Switch languages and hit copy.
Example response
{
"success": true,
"data": {
"handle": "NASA",
"requested": 20,
"totalReturned": 2,
"listingHits": 20,
"hasMore": false,
"tweets": [
{
"platform": "twitter",
"url": "https://x.com/NASA/status/2111180963661435219",
"id": "2111180963661435219",
"text": "The aircraft lineup just keeps getting bigger. ✈️\n\nMAX POWER, a new aerospace expo, is set for Nov. 7-8 @NASAKennedy — featuring flyovers and static displays, including NASA’s F-15, F-18, T-38, and ER-2 aircraft.\n\nDetails on how to join us: https://t.co/SPHni2YCxO https://t.co/pXYGxy6ZbE",
"lang": "en",
"publishedAt": "2026-10-16T19:42:20.000Z",
"author": {
"id": "11348282",
"username": "NASA",
"displayName": "NASA",
"url": "https://x.com/NASA",
"followers": 92321222,
"verified": true,
"profileImage": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg"
},
"isReply": false,
"isRetweet": false,
"possiblySensitive": false,
"conversationId": "2111180963661435219",
"engagement": {
"likes": 1578,
"replies": 169,
"retweets": 222,
"quotes": 24
},
"hashtags": [],
"media": [
"https://pbs.twimg.com/amplify_video_thumb/2111180787802370048/img/0nbyTdS0MRg5JqXk.jpg"
],
"isQuote": false
},
{
"platform": "twitter",
"url": "https://x.com/NASA/status/2111148671219753420",
"id": "2111148671219753420",
"text": "RT @NASASpox: There was plenty to see across @NASA this week 🚀\n \n🔴 Perseverance breaks a record on Mars\n🛰️ Fresh cargo arrives at the ISS\n🌌…",
"lang": "en",
"publishedAt": "2026-10-16T17:34:01.000Z",
"author": {
"id": "11348282",
"username": "NASA",
"displayName": "NASA",
"url": "https://x.com/NASA",
"followers": 92321222,
"verified": true,
"profileImage": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_normal.jpg"
},
"isReply": false,
"isRetweet": true,
"possiblySensitive": false,
"conversationId": "2111148671219753420",
"engagement": {
"likes": 0,
"replies": 0,
"retweets": 62,
"quotes": 0
},
"hashtags": [],
"media": [
"https://pbs.twimg.com/media/HUxNOVOWcAA0-8H.jpg"
],
"isQuote": false
}
],
"fetchedAt": "2026-10-19T13:58:46.413Z"
}
}Billing metadata is returned in response headers: X-Captapi-Credits (credits charged), X-Captapi-Cache (hit or miss), and X-Captapi-Request-Id (include it when contacting support). Where the response has a source field, it names the path that served the data: native, extended, cache or asr. Failed requests (4xx/5xx) are never charged. See the full list of error codes in the error reference.
Response structure
A successful call returns success and a data object with the following fields:
Top-level fields
handleAccount handle.requestedThe limit you sent.totalReturnedNumber of items returned in this response.listingHitsTweets in Twitter's public popular-timeline embed this call (typically up to ~100).hasMoreAlways false: hasMore is true only next to a fetchable nextCursor, and this list has none. truncatedReason says why the list stops.fetchedAtWhen this snapshot was fetched (ISO 8601 UTC).
Tweets
Each item in tweets contains:
platformPlatform identifier for this response (matches the endpoint's platform).urlCanonical URL of the item.idId of this tweets item.textText content.langLanguage code of the content.publishedAtTweet publish time as ISO-8601 UTC (e.g. 2022-04-28T00:56:58.000Z). Not Twitter's raw created_at string.authorAuthor name or handle.isReplyWhether the tweet is a reply.isRetweetWhether the tweet is a retweet.possiblySensitivePossibly sensitive. Example: false.conversationIdThread root id (conversation_id_str) for grouping replies.engagementEngagement metrics for the item.hashtagsHashtag texts without #. Always an array (empty when the tweet has none).mediaMedia image/video preview URLs when present. Always an array (empty when none).isQuoteIs quote. Example: false.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Twitter/X profile URL or @handle. The URL platform must match this endpoint's platform. Do not pass cross-platform URLs, e.g. YouTube to TikTok, Instagram to Facebook, LinkedIn to X/Twitter, or Pinterest to Rumble. |
| limit | integer | No | Max tweets to return (default 20, max 200). Twitter's public surface usually caps around ~100 most popular posts — not chronological latest. Flat 2 credits per call. |
| cache | boolean | No | Set true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh. |
Authentication: send your key as Authorization: Bearer capt_live_.... A typical call costs 2 credits. Pass cache=true for a free 24h cache hit; default is always fresh.
How it works
- 1. Sign up — get 100 free credits, no card required.
- 2. Create a key from your dashboard.
- 3. Send one request to
/v1/twitter/user-tweetsand parse the JSON response.
Use cases
Top-Post Analysis
Study an account's highest-engagement public tweets (popularity-ranked, not latest).
Brand Safety Sampling
Review viral posts and media from a profile before a partnership.
Engagement Benchmarks
Compare likes/replies/retweets/quotes across an account's standout posts.
Not for New-Tweet Monitoring
Twitter does not expose a public chronological feed here — use another signal for "just posted".
Frequently asked questions
What does the Twitter/X User Tweets API do?+
The Twitter/X User Tweets API lets you list items in bulk with metadata from a public Twitter / X tweet using one GET request to /v1/twitter/user-tweets. It returns clean JSON — no OAuth or infrastructure setup required.
How many credits does the Twitter/X User Tweets API cost?+
Each successful call costs 2 credits. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Failed or empty results are never charged.
Do I need a Twitter / X API key or OAuth?+
No. A single Captapi key works across every platform Captapi supports — YouTube, TikTok, Instagram, Facebook, Twitter/X, Reddit, Threads, Bluesky, Pinterest, LinkedIn, Rumble, Spotify, Kwai, and more. We handle access, rate limits, retries, and authentication for you.
Is the Twitter/X User Tweets API suitable for production use?+
Yes. It is a stable REST endpoint with predictable JSON and automatic retries. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Use it for analytics, monitoring, and content automation.
More Twitter / X APIs
Ready to use the Twitter/X User Tweets API?
Sign up, grab your key, and make your first call in 60 seconds.