X / Twitter data, ready when you are.

Profiles, posts and search from X, formerly Twitter.

Try in playground From $0.000225 a record · $0.10 free

What you can get.

What the data looks like.

usernamedisplayNamebiolocationisBlueVerifiedaccountTypejoinedAtfollowersfollowingpostsCountaccountIdavatarUrlbannerUrlisProtectedpinnedPostUrldetails
northfoldhqNorthfoldClose your books in days, not weeks.Londontruebusiness2020-06-0124,1004103,8121354972458https://img.x.com/northfold.jpghttps://img.x.com/northfold.jpgfalsehttps://x.com/northfold-1000
  • {}
ananya_buildsAnanya RaoMarketing @paylane. Notes on growth.Bengalurufalseperson2014-02-188,9206905,2101119122908https://img.x.com/ananya-rao.jpghttps://img.x.com/ananya-rao.jpgfalsehttps://x.com/ananya-rao-1001
  • {}
kitebankKitebankBusiness banking that keeps up.Austin, TXtruebusiness2012-09-10131,0002209,6401442014665https://img.x.com/kitebank.jpghttps://img.x.com/kitebank.jpgfalsehttps://x.com/kitebank-1002
  • {}
16 fields, scroll sideways for all. Example rows: made-up names, real field names. Live calls return real data.

For developers

API reference.

One endpoint, POST /v1/x_twitter. Open an operation to see its fields.

Read the docs
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.

FieldTypeMeaning
subjects *list of string · 1-10 items@handles or profile URLs.
includeobject
include.postsobject
include.posts.limitinteger · 1-50Recent posts to fetch per account, newest first; 1-50.

Response fields, each row of data

FieldType
usernamestring
accountIdstring
displayNamestring
biostring
locationstring
websitestring
avatarUrlstring
bannerUrlstring
isProtectedboolean
isBlueVerifiedboolean
verifiedTypestring
accountTypestring
joinedAtstring
pinnedPostUrlstring
followersinteger
followinginteger
postsCountinteger
mediaCountinteger
likesGiveninteger
canonicalUsernamestring
detailsobject

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.

example request · profiles
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

data · made-up names, real field names
[
  {
    "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.

Try profiles in the playground Examples and pricing for profiles
Posts by a personposts

One account's recent posts with engagement. Includes the author's profile card when held.

FieldTypeMeaning
subject *string · ≤400 charsOne @handle or profile URL.
limitinteger · 1-50

Response fields, each row of data

FieldType
postIdstring
bodystring
kindstring
postedAtstring
permalinkstring
languagestring
mediaUrlstring
likesinteger
repliesinteger
repostsinteger
quotesinteger
viewsinteger
bookmarksinteger
isReplyboolean
isQuoteboolean
isPinnedboolean
replyToHandlestring
quotedPostUrlstring
repostedPostUrlstring
hashtagslist of string
mentionslist of string
authorUsernamestring
authorIdstring
authorobject
conversationIdstring
medialist of object
outboundLinkslist of string
detailsobject

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.

example request · posts
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

data · made-up names, real field names
[
  {
    "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.

Try posts by a person in the playground Examples and pricing for posts by a person
Search postssearchPosts

Find POSTS by keyword. What X is saying about something. The content itself, across all authors, newest-relevant first.

FieldTypeMeaning
query *string · ≤300 chars
limitinteger · 1-50

Response fields, each row of data

FieldType
postIdstring
bodystring
kindstring
postedAtstring
permalinkstring
languagestring
mediaUrlstring
likesinteger
repliesinteger
repostsinteger
quotesinteger
viewsinteger
bookmarksinteger
isReplyboolean
isQuoteboolean
isPinnedboolean
replyToHandlestring
quotedPostUrlstring
repostedPostUrlstring
hashtagslist of string
mentionslist of string
authorUsernamestring
authorIdstring
authorobject
conversationIdstring
medialist of object
outboundLinkslist of string
detailsobject

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.

example request · searchPosts
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

data · made-up names, real field names
[
  {
    "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.

Try search posts in the playground Examples and pricing for search posts
Historyhistoryfree

The stored time series. Free, reads only what captures already wrote.

FieldTypeMeaning
subjects *list of string · 1-10 items@handles or profile URLs.
metricenumfollowers · following · posts_count
daysinteger · 1-730
Try history in the playground

Guides and ideas.

Use it from your tools.

More in social.

All platforms