{"openapi":"3.1.0","info":{"title":"Haris Guardian API","description":"Read-only scam/rug risk checks for Solana tokens (SPL + Token-2022), by Haris Guardian.\n\n**Score: 0-100, HIGHER = RISKIER.** Levels: low (<20), medium (20-49), high (50-74), critical (75+).\nThe score is the capped sum of published flag weights; every flag comes with a plain-English reason.\n\nFree tier: 3 checks per UTC day per IP. Optional `X-API-Key` header for higher limits.\nAfter the free tier: **$0.01 USDC per check via [x402](https://x402.org), on Solana or Base (eip155:8453)** (HTTP 402 -> retry with\n`X-PAYMENT` (v1) or `PAYMENT-SIGNATURE` (v2); the facilitator pays network fees; failed checks are not charged).\n`/v1/paid/check` (POST JSON `{\"mint\": ...}` or GET `?mint=`) and `/v1/paid/check/{mint}` always use x402.\n\nHigher-value paid endpoints (x402, POST JSON, flat price per call):\n* `/v1/paid/deep-check` `{\"mint\"}`: holder concentration, linked top wallets (shared funder), LP lock/burn, authorities.\n* `/v1/paid/batch-check` `{\"mints\": [...]}`: up to 20 mints in one call.\n* `/v1/paid/diff` `{\"mint\", \"previous\"}`: what changed since your previous snapshot (stateless watch).\n\nResults are cached for 60 s. Signals, not guarantees. Not financial advice.\nAlso available over MCP at `/mcp` (streamable HTTP): `check_solana_token`, `diff_solana_token` (free tier) and\n`deep_check_solana_token`, `batch_check_solana_tokens` (return x402 payment instructions).\n\nLLM-friendly summary: [`/llms.txt`](/llms.txt).\n\n## Quickstart\n\n**1. Free, no wallet** (3 checks per UTC day per IP):\n\n```bash\ncurl https://haris-api.vercel.app/v1/check/DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263\n```\n\n**2. Paid, $0.01 USDC per check via x402** on Solana or Base. Unpaid calls get HTTP 402 with one `accepts[]` entry per chain;\nan x402 client signs a USDC payment and retries. Your wallet needs USDC only (the facilitator pays network fees), and a\ncheck that fails is never charged.\n\n```bash\ncurl -i -X POST https://haris-api.vercel.app/v1/paid/check -H 'content-type: application/json' -d '{\"mint\":\"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263\"}'\n# -> 402, v1 challenge in the body, v2 challenge base64 in the PAYMENT-REQUIRED header\n```\n\n| Chain | Network (CAIP-2) | Asset | payTo |\n|---|---|---|---|\n| Base | `eip155:8453` | USDC `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` | `0xCf2187a039c9ac286Ee43ECc46cBc6DaEB4Fa633` |\n| Solana | `solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp` | USDC `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` | `7ZpBTGZ7mBm81esAq77FFm293zAuGM3Hi249fKPnVDfJ` |\n\n**Python** (`pip install \"x402[httpx,evm,svm]\"`):\n\n```python\nimport asyncio, os\nfrom x402 import x402Client\nfrom x402.http.clients import x402HttpxClient\n\nclient = x402Client()\nif os.getenv(\"EVM_PRIVATE_KEY\"):      # Base\n    from eth_account import Account\n    from x402.mechanisms.evm.exact import register_exact_evm_client\n    from x402.mechanisms.evm.signers import EthAccountSigner\n    register_exact_evm_client(client, EthAccountSigner(Account.from_key(os.environ[\"EVM_PRIVATE_KEY\"])))\nif os.getenv(\"SOLANA_PRIVATE_KEY\"):   # Solana (base58 secret key)\n    from solders.keypair import Keypair\n    from x402.mechanisms.svm.exact import register_exact_svm_client\n    from x402.mechanisms.svm.signers import KeypairSigner\n    register_exact_svm_client(client, KeypairSigner(Keypair.from_base58_string(os.environ[\"SOLANA_PRIVATE_KEY\"])))\n\nasync def main():\n    async with x402HttpxClient(client, timeout=60) as http:\n        r = await http.post(\"https://haris-api.vercel.app/v1/paid/check\", json={\"mint\": \"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263\"})\n        print(r.status_code, r.json())\n\nasyncio.run(main())\n```\n\n**TypeScript** (`npm i @x402/fetch @x402/evm @x402/svm viem @solana/kit @scure/base`):\n\n```ts\nimport { wrapFetchWithPayment, x402Client } from \"@x402/fetch\";\nimport { ExactEvmScheme } from \"@x402/evm/exact/client\";\nimport { ExactSvmScheme } from \"@x402/svm/exact/client\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { createKeyPairSignerFromBytes } from \"@solana/kit\";\nimport { base58 } from \"@scure/base\";\n\nconst client = new x402Client();\nif (process.env.EVM_PRIVATE_KEY)      // Base\n  client.register(\"eip155:8453\", new ExactEvmScheme(privateKeyToAccount(process.env.EVM_PRIVATE_KEY as `0x${string}`)));\nif (process.env.SOLANA_PRIVATE_KEY)   // Solana\n  client.register(\"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\",\n    new ExactSvmScheme(await createKeyPairSignerFromBytes(base58.decode(process.env.SOLANA_PRIVATE_KEY))));\n\nconst fetchWithPayment = wrapFetchWithPayment(fetch, client);\nconst r = await fetchWithPayment(\"https://haris-api.vercel.app/v1/paid/check\", {\n  method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: JSON.stringify({ mint: \"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263\" }),\n});\nconsole.log(r.status, await r.json());\n```\n\nOther paid endpoints work the same way (POST JSON): `/v1/paid/deep-check` `{\"mint\"}` $0.10,\n`/v1/paid/batch-check` `{\"mints\": [...]}` (up to 20) $0.10, `/v1/paid/diff` `{\"mint\", \"previous\"}` $0.02.\n**MCP**: `https://haris-api.vercel.app/mcp` (streamable HTTP), tools `check_solana_token`, `diff_solana_token` (free tier),\n`deep_check_solana_token`, `batch_check_solana_tokens`.\nFull runnable examples: https://github.com/fitness9991/haris-guardian/tree/main/examples\n","contact":{"name":"Haris Guardian","url":"https://harisguardian.netlify.app/","email":"mansor791@gmail.com"},"version":"1.0.0","x-guidance":"Solana token scam/rug risk checker. Paid x402 endpoint: POST /v1/paid/check with JSON body {\"mint\": \"<base58 mint>\"} (or GET /v1/paid/check?mint=<mint>, or GET /v1/paid/check/<mint>). Costs $0.01 USDC on Solana or Base per call via x402 (v1 X-PAYMENT or v2 PAYMENT-SIGNATURE); the facilitator pays network fees and failed checks are not charged. Response: score 0-100 (HIGHER = RISKIER), level (low/medium/high/critical), verdict and flags with plain-English reasons. Free tier: GET /v1/check/<mint>, 3 calls per UTC day per IP. Read-only; never signs or trades. Higher-value paid endpoints (POST JSON, x402): /v1/paid/deep-check {\"mint\"} ($0.10: holder concentration top1/top5/top10 %, top wallets linked by a shared funder, LP lock/burn, authorities, score + reasons); /v1/paid/batch-check {\"mints\": [up to 20]} ($0.10 per batch, charged only if at least one mint is checked); /v1/paid/diff {\"mint\", \"previous\": <earlier Haris result>} ($0.02: alerts on what changed, e.g. authority re-enabled, LP unlocked, liquidity pulled, sell blocked).","x-logo":{"url":"https://harisguardian.netlify.app/logo-400.png"}},"servers":[{"url":"https://haris-api.vercel.app"}],"paths":{"/health":{"get":{"tags":["meta"],"summary":"Liveness","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/check/{mint}":{"get":{"tags":["check"],"summary":"Check a Solana token mint for scam/rug risk","operationId":"check_v1_check__mint__get","parameters":[{"name":"mint","in":"path","required":true,"schema":{"type":"string","minLength":32,"maxLength":44,"description":"Base58 token mint address","examples":["DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"],"title":"Mint"},"description":"Base58 token mint address"}],"responses":{"200":{"description":"Check result. score 0-100, higher = riskier.","content":{"application/json":{"schema":{}}}},"401":{"description":"Invalid API key"},"402":{"description":"Free tier used: pay $0.01 USDC on Solana or Base via x402 (X-PAYMENT or PAYMENT-SIGNATURE)"},"429":{"description":"Free quota (when x402 disabled) or burst limit exceeded"},"400":{"description":"Invalid mint address or malformed payment header"},"404":{"description":"Address is not a token mint (paid calls are not charged)"},"502":{"description":"Upstream Solana data unavailable (paid calls are not charged)"},"503":{"description":"Payment facilitator unavailable (not charged)"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[]}},"/v1/paid/check":{"post":{"tags":["paid"],"summary":"Check a Solana token mint for scam/rug risk (x402)","operationId":"paid_check","responses":{"200":{"description":"Check result; X-PAYMENT-RESPONSE (v1) / PAYMENT-RESPONSE (v2) carries the settlement","content":{"application/json":{"schema":{"type":"object","properties":{"mint":{"type":"string"},"name":{"type":"string"},"score":{"type":"number","description":"0-100, higher = riskier"},"level":{"type":"string","enum":["low","medium","high","critical"]},"verdict":{"type":"string"},"flags":{"type":"array","items":{"type":"object"}}},"required":["mint","score","level"]},"example":{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","name":"Bonk","score":5,"level":"low","verdict":"No major red flags found.","flags":[]}}}},"402":{"description":"x402 payment required: $0.01 USDC on Solana or Base (v2 challenge in the PAYMENT-REQUIRED header, v1 challenge in the JSON body)"},"400":{"description":"Invalid mint address or malformed payment header"},"404":{"description":"Address is not a token mint (paid calls are not charged)"},"502":{"description":"Upstream Solana data unavailable (paid calls are not charged)"},"503":{"description":"Payment facilitator unavailable (not charged)"}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mint":{"type":"string","description":"Base58 Solana token mint address (SPL or Token-2022)","minLength":32,"maxLength":44}},"required":["mint"]},"example":{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"}}}}},"get":{"tags":["paid"],"summary":"Check a Solana token mint for scam/rug risk (x402, ?mint=)","operationId":"paid_check_get","responses":{"200":{"description":"Check result; X-PAYMENT-RESPONSE (v1) / PAYMENT-RESPONSE (v2) carries the settlement","content":{"application/json":{"schema":{"type":"object","properties":{"mint":{"type":"string"},"name":{"type":"string"},"score":{"type":"number","description":"0-100, higher = riskier"},"level":{"type":"string","enum":["low","medium","high","critical"]},"verdict":{"type":"string"},"flags":{"type":"array","items":{"type":"object"}}},"required":["mint","score","level"]},"example":{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","name":"Bonk","score":5,"level":"low","verdict":"No major red flags found.","flags":[]}}}},"402":{"description":"x402 payment required: $0.01 USDC on Solana or Base (v2 challenge in the PAYMENT-REQUIRED header, v1 challenge in the JSON body)"},"400":{"description":"Invalid mint address or malformed payment header"},"404":{"description":"Address is not a token mint (paid calls are not charged)"},"502":{"description":"Upstream Solana data unavailable (paid calls are not charged)"},"503":{"description":"Payment facilitator unavailable (not charged)"}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]},"parameters":[{"name":"mint","required":true,"description":"Base58 Solana token mint address (SPL or Token-2022)","schema":{"type":"string","minLength":32,"maxLength":44},"example":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","in":"query"}]}},"/v1/paid/deep-check":{"post":{"tags":["paid"],"summary":"Analyze holders, linked wallets, LP lock and authorities","description":"Haris Guardian deep check: holder concentration, linked top wallets (shared funder), LP lock/burn, authorities, score 0-100 (higher = riskier) with reasons.","operationId":"paid_deep_check","requestBody":{"content":{"application/json":{"schema":{"properties":{"mint":{"type":"string","maxLength":44,"minLength":32,"description":"Base58 Solana token mint address (SPL or Token-2022)"}},"type":"object","required":["mint"]},"example":{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"}}},"required":true},"responses":{"200":{"description":"Result; X-PAYMENT-RESPONSE (v1) / PAYMENT-RESPONSE (v2) carries the settlement","content":{"application/json":{"schema":{"properties":{"mint":{"type":"string"},"name":{"type":"string"},"score":{"type":"number","description":"0-100, higher = riskier (base check + holder-cluster flags)"},"level":{"type":"string","enum":["low","medium","high","critical"]},"base_score":{"type":"number"},"verdict":{"type":"string"},"reasons":{"items":{"type":"string"},"type":"array"},"flags":{"items":{"type":"object"},"type":"array"},"holders":{"type":"object","description":"top1/top5/top10 wallet % of supply, excluded %, top wallets"},"clusters":{"items":{"type":"object"},"type":"array","description":"top wallets sharing one funder (first incoming SOL transfer)"},"lp":{"type":"object"},"authorities":{"type":"object"},"liquidity":{"type":"object"}},"type":"object","required":["mint","score","level"]},"example":{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","name":"Bonk","score":5,"level":"low","base_score":5,"verdict":"Low risk: no major red flags found.","reasons":[],"flags":[],"holders":{"top1_wallet_pct":2.1,"top5_wallet_pct":6.3,"top10_wallet_pct":9.8,"excluded_pct":12.0,"wallets":[]},"clusters":[],"lp":{"status":"burned","locked_pct":100.0},"authorities":{}}}}},"402":{"description":"x402 payment required: $0.10 USDC on Solana or Base (v2 challenge in the PAYMENT-REQUIRED header, v1 challenge in the JSON body)"},"400":{"description":"Invalid input or malformed payment header (payment not processed)"},"404":{"description":"Address is not a token mint (not charged)"},"502":{"description":"Upstream Solana data unavailable (not charged)"},"503":{"description":"Payment facilitator unavailable (not charged)"}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.10"},"protocols":[{"x402":{}}]}}},"/v1/paid/batch-check":{"post":{"tags":["paid"],"summary":"Check up to 20 Solana token mints in one call","description":"Haris Guardian batch: risk-check up to 20 Solana token mints in one call (flat price per batch).","operationId":"paid_batch_check","requestBody":{"content":{"application/json":{"schema":{"properties":{"mints":{"items":{"type":"string","maxLength":44,"minLength":32},"type":"array","maxItems":20,"minItems":1,"description":"1-20 base58 Solana token mint addresses"}},"type":"object","required":["mints"]},"example":{"mints":["DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"]}}},"required":true},"responses":{"200":{"description":"Result; X-PAYMENT-RESPONSE (v1) / PAYMENT-RESPONSE (v2) carries the settlement","content":{"application/json":{"schema":{"properties":{"count":{"type":"integer"},"ok":{"type":"integer"},"failed":{"type":"integer"},"results":{"items":{"type":"object","description":"check result, or {mint, error, message}"},"type":"array"},"summary":{"type":"object","description":"count per level and the riskiest mint"}},"type":"object","required":["count","results"]},"example":{"count":1,"ok":1,"failed":0,"results":[{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","name":"Bonk","score":5,"level":"low","verdict":"No major red flags found.","flags":[]}],"summary":{"low":1,"medium":0,"high":0,"critical":0,"riskiest":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"}}}}},"402":{"description":"x402 payment required: $0.10 USDC on Solana or Base (v2 challenge in the PAYMENT-REQUIRED header, v1 challenge in the JSON body)"},"400":{"description":"Invalid input or malformed payment header (payment not processed)"},"404":{"description":"Address is not a token mint (not charged)"},"502":{"description":"Upstream Solana data unavailable (not charged)"},"503":{"description":"Payment facilitator unavailable (not charged)"}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.10"},"protocols":[{"x402":{}}]}}},"/v1/paid/diff":{"post":{"tags":["paid"],"summary":"Compare a token with your previous snapshot and list changes","description":"Haris Guardian watch/diff: re-check a Solana token and report what changed vs. your previous snapshot (authorities, LP, liquidity, holders, sellability, score).","operationId":"paid_diff","requestBody":{"content":{"application/json":{"schema":{"properties":{"mint":{"type":"string","maxLength":44,"minLength":32,"description":"Base58 Solana token mint address (SPL or Token-2022)"},"previous":{"type":"object","description":"A previous Haris result for the same mint (from /v1/paid/check, /v1/check, /v1/paid/deep-check or the 'current' field of an earlier diff)"}},"type":"object","required":["mint","previous"]},"example":{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","previous":{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","name":"Bonk","score":5,"level":"low","verdict":"No major red flags found.","flags":[]}}}},"required":true},"responses":{"200":{"description":"Result; X-PAYMENT-RESPONSE (v1) / PAYMENT-RESPONSE (v2) carries the settlement","content":{"application/json":{"schema":{"properties":{"mint":{"type":"string"},"changed":{"type":"boolean"},"severity":{"type":"string","enum":["none","info","warning","critical"]},"alerts":{"items":{"type":"object"},"type":"array"},"changes":{"type":"object"},"current":{"properties":{"mint":{"type":"string"},"name":{"type":"string"},"score":{"type":"number","description":"0-100, higher = riskier"},"level":{"type":"string","enum":["low","medium","high","critical"]},"verdict":{"type":"string"},"flags":{"items":{"type":"object"},"type":"array"}},"type":"object","required":["mint","score","level"]}},"type":"object","required":["mint","changed","alerts","current"]},"example":{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","changed":false,"severity":"none","alerts":[],"changes":{},"current":{"mint":"DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263","name":"Bonk","score":5,"level":"low","verdict":"No major red flags found.","flags":[]}}}}},"402":{"description":"x402 payment required: $0.02 USDC on Solana or Base (v2 challenge in the PAYMENT-REQUIRED header, v1 challenge in the JSON body)"},"400":{"description":"Invalid input or malformed payment header (payment not processed)"},"404":{"description":"Address is not a token mint (not charged)"},"502":{"description":"Upstream Solana data unavailable (not charged)"},"503":{"description":"Payment facilitator unavailable (not charged)"}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]}}},"/v1/paid/rent-scan":{"post":{"tags":["paid"],"summary":"Find reclaimable rent SOL in a wallet's token accounts","description":"Haris Rent Rebate scan: list a Solana wallet's empty or over-funded SPL/Token-2022 token accounts and how much rent SOL can be reclaimed (read-only; reclaim non-custodially at the returned refund_url).","operationId":"paid_rent_scan","requestBody":{"content":{"application/json":{"schema":{"properties":{"wallet":{"type":"string","maxLength":44,"minLength":32,"pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","description":"Base58 Solana wallet address (owner of the token accounts)"}},"type":"object","required":["wallet"]},"example":{"wallet":"FCcH6NowSESDgEQGcx3TdND6Gs8V1ean7xC77ZNn56Te"}}},"required":true},"responses":{"200":{"description":"Result; X-PAYMENT-RESPONSE (v1) / PAYMENT-RESPONSE (v2) carries the settlement","content":{"application/json":{"schema":{"properties":{"wallet":{"type":"string"},"balance_lamports":{"type":"integer"},"totals":{"type":"object","description":"close/withdraw/skip counts, reclaimable, fee (1.5%) and net lamports"},"reclaimable_sol":{"type":"number"},"net_sol":{"type":"number"},"accounts":{"items":{"type":"object"},"type":"array","description":"actionable token accounts (max 200)"},"skip_reasons":{"type":"object"},"refund_url":{"type":"string","description":"non-custodial page to reclaim (wallet signs)"}},"type":"object","required":["wallet","totals","refund_url"]},"example":{"wallet":"FCcH6NowSESDgEQGcx3TdND6Gs8V1ean7xC77ZNn56Te","balance_lamports":100000000,"totals":{"close":136,"withdraw":0,"skip":27,"reclaimable":207939640,"fee":3119093,"net":204820547},"reclaimable_sol":0.20793964,"net_sol":0.20482055,"accounts":[],"skip_reasons":{},"refund_url":"https://hariskeep.com/refund?wallet=FCcH6NowSESDgEQGcx3TdND6Gs8V1ean7xC77ZNn56Te"}}}},"402":{"description":"x402 payment required: $0.01 USDC on Solana or Base (v2 challenge in the PAYMENT-REQUIRED header, v1 challenge in the JSON body)"},"400":{"description":"Invalid input or malformed payment header (payment not processed)"},"404":{"description":"Address is not a token mint (not charged)"},"502":{"description":"Upstream Solana data unavailable (not charged)"},"503":{"description":"Payment facilitator unavailable (not charged)"}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]}}},"/.well-known/agent.json":{"get":{"tags":["meta"],"summary":"A2A agent card","operationId":"agent_card__well_known_agent_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/agent-card.json":{"get":{"tags":["meta"],"summary":"A2A agent card (alias)","operationId":"agent_card__well_known_agent_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/x402":{"get":{"tags":["meta"],"summary":"x402 discovery document","description":"x402scan-style discovery fan-out: absolute URLs of every route that answers a live 402.","operationId":"well_known_x402__well_known_x402_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/llms.txt":{"get":{"tags":["meta"],"summary":"LLM-friendly summary and copy-paste quickstart (Markdown)","operationId":"llms_txt_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Optional key for a higher free quota on /v1/check (not needed for x402 routes)."}}}}