X / Twitter User posts API
Get an X (Twitter) account's profile Posts-tab timeline by handle. Results follow profile order: a pinned post may appear first, followed by otherwise reverse-chronological authored posts, reposts, quotes, and self-thread continuations.
$0.45/1k req, pay per request, no subscription.
@buildwithjonah
@buildwithjonah
Pinned
@buildwithjonah· Sep 26, 2024
Spent the last 6 months building a data pipeline that normalizes 40 scraper APIs into one schema. Here is what broke, and what I would do differently. A thread.
{"id":Â "1842093771280384512","url":Â "https://x.com/buildwithjonah/status/1842093771280384512","text":Â "Spent the last 6 months building a data pipeline that normalizes 40 scraper APIs into one schema. Here is what broke, and what I would do differently. A thread.","createdUtc":Â 1727366400,"lang":Â "en","likes":Â 3820,"retweets":Â 412,"replies":Â 96,+12 more fields}
Pricing and providers
X / Twitter User posts API pricing: one API, 3 interchangeable providers
The cheapest provider serves first. If it fails, the next one takes over in the same call.
capped at $0.0021 per request1 result$0.000210 results$0.001120 results$0.0021 capYou are charged for what comes back. Lower the limit to pay less - and no single request can cost more than the cap, however much comes back.
Try it
Get X / Twitter user posts in one request
{
"found": true,
"data": {
"tweets": [
{
"id": "1842093771280384512",
"url": "https://x.com/buildwithjonah/status/1842093771280384512",
"text": "Spent the last 6 months building a data pipeline that normalizes 40 scraper APIs into one schema. Here is what broke, and what I would do differently. A thread.",
"createdUtc": 1727366400,
"lang": "en",
"likes": 3820,
"retweets": 412,
"replies": 96,
"quotes": 28,
"views": 284000,
"bookmarks": 1540,
"isReply": false,
"isPinned": true,
"media": [],
"conversationId": "1842093771280384512",
"source": "Twitter Web App",
"authorId": "1401882093771280384",
"authorName": "Jonah Ruiz",
"authorHandle": "buildwithjonah",
"authorImage": "https://pbs.twimg.com/profile_images/1401882093771280384/jonah_400x400.jpg"
},
{
"id": "1841002881044099072",
"url": "https://x.com/buildwithjonah/status/1841002881044099072",
"text": "Shipped a small tool today that diffs API response schemas across versions. Saved me from a nasty silent break last week.",
"createdUtc": 1727280000,
"lang": "en",
"likes": 640,
"retweets": 52,
"replies": 18,
"quotes": 2,
"views": 41200,
"bookmarks": 210,
"isReply": false,
"isPinned": false,
"media": [
{
"type": "photo",
"url": "https://pbs.twimg.com/media/F9j1QoQWkAA_diff_tool.jpg",
"width": 1600,
"height": 1000
}
],
"conversationId": "1841002881044099072",
"source": "Twitter for iPhone",
"authorId": "1401882093771280384",
"authorName": "Jonah Ruiz",
"authorHandle": "buildwithjonah",
"authorImage": "https://pbs.twimg.com/profile_images/1401882093771280384/jonah_400x400.jpg"
},
{
"id": "1839881220337844224",
"url": "https://x.com/buildwithjonah/status/1839881220337844224",
"text": "@dataeng_marta Totally agree, cursor pagination beats offset once you get past a few hundred thousand rows.",
"createdUtc": 1727107200,
"lang": "en",
"likes": 88,
"retweets": 4,
"replies": 6,
"quotes": 0,
"views": 6200,
"bookmarks": 12,
"isReply": true,
"isPinned": false,
"media": [],
"conversationId": "1839880002114899968",
"source": "Twitter Web App",
"authorId": "1401882093771280384",
"authorName": "Jonah Ruiz",
"authorHandle": "buildwithjonah",
"authorImage": "https://pbs.twimg.com/profile_images/1401882093771280384/jonah_400x400.jpg"
}
],
"nextCursor": "DAABCgABGZ3xw5A2xVIKAAIY__posts_page2"
}
}Full parameter and response reference - every field, type, and example for this endpoint.
Reference
One request, one response shape.
Every field you send and every field you get back, each with a real example.
Last verified 2026-10-06 · uptime and latency measured over 30d
Request body
JSON, posted to this endpoint.
- handlestring
buildwithjonah
Twitter/X handle without the leading @.
- cursorstring
Opaque pagination cursor from a previous response's nextCursor. Omit for the first page.
- requireFieldsarray
Optional; omit it and routing is unchanged, with the cheapest source serving. Name the output fields this request must be able to return, for example `isPinned` or `isReply`, and it is served only by a source that returns every one of them. Fields you do not name are still returned whenever the serving source has them. This can raise your price: when the cheapest source cannot return a named field, a dearer source serves, and you are quoted and charged its price. A named field can still be absent on a tweet that genuinely lacks it. Naming a combination that no single source returns together is refused as invalid input, with no charge. On a paginated walk it applies to the first page only; later pages stay with the source that page chose, at the price it was quoted.
Response
JSON, one example value per field.
- foundboolean
true
- idstring
1842093771280384512
- urlstring
https://x.com/buildwithjonah/status/1842093771280384512
- textstring
Spent the last 6 months building a data pipeline that normalizes 40 scraper APIs into one schema. Here is what broke, and what I would do differently. A thread.
- createdUtcnumber
1727366400
- langstring
en
- likesnumber
3820
- retweetsnumber
412
- repliesnumber
96
- quotesnumber
28
- viewsnumber
284000
- bookmarksnumber
1540
- isReplybooleancan require
false
- isPinnedbooleancan require
true
- mediaarray
- conversationIdstring
1842093771280384512
- sourcestring
Twitter Web App
- authorIdstring
1401882093771280384
- authorNamestring
Jonah Ruiz
- authorHandlestring
buildwithjonah
- authorImagestring
https://pbs.twimg.com/profile_images/1401882093771280384/jonah_400x400.jpg
- nextCursorstring
DAABCgABGZ3xw5A2xVIKAAIY__posts_page2
FAQ
About the X / Twitter User posts API
The AnyAPI X / Twitter User posts API returns X / Twitter user posts data as normalized JSON from one POST call to /v1/run/twitter.user_posts. Get an X (Twitter) account's profile Posts-tab timeline by handle. Results follow profile order: a pinned post may appear first, followed by otherwise reverse-chronological authored posts, reposts, quotes, and self-thread continuations. AnyAPI routes each request across 3 sources and falls back automatically when one fails. It costs from $0.45 per 1,000 requests, in US dollars with no subscription and no monthly minimum. Over the last 30 days, 99.9% of X / Twitter user posts calls through AnyAPI succeeded, with a median response time of 2.0 seconds across 32,811 measured calls.