X (Twitter) Account Scraper
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
Farhan Febrian Nauval
Maintained by CommunityActor 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.