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
Search X (Twitter) users by keyword, filter profiles by followers, verification, visibility, website, posts, location, or creation date, and export structured data.
Pricing
from $0.50 / 1,000 x user profiles
Rating
0.0
(0)
Developer
Arjun AI
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
6
Monthly active users
4 days ago
Last modified
Categories
Share
Find public X (Twitter) accounts with X's native People search and export clean, structured profile data. Enter one or more keyword phrases, optionally filter the profiles by audience size, verification, visibility, website, posting volume, location, or creation date, and receive an analysis-ready Dataset.
This Actor searches for people and organizations—not posts. It is useful when you want to discover accounts around a profession, company, research area, community, location, name, or niche without manually paging through X search results.
No X account, cookie, API key, session credential, or proxy setup is required from the user.
What you can do
- Search X users with phrases such as
AI researcher,climate journalist,fintech Singapore, or a person's name. - Run several queries in one Actor run.
- Save only profiles that match your audience, account-quality, and location criteria.
- Export profile names, handles, bios, locations, websites, avatars, and banners.
- Compare followers, following, likes, posts, and media-post counts.
- Capture verified, blue-verified, protected, sensitive-content, and professional-profile signals.
- Receive Grok-translated bios when X supplies a translation.
- Download results as JSON, CSV, Excel, XML, RSS, or access them through the Apify API.
Input
| 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. The Actor follows result pages until it reaches this number or X has no more results. 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.
Example input:
{"searchQueries": ["AI researcher","climate journalist London"],"maxUsersPerQuery": 100,"minFollowers": 1000,"maxFollowers": 100000,"minTweets": 100,"verification": "any_verified","visibility": "public","requireWebsite": true,"locationKeywords": ["San Francisco","New York"],"createdAfter": "2018-01-01","createdBefore": "2024-12-31"}
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.
Output
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 |
Representative output:
{"status": "success","search_query": "AI researcher","user_id": "891077171673931776","screen_name": "berkeley_ai","profile_url": "https://x.com/berkeley_ai","name": "Berkeley AI Research","description": "We're graduate students, postdocs, faculty and scientists at the cutting edge of artificial intelligence research.","description_entities": {"description": {},"url": {"urls": [{"display_url": "bair.berkeley.edu","expanded_url": "http://bair.berkeley.edu/","indices": [0, 23],"url": "https://t.co/h9tAyYG2Q0"}]}},"profile_description_language": "en","grok_translation_available": false,"grok_translated_bio": "","grok_source_language": "","grok_destination_language": "","location": "Berkeley, CA","created_at": "Fri Jul 28 23:25:27 +0000 2017","followers_count": 288339,"friends_count": 472,"favourites_count": 663,"tweets_count": 1588,"media_count": 42,"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": [],"profile_image_shape": "Circle","subscription_eligible": false,"bio_urls": [],"bio_mentions": [],"bio_hashtags": [],"website_url": "http://bair.berkeley.edu/","profile_image_url": "https://pbs.twimg.com/profile_images/891079469594587138/c_bnAh4o_normal.jpg","profile_banner_url": "https://pbs.twimg.com/profile_banners/891077171673931776/1501285360"}
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
Each query keeps a stable request session across pagination. Temporary network, server, access, and rate-limit failures are retried automatically, for a maximum of five attempts per page. Every retry repeats the same page cursor, and completed pages remain in the Dataset. Non-retryable errors can stop after one attempt. If a page cannot be completed, the Actor saves an uncharged status record and continues with any 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.
Run from the Apify Console
- Open the Actor and select Try for free.
- Add one or more People search queries.
- Set the maximum matching profiles per query.
- Optionally narrow the results with the profile filters.
- Click Start.
- Open the Dataset to preview, filter, download, or access the results through the API.
Run with the Apify API
cURL
curl -X POST \"https://api.apify.com/v2/acts/arjun_code~x-twitter-people-search-scraper/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries": ["AI researcher"],"maxUsersPerQuery": 20}'
The run response contains defaultDatasetId. Use it to retrieve the result items from the Dataset API.
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("arjun_code/x-twitter-people-search-scraper").call(run_input={"searchQueries": ["AI researcher"],"maxUsersPerQuery": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('arjun_code/x-twitter-people-search-scraper').call({searchQueries: ['AI researcher'],maxUsersPerQuery: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Common use cases
- Discover researchers, creators, journalists, founders, recruiters, or subject-matter experts.
- Build prospect and partnership lists from public profile data.
- Find organizations and communities in a specific market or location.
- Compare audience and activity signals before outreach or research.
- Create public-profile datasets for enrichment, monitoring, or analysis workflows.
Try a ready-made example or enter your own search phrases in the Actor input:
- Find AI Researchers on X (Twitter)
- Find B2B Founders and Leads on X
- Find Influencers and Creators on X
Continue your X research workflow
| Goal | Actor |
|---|---|
| Discover public accounts by keyword, profession, niche, or location | X (Twitter) People Search Scraper – Find X Users |
| Expand from a known profile through X's native Similar to recommendations | X (Twitter) Similar Accounts Finder — No Login |
| Export followers or accounts followed by one or more profiles | X Followers & Following Scraper — No Login |
| Inspect account origin, signup source, and username-change history | X / Twitter Account Origin Intelligence |
| Monitor profile, username, verification, and follower changes over time | X (Twitter) Profile & Username Change Monitor |
A practical workflow is: discover accounts by keyword, expand each seed through native Similar to recommendations, export selected audiences, inspect origin signals, then monitor shortlisted profiles over time.
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.
Privacy and request handling
Apify Proxy routing and internal X authentication are handled automatically; neither is requested through public input or written to the Dataset. The Actor exports only public profile information returned by X People search. Viewer-specific relationship fields—such as whether the internal session follows, blocks, mutes, or can message a profile—are intentionally excluded.
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 the applicable number of attempts, up to five for retryable failures. 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.
Limitations
- 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.