SFOLN

Catalogue / Social media data

Twitter (X) Account Audit – Engagement

sfoln/x-account-overview · Social media, Lead generation, Automation On request

Audit any public X (Twitter) account in one row: profile, followers and bio plus average likes, reposts, replies and views, engagement rate, posting frequency and top hashtags over its ~20 latest posts. $12 per 1,000 accounts; unknown or suspended accounts are free.

About

What it does

Twitter (X) Account Audit – Engagement gives a one-row health check for any public X (Twitter) account: the full profile (followers, following, posts, verification, bio, website, creation date) plus engagement analytics computed over its ~20 latest posts: average likes, reposts, replies and views, median likes, engagement rate, posting frequency, share of replies and reposts, top hashtags and mentions, last post date and the most-liked recent post. Ideal for influencer vetting, competitor benchmarking, brand-account audits, lead scoring and agency reporting.

Price

Price per delivered record

EventPricePer 1,000Charged for
X account overview
x-account-overview
$0.012$12 / 1,000Charged once per account for which the profile and engagement stats over its latest posts were delivered.
X profile snapshot
x-account-profile-only
$0.003$3 / 1,000Charged instead of x-account-overview when only the profile could be delivered (the posts request failed or the account has no public posts).

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-account-overview/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"handles":["apify"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/x-account-overview"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~x-account-overview/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: Audit the X accounts @apify and @NASA: compare followers, engagement rate, average views and how often they post.

Input

Input fields

Paste X (Twitter) handles. For each account the Actor returns the profile plus engagement statistics computed over its ~20 latest posts.

FieldTypeDefaultMeaning
handles *arrayrequiredHandles or profile URLs
X handles (with or without @) or profile URLs, one per line. Duplicates are removed. Accounts on the Apify free plan can process up to 10 accounts per run.
includeRepliesbooleanfalseInclude replies in the sample
Sample the timeline including the account's replies (makes shareOfReplies meaningful; engagement stats always use original posts only, so fewer posts may be analyzed).
maxItemsinteger1000Max accounts
Safety cap on the number of accounts processed in this run. Range 1–10000.
concurrencyinteger3Concurrency
Accounts processed in parallel (1–5). Range 1–5.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified TwitterAPI.io profile and posts under `raw`.
Example input
{
  "handles": [
    "apify"
  ]
}

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 (full overview, or profile-only with a warning) | not_found (unknown / suspended account, not charged) | 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).
foundboolean | nullFound
Account exists and is available.
handlestring | nullHandle
X handle without @. e.g. "NASA"
userIdstring | nullUser id
Numeric X user id as a string.
namestring | nullName
Display name.
biostring | nullBio
Profile description with t.co links expanded.
locationstring | nullLocation
Free-text profile location.
urlstring | nullWebsite
Website link from the profile (expanded).
profileUrlstring | nullProfile URL
https://x.com/<handle>.
followersinteger | nullFollowers
Follower count.
followinginteger | nullFollowing
Accounts followed.
tweetsinteger | nullPosts
Total posts incl. replies and reposts (statusesCount).
likesinteger | nullLikes given
Posts this account has liked (favouritesCount).
mediaCountinteger | nullMedia
Media posts.
isBlueVerifiedboolean | nullBlue verified
Has a blue check (null when the endpoint does not report it).
verifiedTypestring | nullVerified type
Business / Government / null.
profileImageUrlstring | nullAvatar
Profile image URL.
coverImageUrlstring | nullBanner
Banner image URL.
createdAtstring | nullCreated at
ISO 8601 account creation time.
isAutomatedboolean | nullAutomated
Labelled as an automated account.
automatedBystring | nullAutomated by
Handle of the operator of an automated account.
canDmboolean | nullCan DM
Accepts direct messages.
possiblySensitiveboolean | nullPossibly sensitive
Marked as possibly sensitive.
withheldInCountriesarrayWithheld in
Country codes where the account is withheld.
pinnedTweetIdsarrayPinned post ids
Ids of pinned posts.
unavailableboolean | nullUnavailable
Account is suspended / deactivated / unavailable.
unavailableReasonstring | nullUnavailable reason
e.g. suspended.
unavailableMessagestring | nullUnavailable message
Upstream message for unavailable accounts.
overviewTypestring | nullOverview type
full (profile + post stats) | profile-only (posts could not be fetched or none are public).
sampleSizeinteger | nullPosts sampled
Timeline posts fetched (incl. reposts, excl. pinned).
postsAnalyzedinteger | nullOriginal posts analyzed
Original posts (no reposts, no replies) used for engagement stats.
avgLikesnumber | nullAvg likes
Average likes per original post.
avgRetweetsnumber | nullAvg reposts
Average reposts per original post.
avgRepliesnumber | nullAvg replies
Average replies per original post.
avgViewsnumber | nullAvg views
Average views per original post (posts with a view count).
medianLikesnumber | nullMedian likes
Median likes per original post.
engagementRatePctnumber | nullEngagement rate %
(avgLikes + avgRetweets + avgReplies) / followers × 100.
postsPerDaynumber | nullPosts per day
Sampled posts / days between the oldest sampled post and fetch time.
sampleWindowDaysnumber | nullSample window (days)
Days between the oldest sampled post and fetch time.
topHashtagsarrayTop hashtags
Up to 10 { tag, count } from the account's own posts in the sample.
topMentionsarrayTop mentions
Up to 10 { handle, count } from the account's own posts in the sample.
shareOfRepliesnumber | nullShare of replies
Replies / sampled posts (0–1).
shareOfRetweetsnumber | nullShare of reposts
Reposts / sampled posts (0–1).
lastPostAtstring | nullLast post at
ISO time of the newest sampled post.
mostLikedPostobject | nullMost liked post
{ id, url, text, likes } among original posts.
Example record
{
  "input": "apify",
  "found": true,
  "handle": "apify",
  "userId": "3018470543",
  "name": "Apify",
  "bio": "Web scraping and automation platform",
  "location": "Prague",
  "url": "https://apify.com",
  "profileUrl": "https://x.com/apify",
  "followers": 12000,
  "following": 300,
  "tweets": 5000,
  "likes": 100,
  "mediaCount": 400,
  "isBlueVerified": true,
  "verifiedType": "Business",
  "createdAt": "2015-02-13T08:00:00.000Z",
  "pinnedTweetIds": [
    "1830000000000000000"
  ],
  "overviewType": "full",
  "sampleSize": 20,
  "postsAnalyzed": 16,
  "avgLikes": 41.5,
  "avgRetweets": 7.25,
  "avgReplies": 3.1,
  "avgViews": 5230.4,
  "medianLikes": 30,
  "engagementRatePct": 0.4296,
  "postsPerDay": 1.43,
  "sampleWindowDays": 14,
  "topHashtags": [
    {
      "tag": "webscraping",
      "count": 5
    },
    {
      "tag": "AI",
      "count": 3
    }
  ],
  "topMentions": [
    {
      "handle": "crawlee",
      "count": 4
    }
  ],
  "shareOfReplies": 0.05,
  "shareOfRetweets": 0.15,
  "lastPostAt": "2026-10-13T14:05:09.000Z",
  "mostLikedPost": {
    "id": "1845000000000000001",
    "url": "https://x.com/apify/status/1845000000000000001",
    "text": "New on the blog …",
    "likes": 210
  },
  "status": "ok",
  "charged": true,
  "chargedEvent": "x-account-overview",
  "source": "twitterapi",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents