Twitter User Search API | Find Accounts by Keyword
Search X's People directory by keyword. Matches against display name and handle; bio text is not searched, so a term that appears only in a bio returns no match. Useful for discovery, lead lists, and resolving partial handles into full profiles. Cost: $0.0008 per call.
User Search finds Twitter/X accounts by keyword, matching against display name and handle (X's People search does not search bio text). Results are cursor-paginated full user objects, useful for discovery, lead lists, and resolving a partial handle into a full profile. Each call costs $0.0008, the standard read rate, with no OAuth required.
Authorization
bearerAuth Pass your API key as a bearer token on every request: Authorization: Bearer <API_KEY>.
In: header
Query Parameters
Name, keyword or partial handle to search for. Matched against display name and handle, not bio.
Pagination cursor from a previous response.
Max items to return for this page. Default 20; clamped to 1-100.
Comma-separated list of dotted field paths to keep in the response (one parameter, never repeated), applied to every object in the returned lists and to nested objects (for example fields=id,text,author.username; the list's own name may prefix a path, fields=tweets.id). A path prefix that lands on an array applies to each element (media.media_url_https). Pagination and envelope keys (next_cursor, cursor, has_more, count, partial, error, message, reason) are always kept. Unknown paths are ignored; up to 50 paths of up to 6 segments. Projection never changes status codes or billing, and applies to data reads only: account, feedback, session status, monitor (other than deliveries), webhook and stream-compat reads return their bodies unchanged.
Set to 1 (or true) to apply the built-in compact preset: ids, url, text, created_at, lang, the engagement counts, the is_retweet/is_reply/is_quote flags, conversation ids, the author's id/username/name/followers_count/verification, and the quoted or retweeted tweet's id/url/author username. The preset trims what it recognises and leaves alone what it would empty, so it never turns a body into {}. Combine with fields to add paths on top of the preset. Typically cuts a tweet page by 70 to 90 percent for LLM tool callers.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/user/search?query=machine+learning&count=20&fields=id%2Ctext%2Ccreated_at%2Cauthor.username&compact=1"{ "users": [ { "id": "44196397", "username": "elonmusk", "name": "Elon Musk", "description": "", "followers_count": 211000000, "verified": true } ], "next_cursor": "DAABCgABF..."}{ "error": "bad_request", "message": "Missing or malformed parameter. Fix the request before retrying."}{ "error": "unauthorized", "message": "The API key is missing, malformed, or revoked. Check the Authorization header."}{ "error": "insufficient_credits", "message": "Your balance is exhausted. Top up your credits to continue.", "top_up_url": "https://www.twitterapis.com/dashboard/buy-credits?utm_source=api&utm_medium=402"}{ "error": "forbidden", "message": "X refused this resource for the acting account: on a read, the account is not a participant in the DM thread, the target is protected or has blocked it, or the session was attestation-blocked for calling from a datacenter or rotating IP; on a write, the account is not authorized for the action or has no logged-in session. The credentials are still valid, so do not re-register."}{ "error": "not_found", "message": "The resource does not exist, for example a deleted tweet or a private account."}{ "error": "rate_limited", "message": "Too many requests. Back off and retry with exponential backoff."}{ "error": "server_error", "message": "Something failed on our side. Retry with backoff; if it persists, contact support."}Pricing
| Unit | Price |
|---|---|
| Per call | $0.0008 |
| Per 1,000 calls | $0.80 |
| Per 1,000 records (~20 per call) | ~$0.04 |
Each page of results is one $0.0008 read, so a deep discovery crawl spends per page. Page only as far as your list needs.
When to use
Use it for account discovery, lead building and resolving partial handles, for example finding profiles whose display name mentions machine learning. To find people by what their bio says (a company @mention, a job title), pull that company's followers with User Followers, or search tweets mentioning it with Advanced Tweet Search, then filter the returned description field.
Pagination
This endpoint is cursor-paginated and returns roughly 20 records per call. Pass the next_cursor from each response back as the cursor parameter to read the next page. Stop when the records array comes back empty: follower-graph endpoints return a non-null cursor even on the final page, so the empty array is the only reliable stop signal. See Pagination for the full loop.
Related endpoints
- Advanced Tweet Search: Search tweets with Twitter's full query-operator syntax, paginated with cursors.
- User Info by Username: Fetch a full profile by @handle.
- User Followers: Page through the accounts that follow a user.
FAQ
What fields does User Search match against?
The display name and the @handle. X's People search does not match bio text, so a term that appears only in a bio (for example a job title or a company @mention) returns no match. Every result still carries its bio in the description field.
How do I find accounts whose bio mentions a company or keyword?
Pull the company's followers with User Followers, or search tweets that mention it with Advanced Tweet Search, then filter for the term. User Followers returns full user objects, and every tweet from Advanced Tweet Search carries its author profile with the bio in author.description.
Can I resolve a partial handle to a full profile?
Yes. Search the partial handle, then pass the resolved username to User Info by Username for the complete profile object.
How are results paginated?
Results come back cursor-paginated. Send the next_cursor from a response as the cursor parameter to fetch the next page.
Advanced Tweet Search GETHot
Run a full-text tweet search using the same operator syntax as Twitter/X advanced search. Combine free text with operators such as from:, to:, since:, until:, min_faves:, and lang: to filter precisely. Results are cursor-paginated at roughly 20 tweets per call. Cost: $0.0008 per call.
Commentary Video Creators GET
Search X for native-video posts about a topic and get back the creators behind them, ranked. Each call reads one search page, keeps posts that carry native video, drops retweets, applies your min_views bar and groups what is left by author, with every exclusion counted by reason. Billed at $0.0008 per call. Cost: $0.0008 per call.