X (Twitter) People Search Scraper – Find X Users avatar

X (Twitter) People Search Scraper – Find X Users

Pricing

from $0.50 / 1,000 x user profiles

Go to Apify Store
X (Twitter) People Search Scraper – Find X Users

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

ArjunAI Data

Maintained by Community

Actor stats

0

Bookmarked

28

Total users

10

Monthly active users

3 days ago

Last modified

Features

Limited permissions

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

  1. Enter a keyword such as AI creator or SaaS founder.
  2. Set how many matching profiles to save for each query.
  3. Optionally select filters, then click Start.
  4. 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.

📊 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.

GroupFields
Result statestatus, message, results_saved
Search and identitysearch_query, user_id, screen_name, profile_url, name
Biographydescription, description_entities, profile_description_language, bio_urls, bio_mentions, bio_hashtags
Grok bio translationgrok_translation_available, grok_translated_bio, grok_source_language, grok_destination_language
Profile detailslocation, created_at, website_url, profile_image_url, profile_banner_url, profile_image_shape
Audience and activityfollowers_count, friends_count, favourites_count, tweets_count, media_count
Verification and privacyverified, verified_type, is_blue_verified, protected, possibly_sensitive, account_label, profile_interstitial_type
Professional profileprofessional_type, professional_categories, affiliation_name, affiliation_url, affiliation_badge_url
Other native signalspinned_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

FieldTypeDescriptionDefault
searchQueriesstring arrayEnter 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
maxUsersPerQueryintegerMaximum 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
minFollowersintegerOnly save accounts with at least this many followers. Use 0 for no minimum.0
maxFollowersintegerOnly save accounts with no more than this many followers. Leave empty for no maximum.Empty
minTweetsintegerOnly save accounts with at least this many lifetime posts. This does not measure recent activity.0
verificationstringKeep any account, any verified or badged account, Blue verified accounts, Business accounts, Government accounts, or unverified accounts.any
visibilitystringKeep accounts with any visibility, public accounts only, or protected accounts only.any
requireWebsitebooleanWhen enabled, only save accounts with a website URL in their X profile.false
locationKeywordsstring arrayEnter 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
createdAfterdateOnly save accounts created on or after this UTC date.Empty
createdBeforedateOnly 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:

ValueAccounts kept
anyEvery account, regardless of badge status
any_verifiedAccounts with a Blue, Business, Government, or other X verification signal
blue_verifiedAccounts for which X returns is_blue_verified: true
businessAccounts for which X returns verified_type: Business
governmentAccounts for which X returns verified_type: Government
unverifiedAccounts 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:

EventPriceWhen it is charged
Actor start$0.00005 per GB, minimum $0.00005Once per run; the event count scales with allocated memory
X user profile (search-user-result)$0.0005Once 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 os
from apify_client import ApifyClient
client = 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

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.

⌂ 换网址