X (Twitter) People Search Scraper – Find X Users
Pricing
from $0.50 / 1,000 x user profiles
X (Twitter) People Search Scraper – Find X Users
Find X (Twitter) users for creator discovery, audience research, and lead research. Search by keyword and filter by followers, verification, visibility, location, creation date, website, and total posts. Export matching profiles to JSON, CSV, or Excel. No X login required.
Pricing
from $0.50 / 1,000 x user profiles
Rating
0.0
(0)
Developer
ArjunAI Data
Maintained by CommunityActor stats
0
Bookmarked
28
Total users
10
Monthly active users
3 days ago
Last modified
Categories
Features
Share
Find X (Twitter) accounts by keyword, then narrow the results to the profiles relevant to your research. Search for creators, founders, researchers, or other audiences, and filter by followers, verification, profile location, account creation date, website, and total posts. Export matching profiles to JSON, CSV, or Excel without an X login.
🚀 Quick start
- Enter a keyword such as AI creator or SaaS founder.
- Set how many matching profiles to save for each query.
- Optionally select filters, then click Start.
- Review the matched profiles and export JSON, CSV, or Excel.
Start with a small unfiltered search, then add filters for your target audience.
{"searchQueries": ["AI creator"],"maxUsersPerQuery": 10}
🔗 Ready-to-run examples
Open an example, review its input and spending limit, then run it in your Apify account.
- Find Influencers and Creators on X
- Find Public X Accounts in San Francisco
- Find B2B Founders on X by Industry
📊 Results
Each successful row is one profile that matches a search query and all selected filters. The same account can appear once for each query it matches.
Each Dataset item is one flattened public profile. There is no nested raw user object.
| Group | Fields |
|---|---|
| Result state | status, message, results_saved |
| Search and identity | search_query, user_id, screen_name, profile_url, name |
| Biography | description, description_entities, profile_description_language, bio_urls, bio_mentions, bio_hashtags |
| Grok bio translation | grok_translation_available, grok_translated_bio, grok_source_language, grok_destination_language |
| Profile details | location, created_at, website_url, profile_image_url, profile_banner_url, profile_image_shape |
| Audience and activity | followers_count, friends_count, favourites_count, tweets_count, media_count |
| Verification and privacy | verified, verified_type, is_blue_verified, protected, possibly_sensitive, account_label, profile_interstitial_type |
| Professional profile | professional_type, professional_categories, affiliation_name, affiliation_url, affiliation_badge_url |
| Other native signals | pinned_tweet_ids, can_media_tag, subscription_eligible |
Profile data and counts change over time. Empty strings or arrays mean X did not provide that field for the returned profile. A Grok translation is included only when it is available in X's response.
Invalid input
If every query is empty after trimming, more than 25 unique queries reach the Actor outside the Console input validation, minFollowers exceeds maxFollowers, or createdAfter is later than createdBefore, the run completes successfully with one uncharged invalid_input status record. No X request is made.
No results
When X returns no usable People matches, or none of its results pass the selected filters, the Actor completes successfully and writes one uncharged status record instead of leaving the Dataset empty:
{"status": "no_results","search_query": "example keyword","message": "No X People profiles matched this search query and the selected filters."}
For runs with multiple queries, the Actor writes a separate no_results record for each query with no matches and continues processing the remaining queries. Successful profile records use status: "success".
Request failures
Temporary request problems are retried automatically. Previously saved profiles remain available. If a query cannot be completed, an uncharged status record explains the outcome and the Actor continues with the remaining queries:
{"status": "request_failed","search_query": "AI researcher","results_saved": 0,"message": "X People search could not be completed after 5 attempts. Try this query again later. Last error: connection timed out."}
If earlier pages were already stored, the status is partial and results_saved reports how many unique profiles remain available in the Dataset.
Input and filters
| Field | Type | Description | Default |
|---|---|---|---|
searchQueries | string array | Enter up to 25 keyword or phrase entries. Every query runs independently and results follow X's People-search ranking. Exact duplicates are queried only once. Post-search operators are not supported. | AI researcher |
maxUsersPerQuery | integer | Maximum profiles that pass all selected filters and are saved for each query. This is a target limit; X may provide fewer profiles that match all selected filters. Accepted values are 1 to 1,000. | 20 |
minFollowers | integer | Only save accounts with at least this many followers. Use 0 for no minimum. | 0 |
maxFollowers | integer | Only save accounts with no more than this many followers. Leave empty for no maximum. | Empty |
minTweets | integer | Only save accounts with at least this many lifetime posts. This does not measure recent activity. | 0 |
verification | string | Keep any account, any verified or badged account, Blue verified accounts, Business accounts, Government accounts, or unverified accounts. | any |
visibility | string | Keep accounts with any visibility, public accounts only, or protected accounts only. | any |
requireWebsite | boolean | When enabled, only save accounts with a website URL in their X profile. | false |
locationKeywords | string array | Enter one self-reported profile-location phrase per line. At least one phrase must be contained in the location, without regard to letter case. For example, San Francisco matches San Francisco, CA and San Francisco Bay Area, but not the abbreviation SF. | Empty |
createdAfter | date | Only save accounts created on or after this UTC date. | Empty |
createdBefore | date | Only save accounts created on or before this UTC date. The entire selected day is included. | Empty |
Filters are applied before a profile is saved or charged. Different filter fields use AND logic, so an account must satisfy every selected condition. Entries inside locationKeywords use OR logic, so matching any one location phrase is enough. Leave all optional filters at their defaults to preserve the current unfiltered behavior.
Follower and creation-date ranges are inclusive. minFollowers cannot exceed maxFollowers, and createdAfter cannot be later than createdBefore. Invalid ranges are rejected before any X request is made.
verification accepts these values:
| Value | Accounts kept |
|---|---|
any | Every account, regardless of badge status |
any_verified | Accounts with a Blue, Business, Government, or other X verification signal |
blue_verified | Accounts for which X returns is_blue_verified: true |
business | Accounts for which X returns verified_type: Business |
government | Accounts for which X returns verified_type: Government |
unverified | Accounts with none of these verification or badge signals |
Blue, Business, and Government signals can overlap. A Blue badge can reflect X Premium and should not be interpreted as proof of identity. Locations are self-reported profile text and are matched as case-insensitive phrases.
Up to 25 search-query entries are accepted in one run. After trimming and exact deduplication, queries are processed sequentially. maxUsersPerQuery counts matching profiles, not profiles rejected by the filters, and applies separately to every query. Selective filters can require more result pages and X may still expose fewer matching profiles than requested.
Results follow X's own People-search ranking. The query is passed to X as entered, but operators intended for post search—such as since:, until:, min_faves:, and filter:media—are not part of this Actor's supported behavior.
Duplicates are removed by user ID within each query. If the same account matches two different queries, it can appear once for each query so the search_query attribution remains intact.
Example: public profiles in San Francisco
This searches for San Francisco, requires a website and at least 100 lifetime posts, and keeps public profiles with 1,000–10,000,000 followers whose location contains San Francisco. These conditions apply together.
{"searchQueries": ["San Francisco"],"maxUsersPerQuery": 10,"minFollowers": 1000,"maxFollowers": 10000000,"minTweets": 100,"verification": "any","visibility": "public","requireWebsite": true,"locationKeywords": ["San Francisco"]}
💰 Pricing
This Actor uses pay per event pricing. At the current Store price:
| Event | Price | When it is charged |
|---|---|---|
| Actor start | $0.00005 per GB, minimum $0.00005 | Once per run; the event count scales with allocated memory |
X user profile (search-user-result) | $0.0005 | Once for each successfully saved profile |
Estimated profile-result charges are $0.01 for 20 profiles, $0.05 for 100 profiles, and $0.50 for 1,000 profiles. Only profiles that pass the selected filters and are successfully saved are charged as profile results. invalid_input, no_results, partial, and request_failed status records are not charged as profile results. Set maxUsersPerQuery to control the maximum number of billable profiles requested for each query. The Pricing tab is authoritative if prices change, and Apify platform usage can also apply according to your plan.
Troubleshooting
Why did I receive fewer profiles than requested?
maxUsersPerQuery is an upper limit, not a guaranteed result count. X may expose fewer People results for a query, return duplicates, stop providing additional result pages, or return profiles that do not pass your filters.
Why did I receive a no_results item?
X returned no usable People matches, or none of the returned profiles passed every selected filter. Try a broader phrase, raise the profile limit, or relax one or more filters. Post-search operators such as since: and filter:media are not supported in People search.
Why did I receive a request_failed item?
The query failed after automatic retries. The status item is not charged as a profile result; retry the query later or include the run ID when contacting support.
How do I keep the run cost predictable?
Use maxUsersPerQuery as the per-query profile limit. With multiple queries, the limit applies independently to each query.
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.
Keyword search: AI creator
{"status": "success","search_query": "AI creator","user_id": "1603484516479561728","screen_name": "DivineManhood","profile_url": "https://x.com/DivineManhood","name": "Chirag | AI creator","description": "Al consultant | film director | sharing practical ways to use Al for you and your business.\nReach out to me for collabs👇\nhttps://t.co/9kVUKVW26J","description_entities": {"description": {"urls": [{"display_url": "telegram.me/DivineManhood","expanded_url": "http://telegram.me/DivineManhood","indices": [121,144],"url": "https://t.co/9kVUKVW26J"}]}},"profile_description_language": "en","grok_translation_available": false,"grok_translated_bio": "","grok_source_language": "","grok_destination_language": "","location": "New York, USA","created_at": "2022-12-15T20:18:16Z","followers_count": 280758,"friends_count": 132,"favourites_count": 80935,"tweets_count": 15396,"media_count": 5642,"verified": false,"verified_type": "","is_blue_verified": true,"protected": false,"possibly_sensitive": false,"profile_interstitial_type": "","can_media_tag": true,"account_label": null,"professional_type": "","professional_categories": [],"affiliation_name": "","affiliation_url": "","affiliation_badge_url": "","pinned_tweet_ids": ["2117320052030726313"],"profile_image_shape": "Circle","subscription_eligible": false,"bio_urls": ["http://telegram.me/DivineManhood"],"bio_mentions": [],"bio_hashtags": [],"website_url": "","profile_image_url": "https://pbs.twimg.com/profile_images/2088325971749613568/SkU_h78w_normal.jpg","profile_banner_url": "https://pbs.twimg.com/profile_banners/1603484516479561728/1786730697"}
San Francisco: all selected filters applied
{"status": "success","search_query": "San Francisco","user_id": "121597316","screen_name": "sfchronicle","profile_url": "https://x.com/sfchronicle","name": "San Francisco Chronicle","description": "Delivering the Bay Area’s best journalism every day. Subscribe and support the newsroom: https://t.co/p8tnyqwzKs","description_entities": {"description": {"urls": [{"display_url": "SFChronicle.com/subscribe","expanded_url": "http://SFChronicle.com/subscribe","indices": [89,112],"url": "https://t.co/p8tnyqwzKs"}]},"url": {"urls": [{"display_url": "SFChronicle.com","expanded_url": "http://SFChronicle.com","indices": [0,23],"url": "https://t.co/We5Z8CENIp"}]}},"profile_description_language": "en","grok_translation_available": false,"grok_translated_bio": "","grok_source_language": "","grok_destination_language": "","location": "San Francisco, CA","created_at": "2010-03-10T00:44:07Z","followers_count": 370140,"friends_count": 478,"favourites_count": 5685,"tweets_count": 505741,"media_count": 93284,"verified": false,"verified_type": "Business","is_blue_verified": false,"protected": false,"possibly_sensitive": false,"profile_interstitial_type": "","can_media_tag": true,"account_label": null,"professional_type": "Business","professional_categories": ["Media & News Company"],"affiliation_name": "","affiliation_url": "","affiliation_badge_url": "","pinned_tweet_ids": [],"profile_image_shape": "Square","subscription_eligible": false,"bio_urls": ["http://SFChronicle.com/subscribe"],"bio_mentions": [],"bio_hashtags": [],"website_url": "http://SFChronicle.com","profile_image_url": "https://pbs.twimg.com/profile_images/1145742752824483842/gAPc8mwO_normal.png","profile_banner_url": "https://pbs.twimg.com/profile_banners/121597316/1431378314"}
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-people-search-scraper/runs" \-H "Authorization: Bearer $APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries":["AI creator"],"maxUsersPerQuery":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.
Python Client 3.x
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("arjun_code/x-twitter-people-search-scraper").call(run_input={'searchQueries': ['AI creator'], 'maxUsersPerQuery': 10})if run is not None:for item in client.dataset(run.default_dataset_id).iterate_items():print(item)
Continue your research
- Export audience profiles with Followers & Following
- Review account background with Account Origin
- Track future profile changes with Profile Monitor
Coverage and responsible use
- This Actor returns People results only; it does not search posts or return tweet content.
- Search order and result availability are controlled by X and can change between runs.
- Protected accounts may expose fewer public fields.
- Some optional fields, including Grok bio translations, may be unavailable.
- X can change its web responses or apply temporary rate limits, which may affect a run.
- Each run accepts up to 25 query entries, and each query is capped at 1,000 profiles. X People search is relevance-ranked and cannot guarantee every account matching a phrase.
Use the data responsibly and comply with applicable laws, privacy requirements, X's terms, and Apify's terms. This independent Actor is not affiliated with, endorsed by, or sponsored by X Corp.
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.