x_search 6 credits
Search X by keywords. type picks the mode: recent (default) is the deep chronological sweep and keeps paginating as far as you follow the cursor; popular returns the highest-engagement tweets for the query; people finds accounts and returns a single page (no cursor). Advanced query operators pass through verbatim, e.g. "from:nasa", "min_faves:100", exact phrases in quotes -- there is no separate date parameter, so use since:/until: operators for time windows. Costs 6 credits per page; a cursor page is a NEW call priced the same way, so a deep sweep costs linearly in pages. Returns tweet summaries (text, author with follower count, views, likes, retweets, replies, created_at, url, id) with a cursor. Fetch one tweet's full detail with x_get_tweet and an account's timeline with x_get_tweets. For comment-level sentiment inside topic communities, reddit_search type=comments is usually the sharper instrument.
Parameters
| Param | Required | Type | Description |
|---|---|---|---|
query | yes | string | Free-text keywords; X advanced operators work, e.g. 'claude code from:AnthropicAI since:2026-06-01'. |
type | no | string | recent = chronological deep sweep; popular = top engagement; people = account search (single page). |
cursor | no | string | Cursor from a previous page. Not valid with type 'people'. |
freshness | no | string | recent (default) serves cached data from the last few hours when available; realtime forces a live fetch for +2 credits (refunded if we fall back to cached data). |
max_credits | no | integer | Spend ceiling for this one call. The call is rejected (nothing charged) if its quote exceeds this. Only the quote is ever reserved, never this ceiling. |
REST
GET /v1/x/search · auth: required · metered: true
curl "https://api.veezee.io/v1/x/search?query=veezee+api" \
-H "Authorization: Bearer $VEEZEE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
MCP
{
"method": "tools/call",
"params": {
"name": "x_search",
"arguments": {
"query": "veezee api"
}
}
}
Input examples
Fresh mentions of a product
{
"query": "veezee api"
}
Highest-engagement takes on a topic
{
"query": "ai agents data access",
"type": "popular"
}
Find accounts
{
"query": "developer relations ai",
"type": "people"
}
Output
Returns a x_search envelope. Full field list: /docs/fields#x_search.
Errors
REST returns application/problem+json; MCP returns the same content as an error result. message is written as the next-turn instruction.
| Code | HTTP status | Retriable | Meaning |
|---|---|---|---|
INVALID_INPUT | 400 | no | A parameter failed validation. Check param and message for what to fix. |
NOT_FOUND | 404 | no | Nothing matches the given identifier or URL. |
UNAUTHORIZED | 401 | no | Missing, invalid, or revoked API key. |
NOT_ENTITLED | 403 | no | This account is not enabled for the platform you called. |
INSUFFICIENT_CREDITS | 402 | no | Your balance can't cover this call's quote. Check get_usage or add credits. |
QUOTE_EXCEEDS_MAX_CREDITS | 402 | no | The call's quote is higher than the max_credits you set. Nothing was charged. |
IDEMPOTENCY_KEY_REQUIRED | 400 | no | This is a metered call; send an Idempotency-Key header. |
IDEMPOTENCY_KEY_REUSED | 409 | no | That Idempotency-Key was already used with different arguments. Use a new key for a new call. |
CONCURRENCY_LIMIT | 429 | yes | Too many calls in flight for this key's plan. Wait for one to finish. |
RATE_LIMITED | 429 | yes | Too many calls per minute for this key's plan. Back off and retry. |
TRIAL_CAP_EXCEEDED | 403 | no | A trial-only limit was hit (concurrency, rate, search size, or realtime fetches). |
BUDGET_EXHAUSTED | 503 | no | A configured spend budget has been used up. |
UPSTREAM_UNAVAILABLE | 502 | yes | LinkedIn data wasn't reachable. Safe to retry. |
PAYLOAD_TOO_LARGE | 413 | no | The request or response exceeded the size limit. |
INTERNAL | 500 | yes | Something failed on our side. Safe to retry. |
Errors a payment can fix add fields to this shape. INSUFFICIENT_CREDITS, TRIAL_CAP_EXCEEDED, and BUDGET_EXHAUSTED carry upgrade_url (give it to your human) and offer, its machine-readable twin; RATE_LIMITED and CONCURRENCY_LIMIT carry both on trial accounts only, where a paid plan raises the limit. offer holds offer_version (1), reason (the error code), currency ("usd"), recommended (which pack to lead with, currently flex), packs (pack, mode, price_usd_cents, credits or credits_per_month, and when, a short label for when that pack fits), rails (currently stripe_checkout), checkout_url (the same account-bound link as upgrade_url), resume, and refund_policy. Follow offer.resume after payment: INSUFFICIENT_CREDITS retries the same call with the SAME Idempotency-Key; TRIAL_CAP_EXCEEDED and BUDGET_EXHAUSTED retry with a fresh key; the two limit codes clear on their own with back-off, payment only raises the limit. INSUFFICIENT_CREDITS also sets credits_required: the credits the failed call needed. The failed attempt charged nothing.