X / Twitter data, ready when you are.
Profiles, posts and search from X, formerly Twitter.
- See the price before every call
- Pay only for records that come back
- No subscription. Your balance never expires
What you can get.
- $0.000225per recordTry it →
Profiles
Name, headline, company, skills and work history.
- $0.000225per recordTry it →
Posts by a person
A person's latest posts, with likes and comments.
- $0.000225per recordTry it →
Search
Find ACCOUNTS by keyword. A name, a topic, a bio phrase.
- $0.000225per recordTry it →
Search posts
Posts about any topic, brand or person.
What the data looks like.
| username | displayName | bio | location | isBlueVerified | accountType | joinedAt | followers | following | postsCount | accountId | avatarUrl | bannerUrl | isProtected | pinnedPostUrl | details |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| northfoldhq | Northfold | Close your books in days, not weeks. | London | true | business | 2020-06-01 | 24,100 | 410 | 3,812 | 1354972458 | https://img.x.com/northfold.jpg | https://img.x.com/northfold.jpg | false | https://x.com/northfold-1000 |
|
| ananya_builds | Ananya Rao | Marketing @paylane. Notes on growth. | Bengaluru | false | person | 2014-02-18 | 8,920 | 690 | 5,210 | 1119122908 | https://img.x.com/ananya-rao.jpg | https://img.x.com/ananya-rao.jpg | false | https://x.com/ananya-rao-1001 |
|
| kitebank | Kitebank | Business banking that keeps up. | Austin, TX | true | business | 2012-09-10 | 131,000 | 220 | 9,640 | 1442014665 | https://img.x.com/kitebank.jpg | https://img.x.com/kitebank.jpg | false | https://x.com/kitebank-1002 |
|
For developers
API reference.
One endpoint, POST /v1/x_twitter. Open an operation to see its fields.
Profilesprofiles
Profile cards for up to ten accounts, by @handle or pasted profile URL. `include.posts` adds each account's recent posts to the same answer.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | @handles or profile URLs. |
| include | object | |
| include.posts | object | |
| include.posts.limit | integer · 1-50 | Recent posts to fetch per account, newest first; 1-50. |
Response fields, each row of data
| Field | Type |
|---|---|
| username | string |
| accountId | string |
| displayName | string |
| bio | string |
| location | string |
| website | string |
| avatarUrl | string |
| bannerUrl | string |
| isProtected | boolean |
| isBlueVerified | boolean |
| verifiedType | string |
| accountType | string |
| joinedAt | string |
| pinnedPostUrl | string |
| followers | integer |
| following | integer |
| postsCount | integer |
| mediaCount | integer |
| likesGiven | integer |
| canonicalUsername | string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/x_twitter \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"profiles","subjects":["@NASA"]}'Example response rows
[
{
"username": "northfoldhq",
"displayName": "Northfold",
"bio": "Close your books in days, not weeks.",
"location": "London",
"isBlueVerified": true,
"accountType": "business",
"joinedAt": "2020-06-01",
"followers": 24100,
"following": 410,
"postsCount": 3812,
"accountId": "1354972458",
"avatarUrl": "https://img.x.com/northfold.jpg",
"bannerUrl": "https://img.x.com/northfold.jpg",
"isProtected": false,
"pinnedPostUrl": "https://x.com/northfold-1000",
"details": {}
},
{
"username": "ananya_builds",
"displayName": "Ananya Rao",
"bio": "Marketing @paylane. Notes on growth.",
"location": "Bengaluru",
"isBlueVerified": false,
"accountType": "person",
"joinedAt": "2014-02-18",
"followers": 8920,
"following": 690,
"postsCount": 5210,
"accountId": "1119122908",
"avatarUrl": "https://img.x.com/ananya-rao.jpg",
"bannerUrl": "https://img.x.com/ananya-rao.jpg",
"isProtected": false,
"pinnedPostUrl": "https://x.com/ananya-rao-1001",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Posts by a personposts
One account's recent posts with engagement. Includes the author's profile card when held.
| Field | Type | Meaning |
|---|---|---|
| subject * | string · ≤400 chars | One @handle or profile URL. |
| limit | integer · 1-50 |
Response fields, each row of data
| Field | Type |
|---|---|
| postId | string |
| body | string |
| kind | string |
| postedAt | string |
| permalink | string |
| language | string |
| mediaUrl | string |
| likes | integer |
| replies | integer |
| reposts | integer |
| quotes | integer |
| views | integer |
| bookmarks | integer |
| isReply | boolean |
| isQuote | boolean |
| isPinned | boolean |
| replyToHandle | string |
| quotedPostUrl | string |
| repostedPostUrl | string |
| hashtags | list of string |
| mentions | list of string |
| authorUsername | string |
| authorId | string |
| author | object |
| conversationId | string |
| media | list of object |
| outboundLinks | list of string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/x_twitter \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"posts","subject":"@NASA","limit":20}'Example response rows
[
{
"authorUsername": "northfoldhq",
"body": "Month-end close in 2 days, not 10. Here's how teams do it ↓",
"kind": "post",
"postedAt": "2026-10-14T13:00:00Z",
"views": 84200,
"likes": 1210,
"reposts": 240,
"replies": 61,
"quotes": 18,
"isReply": false,
"replyToHandle": null,
"postId": "2327853664",
"permalink": "https://x.com/month-end-close-in-2-days-not-10-here-s--1000",
"mediaUrl": "https://x.com/month-end-close-in-2-days-not-10-here-s--1000",
"isQuote": false,
"isPinned": false,
"quotedPostUrl": "https://x.com/month-end-close-in-2-days-not-10-here-s--1000",
"repostedPostUrl": "https://x.com/month-end-close-in-2-days-not-10-here-s--1000",
"authorId": "804340720",
"details": {}
},
{
"authorUsername": "northfoldhq",
"body": "We're at Finance Leaders London next week. Come say hi!",
"kind": "post",
"postedAt": "2026-10-10T09:00:00Z",
"views": 12100,
"likes": 140,
"reposts": 21,
"replies": 9,
"quotes": 1,
"isReply": false,
"replyToHandle": null,
"postId": "482952772",
"permalink": "https://x.com/we-re-at-finance-leaders-london-next-wee-1001",
"mediaUrl": "https://x.com/we-re-at-finance-leaders-london-next-wee-1001",
"isQuote": false,
"isPinned": false,
"quotedPostUrl": "https://x.com/we-re-at-finance-leaders-london-next-wee-1001",
"repostedPostUrl": "https://x.com/we-re-at-finance-leaders-london-next-wee-1001",
"authorId": "1870987843",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Searchsearch
Find ACCOUNTS by keyword. A name, a topic, a bio phrase.
| Field | Type | Meaning |
|---|---|---|
| query * | string · ≤300 chars | |
| limit | integer · 1-25 |
Response fields, each row of data
| Field | Type |
|---|---|
| username | string |
| accountId | string |
| displayName | string |
| bio | string |
| location | string |
| website | string |
| avatarUrl | string |
| bannerUrl | string |
| isProtected | boolean |
| isBlueVerified | boolean |
| verifiedType | string |
| accountType | string |
| joinedAt | string |
| pinnedPostUrl | string |
| followers | integer |
| following | integer |
| postsCount | integer |
| mediaCount | integer |
| likesGiven | integer |
| canonicalUsername | string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/x_twitter \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"search","query":"climate scientist","limit":10}'Example response rows
[
{
"username": "pilates_daily",
"displayName": "Pilates Daily",
"bio": "One pilates tip a day.",
"location": "Sydney",
"isBlueVerified": false,
"accountType": "person",
"joinedAt": "2019-01-03",
"followers": 41200,
"following": 310,
"postsCount": 2210,
"accountId": "519961039",
"avatarUrl": "https://img.x.com/pilates-daily.jpg",
"bannerUrl": "https://img.x.com/pilates-daily.jpg",
"isProtected": false,
"pinnedPostUrl": "https://x.com/pilates-daily-1000",
"details": {}
},
{
"username": "mira_moves",
"displayName": "Mira | Pilates",
"bio": "Classes on YouTube, links below.",
"location": "Mumbai",
"isBlueVerified": true,
"accountType": "person",
"joinedAt": "2018-05-21",
"followers": 96400,
"following": 120,
"postsCount": 4120,
"accountId": "2620162896",
"avatarUrl": "https://img.x.com/mira-pilates.jpg",
"bannerUrl": "https://img.x.com/mira-pilates.jpg",
"isProtected": false,
"pinnedPostUrl": "https://x.com/mira-pilates-1001",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Search postssearchPosts
Find POSTS by keyword. What X is saying about something. The content itself, across all authors, newest-relevant first.
| Field | Type | Meaning |
|---|---|---|
| query * | string · ≤300 chars | |
| limit | integer · 1-50 |
Response fields, each row of data
| Field | Type |
|---|---|
| postId | string |
| body | string |
| kind | string |
| postedAt | string |
| permalink | string |
| language | string |
| mediaUrl | string |
| likes | integer |
| replies | integer |
| reposts | integer |
| quotes | integer |
| views | integer |
| bookmarks | integer |
| isReply | boolean |
| isQuote | boolean |
| isPinned | boolean |
| replyToHandle | string |
| quotedPostUrl | string |
| repostedPostUrl | string |
| hashtags | list of string |
| mentions | list of string |
| authorUsername | string |
| authorId | string |
| author | object |
| conversationId | string |
| media | list of object |
| outboundLinks | list of string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/x_twitter \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"searchPosts","query":"electric cars","limit":25}'Example response rows
[
{
"authorUsername": "fintech_weekly",
"body": "Three fintechs raised $100M+ this week. Thread 🧵",
"kind": "post",
"postedAt": "2026-10-15T11:00:00Z",
"views": 210000,
"likes": 3400,
"reposts": 880,
"replies": 140,
"quotes": 96,
"postId": "989531282",
"permalink": "https://x.com/three-fintechs-raised-100m-this-week-thr-1000",
"mediaUrl": "https://x.com/three-fintechs-raised-100m-this-week-thr-1000",
"isReply": false,
"isQuote": false,
"isPinned": false,
"quotedPostUrl": "https://x.com/three-fintechs-raised-100m-this-week-thr-1000",
"repostedPostUrl": "https://x.com/three-fintechs-raised-100m-this-week-thr-1000",
"authorId": "2124078388",
"details": {}
},
{
"authorUsername": "marcus_sells",
"body": "Fintech funding is back, but only for revenue.",
"kind": "post",
"postedAt": "2026-10-14T08:20:00Z",
"views": 41000,
"likes": 920,
"reposts": 110,
"replies": 64,
"quotes": 12,
"postId": "2595211473",
"permalink": "https://x.com/fintech-funding-is-back-but-only-for-rev-1001",
"mediaUrl": "https://x.com/fintech-funding-is-back-but-only-for-rev-1001",
"isReply": false,
"isQuote": false,
"isPinned": false,
"quotedPostUrl": "https://x.com/fintech-funding-is-back-but-only-for-rev-1001",
"repostedPostUrl": "https://x.com/fintech-funding-is-back-but-only-for-rev-1001",
"authorId": "4058817374",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Historyhistoryfree
The stored time series. Free, reads only what captures already wrote.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | @handles or profile URLs. |
| metric | enum | followers · following · posts_count |
| days | integer · 1-730 |