X Twitter Profile Scraper - Public Profile Details avatar

X Twitter Profile Scraper - Public Profile Details

Pricing

from $7.00 / 1,000 x/twitter profile scrapeds

Go to Apify Store
X Twitter Profile Scraper - Public Profile Details

X Twitter Profile Scraper - Public Profile Details

Scrape public X/Twitter profiles with bio, follower counts, verification, websites, images, and optional top tweets. MCP-ready. $0.007/profile.

Pricing

from $7.00 / 1,000 x/twitter profile scrapeds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

9

Monthly active users

19 days ago

Last modified

Share

This Apify Actor is for users who need public X/Twitter profile data for one or more accounts. It accepts handles or profile URLs, and it emits one dataset record per public profile, plus optional public top-tweet rows when requested. The main profile fields include username, display name, bio, follower and following counts, verification flags, website, avatar, banner, and account context, with outcome-ready rows that are easy to filter, store, or pass to downstream AI or automation workflows. It is usable through Apify MCP and through the Apify API.

Best fit and connected workflows

This Actor fits well when your workflow starts with a list of public X/Twitter accounts and you want structured profile enrichment.

Common routing patterns include:

  • Creator and influencer research from handles or profile links
  • Competitor or brand account tracking from known usernames
  • Sales, recruiting, and partnerships enrichment from account lists
  • Social media analysis where profile identity and audience metrics matter
  • AI agents that need compact profile JSON with optional public tweet context

When your workflow needs profile records first, this Actor provides a focused starting point. When you also want public tweet examples for context, enable includeTweets and use the same dataset stream for both profile and tweet rows.

Input

Provide 1 to 100 public profiles as handles or URLs.

FieldTypeRequiredDescription
profilesarray of stringsYesPublic X/Twitter handles or profile URLs. Examples include openai, @levelsio, and https://x.com/apify. This is the profile input field, not a tweet search field.
includeTweetsbooleanNoAdds public top-tweet rows for each profile when enabled. Defaults to false.
maxTweetsPerProfileintegerNoCaps optional tweet rows per profile when includeTweets is enabled. Accepted range: 0 to 100. Defaults to 10 with tweets enabled and 0 otherwise.
providerOrderstringNoProvider preference for testing or fallback checks. Values: auto, scrapecreators-first, sociavault-first. Defaults to auto.
dedupeProfilesbooleanNoRemoves duplicate profile rows when the same account appears more than once. Defaults to true.
includeRawbooleanNoAdds the raw provider payload to each dataset item for debugging or provider parity checks. Defaults to false.

Focused input example

{
"profiles": ["openai", "@apify", "https://x.com/levelsio"],
"includeTweets": false,
"maxTweetsPerProfile": 10,
"providerOrder": "auto",
"dedupeProfiles": true,
"includeRaw": false
}

Output

The dataset contains profile rows always, and tweet rows only when includeTweets is enabled. Records include the provider name and scrape timestamp, which makes it easy to trace where each row came from and when it was emitted.

FieldTypeDescription
recordTypestringRecord family emitted by the Actor: profile or tweet.
inputProfilestringThe original handle or URL from the input that produced the record.
userIdstring or nullNumeric X/Twitter user ID when returned.
usernamestringCanonical handle without the @ symbol.
namestring or nullPublic display name.
biostring or nullPublic profile biography text.
profileUrlstringCanonical x.com profile URL.
locationstring or nullPublic free-text location.
websiteUrlstring or nullExpanded public website URL.
avatarUrlstring or nullPublic profile image URL.
bannerUrlstring or nullPublic profile banner image URL.
isVerifiedboolean or nullLegacy verification state when available.
isBlueVerifiedboolean or nullBlue verification state when available.
isProtectedboolean or nullProtected state when available.
followersCountinteger or nullPublic follower count.
followingCountinteger or nullPublic following count.
tweetCountinteger or nullPublic tweet count reported by X.
mediaCountinteger or nullPublic media post count reported by X.
listedCountinteger or nullNumber of public lists containing the profile when returned.
likesCountinteger or nullPublic likes or favourites count when returned.
accountCreatedAtstring or nullISO timestamp of account creation when available.
pinnedTweetIdsarray of stringsPinned tweet IDs visible on the profile when returned.
businessLabelstring or nullAffiliated organization or business label when exposed by X.
tweetIdstring or nullTweet ID for optional tweet rows.
tweetUrlstring or nullCanonical status URL for optional tweet rows.
textstring or nullFull text for optional public top-tweet rows.
createdAtstring or nullISO timestamp for optional tweet rows.
langstring or nullTweet language code when returned.
isQuoteboolean or nullWhether the optional tweet row is a quote tweet.
replyCountinteger or nullReply count for optional tweet rows.
repostCountinteger or nullRepost or retweet count for optional tweet rows.
quoteCountinteger or nullQuote count for optional tweet rows.
likeCountinteger or nullLike count for optional tweet rows.
viewCountinteger or nullView count for optional tweet rows.
bookmarkCountinteger or nullBookmark count for optional tweet rows.
hashtagsarray of stringsHashtags extracted from optional tweet rows.
mentionsarray of stringsMentioned usernames extracted from optional tweet rows.
urlsarray of stringsExpanded URLs extracted from profile or optional tweet rows.
mediaUrlsarray of stringsMedia URLs extracted from optional tweet rows.
providerstringProvider that returned the record: scrapecreators or sociavault.
scrapedAtstringISO timestamp when the dataset row was emitted.
rawobjectRaw provider item when includeRaw is enabled.

Illustrative output record

{
"recordType": "profile",
"inputProfile": "openai",
"userId": "4398626122",
"username": "openai",
"name": "OpenAI",
"bio": "Creating safe AGI that benefits all of humanity.",
"profileUrl": "https://x.com/openai",
"location": "San Francisco, CA",
"websiteUrl": "https://openai.com",
"avatarUrl": null,
"bannerUrl": null,
"isVerified": null,
"isBlueVerified": true,
"isProtected": false,
"followersCount": 1000000,
"followingCount": 1000,
"tweetCount": 12000,
"mediaCount": 250,
"listedCount": 1500,
"likesCount": 3000,
"accountCreatedAt": "2015-12-11T20:29:15.000Z",
"pinnedTweetIds": ["1234567890"],
"businessLabel": "OpenAI",
"provider": "scrapecreators",
"scrapedAt": "2026-06-12T12:00:00.000Z"
}

How it works

This Actor uses provider-backed public data for X/Twitter profile details. According to the live contract, it is built from the ts-provider-api template, uses the Apify dataset and key-value store for output, and reads provider credentials from environment variables for ScrapeCreators and SociaVault. The dataset schema separates profile rows from optional tweet rows with recordType, and the output schema exposes dataset items plus OUTPUT and RUN_SUMMARY records in the key-value store.

Pricing

This Actor uses Pay per event pricing, and Apify platform usage is charged in addition to the event-based charges shown on the Actor's live Pricing tab.

Charged events include:

  • Actor start
  • One public X/Twitter profile saved
  • One optional public profile tweet saved

For a simple example, if you scrape 100 profiles with profile-only output, the charged profile events are counted per saved record, and the live Pricing tab shows the current event prices and total cost guidance for the run. For a mixed run with 10 profiles and 5 optional tweets per profile, the dataset contains the profile rows plus the tweet rows, and the live Pricing tab provides the event rates used to estimate the total.

Use with AI agents (MCP)

This Actor is MCP-ready and usable through Apify MCP as a tool for public profile enrichment.

Actor identity: khadinakbar/x-twitter-profile-scraper

Tool behavior:

  • Accepts a list of public X/Twitter profile handles or URLs
  • Returns one dataset row per profile, plus optional public top-tweet rows when enabled
  • Provides structured fields that are convenient for agent parsing, filtering, and routing
  • Includes provenance via provider and scrapedAt, and optional raw payloads via includeRaw

Pull public X/Twitter profile details for these accounts: ["openai","@apify","https://x.com/levelsio"]. Return profile rows only, and include tweet rows only if I ask for tweet context.

Output interpretation:

  • recordType = profile identifies account-level records
  • recordType = tweet identifies optional public top-tweet rows
  • provider shows which upstream source returned the record
  • scrapedAt shows when the row was emitted
  • raw appears only when includeRaw is enabled

Scope and pagination guidance:

  • profiles accepts 1 to 100 accounts per run
  • includeTweets switches on extra tweet rows
  • maxTweetsPerProfile caps tweet rows per profile from 0 to 100
  • dedupeProfiles helps keep repeated profile inputs to one row each
  • The dataset is the main stream for downstream agent processing, and the key-value store records OUTPUT and RUN_SUMMARY for run-level context

Apify API example

JavaScript

import { ApifyClient } from "apify-client";
const client = new ApifyClient({
token: process.env.APIFY_TOKEN,
});
const run = await client.actor("khadinakbar/x-twitter-profile-scraper").call({
profiles: ["openai", "apify"],
includeTweets: false,
dedupeProfiles: true,
});
const datasetItems = await client.dataset(run.defaultDatasetId).listItems();
console.log(datasetItems.items);

Set APIFY_TOKEN in your environment before running the example. The dataset readback lets you consume the profile rows immediately after the execution finishes.

Best results and outcome guidance

Use handles or canonical profile URLs in profiles for the most direct input path. Keep includeTweets off when you only need enrichment fields such as bio, website, verification, and audience counts. Turn it on when your workflow benefits from a few public tweet examples alongside the profile record. If you are comparing upstream sources or validating field parity, providerOrder and includeRaw are useful during testing.

Continue the workflow

Design note

I found that the dataset schema always includes recordType, inputProfile, username, profileUrl, provider, and scrapedAt as required fields, which makes each row easy to identify and trace.

FAQ

Can this Actor be used for profile enrichment from a list of handles?

Yes. The input schema is built for one or more public profiles, and each account produces a normalized dataset record.

Can it return tweet context with the profile?

Yes. Enable includeTweets to add public top-tweet rows for each profile, and use maxTweetsPerProfile to cap how many rows are emitted per profile.

How should I choose between providers?

Use providerOrder: "auto" for the default behavior. If you are validating behavior or testing fallback paths, choose scrapecreators-first or sociavault-first.

How can I remove duplicate profile rows?

Set dedupeProfiles to true. Matching uses X user ID first, then normalized username.

Where should I look for the run-level summary?

Check the key-value store records named OUTPUT and RUN_SUMMARY. The output schema also exposes links to those records.

Responsible use

This Actor is intended for lawful collection and analysis of public X/Twitter profile data. Use the exported records in line with applicable laws, platform terms, privacy obligations, and your internal policies.