{"name":"X Data Gateway — X + Base market for agents","discovery":["/openapi.json","/.well-known/x402","/llms.txt","/v1/capabilities","/mcp"],"mcp":"https://x-data-gateway.annushka1190.workers.dev/mcp","routes":[{"path":"/users/by/username","method":"GET","summary":"User profile by username","description":"Look up a public X/Twitter user by handle. Returns id, username, display name, bio, location, followers/following/statuses counts, verified flag, createdAt, profile image. Query: username (required, no @). e.g. GET /users/by/username?username=elonmusk","priceUsd":"0.004","amount":"4000","params":[{"name":"username","required":true,"description":"X handle without @"}]},{"path":"/users/by/id","method":"GET","summary":"User profile by numeric ID","description":"Look up a public X user by numeric ID. Same fields as username lookup. e.g. GET /users/by/id?id=44196397","priceUsd":"0.004","amount":"4000","params":[{"name":"id","required":true,"description":"Numeric X user ID"}]},{"path":"/tweets/by/id","method":"GET","summary":"Single tweet by ID","description":"One post by numeric ID: text, author, metrics (likes, retweets, replies, quotes, views). e.g. GET /tweets/by/id?id=20","priceUsd":"0.002","amount":"2000","params":[{"name":"id","required":true,"description":"Numeric tweet ID"}]},{"path":"/tweets","method":"GET","summary":"Bulk tweet lookup","description":"Up to 50 tweets by comma-separated IDs. e.g. GET /tweets?ids=20,21,22","priceUsd":"0.007","amount":"7000","params":[{"name":"ids","required":true,"description":"Comma-separated tweet IDs, max 50"}]},{"path":"/tweets/user","method":"GET","summary":"User timeline","description":"Recent posts from a user (newest first) with author and metrics. e.g. GET /tweets/user?username=elonmusk","priceUsd":"0.007","amount":"7000","params":[{"name":"username","required":true,"description":"X handle without @"}]},{"path":"/tweets/search","method":"GET","summary":"Advanced tweet search","description":"Search posts. At least one of: words (or query alias), phrase, hashtags, from, minLikes, since, until. e.g. GET /tweets/search?words=bitcoin or ?query=bitcoin","priceUsd":"0.005","amount":"5000","params":[{"name":"words","required":false,"description":"Words that must appear"},{"name":"phrase","required":false,"description":"Exact phrase"},{"name":"hashtags","required":false,"description":"Comma-separated hashtags, no #"},{"name":"from","required":false,"description":"Only from this username"},{"name":"minLikes","required":false,"description":"Minimum likes"},{"name":"since","required":false,"description":"YYYY-MM-DD"},{"name":"until","required":false,"description":"YYYY-MM-DD"}]},{"path":"/tweets/replies","method":"GET","summary":"Replies to a tweet","description":"Replies to a post by numeric ID. e.g. GET /tweets/replies?id=20","priceUsd":"0.008","amount":"8000","params":[{"name":"id","required":true,"description":"Parent tweet ID"}]},{"path":"/tweets/quotes","method":"GET","summary":"Quote tweets of a post","description":"Posts that quote a given tweet ID (via search quoted filter). e.g. GET /tweets/quotes?id=20","priceUsd":"0.008","amount":"8000","params":[{"name":"id","required":true,"description":"Quoted tweet ID"}]},{"path":"/users/followers","method":"GET","summary":"Followers of a user","description":"One page of followers by numeric user ID. e.g. GET /users/followers?id=44196397","priceUsd":"0.008","amount":"8000","params":[{"name":"id","required":true,"description":"Numeric X user ID"}]},{"path":"/users/following","method":"GET","summary":"Accounts a user follows","description":"One page of accounts followed by numeric user ID (GraphQL Following when available). e.g. GET /users/following?id=44196397","priceUsd":"0.008","amount":"8000","params":[{"name":"id","required":true,"description":"Numeric X user ID"}]},{"path":"/users/search","method":"GET","summary":"Search user accounts","description":"Search public accounts by keyword. e.g. GET /users/search?query=bitcoin","priceUsd":"0.008","amount":"8000","params":[{"name":"query","required":true,"description":"Keyword"}]},{"path":"/workflows/profile-digest","method":"GET","summary":"Profile + activity digest","description":"Profile + recent tweets + avg engagement in one call. e.g. GET /workflows/profile-digest?username=elonmusk&tweet_count=20","priceUsd":"0.04","amount":"40000","params":[{"name":"username","required":true,"description":"X handle without @"},{"name":"tweet_count","required":false,"description":"Default 20, max 40"}]},{"path":"/v1/gas/base","method":"GET","summary":"Base L2 gas tip","description":"Current gas price on Base from public RPC (wei + gwei). Optional query network=base for schema probes. e.g. GET /v1/gas/base","priceUsd":"0.001","amount":"1000","params":[{"name":"network","required":false,"description":"Ignored; always Base mainnet"}]},{"path":"/v1/price/spot","method":"GET","summary":"Spot price by symbol","description":"USD spot via DexScreener search for symbol (e.g. ETH, BTC, SOL). Returns priceUsd, confidence, sources. e.g. GET /v1/price/spot?symbol=ETH","priceUsd":"0.002","amount":"2000","params":[{"name":"symbol","required":true,"description":"Token symbol e.g. ETH"}]},{"path":"/v1/token/meta","method":"GET","summary":"Token metadata by address","description":"Metadata for a token contract (prefers Base). name/symbol/priceUsd always refer to the *requested* address — not the other side of a DEX pair. Stables fall back to registry if Dex is rate-limited. e.g. GET /v1/token/meta?address=0x8335...USDC","priceUsd":"0.004","amount":"4000","params":[{"name":"address","required":true,"description":"Token contract 0x..."}]},{"path":"/v1/token/pairs","method":"GET","summary":"DEX pairs for token","description":"Top liquidity pairs for a token address from DexScreener. e.g. GET /v1/token/pairs?address=0x...","priceUsd":"0.004","amount":"4000","params":[{"name":"address","required":true,"description":"Token contract 0x..."}]},{"path":"/v1/token/verdict","method":"POST","summary":"Base token AI-style verdict card","description":"Send a Base token contract address, get a structured verdict: onchain metrics (price, liquidity, volume, pair count), a plain-language take, risk label, and a shareable verdict card. Body JSON: { \"address\": \"0x...\" } (alias: resource). Entertainment / research helper — not trading advice. e.g. POST /v1/token/verdict {\"address\":\"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"}","priceUsd":"0.015","amount":"15000","params":[{"name":"address","required":true,"description":"Base token contract address (0x…40 hex). Also accepts body.resource"}]},{"path":"/v1/trending/base","method":"GET","summary":"Trending Base tokens","description":"Ranked Base-related tokens from DexScreener boosts/search with simple momentum/risk heuristics. e.g. GET /v1/trending/base","priceUsd":"0.006","amount":"6000","params":[]},{"path":"/v1/defi/tvl","method":"GET","summary":"DefiLlama protocol TVL","description":"Current TVL for a protocol slug from DefiLlama free API. e.g. GET /v1/defi/tvl?slug=aave","priceUsd":"0.003","amount":"3000","params":[{"name":"slug","required":true,"description":"DefiLlama slug e.g. aave, uniswap"}]},{"path":"/v1/wallet/intel","method":"POST","summary":"Base wallet intel","description":"EOA vs contract, ETH balance, USDC balance on Base via public RPC. Body JSON: { \"address\": \"0x...\" }","priceUsd":"0.008","amount":"8000","params":[{"name":"address","required":true,"description":"Wallet 0x... (in JSON body)"}]},{"path":"/v1/x402/probe","method":"GET","summary":"x402 endpoint probe","description":"Unauthenticated GET to resourceUrl; checks HTTP 402, accepts[], price sanity. Query: url (required). e.g. GET /v1/x402/probe?url=https://...","priceUsd":"0.005","amount":"5000","params":[{"name":"url","required":true,"description":"Full https URL to probe"}]},{"path":"/v1/health/paid","method":"GET","summary":"Paid ping","description":"Cheap end-to-end x402 test. Returns { ok: true, ts }. GET /v1/health/paid","priceUsd":"0.001","amount":"1000","params":[]},{"path":"/v1/text/scam-scan","method":"POST","summary":"Scam/phishing text heuristics","description":"Heuristic scan of text for common scam patterns (seed phrases, urgency, fake support). Body: { \"text\": \"...\" }","priceUsd":"0.003","amount":"3000","params":[{"name":"text","required":true,"description":"Text to scan (JSON body)"}]},{"path":"/v1/json/repair","method":"POST","summary":"Repair broken JSON","description":"Best-effort repair of truncated/malformed JSON strings. Body: { \"text\": \"{...\" } or { \"json\": \"...\" }","priceUsd":"0.002","amount":"2000","params":[{"name":"text","required":false,"description":"Raw string (or use json field)"}]}],"mcpTools":["user_by_username","user_by_id","tweet_by_id","tweets_bulk","user_timeline","search_tweets","tweet_replies","tweet_quotes","user_followers","user_following","search_users","profile_digest","gas_base","price_spot","token_meta","token_pairs","token_verdict","trending_base","defi_tvl","wallet_intel","x402_probe","health_paid","scam_scan","json_repair"]}