X Followers & Following Scraper — At Scale
Pricing
from $0.08 / 1,000 profile scrapeds
X Followers & Following Scraper — At Scale
Export X (Twitter) followers and following profiles for audience research. Enter usernames, profile links, or user IDs; filter by verification, account visibility, follower count, and total posts. Download JSON, CSV, or Excel. No X login or X API key required.
Pricing
from $0.08 / 1,000 profile scrapeds
Rating
5.0
(1)
Developer
ArjunAI Data
Maintained by CommunityActor stats
2
Bookmarked
99
Total users
53
Monthly active users
3 days ago
Last modified
Categories
Features
Share
Export the followers of public X (Twitter) accounts, or the accounts they follow, as structured profile data. Enter usernames, profile links, or user IDs, then choose a sample size or apply profile filters for audience research. Download the results in JSON, CSV, or Excel without an X login or X API key.
🚀 Quick start
- Enter a username, profile link, or user ID.
- Choose Followers or Followings, then set Profiles per account (0 = all).
- Optionally select profile filters, then click Start.
- Review the Dataset and export JSON, CSV, or Excel.
Start with 10 profiles. To collect both relationship types, run once for each type.
{"screenNames": ["OpenAI"],"relationshipType": "followers","maxItemsPerUser": 10}
🔗 Ready-to-run examples
Open an example, review its input and spending limit, then run it in your Apify account.
- Export X Followers to CSV
- Export Accounts Followed by an X Profile
- Export Followers from Multiple X Accounts
- Export Verified X Followers by Audience Size
📊 Results
One successful row is one follower or following profile for a source account. The same profile can appear under different source accounts.
The default output includes:
- Source account ID, screen name, profile URL, and requested identifier.
- Relationship type:
followersorfollowings. - User ID, screen name, name, bio, location, and account creation date.
- Followers, following, posts, media posts, likes, and listed counts.
- Legacy verification, Blue verification, Business or Government badge type, account label, protected-account, default-profile, and geo status.
- Expanded website and bio links, profile image, banner, pinned post IDs, and country restrictions.
Leave includeRawUser disabled for compact, spreadsheet-friendly results. Enable it only when you need the complete original response from X.
account_label contains X's parody, commentary, or fan-account label; accounts without one return null.
Normalized created_at values use ISO 8601 UTC, for example 2020-07-02T12:00:00Z. The optional raw_user object keeps X's original time representation unchanged.
Input and filters
Provide at least one value in screenNames, userIds, or both.
| Field | Description | Default |
|---|---|---|
screenNames | Usernames, @handles, full x.com or twitter.com profile URLs, or numeric user IDs. | None |
userIds | Optional numeric X user IDs. You can use this field by itself or together with usernames and URLs. | Empty |
relationshipType | followers returns accounts following the source profile. followings returns accounts followed by it. | followers |
maxItemsPerUser | Maximum matching profiles saved per source account. Keep 100 for a quick test, or set 0 to paginate through all profiles available from X. When filters are enabled, maxProfilesScannedPerUser still applies. | 100 |
verification | Keeps all accounts, any verified account, Blue verified accounts, Business or Government accounts, or accounts without a verification badge. | any |
visibility | Keeps all accounts, public accounts only, or protected accounts only. | any |
minFollowers | Minimum follower count required for a result. Set 0 to disable. | 0 |
maxFollowers | Maximum follower count allowed for a result. Leave empty for no maximum. | Empty |
minTweets | Minimum lifetime post count required for a result. Set 0 to disable. | 0 |
maxProfilesScannedPerUser | Profiles checked per source account while filters are enabled. Set 0 to check until X ends the list. | 20000 |
includeRawUser | Adds the complete original X user object as raw_user. | false |
Each run accepts up to 25 distinct input identifiers across screenNames and userIds combined. Equivalent username forms such as nasa, @nasa, and https://x.com/nasa count once; a username and ID for the same account count separately at input time, but are merged after lookup. Sources are processed sequentially. All enabled filters work together, so a saved profile must satisfy every selected condition. The scan limit is applied separately to each source account and is ignored when no result filter is enabled.
Profiles saved and profiles checked
maxItemsPerUser controls how many matching profiles are saved for each source account. Set it to 0 to collect all profiles X makes available.
With filters enabled, maxProfilesScannedPerUser limits the profiles checked while looking for matches. Its default is 20,000; use 0 to continue through the available list. Without filters, this check limit is ignored. A target result count is not a guarantee that enough matching profiles exist. Results keep the order returned by X.
💰 Pricing
This Actor uses pay-per-event pricing. A successful profile written to the Dataset is charged as one relationship-result event. Error and not-found records are not charged.
| Apify plan | Price per successful profile | Example: 1,000 profiles |
|---|---|---|
| Free | $0.00015 | $0.15 |
| Bronze | $0.00010 | $0.10 |
| Silver | $0.00009 | $0.09 |
| Gold, Platinum, or Diamond | $0.00008 | $0.08 |
A small Actor-start event also applies: $0.00005 per GB of allocated memory, with a minimum of one event. The Actor respects the maximum charge limit configured for the run and stops before making additional requests after that limit is reached.
Large exports take longer and cost more. Keep the default limit of 100 while testing a new target, then increase it or set it to 0 after confirming the expected result volume.
Missing, unavailable, and partial results
Malformed usernames, profile URLs, and user IDs produce uncharged invalid_input records. Valid inputs in the same run are still processed. If no usable account was provided, the run ends without sending an X request and leaves an invalid_input record explaining why.
When X explicitly reports that an account does not exist or is unavailable, the Actor writes an uncharged not_found record and continues with the remaining source profiles:
{"status": "not_found","requested_identifier": "missing-user","relationship_type": "followers","error": "X user @missing-user was not found or is unavailable."}
Temporary request failures that remain after all retry attempts produce an uncharged error record. If at least one source succeeds, other source-level errors do not discard its results. If every requested source fails because of a technical error, the run finishes with a failed status while its error records and any previously stored pages remain available.
FAQ
Do I need an X account or API key?
No. You do not need to submit an X login, cookies, bearer token, or X API key.
Can one run collect both followers and following?
One run collects one relationship type. Run it once with followers and once with followings when you need both datasets.
What does maxItemsPerUser: 0 mean?
It removes the saved-result limit. Without filters, pagination continues until X provides no more available profiles. With filters, the Actor can still stop at maxProfilesScannedPerUser; set both values to 0 to continue until X ends the list. Protected, suspended, restricted, or changing accounts can still return fewer records.
What is the difference between results saved and profiles checked?
maxItemsPerUser limits how many matching profiles are written to the Dataset. maxProfilesScannedPerUser limits how many followers or following profiles are inspected while filters are enabled. For example, the Actor can check up to 20,000 profiles to save the first 100 that match every filter.
Can the Dataset contain duplicate profiles?
Usually X result pages do not repeat users. During a long export, however, the relationship list can change while it is being read. If X returns the same profile on different pages, the Actor preserves those rows as returned.
Why can the result count differ from the number shown on X?
X relationship counts change continuously and can include accounts that are protected, suspended, restricted, withheld, or otherwise unavailable in the available relationship data.
What happens if a later page fails?
The Actor stores results after every completed page. Earlier pages remain in the Dataset, and the failed source receives an error record after retry attempts are exhausted.
Result examples
The examples below were captured from successful runs on November 10, 2026. Counts and availability can change. They correspond to the Quick start or separately labeled input above.
Follower profile
{"status": "success","source_user_id": "4398626122","source_screen_name": "OpenAI","source_profile_url": "https://x.com/OpenAI","requested_identifier": "OpenAI","relationship_type": "followers","user_id": "1640759131731812352","screen_name": "chaoXu245194412","profile_url": "https://x.com/chaoXu245194412","name": "Waluolaa","description": "","location": "","created_at": "2023-03-28T16:54:18Z","followers_count": 0,"friends_count": 9,"listed_count": 0,"favourites_count": 1,"tweets_count": 0,"media_count": 0,"pinned_tweet_ids": [],"verified": false,"is_blue_verified": false,"verified_type": "","account_label": null,"protected": false,"profile_interstitial_type": "","can_media_tag": true,"default_profile": true,"geo_enabled": false,"advertiser_account_type": "none","business_profile_state": "none","withheld_in_countries": [],"website_url": "","bio_urls": [],"profile_image_url": "https://pbs.twimg.com/profile_images/1640759227194171393/0SGIh4mF_normal.png","profile_image_shape": "Circle","profile_banner_url": "","default_profile_image": false}
API and integrations
Use your Apify API token in the request header.
curl -X POST \"https://api.apify.com/v2/actors/arjun_code~x-twitter-followers-followings-scraper/runs" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"screenNames":["OpenAI"],"relationshipType":"followers","maxItemsPerUser":10}'
This starts a run and returns its ID. After the run finishes, use its defaultDatasetId to download the results. You can also save the input as a Task, schedule it, or use Apify integrations.
Continue your research
Privacy and limitations
The Actor works with relationship data exposed by X for public profiles. It does not require an X login, cookies, API key, or proxy configuration, and no internal authentication data is written to the Dataset.
Protected, suspended, restricted, or withheld accounts may return limited or no relationship data. This unofficial Actor is not affiliated with or endorsed by X. Use the data lawfully and follow X, Apify, and applicable privacy requirements.
Support
If a run fails or the output changes, open an issue on the Actor page and include the Apify run ID, input, and expected behavior. Do not include passwords, cookies, tokens, or other secrets.