Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/xquik-api-guest-wallets-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no email required.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Xquik Guest Wallets API
version: '1.0'
description: "Xquik is an independent third-party service. Not affiliated with X Corp. \"Twitter\" and \"X\" are trademarks of X Corp. Look up tweets, users, and X trends. Search tweets, check follow relationships, download media, and monitor accounts. 33 paid-read endpoints accept prepaid credits without a subscription. 7 fixed-price lookups also accept direct MPP payments. Write and automation endpoints require an API key or OAuth 2.1 bearer token.\n\n## Xquik SDKs\n\nStainless generates each SDK from this OpenAPI schema. Pick a language:\n\n- TypeScript / Node.js: `npm i x-twitter-scraper` -\n [Xquik-dev/x-twitter-scraper-typescript](https://github.com/Xquik-dev/x-twitter-scraper-typescript)\n\n- Python: `pip install x-twitter-scraper` -\n [Xquik-dev/x-twitter-scraper-python](https://github.com/Xquik-dev/x-twitter-scraper-python)\n\n- Go: `go get github.com/Xquik-dev/x-twitter-scraper-go` -\n [Xquik-dev/x-twitter-scraper-go](https://github.com/Xquik-dev/x-twitter-scraper-go)\n\n- Ruby: `gem install x-twitter-scraper` -\n [Xquik-dev/x-twitter-scraper-ruby](https://github.com/Xquik-dev/x-twitter-scraper-ruby)\n\n- Java (source build; Maven Central pending) -\n [Xquik-dev/x-twitter-scraper-java](https://github.com/Xquik-dev/x-twitter-scraper-java)\n\n- Kotlin (source build; Maven Central pending) -\n [Xquik-dev/x-twitter-scraper-kotlin](https://github.com/Xquik-dev/x-twitter-scraper-kotlin)\n\n- C# / .NET: `dotnet add package XTwitterScraper` -\n [Xquik-dev/x-twitter-scraper-csharp](https://github.com/Xquik-dev/x-twitter-scraper-csharp)\n\n- PHP: `composer require xquik/x-twitter-scraper` -\n [Xquik-dev/x-twitter-scraper-php](https://github.com/Xquik-dev/x-twitter-scraper-php)\n\n- CLI: `go install github.com/Xquik-dev/x-twitter-scraper-cli/cmd/x-twitter-scraper@latest` -\n [Xquik-dev/x-twitter-scraper-cli](https://github.com/Xquik-dev/x-twitter-scraper-cli)\n\n- Terraform Provider (Terraform Registry) -\n [Xquik-dev/terraform-provider-x-twitter-scraper](https://github.com/Xquik-dev/terraform-provider-x-twitter-scraper)\n\n\nOpenClaw plugin: [Xquik-dev/tweetclaw](https://github.com/Xquik-dev/tweetclaw) (`openclaw plugins install clawhub:@xquik/tweetclaw`)."
x-guidance: '## Common tasks
**Find a tweet** - GET /x/tweets/{id} with a numeric tweet ID. Returns full tweet data: text, author, metrics (likes, retweets, replies, views), media URLs, and creation timestamp. Cost: $0.00015 per lookup.
**Search tweets** - GET /x/tweets/search?q={query}&limit={n}. Supports X search operators, structured filters like fromUser, mediaType, minFaves, hashtags, and verifiedOnly, plus exact lookup for a pasted Tweet ID or X status URL. Plain from:user date windows are optimized for timeline completeness. Returns up to 200 tweets per page with cursor-based pagination. Cost: $0.00015 per tweet returned.
**Find a user** - GET /x/users/{id} where {id} is a numeric user ID or @username. Returns profile data: name, bio, follower/following counts, verification status, join date. Cost: $0.00015 per lookup.
**Check if A follows B** - GET /x/followers/check?source={a}&target={b} where source and target are usernames, @usernames, or X or Twitter profile URLs. Cost: $0.00075.
**Get trending topics** - GET /trends?woeid={region}&count={n}. WOEID 1 = worldwide, 23424977 = US, 23424975 = UK, 23424969 = Turkey. Cost: $0.00045.
**Download media** - POST /x/media/download with {"tweetIds": ["123", "456"]} body. Returns download URLs for images and videos. Cost: 1 credit per fresh tweet processed with media; cached repeat downloads are free.
**Read an article** - GET /x/articles/{tweetId} for long-form X Articles. Returns full article HTML, cover image, and metadata. Cost: $0.00075.
## Pagination
Default v1 responses keep their existing pagination fields for compatibility. Platform list endpoints return `hasMore` and `nextCursor`; X data endpoints return `has_next_page` and `next_cursor`. Send `xquik-api-contract: 2026-04-29` to receive the unified best-practice fields `has_more` and `next_cursor`. Pass the cursor back as `?cursor={cursor}`; legacy `?after={cursor}` still works. Dynamic-priced endpoints charge per item returned, not per request.
## Authentication
Eligible paid read endpoints accept accountless prepaid credit wallets. Fixed-price lookups also accept direct MPP payments. Media downloads, write endpoints, and automation features require authentication. Send an Xquik API key through `x-api-key`, `Xquik-Api-Key`, or `Authorization: Bearer xq_...`. Send an OAuth 2.1 access token through `Authorization: Bearer`.
## Best-Practice Response Contract
v1 keeps its original response contract by default so existing integrations do not break. Send `xquik-api-contract: 2026-04-29` to opt in to the best-practice contract: snake_case response fields, Unix timestamps in seconds, structured error objects, `has_more` and `next_cursor` pagination fields, `object` resource identifiers, and prefixed IDs where available. Dependency failures that returned 502 in default v1 return 424 in the opt-in contract. Future major API versions should make this contract the default.'
contact:
name: Xquik
url: https://xquik.com
email: support@xquik.com
servers:
- url: https://xquik.com
security:
- apiKey: []
- oauthBearer: []
tags:
- name: Guest Wallets
description: Accountless prepaid access for paid read endpoints
paths:
/api/v1/guest-wallets:
post:
operationId: createGuestWallet
summary: Create an accountless prepaid wallet checkout
description: 'Create a one-use Stripe-hosted checkout after the user explicitly confirms a $10-$250 USD amount. This request creates no charge by itself. The user opens checkout_url on Stripe. This endpoint returns the paid-read API key without requiring an Xquik account, email, dashboard, or Xquik web page. An idempotent replay returns the same key.
'
tags:
- Guest Wallets
security: []
parameters:
- $ref: '#/components/parameters/GuestIdempotencyKey'
requestBody:
required: true
description: Confirmed USD amount in cents.
content:
application/json:
schema:
$ref: '#/components/schemas/GuestWalletPurchaseRequest'
example:
amount_minor: 1000
currency: usd
responses:
'201':
description: 'Stripe-hosted checkout, guest API key, and API status URL.
'
headers:
Cache-Control:
description: Prevents storage of the secret-bearing response.
schema:
type: string
const: no-store, private
Idempotent-Replayed:
description: Set to true when this wallet creation replays.
schema:
type: string
const: 'true'
content:
application/json:
schema:
$ref: '#/components/schemas/GuestWalletCreateResponse'
example:
account_required: false
amount:
amount_minor: 1000
currency: usd
api_key: xq_example_returned_once
authorization:
header: Authorization
scheme: Bearer
checkout_url: https://buy.stripe.com/example
credential_notice: Store api_key and the Idempotency-Key securely before sharing checkout_url. No email recovery is available.
credits: '66666'
expires_at: '2026-07-13T13:00:00.000Z'
instructions: Give checkout_url to the user. They must complete payment on Stripe. Never submit payment for them. After payment, poll status_url every poll_after_seconds until latest_purchase.status is no longer pending.
poll_after_seconds: 2
purchase_id: gp_example
requires_user_interaction: true
status: pending
status_url: https://xquik.com/api/v1/guest-wallets/status
wallet_id: gw_example
'400':
$ref: '#/components/responses/InvalidInput'
'409':
description: Idempotency-Key was reused with a different request.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: idempotency_conflict
message: Reuse this Idempotency-Key only with the original request.
'410':
description: Checkout expired or can no longer be used.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: checkout_unavailable
message: Checkout unavailable. Retry with a new Idempotency-Key.
'413':
description: Request body is too large.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: body_too_large
message: Request body is too large.
'415':
description: Content-Type must be application/json.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: unsupported_media_type
message: 'Send Content-Type: application/json.'
'423':
description: Guest wallet is unavailable.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: guest_wallet_unavailable
message: Guest wallet unavailable. Create a new wallet or contact support.
'429':
$ref: '#/components/responses/GuestWalletRateLimited'
'503':
description: Guest wallet checkout is unavailable.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: guest_wallets_unavailable
message: Guest wallet checkout is temporarily unavailable.
default:
content:
application/json:
example:
error: internal_error
message: Unexpected error. Try again.
schema:
$ref: '#/components/schemas/Error'
description: Unexpected error.
/api/v1/guest-wallets/topups:
post:
operationId: topUpGuestWallet
summary: Create another guest wallet checkout
description: 'Create a one-use Stripe-hosted checkout for an existing paid-read guest key after the user explicitly confirms a $10-$250 USD amount. The key remains the same. This request creates no charge by itself and never redirects through an Xquik web page.
'
tags:
- Guest Wallets
security:
- apiKey: []
parameters:
- $ref: '#/components/parameters/GuestIdempotencyKey'
requestBody:
required: true
description: Confirmed top-up amount in USD cents.
content:
application/json:
schema:
$ref: '#/components/schemas/GuestWalletPurchaseRequest'
example:
amount_minor: 1000
currency: usd
responses:
'201':
description: Stripe-hosted checkout and API status URL.
headers:
Cache-Control:
description: Prevents caching the top-up checkout response.
schema:
type: string
const: no-store, private
Idempotent-Replayed:
description: Set to true when this top-up replays.
schema:
type: string
const: 'true'
content:
application/json:
schema:
$ref: '#/components/schemas/GuestWalletTopupResponse'
example:
account_required: false
amount:
amount_minor: 1000
currency: usd
checkout_url: https://buy.stripe.com/example
credits: '66666'
expires_at: '2026-07-13T13:00:00.000Z'
instructions: Give checkout_url to the user. They must complete payment on Stripe. Never submit payment for them. After payment, poll status_url every poll_after_seconds until latest_purchase.status is no longer pending.
poll_after_seconds: 2
purchase_id: gp_example
requires_user_interaction: true
status: pending
status_url: https://xquik.com/api/v1/guest-wallets/status
wallet_id: gw_example
'400':
$ref: '#/components/responses/InvalidInput'
'401':
$ref: '#/components/responses/Unauthenticated'
'409':
description: Top-up key was reused with a different request.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: idempotency_conflict
message: Reuse this Idempotency-Key only with the original request.
'410':
description: Top-up checkout expired or became unavailable.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: checkout_unavailable
message: Checkout unavailable. Retry with a new Idempotency-Key.
'413':
description: Top-up request body is too large.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: body_too_large
message: Request body is too large.
'415':
description: Top-up requires Content-Type application/json.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: unsupported_media_type
message: 'Send Content-Type: application/json.'
'423':
description: Guest wallet cannot accept a top-up.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: guest_wallet_unavailable
message: Guest wallet unavailable. Create a new wallet or contact support.
'429':
$ref: '#/components/responses/GuestWalletRateLimited'
'503':
description: Guest wallet top-up checkout is unavailable.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: guest_wallets_unavailable
message: Guest wallet checkout is temporarily unavailable.
default:
content:
application/json:
example:
error: internal_error
message: Unexpected error. Try again.
schema:
$ref: '#/components/schemas/Error'
description: Unexpected error.
/api/v1/guest-wallets/status:
get:
operationId: getGuestWalletStatus
summary: Get guest wallet and payment status
description: 'Poll after Stripe payment. Use usable to decide whether paid reads can run. An active wallet can remain usable while a top-up is pending. A new wallet becomes usable only after verified webhook fulfillment. Send the guest key as Authorization: Bearer.
'
tags:
- Guest Wallets
security:
- apiKey: []
responses:
'200':
description: Guest wallet status without exposing the API key.
headers:
Cache-Control:
description: Prevents storage of wallet status.
schema:
type: string
const: no-store, private
content:
application/json:
schema:
$ref: '#/components/schemas/GuestWalletStatusResponse'
example:
balance: '66666'
latest_purchase:
amount:
amount_minor: 1000
currency: usd
checkout_url: null
credits: '66666'
expires_at: '2026-07-13T13:00:00.000Z'
purchase_id: gp_example
status: paid
poll_after_seconds: null
scope: paid_reads
status: active
top_up:
method: POST
path: /api/v1/guest-wallets/topups
usable: true
wallet_id: gw_example
'401':
$ref: '#/components/responses/Unauthenticated'
'429':
$ref: '#/components/responses/GuestWalletRateLimited'
default:
content:
application/json:
example:
error: internal_error
message: Unexpected error. Try again.
schema:
$ref: '#/components/schemas/Error'
description: Unexpected error.
components:
responses:
Unauthenticated:
description: Unauthenticated
headers:
Cache-Control:
description: Prevents storage of authentication responses.
schema:
type: string
const: no-store
WWW-Authenticate:
description: Bearer authentication challenge.
schema:
type: string
const: Bearer realm="xquik"
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: unauthenticated
message: Authentication required. Provide a valid API key or bearer token.
GuestWalletRateLimited:
description: Guest wallet request limit exceeded.
headers:
Retry-After:
description: Seconds before the next guest wallet request.
required: true
schema:
type: integer
minimum: 1
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: rate_limited
message: Try again later.
InvalidInput:
description: Invalid input
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
error: invalid_input
message: Invalid input. Check the request body.
schemas:
GuestWalletCheckoutResponse:
description: Pending Stripe checkout and guest wallet purchase details.
type: object
additionalProperties: false
required:
- account_required
- amount
- checkout_url
- credits
- expires_at
- instructions
- poll_after_seconds
- purchase_id
- requires_user_interaction
- status
- status_url
- wallet_id
properties:
account_required:
type: boolean
const: false
amount:
$ref: '#/components/schemas/GuestWalletAmount'
api_key:
type: string
format: password
description: 'Paid-read bearer credential returned only by initial creation. Store it as a secret. Never place it in a URL or log.
'
example: xq_example_returned_once
authorization:
type: object
additionalProperties: false
required:
- header
- scheme
properties:
header:
type: string
enum:
- Authorization
example: Authorization
scheme:
type: string
enum:
- Bearer
example: Bearer
checkout_url:
type: string
format: uri
pattern: ^https://buy\.stripe\.com/
description: Raw Stripe-hosted checkout URL for user interaction.
example: https://buy.stripe.com/example
credits:
type: string
pattern: ^\d+$
description: Credits granted after verified payment.
example: '66666'
credential_notice:
type: string
const: Store api_key and the Idempotency-Key securely before sharing checkout_url. No email recovery is available.
expires_at:
type: string
format: date-time
description: Time when the pending checkout expires.
example: '2026-07-13T13:00:00.000Z'
instructions:
type: string
const: Give checkout_url to the user. They must complete payment on Stripe. Never submit payment for them. After payment, poll status_url every poll_after_seconds until latest_purchase.status is no longer pending.
poll_after_seconds:
type: integer
const: 2
description: Wait at least this long before polling status_url.
purchase_id:
type: string
pattern: ^gp_[A-Za-z0-9_-]+$
example: gp_example
requires_user_interaction:
type: boolean
const: true
status:
type: string
enum:
- creating
- pending
- paid
- expired
- failed
- refunded
- disputed
example: pending
status_url:
type: string
format: uri
const: https://xquik.com/api/v1/guest-wallets/status
wallet_id:
type: string
pattern: ^gw_[A-Za-z0-9_-]+$
example: gw_example
GuestWalletStatusResponse:
description: Current balance, usability, and latest guest purchase state.
type: object
additionalProperties: false
required:
- balance
- latest_purchase
- poll_after_seconds
- scope
- status
- top_up
- usable
- wallet_id
properties:
balance:
type: string
pattern: ^\d+$
example: '66666'
latest_purchase:
description: Latest purchase state. This does not determine usability.
anyOf:
- $ref: '#/components/schemas/GuestWalletPurchaseStatus'
- type: 'null'
example:
amount:
amount_minor: 1000
currency: usd
checkout_url: null
credits: '66666'
expires_at: '2026-07-13T13:00:00.000Z'
purchase_id: gp_example
status: paid
poll_after_seconds:
description: Polling delay while payment is pending. Null means stop.
anyOf:
- type: integer
const: 2
- type: 'null'
example: 2
scope:
type: string
const: paid_reads
status:
type: string
description: 'Combined wallet and pending-checkout state. A pending top-up can coexist with usable true. Terminal expired or failed states require a new guest wallet.
'
enum:
- active
- pending
- expired
- failed
- frozen
- closed
example: active
top_up:
description: Top-up action when usable and no checkout is pending.
anyOf:
- type: object
additionalProperties: false
required:
- method
- path
properties:
method:
type: string
const: POST
path:
type: string
const: /api/v1/guest-wallets/topups
- type: 'null'
example:
method: POST
path: /api/v1/guest-wallets/topups
usable:
type: boolean
description: Authoritative paid-read readiness. Use instead of status.
example: true
wallet_id:
type: string
pattern: ^gw_[A-Za-z0-9_-]+$
example: gw_example
GuestWalletTopupResponse:
description: Existing guest wallet top-up response without a new key.
allOf:
- $ref: '#/components/schemas/GuestWalletCheckoutResponse'
- not:
anyOf:
- type: object
properties:
api_key:
type: string
required:
- api_key
- type: object
properties:
authorization:
type: object
required:
- authorization
GuestWalletAmount:
description: Confirmed USD amount for a guest wallet purchase.
type: object
additionalProperties: false
required:
- amount_minor
- currency
properties:
amount_minor:
type: integer
minimum: 1000
maximum: 25000
description: USD amount in cents. Accepted range is $10-$250.
example: 1000
currency:
type: string
const: usd
GuestWalletPurchaseStatus:
description: Latest guest wallet purchase fulfillment state.
type: object
additionalProperties: false
required:
- amount
- checkout_url
- credits
- expires_at
- purchase_id
- status
properties:
amount:
$ref: '#/components/schemas/GuestWalletAmount'
checkout_url:
anyOf:
- type: string
format: uri
pattern: ^https://buy\.stripe\.com/
- type: 'null'
description: Present only while the purchase is pending.
example: null
credits:
type: string
pattern: ^\d+$
example: '66666'
expires_at:
type: string
format: date-time
example: '2026-07-13T13:00:00.000Z'
purchase_id:
type: string
pattern: ^gp_[A-Za-z0-9_-]+$
example: gp_example
status:
type: string
enum:
- creating
- pending
- paid
- expired
- failed
- refunded
- disputed
example: paid
GuestWalletCreateResponse:
description: Initial guest wallet response containing the one-time key.
allOf:
- $ref: '#/components/schemas/GuestWalletCheckoutResponse'
- type: object
required:
- api_key
- authorization
- credential_notice
Error:
description: 'Error response. Default v1 returns a legacy string error code. Send `xquik-api-contract: 2026-04-29` to receive the structured best-practice error object.
'
type: object
required:
- error
properties:
error:
x-stainless-naming:
python:
type_name: ErrorValue
java:
type_name: ErrorValue
example: invalid_input
oneOf:
- type: string
title: LegacyErrorCode
enum:
- internal_error
- account_already_connected
- account_needs_reauth
- account_not_found
- account_required
- account_restricted
- api_key_limit_reached
- article_not_found
- dm_not_permitted
- invalid_format
- invalid_id
- invalid_input
- invalid_params
- invalid_tool_type
- invalid_tweet_id
- invalid_tweet_url
- invalid_user_id
- invalid_user_ids
- invalid_username
- invalid_json
- insufficient_credits
- login_cooldown
- login_failed
- media_download_failed
- missing_params
- missing_query
- monitor_already_exists
- no_media
- no_credits
- no_subscription
- not_found
- payment_failed
- rate_limit_exceeded
- service_unavailable
- style_not_found
- subscription_inactive
- tweet_not_found
- unauthenticated
- unsupported_field
- user_not_found
- body_too_large
- checkout_unavailable
- connection_challenge_expired
- connection_challenge_inactive
- draft_not_found
- favoriters_unavailable
- forbidden
- guest_wallet_unavailable
- guest_wallets_disabled
- guest_wallets_unavailable
- idempotency_conflict
- idempotency_key_conflict
- invalid_community_id
- invalid_idempotency_key
- invalid_list_id
- invalid_payment_amount
- invalid_range
- login_rate_limited
- missing_idempotency_key
- missing_ids
- no_cached_style
- passkey_required
- rate_limited
- read_request_timeout
- replies_incomplete
- support_media_rate_limit
- support_request_rate_limit
- too_many_ids
- unknown_field
- unsupported_media_type
- webhook_inactive
- write_tracking_unavailable
- x_write_unconfirmed
- x_account_feature_required
- x_account_protected
- x_account_suspended
- x_api_rate_limited
- x_api_unavailable
- x_api_unauthorized
- x_auth_failure
- x_content_too_long
- x_daily_limit
- x_dm_not_allowed
- x_duplicate_action
- x_login_auth_failed
- x_login_challenge
- x_login_denied
- x_login_failed
- x_login_proxy_error
- x_login_rate_limited
- x_login_service_unavailable
- x_login_suspended
- x_rate_limited
- x_rejected
- x_target_not_found
- x_transient_error
- x_user_lookup_failed
- x_write_ambiguous
- x_write_failed
example: invalid_input
- type: object
title: StructuredError
required:
- message
- type
- code
properties:
message:
type: string
example: Invalid input. Check the request body.
type:
type: string
enum:
- api_error
- authentication_error
- billing_error
- dependency_error
- invalid_request_error
- permission_error
- rate_limit_error
example: invalid_request_error
code:
type: string
title: ErrorCode
enum:
- internal_error
- account_already_connected
- account_needs_reauth
- account_not_found
- account_required
- account_restricted
- api_key_limit_reached
- article_not_found
- dm_not_permitted
- invalid_format
- invalid_id
- invalid_input
- invalid_params
- invalid_tool_type
- invalid_tweet_id
- invalid_tweet_url
- invalid_user_id
- invalid_user_ids
- invalid_username
- invalid_json
- insufficient_credits
- login_cooldown
- login_failed
- media_download_failed
- missing_params
- missing_query
- monitor_already_exists
- no_media
- no_credits
- no_subscription
- not_found
- payment_failed
- rate_limit_exceeded
# --- truncated at 32 KB (36 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/xquik-api/refs/heads/main/openapi/xquik-api-guest-wallets-api-openapi.yml