{"openapi":"3.1.0","info":{"title":"PickleCheck","version":"1.0.0","description":"Three pay-per-call safety checks for AI trading agents. GET /scam-check asks whether a Base token is safe to buy (rug, honeypot, insider dump, owner powers, with the proof attached). GET /endpoint-check asks whether an x402 endpoint is safe to pay. POST /verify-payment verifies a payment on base, ethereum, arbitrum, solana or bitcoin from its tx hash (omit chain to auto-detect). pending/not_found/unknown are HTTP 503 and not charged. Also GET /scam-check: Base token / URL risk check. x402 USDC. Free calls per IP per day, counted per route: 3 scam checks, 1 payment check, 1 endpoint check. Prices after the free calls (USDC on Base): scam-check $0.008, endpoint-check $0.005, verify-payment $0.003. How to pay and working examples: https://picklecheck-test.onrender.com/docs. Pay a check from a phone with MetaMask: https://picklecheck-test.onrender.com/pay.","x-guidance":"POST /verify-payment {tx_hash, receiver, expected_amount}. Branch on status/verified. Guide: https://picklecheck-test.onrender.com/llms.txt","contact":{"name":"PickleCheck","url":"https://x.com/picklecheck"}},"servers":[{"url":"https://picklecheck-test.onrender.com"}],"paths":{"/endpoint-check":{"get":{"operationId":"endpointCheck","summary":"Is it safe to pay this x402 endpoint? (looks, never pays)","parameters":[{"in":"query","name":"url","required":true,"schema":{"type":"string"},"description":"https URL of an x402 endpoint"}],"responses":{"200":{"description":"A decided answer: action NO_FLAGS, CAUTION or AVOID","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"host + path only: a query string is never kept"},"state":{"type":"string","enum":["payable","not_payable","redirect","unreachable"]},"checked_at":{"type":"string"},"response_ms":{"type":["number","null"]},"data_complete":{"type":"boolean"},"action":{"type":"string","enum":["NO_FLAGS","CAUTION","AVOID","VERIFY_MORE"]},"label":{"type":"string","description":"NO_FLAGS only: \"No major flags found\" (never OK: we do not pay the endpoint)"},"reasons":{"type":"array","items":{"type":"string"}},"flags":{"type":"array","description":"What was found; the ids are listed in /llms.txt","items":{"type":"object","properties":{"id":{"type":"string"},"severity":{"type":"string","enum":["critical","high","medium","info"]}},"additionalProperties":true}},"accepts":{"type":"array","description":"The payment options it asked for","items":{"type":"object","properties":{"scheme":{"type":["string","null"]},"network":{"type":["string","null"]},"asset":{"type":["string","null"]},"pay_to":{"type":"string"},"amount":{"type":"string"},"resource_host":{"type":["string","null"]},"resource_scheme":{"type":["string","null"]}}}},"history":{"type":"object","properties":{"probes":{"type":"integer"},"first_seen":{"type":["string","null"]},"hours_watched":{"type":"number"},"all_payable_same_terms":{"type":"boolean"},"last_change":{"type":["string","null"]}}},"pay_to_history":{"type":"object","description":"Base pay-to wallets, keyed by address; {status: \"reading\"} until the first read lands","additionalProperties":{"type":"object","properties":{"status":{"type":"string"},"days_read":{"type":"number"},"complete":{"type":"boolean"},"payments_in":{"type":"integer"},"usdc_in":{"type":"number"},"payers":{"type":["integer","string"]},"read_at":{"type":["string","null"]},"hosts_seen":{"type":"integer","description":"How many of the endpoints we watch ask to be paid at this wallet"}}}},"query_string":{"type":"string"},"query_note":{"type":"string"},"disclaimer":{"type":"string"}}}}}},"402":{"description":"payment required"},"422":{"description":"bad url (PC-ERR-BAD-URL), not charged"},"503":{"description":"endpoint unreachable (action VERIFY_MORE), not charged"}}}},"/scam-check":{"get":{"operationId":"scamCheck","summary":"Base token / URL scam check","parameters":[{"in":"query","name":"target","required":true,"schema":{"type":"string"},"description":"Base 0x token address or URL"},{"in":"query","name":"quick","schema":{"type":"string","enum":["1"]},"description":"Fast mode (about 5 s): fewer facts; skipped facts are null (never assumed safe) and fields.full_check_url points to the full check"},{"in":"query","name":"amount_usd","schema":{"type":"number"},"description":"Your trade size in USD, for fields.price_impact_at_size_pct (an estimate from pool size) and fields.sell_at_size (a sell quote at that size from the exchange quoters)"},{"in":"query","name":"compact","schema":{"type":"string","enum":["1"]},"description":"No summary text, no disclaimer, no null fields: a missing key means unknown, same as null (about 30-45% smaller)"}],"responses":{"200":{"description":"Risk report (api_version 2.0)","content":{"application/json":{"schema":{"type":"object","properties":{"api_version":{"type":"string","enum":["2.0"]},"risk":{"type":["string","null"],"enum":["Lower Risk","Medium Risk","Higher Risk",null],"description":"null on VERIFY_MORE (not rated)"},"error":{"type":"string","description":"PC-ERR-* code on input errors"},"sanctions":{"type":"string","enum":["not_listed","unread"],"description":"PC-ERR-WALLET replies only (an address with no code): the US sanctions list (OFAC) read; unread = unknown, not clear"},"usdc_blacklisted":{"type":["boolean","null"],"description":"PC-ERR-WALLET replies only: blocked by Circle, the USDC issuer (null = could not be read)"},"fields":{"type":"object","description":"Flat facts (null = unknown, never safe). Meanings: /llms.txt","properties":{"action":{"type":"string"},"risk":{"type":["string","null"]},"reason":{"type":["string","null"]},"why":{"type":["string","null"],"description":"The reason in plain words (AVOID and CAUTION)"},"coverage":{"type":"string","enum":["complete","partial","incomplete"],"description":"partial = decided, some facts not known yet (see not_yet_known); incomplete = retry, never read it as a pass"},"final_answer":{"type":"boolean","description":"true: act on this answer, a retry will not change it"},"answer_final":{"type":"boolean"},"retry_helps":{"type":"boolean"},"not_yet_known":{"type":"array"},"missing":{"type":["array","null"]},"failed_reads":{"type":"array"},"failed_hosts":{"type":"array"},"data_complete":{"type":"boolean"},"data_completeness":{"type":"number"},"mode":{"type":"string"},"checked_at":{"type":"string"},"recheck_after_s":{"type":"number"},"checked_block":{"type":["number","null"]},"result_valid_until_block":{"type":["number","null"]},"previous_action":{"type":["string","null"]},"changed":{"type":"array"},"alerts":{"type":"array"},"age_hours":{"type":["number","null"]},"can_sell":{"type":["boolean","null"]},"buy_tax_pct":{"type":["number","null"]},"sell_tax_pct":{"type":["number","null"]},"tax_source":{"type":["string","null"]},"tax_mutable":{"type":["boolean","null"]},"sell_test_note":{"type":["string","null"]},"sell_sizes":{"type":["array","null"],"description":"One row per trade size ($1, $10, $100, $1K, $10K): what a sell returns","items":{"type":"object","properties":{"usd":{"type":"number"},"back_usd":{"type":["number","null"]},"return_pct":{"type":["number","null"]},"result":{"type":"string","enum":["ok","hook_blocked","too_big_for_pool","no_liquidity","no_quote"]}}}},"sell_at_size":{"type":["object","null"],"description":"Only when amount_usd is sent (not with quick=1): the same row as sell_sizes for your own trade size, from the exchange quoters. null = no size asked or no quote. It never changes the verdict","properties":{"usd":{"type":"number"},"back_usd":{"type":["number","null"]},"return_pct":{"type":["number","null"]},"result":{"type":"string","enum":["ok","hook_blocked","too_big_for_pool","no_liquidity","no_quote"]}}},"sell_1k_return_pct":{"type":["number","null"]},"exit_depth_usd":{"type":["number","null"]},"price_impact_1k_usd":{"type":["number","null"]},"price_impact_at_size_pct":{"type":["number","null"]},"trade_size_usd":{"type":["number","null"]},"liquidity_usd":{"type":["number","null"]},"liquidity_eth":{"type":["number","null"]},"liquidity_basis":{"type":["string","null"]},"liquidity_listed_usd":{"type":["number","null"]},"reserve_liquidity_usd":{"type":["number","null"]},"liquidity_before_usd":{"type":["number","null"]},"liquidity_before_day":{"type":["string","null"]},"drain_evidence":{"type":["string","null"]},"lock_pct":{"type":["number","null"]},"unlock_at":{"type":["string","null"]},"lp_pullable":{"type":["boolean","null"]},"pool_supply_pct":{"type":["number","null"]},"pool_type":{"type":["string","null"]},"pool_id":{"type":["string","null"],"description":"Address of the pool that pool_type names (a Uniswap v4 pool: its 32-byte pool id); null = no pool found, or a quick=1 check (it does not read pools)"},"all_supply_in_pool":{"type":["boolean","null"]},"volume_24h_usd":{"type":["number","null"]},"top1_pct":{"type":["number","null"]},"top10_pct":{"type":["number","null"]},"top1_type":{"type":["string","null"]},"deployer_pct":{"type":["number","null"]},"insider_pct":{"type":["number","null"]},"owner_renounced":{"type":["boolean","null"]},"can_mint":{"type":["boolean","null"]},"upgradeable":{"type":["boolean","null"]},"verified_source":{"type":["boolean","null"]},"code_traps":{"type":["array","null"]},"blue_chip_revoked":{"type":["string","null"]},"full_check_url":{"type":["string","null"]},"background_finish":{"type":"boolean","description":"true: this answer is incomplete and we are finishing the check in the background; ask again after recheck_after_s"},"sanctioned":{"type":"boolean"},"usdc_blacklisted":{"type":["boolean","null"]},"scam_coins":{"type":"number"}},"additionalProperties":true},"input":{"type":"string"},"type":{"type":"string","enum":["token","url","address"]},"disclaimer":{"type":"string"},"check_id":{"type":"string"},"cached_from":{"type":"string","description":"Only on an answer served from our short cache (the same token asked again within about 45 seconds): the check_id of the first answer. The check_id of this reply is new, so feedback stays traceable."},"action":{"type":"string","enum":["AVOID","CAUTION","VERIFY_MORE","OK"]},"summary":{"type":"object","properties":{"text":{"type":"string","description":"Ready-to-show report (same template as Telegram/MCP/plugins)"}}},"flags":{"type":"array","items":{"type":"string"},"description":"Codes that moved this answer (see /codes)"},"info_flags":{"type":"array","items":{"type":"string"},"description":"Zero-point facts that did not move this answer. The bucket is per answer: a code can be a flag on one coin and an info flag on another"}}}}}},"402":{"description":"Payment Required"},"422":{"description":"Input error (PC-ERR-* in error): not charged"},"503":{"description":"Incomplete (action VERIFY_MORE): retry, not charged; same body shape"}},"x-payment-info":{"price":{"currency":"USD","mode":"fixed","amount":"0.008"},"protocols":[{"x402":{"network":"base-sepolia","payTo":"0x350d2922ad59fadf029fdddec0dac181be91a306","asset":"USDC"}}]}}},"/verify-payment":{"post":{"operationId":"verifyPayment","summary":"Verify an on-chain payment from its tx hash (5 chains; chain auto-detected if omitted)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Aliases accepted: network=chain, amount=expected_amount, to|recipient|payTo=receiver, asset=token, txid|signature|hash=tx_hash, from|sender=expected_from","properties":{"tx_hash":{"type":"string"},"receiver":{"type":"string"},"expected_amount":{"type":"string","description":"Decimal string, human units"},"chain":{"type":"string","enum":["base","ethereum","arbitrum","solana","bitcoin"],"description":"Omit to auto-detect"},"token":{"type":"string","description":"Symbol or contract/mint; default USDC (EVM), SOL, BTC"},"exact":{"type":"boolean"},"not_before":{"type":"string","format":"date-time"},"expected_from":{"type":"string"},"min_confirmations":{"type":"integer","description":"Can raise, not lower, the chain default"}},"required":["tx_hash","expected_amount","receiver"]}}}},"responses":{"200":{"description":"confirmed (verified=true), mismatch or failed (verified=false)","content":{"application/json":{"schema":{"type":"object","properties":{"schema_version":{"type":"integer","enum":[2]},"status":{"type":"string","enum":["confirmed","mismatch","failed","pending","not_found","unknown","invalid_request","unsupported"]},"verified":{"type":["boolean","null"]},"chain":{"type":"string"},"detected_chain":{"type":"boolean"},"paid":{"type":"string"},"paid_raw":{"type":"string"},"expected_raw":{"type":"string"},"amount_match":{"type":"string","enum":["exact","over","short"]},"confirmations":{"type":["integer","null"],"description":"null on Solana once finalized"},"required_confirmations":{"type":["integer","null"]},"finality":{"type":"string","enum":["pending","confirming","confirmed","finalized"]},"block_hash":{"type":["string","null"]},"observed_at":{"type":"string"},"cached":{"type":"boolean"},"cached_at":{"type":"string"},"sanctioned_wallets":{"type":"array","items":{"type":"string"},"description":"Base only: a sender or receiver on the US sanctions list (OFAC)"},"sanctions_unchecked":{"type":"array","items":{"type":"string"},"description":"Could not be read this time: unknown, not clear, retry"},"usdc_blacklisted_wallets":{"type":"array","items":{"type":"string"},"description":"Base USDC only: blocked by Circle, the USDC issuer, so a transfer to or from it fails"},"usdc_blacklist_unchecked":{"type":"array","items":{"type":"string"},"description":"Could not be read this time: unknown, not clear, retry"},"known_scam_wallets":{"type":"array","items":{"type":"string"},"description":"A sender or receiver we recorded deploying coins we proved to be scams"},"tx_status":{"type":"string","enum":["pending","mempool","confirmed","success","failed","reverted"],"description":"The transaction itself, as the chain shows it"},"block":{"type":["integer","null"],"description":"Block number (slot on Solana, height on Bitcoin) the transaction is in"},"token":{"type":"string","description":"The token that was checked (symbol, address or mint)"},"receiver":{"type":"string","description":"The receiver that was checked"},"decimals":{"type":["integer","null"]},"senders":{"type":"array","items":{"type":"string"},"description":"Who sent the token to the receiver in this transaction"},"rbf":{"type":"boolean","description":"Bitcoin only: the transaction can still be replaced (replace-by-fee)"},"retry_after":{"type":"integer","description":"Seconds to wait before asking again (pending, unknown or not_found)"},"note":{"type":"string","description":"Confirmed answers: a short hint for the caller"},"disclaimer":{"type":"string"},"reason_code":{"type":"string","enum":["no_transfer_to_receiver","receiver_mismatch","token_mismatch","short","not_exact","unexpected_sender","older_than_not_before","reverted","tx_failed"]},"error":{"type":"string","description":"invalid_request: all problems; unknown_token = token not in registry for that chain"},"errors":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"error":{"type":"string"}}}},"caveat":{"type":"string"},"asset":{"type":"object","properties":{"canonical":{"type":"boolean","description":"false = not an official token in our registry (possible lookalike)"},"symbol":{"type":["string","null"]},"address":{"type":["string","null"]},"decimals":{"type":["integer","null"]}}}}}}}},"400":{"description":"invalid_request (not charged)"},"402":{"description":"Payment Required"},"404":{"description":"not_found: no chain knows this hash, with Retry-After (not charged)"},"503":{"description":"pending / unknown, with Retry-After (not charged); same body shape as 200, with retry_after"}},"x-payment-info":{"price":{"currency":"USD","mode":"fixed","amount":"0.003"},"protocols":[{"x402":{"network":"base-sepolia","payTo":"0x350d2922ad59fadf029fdddec0dac181be91a306","asset":"USDC"}}]}}}}}