Pricing
from $0.10 / 1,000 results
X (Twitter) Account Scraper
Get profile data from any public X (Twitter) account by handle, @handle, or profile URL. Followers, following, posts count, bio, location, website, verification badge, profile image and banner. HTTP-only, no login required.
Pricing
from $0.10 / 1,000 results
Rating
0.0
(0)
Developer
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Extract public profile data from any X (Twitter) account in bulk β handle, display name, bio, follower and following counts, tweet count, profile image, banner, verified status, and account creation date β in a clean structured JSON output.
Why use this actor
- No account / no login required β just give it an X handle or profile URL.
- Identity-flexible input β bare handle (
jack), at-prefixed (@elonmusk), or full profile URL (https://twitter.com/nasa,https://x.com/nasa) all work. - Exact follower & following counts plus tweet count, listed count, and media count β the same numbers X's web app displays.
- Verified status β the
is_blue_verifiedflag plus the structuredverification_infoblock tells you whether the badge comes from a paid subscription or an identity check. - Account creation date in the response so you can sort by account age, spot suspicious newly-created accounts, or audit brand handles.
- Automatic retries with exponential backoff; suspended, protected, or non-existent handles surface as
_errorrows instead of crashing the run.
How it works
- You provide a list of X handles or profile URLs.
- The actor fetches each profile the same way X's web app does and assembles a flat JSON record per account.
- Results stream into your dataset, ready to download as JSON, CSV, or Excel.
You do not need to manage scrapers, browsers, or rotating IPs β all handled internally.
Input
{"handles":["jack","nasa"],"proxyConfiguration":{"useApifyProxy":true,"apifyProxyGroups":["DATACENTER"]}}
| Field | Type | Description |
|---|---|---|
handles | array | List of X handles or profile URLs to scrape. Accepted forms: jack, @elonmusk, https://twitter.com/nasa, https://x.com/nasa. |
proxyConfiguration | object | Apify Proxy settings. Datacenter proxies are sufficient for public profile lookups. |
Output
Input: jack
{"_input":"jack","_source":"S1-primary","_scrapedAt":"2026-05-18T11:03:56.348095+00:00","rest_id":"12","id":"VXNlcjoxMg==","screen_name":"jack","name":"jack","created_at":"Tue Mar 21 20:50:14 +0000 2006","description":"no state is the best state","url":"https://t.co/ZEpOg6rn5L","entities":{"description":{},"url":{"urls":[{"display_url":"primal.net/jack","expanded_url":"http://primal.net/jack","indices":[0,23],"url":"https://t.co/ZEpOg6rn5L"}]}},"location":"","followers_count":7537416,"friends_count":3,"statuses_count":30509,"favourites_count":38827,"listed_count":33146,"media_count":2963,"normal_followers_count":7537416,"fast_followers_count":0,"profile_banner_url":"https://pbs.twimg.com/profile_banners/12/1742427520","profile_image_shape":"Circle","default_profile":false,"default_profile_image":false,"is_blue_verified":true,"has_graduated_access":true,"possibly_sensitive":false,"translator_type":"regular","verification_info":{"is_identity_verified":false,"reason":{"description":{"text":"This account is verified because it's an affiliate of @Square on X. Learn more","entities":[{"from_index":54,"to_index":61,"ref":{"url":"https://twitter.com/Square","url_type":"ExternalUrl"}}]},"verified_since_msec":"1324658988066"}},"pinned_tweet_ids_str":["1833951636005552366"],"has_custom_timelines":true}
| Field | Type | Description |
|---|---|---|
_input | string | The handle or URL exactly as you supplied it. Use this to join results back to your input list. |
_source | string | Internal tag for the path used to fetch the record. S1-primary is the standard fast path; values starting with S2- indicate a fallback was used. |
_scrapedAt | string | ISO-8601 UTC timestamp when the record was scraped. |
rest_id | string | X's internal numeric user ID. Stable across handle changes β the most reliable identifier for an account. |
id | string | Base64-encoded form of the user ID. |
screen_name | string | The current @handle (without the @). |
name | string | Display name shown above the handle on the profile page. |
created_at | string | Account creation timestamp (X's native format, e.g. Tue Mar 21 20:50:14 +0000 2006). |
description | string | The user's bio / about text. Empty string if not set. |
url | string | The shortened (t.co) URL the user pinned to their profile. Empty if none. |
entities | object | Parsed entities inside description and url β mentions, hashtags, and the original expanded_url for any links. |
location | string | Free-text location field from the profile. Empty string if not set. |
followers_count | integer | Number of accounts following this profile. |
friends_count | integer | Number of accounts this profile follows. |
statuses_count | integer | Total tweets (including replies and retweets) the account has posted. |
favourites_count | integer | Number of tweets the account has liked. |
listed_count | integer | Number of public Lists this account appears on. |
media_count | integer | Number of media items (images, videos) the account has posted. |
normal_followers_count | integer | Followers excluding fast-followers; almost always equals followers_count. |
fast_followers_count | integer | Internal X metric β typically 0. |
profile_banner_url | string | URL of the profile banner / header image. May be absent if the user has no banner. |
profile_image_shape | string | Shape of the avatar β Circle for normal accounts, Square for business accounts, Hexagon for NFT avatars. |
default_profile | boolean | true if the account still uses the default profile design. |
default_profile_image | boolean | true if the avatar is still the default egg / silhouette. |
is_blue_verified | boolean | true if the account has the blue checkmark (paid subscription or legacy verification migration). |
has_graduated_access | boolean | Internal X flag indicating full access tier; usually true for established accounts. |
possibly_sensitive | boolean | X's content-sensitivity flag for the profile. |
translator_type | string | X translator tier β almost always none or regular. |
verification_info | object | Structured detail for verified accounts: is_identity_verified (true = passed identity check), a human-readable reason.description.text, and verified_since_msec (millisecond timestamp). |
pinned_tweet_ids_str | array | IDs of tweets the user has pinned to their profile (usually 0 or 1). |
has_custom_timelines | boolean | true if the account has created custom timeline collections. |
Error envelope
Accounts that are suspended, deactivated, protected, or have never existed return a structured error instead of crashing the run:
{"_input":"this-handle-does-not-exist-xyz","_error":"not_found","_errorDetail":"empty user result","_source":"S1-primary","_scrapedAt":"2026-05-18T11:03:56.348095+00:00"}
_error values you may see:
| Value | Meaning |
|---|---|
not_found | Handle has never existed or was permanently deleted. |
unavailable | Account is suspended or deactivated. _errorDetail carries X's reason string (e.g. Suspended). |
blocked | Profile lookup was rejected (HTTP 4xx) β usually rate-limited. The run continues with the next handle. |
exception | Unexpected error; check _errorDetail for the message. |
Filter on _error to triage failed rows.
Pricing
This actor is billed per result: $8.00 per 1,000 profiles. Each successful profile = 1 result. Errors (suspended, not-found, blocked) are not billed.
Other Sosmed Actors
| Platform | Actor | Best for |
|---|---|---|
| Twitter / X | X Account Tweets Scraper | Profile + recent tweets timeline for any handle |
| Twitter / X | X Post Detail Scraper | Full tweet detail, media variants, engagement counters |
| Twitter / X | X Search Scraper | Search tweets by keyword, hashtag, or from:user |
| Instagram Account Scraper | Bio, followers, post count | |
| Threads | Threads Account Scraper | Profile data for a Threads handle |
| Bluesky | Bluesky Account Scraper | atproto profile + counters |
| Reddit User Profile Scraper | Karma, posts, trophies |
Browse the full catalog at apify.com/xtracto.
Notes
followers_count,friends_count, andstatuses_countare the exact numbers X's web app displays β eventually-consistent and may lag the live network by a few minutes.- Protected accounts return their public metadata only (display name, bio, follower/following counts, creation date) β tweets and media are not exposed.
- Suspended accounts return
{"_error": "unavailable", "_errorDetail": "Suspended", "_input": "..."}. Use the error envelope to triage. rest_idis the most reliable identifier β handles can change butrest_idis permanent. Store it if you need long-term joins.- For large jobs (>1,000 profiles), Apify Proxy rotation is recommended to avoid per-IP rate limits.
