SFOLN

Catalogue / Social media data

Twitter Profile Scraper (X)

sfoln/x-profile-lookup · Social media, Lead generation, Automation On request

Scrape X (Twitter) profiles by handle, URL or user ID: followers, following, post count, bio, website, location, verification, join date and pinned posts, one JSON record per account. Suspended accounts are flagged. $1 per 1,000 profiles; invalid handles are free.

About

What it does

Twitter Profile Scraper (X) looks up X (Twitter) accounts by handle, profile URL or numeric user ID and returns one normalized profile record per account: follower and following counts, total posts, bio with expanded links, website, location, blue-check and verification type, join date, avatar and banner, pinned posts and automation labels. Built for influencer vetting, CRM enrichment, audience research and AI agents that need a quick, structured answer about an account.

Price

Price per delivered record

EventPricePer 1,000Charged for
X profile
x-profile-looked-up
$0.001$1 / 1,000Charged once per X (Twitter) handle or user id for which a profile was returned, or for which the upstream confirmed the account does not exist or is suspended/unavailable.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~x-profile-lookup/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"handles":["apify","https://x.com/NASA"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/x-profile-lookup"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~x-profile-lookup/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Look up the X profiles @apify and @NASA and compare their followers, post counts, verification and join dates.

Input

Input fields

Paste X (Twitter) handles or profile URLs, and/or numeric user ids. Each account produces one dataset record with a normalized profile and a `status` field.

FieldTypeDefaultMeaning
handlesarray—Handles or profile URLs
X handles (with or without @) or profile URLs such as https://x.com/nasa, one per line. Duplicates are removed. Accounts on the Apify free plan can process up to 10 profiles per run (handles and user ids together).
userIdsarray—Numeric user ids
Optional numeric X user ids (e.g. 11348282), one per line. Looked up in addition to the handles.
maxItemsinteger5000Max profiles
Safety cap on the number of profiles looked up in this run. Range 1–100000.
concurrencyinteger3Concurrency
Parallel upstream lookups (1–5). Range 1–5.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified TwitterAPI.io payload to each record under `raw` (larger output).
Example input
{
  "handles": [
    "apify",
    "https://x.com/NASA"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The input item this record corresponds to.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
Pay-per-event event charged for this record.
sourcestringSource
Upstream data source (twitterapi = TwitterAPI.io).
fetchedAtstringFetched at
ISO timestamp.
errorobjectError
code / message when status is not ok.
warningsarrayWarnings
Non-fatal notes (e.g. stopped early).
foundbooleanFound
true when a live profile was returned.
handlestring | nullHandle
@handle without @. e.g. "NASA"
userIdstring | nullUser id
Numeric user id.
namestring | nullName
Display name.
biostring | nullBio
Profile description with t.co links expanded.
locationstring | nullLocation
Free-text location.
urlstring | nullWebsite
Website link from the profile (expanded).
profileUrlstring | nullProfile URL
https://x.com/<handle>
followersinteger | nullFollowers
Follower count.
followinginteger | nullFollowing
Following count.
tweetsinteger | nullPosts
Total posts incl. replies and reposts (statusesCount).
likesinteger | nullLikes given
Posts this account liked (favouritesCount).
mediaCountinteger | nullMedia
Media posts count.
isBlueVerifiedboolean | nullBlue check
Has a blue check (X Premium).
verifiedTypestring | nullVerified type
e.g. Business, Government; null for none.
profileImageUrlstring | nullAvatar URL
Profile picture URL.
coverImageUrlstring | nullBanner URL
Header image URL.
createdAtstring | nullJoined
Account creation time (ISO 8601).
isAutomatedboolean | nullAutomated
Labelled as an automated account.
automatedBystring | nullAutomated by
Operator handle for automated accounts.
canDmboolean | nullOpen DMs
Accepts direct messages from anyone.
possiblySensitiveboolean | nullSensitive
Profile marked possibly sensitive.
withheldInCountriesarrayWithheld in
Country codes where the account is withheld.
pinnedTweetIdsarrayPinned post ids
Ids of pinned posts.
unavailablebooleanUnavailable
Account suspended / deactivated / otherwise unavailable.
unavailableReasonstring | nullUnavailable reason
e.g. suspended.
unavailableMessagestring | nullUnavailable message
Message shown by X.
Example record
{
  "input": "NASA",
  "found": true,
  "handle": "NASA",
  "userId": "11348282",
  "name": "NASA",
  "bio": "There's space for everybody. ✨",
  "location": "Pale Blue Dot",
  "url": "https://www.nasa.gov/",
  "profileUrl": "https://x.com/NASA",
  "followers": 89123456,
  "following": 178,
  "tweets": 72015,
  "likes": 16432,
  "mediaCount": 28761,
  "isBlueVerified": true,
  "verifiedType": "Government",
  "profileImageUrl": "https://pbs.twimg.com/profile_images/…_normal.jpg",
  "coverImageUrl": "https://pbs.twimg.com/profile_banners/11348282/1696976373",
  "createdAt": "2007-12-19T20:20:32.000Z",
  "isAutomated": false,
  "automatedBy": null,
  "canDm": false,
  "possiblySensitive": false,
  "withheldInCountries": [],
  "pinnedTweetIds": [
    "1843000000000000000"
  ],
  "unavailable": false,
  "unavailableReason": null,
  "unavailableMessage": null,
  "status": "ok",
  "charged": true,
  "chargedEvent": "x-profile-looked-up",
  "source": "twitterapi",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents