Twitter/X Profile API
X profile: verified + blue/legacy/identity, displayName, avatar/banner, tipjar→contact{}, expanded website.
GET request to /v1/twitter/profile that responds with clean JSON and costs 1 credit. 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 Profile API?
Paste a profile URL or @handle and get clean JSON. Canonical profile core: platform, id, username, url, displayName, bio, avatar, banner, followers, following, postCount, verified, createdAt. No handle/name/profileImage/bannerImage/tweetCount twins — those names are gone, not a one-release alias window. Identity-card keys stay on the set when unpublished: location, website, businessAffiliatesCount, creatorSubscriptionsCount, affiliate, bioUrls[], withheldInCountries are null/0/empty, never missing. null vs 0/false: present none is 0/false; omitted is null on the HTML fallback. Guest GraphQL (source=native, stages.graphqlStatus=ok) omits empty parents (no business_account object) — those independent counts and verification bits become 0/false because Twitter did not send a distinguishable unknown. Split fields (fastFollowers / normalFollowers) stay null when omitted so we never invent 0+0 against followers. verified is derived: isBlueVerified OR isLegacyVerified OR isIdentityVerified OR (affiliate != null). A null bit is treated as false in that OR — it cannot hide a known badge. Verification lives once, on verification{isBlueVerified, isLegacyVerified, isIdentityVerified, verifiedType, reason, verifiedSince}; affiliate is a sibling (object or null). reason is the tooltip text with X's "Learn more" CTA stripped. Trust signals: followers = normalFollowers + fastFollowers when both splits are present; possiblySensitive. followersIsApproximate / followingIsApproximate / postCountIsApproximate use CP-F (true when v ≥ 10000 and v % 100 === 0). Outreach: tipjarSettings (camelCase isEnabled) + contact{emails,paymentHandles,links} always keyed. Cashtags like $NPCBRO land in paymentHandles, not links; links does not repeat website. website / bioUrls[].expandedUrl are expanded (not raw t.co). Twitter-surface extras (fastFollowers, listedCount, pinnedTweetIds, tipjarSettings, profileImageShape, …) stay at the top level — they are not a second contract and are not namespaced under raw. Also listedCount, mediaCount, likesCount, pinnedTweetIds, highlightedTweets. source + stages + timings on every 200 (native | cache). Flat 1 credit. cache=true uses the 1-hour profile TTL (0 credits on hit); pass cacheMaxAge=1d|3d|7d|14d|30d for a longer window. Envelope includes cached, creditsUsed, requestId, fetchedAt, cachedAt.
What you get
- verified is derived (blue OR legacy OR identity OR affiliate)
- Uniform null vs 0/false — GraphQL omit → 0/false; HTML omit → null
- followersIsApproximate / followingIsApproximate / postCountIsApproximate (CP-F)
- source + stages + timings on every 200
- contact{emails,paymentHandles,links} — cashtags are payment handles
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/profile?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": {
"platform": "twitter",
"url": "https://x.com/NASA",
"id": "11348282",
"username": "NASA",
"displayName": "NASA",
"name": "NASA",
"bio": "Making the seemingly impossible, possible. ✨",
"location": "Pale Blue Dot",
"verified": true,
"isBlueVerified": true,
"isIdentityVerified": false,
"verification": {
"isBlueVerified": true,
"isIdentityVerified": false,
"verifiedType": "Government",
"reason": "This account is verified because it is a government or multilateral organization account. Learn more",
"verifiedSince": "2009-08-07T19:53:50.000Z"
},
"followers": 92239064,
"following": 119,
"fastFollowers": 0,
"normalFollowers": 92239064,
"tweetCount": 74288,
"likesCount": 16904,
"mediaCount": 28058,
"listedCount": 97014,
"pinnedTweetIds": [
"2082511887757881648"
],
"website": "http://www.nasa.gov/",
"contact": {
"links": [
"http://www.nasa.gov/"
]
},
"tipjarSettings": {
"is_enabled": false
},
"profileImage": "https://pbs.twimg.com/profile_images/1321163587679784960/0ZxKlEKB_400x400.jpg",
"bannerImage": "https://pbs.twimg.com/profile_banners/11348282/1775567134",
"profileImageShape": "Square",
"possiblySensitive": false,
"highlightedTweets": 265,
"creatorSubscriptionsCount": 0,
"businessAffiliatesCount": 89,
"createdAt": "2007-12-19T20:20:32.000Z"
}
}Billing metadata is returned in response headers: X-Captapi-Credits (credits charged), X-Captapi-Cache (hit or miss), and X-Captapi-Source. 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
platformPlatform identifier for this response (matches the endpoint's platform).urlCanonical URL of the item.idStable platform ID for the item.usernameCanonical @handle without @. No handle twin.displayNameProfile display name. No name twin — that alias window is closed.nameName of the item or account. On profile endpoints: deprecated alias of displayName (one release).bioProfile bio. Canonical across profile endpoints (prefer over description on YouTube).locationProfile location string. Always keyed; null when unpublished.verifiedDerived — isBlueVerified OR isLegacyVerified OR isIdentityVerified OR (affiliate != null). Not a separate Twitter field. A null bit is treated as false in the OR.isBlueVerifiedWhether the account has blue-check verification.isIdentityVerifiedIs identity verified. Example: false.followersTotal followers. Equals normalFollowers + fastFollowers when both splits are present (X's own split; fastFollowers is the suspicious-follower bucket).followingNumber of accounts followed.fastFollowersFast followers. Example: 0.normalFollowersNormal followers. Example: 92239064.tweetCountTotal number of tweets.likesCountLikes count. Example: 16904.mediaCountTotal number of media posts.listedCountListed count. Example: 97014.pinnedTweetIdsPinned tweet ids (array).websiteExpanded profile website (not raw t.co). Always keyed; null when unpublished. Not repeated in contact.links.profileImageProfile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release).bannerImageBanner image URL. Deprecated alias of banner on Twitter (one release).profileImageShapeProfile image shape. Example: "Square".possiblySensitivePossibly sensitive. Example: false.highlightedTweetsHighlighted tweets. Example: 265.creatorSubscriptionsCountCreator-subscriptions count. Always keyed. Same null-vs-0 rule as businessAffiliatesCount — both are 0 or both are null on a given path, never mixed.businessAffiliatesCountX business-affiliates count. Always keyed. Present none is 0. GraphQL omit → 0 (empty business_account is dropped). HTML omit → null.createdAtCreation date (ISO 8601).
Verification
The verification object contains:
isBlueVerifiedWhether the account has blue-check verification.isIdentityVerifiedIs identity verified. Example: false.verifiedTypeVerified type. Example: "Government".reasonWhy X shows this account as verified. Tooltip CTA ("Learn more") is stripped; leftover whitespace is collapsed.verifiedSinceVerified since. Example: "2009-08-07T19:53:50.000Z".
Contact
The contact object contains:
linksLinks listed on the page.
Tipjar settings
The tipjarSettings object contains:
is_enabledIs enabled. Example: false.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| url | string | Yes | Twitter/X profile URL or @handle, e.g. https://x.com/username. 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. |
| cache | boolean | No | Set true to use the 1-hour profile cache (0 credits on hit). Default false — always fetch fresh. Prefer cacheMaxAge for 1d–30d. |
| cacheMaxAge | string | No | Max age of a cached response: 1d, 3d, 7d, 14d, or 30d. When set, enables caching with that TTL. |
Authentication: send your key as Authorization: Bearer capt_live_.... A typical call costs 1 credit. 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/profileand parse the JSON response.
Use cases
Profile Enrichment
Add live stats, bio, and account flags to a contact you already have.
Creator Verification
Confirm a known handle, audience size, and business/verified status before outreach.
Competitive Analysis
Track follower growth and posting cadence for accounts you already follow.
Partnership Qualification
Vet known partnership and sponsorship targets with fresh profile data.
Frequently asked questions
What does the Twitter/X Profile API do?+
The Twitter/X Profile API lets you fetch profile or page details and audience stats from a public Twitter / X profile or page using one GET request to /v1/twitter/profile. It returns clean JSON — no OAuth or infrastructure setup required.
How many credits does the Twitter/X Profile API cost?+
Each successful call costs 1 credit. 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 proxies, rate limits, retries, and authentication for you.
Why does the field list say tweetCount / profileImage / bannerImage?+
It doesn't anymore. Live returns displayName, postCount, avatar, and banner. The old twins (name / tweetCount / profileImage / bannerImage / top-level isBlueVerified) are gone — the "(one release)" alias window is closed, not closing. Code against avatar / banner / postCount.
Is cache 24 hours or the "default TTL"?+
cache=true uses the 1-hour profile TTL (0 credits on hit). Pass cacheMaxAge=1d|3d|7d|14d|30d for a longer window. Default is always fresh. The generic "24h cache" sentence does not apply to this endpoint.
Why is verified true when isBlueVerified is false?+
verified is derived — the OR of isBlueVerified, isLegacyVerified, isIdentityVerified, and affiliate. It is not a separate Twitter field. Those four inputs are always keyed (affiliate is null when X has no highlight) so you can see which signal fired. A null bit is treated as false in the OR; it cannot hide a known badge.
Why is businessAffiliatesCount 0 on one account and null on another?+
Same rule as the verification bits. Present none is 0. Omitted is null on the HTML fallback (the page does not carry the field). Guest GraphQL omits the empty business_account parent — we cannot tell "unknown" from "none" on that path, so omitted independent counts become 0. Read source + stages.graphqlStatus. Do not add null + 0; both counts are always keyed.
Are fastFollowers and profileImageShape part of the cross-platform contract?+
No. The stable core is platform / id / username / url / displayName / bio / avatar / banner / followers / following / postCount / verified / createdAt. Twitter-surface extras stay at the top level (not under raw) so existing parsers keep working. They have no cross-platform twin and can change when X's guest payload changes. Do not treat profileImageShape as profile data.
Is the Twitter/X Profile 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 Profile API?
Sign up, grab your key, and make your first call in 60 seconds.