{"openapi":"3.1.0","info":{"title":"ChainWard","version":"1.0.0","description":"Check a Base or BNB Chain address before you pay it: a verdict label pay / hold / unknown with a human text (Pay, Hold, Inactive, No track record, Couldn't check or Payer hidden), the reason, and the evidence. Also sells the datasets behind published decodes. On-chain behavior only.","contact":{"url":"https://chainward.ai","email":"hello@chainward.ai"},"x-guidance":"Start with GET /api/risk/wallet?address=0x... ($0.01): sanctions, wallet age, activity and first funder, with a hold / review / no_flags verdict. Before paying an address: GET /api/risk/x402?address=0x... ($0.05). Before every payment: GET /api/risk/sanctions?address=0x... ($0.01). Add &chain=bsc to the first two for BNB Chain. Before buying a Base token: GET /api/risk/rugcheck?token=0x... ($0.02). Pay with any x402 client in USDC on Base; a call that fails is not charged."},"servers":[{"url":"https://api.chainward.ai"}],"paths":{"/api/risk/x402":{"get":{"operationId":"counterpartyCheck","summary":"Verdict label pay / hold / unknown for a Base or BNB Chain address, with a human text, the reason and the full report, paid per call over x402","description":"Returns a verdict label pay / hold / unknown with a human text (Pay, Hold, Inactive, No track record, Couldn't check or Payer hidden), the reason, and the evidence: a report no older than 24h (a fresh check runs when needed) with every flag, its evidence and source, what was not assessed, and the EAS attestation if one exists. Screens the US Treasury OFAC sanctions list; a listed address always answers Hold. A known reserve or relayer of the px402 privacy pool answers Payer hidden: the real payer can't be screened. A strong label from ChainWard's published investigations or detectors (for example, one of a group of wallets that appear to be run together) answers Hold with the label as the reason (flag known_label); no label is not a clearance. Not charged if the check fails.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","example":"0x4baadba26c3c0bdef9e8faf173925d463aa53bb2"},"description":"Address to check"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","enum":["base","bsc"],"default":"base"},"description":"Chain the address is on. Payment is USDC on Base either way."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Report (status \"ready\") or status \"no_history\"","content":{"application/json":{"example":{"success":true,"data":{"status":"ready","report":{"address":"0x4baadba26c3c0bdef9e8faf173925d463aa53bb2","chain":"base","verdict":{"label":"hold","text":"Hold","reason":"USDC balance held in a dormant wallet: Holds 5451.386272 USDC while classified dormant.","limits":"On-chain behavior only. Absence of flags is not a clearance of the counterparty."},"band":"high-signal","flags":[{"id":"stranded_value","severity":"high","title":"USDC balance held in a dormant wallet","evidence":"Holds 5451.386272 USDC while classified dormant","source":"https://base.blockscout.com/address/0x4baadba26c3c0bdef9e8faf173925d463aa53bb2"}],"not_assessed":["Contract bytecode or source auditing","Social-engineering or off-chain reputation"],"freshness":{"as_of_block":51846337,"generated_at":"2026-09-27T04:07:05.375Z","ttl_state":"fresh"},"attestation":{"uid":"0xda5dc4ca34777d908c3f16fc9eb10a75325d2c83683adb7539c8bc4ade6f6560","explorer_url":"https://base.easscan.org/attestation/view/0xda5dc4ca34777d908c3f16fc9eb10a75325d2c83683adb7539c8bc4ade6f6560"},"disclaimer":"Risk flags from on-chain behavior only. ChainWard cannot see social engineering, off-chain agreements, or intent. Absence of flags is not a guarantee of safety."}}}}}},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"},"503":{"description":"SOURCES_UNAVAILABLE: the on-chain sources the check reads were down, so no report was built; not charged"},"504":{"description":"Check did not finish in time; not charged"}}}},"/api/risk/seller-demand":{"get":{"operationId":"sellerDemandCheck","summary":"Real or self-funded demand for an x402 or agent-marketplace seller, with the money trail behind it, paid per call over x402","description":"For any Base or BNB Chain address that receives payments: samples its recent stablecoin inflows (USDC on Base; USDT and USDC on BNB Chain), walks each top buyer's funding back up to 4 hops, and reports how much traces to the seller itself, how much it pays back, and whether one wallet funds most buyers. On Base, payments a facilitator proxy delivered (Meridian, Fluxa) are traced to their real payer: x402scan's record, confirmed on receipts (proxied_payers). Payers behind exchanges stay opaque. Not charged if the check fails.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","example":"0x68396bd35874695ad86cd29410bd80a550991a2b"},"description":"Address that receives payments (an x402 payTo or a marketplace escrow/agent wallet)"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","enum":["base","bsc"],"default":"base"},"description":"Chain the seller is on. Payment is USDC on Base either way."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.10"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Seller demand report","content":{"application/json":{"example":{"success":true,"data":{"address":"0x68396bd35874695ad86cd29410bd80a550991a2b","window_days":30,"sample":{"inflow_transfers":1000,"buyers":500,"capped":true},"via_intermediary_share":0,"top_buyer_share":0.037,"buyers_checked":30,"seller_funded":{"buyers":30,"volume_share":1,"hops":{"3":30}},"paid_back_share":0,"common_first_funder":{"address":"0x82b551e820efc3503a3a27fc450e07e328daf91c","buyer_share":0.5},"walk_stops":{},"proxied_payers":[],"signals":[{"id":"buyers_funded_by_seller","title":"Most checked buyers' USDC traces back to this address","evidence":"30 of 30 top buyers reach this address within 3 hops of their largest funders (100% of their volume)."},{"id":"common_funder","title":"One wallet funds most checked buyers","evidence":"0x82b551e820efc3503a3a27fc450e07e328daf91c is the largest funder of 50% of the top buyers checked."}],"disclaimer":"Describes where stablecoins moved on this chain, not why. A common funder can be a legitimate faucet, exchange or custodian. Not a safety verdict."}}}}},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"},"504":{"description":"Check did not finish in time; not charged"}}}},"/api/risk/hires":{"get":{"operationId":"hireCheck","summary":"Hired by others or by its own circle: an ERC-8004 agent's hirers under Set and Earn's rule, BNB Chain, paid per call over x402","description":"For an ERC-8004 agent on BNB Chain (an agent id, or an owner address for all its agents): every wallet that hired it in the last 30 days through the TermiX escrow or the shared ERC-8183 contract, each with a verdict (owner, owner_funded, shared_funder, inconclusive, independent_within_limits), the evidence and the funding path. Follows each wallet's first incoming BNB and first incoming stablecoin up to 4 hops. independent_within_limits means no link found within those limits, not proven independence. Not charged if the check fails.","parameters":[{"name":"agent","in":"query","required":true,"schema":{"type":"string","pattern":"^(\\d{1,12}|0x[a-fA-F0-9]{40})$","example":"332962"},"description":"ERC-8004 agent id on BNB Chain, or the 0x address that owns the agent(s)"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","enum":["bsc"],"default":"bsc"},"description":"BNB Chain only for now. Payment is USDC on Base."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.10"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Hire check report","content":{"application/json":{"example":{"success":true,"data":{"chain":"bsc","agent_id":332962,"agent_ids":[332962],"owner":"0x15d08640aeefbdce11930d9c9a30884011f654f6","agent_wallet":"0x15d08640aeefbdce11930d9c9a30884011f654f6","window_days":30,"hires":{"total":3,"distinct_hirers":2,"by_source":{"termix_escrow":3,"erc8183_shared":0}},"hirers":[{"address":"0x4e276b4db12447254134b45e5add170993df5ad2","hires":1,"first_hire_at":"2026-10-01T07:42:05.000Z","verdict":"inconclusive","evidence":"The hirer's first-incoming-BNB trail stops at 0x8894e0a0c962cb723c1976a4421c95949be2d4e3, a hub (exchange-style wallet, router or custodian), after 2 hops; funding behind it is not visible.","path":["0x4e276b4db12447254134b45e5add170993df5ad2","0x1d21aa41a77737e593b8ca92d6bf6437fa81697f","0x8894e0a0c962cb723c1976a4421c95949be2d4e3"]},{"address":"0x99f88c4cae19f858052236f808b75967eece5bd0","hires":2,"first_hire_at":"2026-10-03T07:19:06.000Z","verdict":"shared_funder","evidence":"The hirer's and the owner wallet's funding trails meet at 0x0fe05614b2d344fb0ef9797431890d4c13c0f0f1, which is not a hub or a contract (hirer: 1 hop up its first-incoming-stablecoin trail; owner wallet: 1 hop up its first-incoming-stablecoin trail).","path":["0x99f88c4cae19f858052236f808b75967eece5bd0","0x0fe05614b2d344fb0ef9797431890d4c13c0f0f1","0x15d08640aeefbdce11930d9c9a30884011f654f6"]}],"summary":{"owner_linked":1,"inconclusive":1,"independent_within_limits":0,"passes_three_independent":false},"method":"Hires are TermiX escrow OrderCreated events naming the agent as provider and shared ERC-8183 JobCreated events naming the owner or agent wallet as provider, on BNB Chain, in a 30-day hire window that starts no earlier than Set and Earn's first block. For each distinct hirer the check follows its first incoming BNB and first incoming stablecoin (USDT, USDC) back to their senders, up to 4 hops, and does the same for the owner and the agent wallet. owner: the hirer is the owner or the agent wallet. owner_funded: the owner or agent wallet is in the hirer's trail. direct_transfer: the hirer and the owner or agent wallet sent each other BNB or a stablecoin at any time, in either direction. shared_funder: the hirer's trail and the owner's (or agent wallet's) trail meet at a wallet that is not a hub or a contract, or the hirer is in the owner's trail. Trails stop at hubs (1,000+ incoming stablecoin transfers of at least $0.01 in 30 days, or 100,000+ sent transactions) and at contracts. inconclusive: the hirer's and the owner's (or agent wallet's) same-kind trails end at the same hub with first funding under 24 hours apart, or no incoming BNB or stablecoin is visible. independent_within_limits: none of these, including trails that end at a hub or a contract (the decode's \"no link found\").","limits":["independent_within_limits means no link was found within these limits; it is not proven independence.","Only each wallet's first incoming BNB and first incoming stablecoin are followed, up to 4 hops. Later funding, and transfers between hirer and owner after that, are not checked.","BNB moved by contract-internal calls is not visible to the trail (top-level transfers only).","Trails stop at hubs and contracts and count as no link found: who funded a wallet through an exchange is not visible, so an owner who withdrew from their own exchange account to a hirer is not detected.","Pairwise only: wallets that hire each other inside a closed group can each look unlinked pair by pair (chainward.ai/decodes/set-and-earn-week-one).","Counts hire events (OrderCreated, JobCreated), not completed hires, and does not check which marketplace a hire came from. Hires on other contracts or on BSC testnet are not counted.","Owner and agent wallet are read at the as_of block. For an owner address, its agents are the registry tokens transferred to it in the last 60 days that it still owns.","At most 20 hirers are traced per check, in order of first hire.","Describes where money moved, not who controls a wallet or why. Not a verdict on the agent or its builder."],"as_of":{"block":125969567,"time":"2026-10-06T01:09:22.000Z"}}}}}},"400":{"description":"Bad agent or chain (chain=base is not supported yet); not charged"},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"},"404":{"description":"No ERC-8004 agent with that id on BNB Chain; not charged"},"504":{"description":"Check did not finish in time; not charged"}}}},"/api/risk/sanctions":{"get":{"operationId":"sanctionsScreen","summary":"Is this address on the OFAC SDN list? One cent, before every payment","description":"Screens one address against the US Treasury OFAC SDN list of digital currency addresses (EVM, the same on every chain). sanctioned answers Hold; anything else answers Not listed, which is not a clearance: wallets linked to a listed party and addresses added after the snapshot date are not covered. Answers at once from a bundled list; the snapshot date is in the response.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","example":"0x4baadba26c3c0bdef9e8faf173925d463aa53bb2"},"description":"EVM address to screen"}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Sanctions screen","content":{"application/json":{"example":{"success":true,"data":{"address":"0x4baadba26c3c0bdef9e8faf173925d463aa53bb2","sanctioned":false,"verdict":{"label":"not_listed","text":"Not listed","reason":"This exact address is not among the 124 EVM addresses OFAC has published."},"list":{"name":"US Treasury OFAC SDN list, digital currency addresses (EVM)","source":"https://github.com/0xB10C/ofac-sanctioned-digital-currency-addresses","fetched_at":"2026-10-11","addresses":124},"limit":"Not listed is not a clearance: wallets that belong to or deal with a listed party, and addresses added after the snapshot date, are not covered. For behavior (activity, counterparties, flags) use the counterparty check.","full_check":"https://api.chainward.ai/api/risk/x402?address=0x4baadba26c3c0bdef9e8faf173925d463aa53bb2"}}}}},"400":{"description":"Malformed address; not charged"},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"}}}},"/api/risk/wallet":{"get":{"operationId":"walletLookup","summary":"Fast wallet lookup: sanctions, age, activity and first funder, with a hold / review / no_flags verdict","description":"One address on Base or BNB Chain: is it on the OFAC SDN list, when it was first seen, when it last sent, its native and USDC balances, and the wallet that first funded it (sanctioned, an exchange or hub, or a funder of many wallets). hold if it or its first funder is sanctioned, or if on Base it looks like an address-poisoning decoy (never used, every recent token transfer a fake, its first and last characters matching an address a wallet in those fakes really paid); review if it is new, has no history, shares a funder with many wallets, pays through the px402 privacy pool (flag privacy_relay: the real payer is hidden), or carries a strong label from published ChainWard investigations or detectors (flag labeled; every public label is listed in labels); no_flags otherwise, which is not a clearance. Also free with an API key at GET /v1/wallet/{address}.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","example":"0x4baadba26c3c0bdef9e8faf173925d463aa53bb2"},"description":"Address to look up"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","enum":["base","bsc"],"default":"base"},"description":"Chain the address is on. Payment is USDC on Base either way."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Wallet lookup","content":{"application/json":{"example":{"success":true,"data":{"address":"0x4baadba26c3c0bdef9e8faf173925d463aa53bb2","chain":"base","verdict":{"label":"no_flags","reason":"None of the checks matched: sanctions, age, history and first funder."},"sanctioned":false,"type":"wallet","first_seen":"2025-02-04T12:26:09.000Z","age_days":616,"last_active":"2026-01-30T15:58:27.000Z","sent_txs":87,"balances":{"native":0.01916580034492214,"usdc":5451.386272},"first_funder":{"address":"0x0dff09a6733a12366236e62111a4ce93c475db78","tx":"0xaf801c6252bb681fc6654b763a1d530cc3828c918dd34774e64a8a33d53e20f3","sanctioned":false,"exchange_or_hub":true,"funded_wallets":null},"labels":[],"flags":[],"as_of_block":52553137,"limits":"On-chain facts only. A shared funder is not proof of one owner, and exchanges and other hubs hide who funded a wallet. no_flags means none of these checks matched; it is not a clearance."}}}}},"400":{"description":"Malformed address or unsupported chain; not charged"},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"}}}},"/api/risk/rugcheck":{"get":{"operationId":"tokenRugCheck","summary":"Rug check for a Base token: who launched it and what the launch wallet and the supply did after, with a hold / review / no_flags verdict","description":"For an ERC-20 token on Base: the launch block and transaction and the wallet that launched it: the sender, the smart wallet behind an ERC-4337 bundle, or for a Virtuals agent token the prototype's creator (a buyer's purchase graduates it). Clanker's factory and Virtuals' bonding curve are named when their contracts confirm the token. Then the launch wallet: OFAC sanctions, its age at launch, its first funder, the share of supply it holds, whether it had sent out 90% or more of the tokens it received at launch (within the hour, or later, read from its balance now), and how many tokens it launched through Clanker, Doppler and Zora in the busiest 24 hours that include this launch, read through to the time of the check (creator.launches_24h). When the launch receipt names one other wallet the launch was made for (Clanker's token_admin, Zora's payout recipient, or the one wallet a Doppler token vests to), the wallet checks run on that wallet: launch.made_for names it and creator.role says which wallet the facts describe. And the supply: mints after the first issuance, and how many went to the launch wallet. hold if the launch wallet or its first funder is sanctioned, mints after launch gave it 1% or more of today's supply, or it took back most of the liquidity it added (creator_removed_liquidity); review for other mints after launch, a fast send-out, a large holding, a serial launcher (5 or more launches through Clanker, Doppler or Zora in 24 hours), a launch wallet with a strong label from ChainWard's published investigations or detectors (creator_labeled; its labels are listed in creator.labels), a new launch wallet, a shared funder (a first funder whose recent recipients were mostly brand-new wallets) or a launch it could not trace; no_flags otherwise, which is not a clearance. An address that is not a token answers 400 NOT_A_TOKEN and is never charged: an empty address, or a contract without totalSupply(), is refused before the 402, and an NFT collection once the check has read it. A token whose name or symbol passes for USDC, USDT or another well-known token through look-alike or hidden characters answers hold (imitates_known_token), even when it is not a full ERC-20. Every answer carries checked_at, cached and age_seconds: when it was read, whether it came from the cache, and its age in seconds. It also reads whether the launch wallet removed the liquidity it added to the token's Uniswap v2 or Aerodrome pool, and supply still vesting to it from a Doppler launch, which counts in its share. Not a honeypot or sell simulation, and not a holder-concentration check. The launch wallet can be a bot or launch service acting for someone else. Not charged if the check fails.","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","example":"0x5f13d8f3bd2a9bd439d6ec9734ac1b4fb32b3b07"},"description":"Token contract on Base (?address= works too)"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","enum":["base"],"default":"base"},"description":"Base only for now. Payment is USDC on Base."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Token check","content":{"application/json":{"example":{"success":true,"data":{"token":"0x5f13d8f3bd2a9bd439d6ec9734ac1b4fb32b3b07","chain":"base","verdict":{"label":"review","reason":"The wallet that launched it received 6,416,006,425.89 tokens in the launch transaction and had sent out 100% of them 26 seconds later."},"token_info":{"name":"Clanker hook","symbol":"HOOK","decimals":18,"total_supply":100000000000},"launch":{"block":41628163,"time":"2026-02-02T15:21:13.000Z","tx":"0x2f7eae9f2bba106190fa1c3ff6e6726ad8f49281eb967e12f180c76529dc5a03","creator":"0xdbd1c0e6c6252492bd5b99da162558de7f08d68b","via":"0xe85a59c628f7d27878aceb4bf3b35733630083a9","launcher":"clanker","launcher_note":"Launched through Clanker's current factory, which deploys every token from one verified template with no owner mint, pause, blacklist or transfer tax.","token_admin":"0xdbd1c0e6c6252492bd5b99da162558de7f08d68b","made_for":null},"creator":{"address":"0xdbd1c0e6c6252492bd5b99da162558de7f08d68b","role":"launch_wallet","type":"wallet","sanctioned":false,"first_seen":"2026-02-02T14:39:03.000Z","age_days_at_launch":0,"sent_txs":8,"week_before_launch":{"block":52538275,"sent_txs":0,"has_code":false},"first_funder":{"address":"0xb0818aebe3afd4fbc5dccde0b5a370140b1380a7","tx":"0x2353f506566e79dc6dd4c35fbebe065373d78c7a5010f48f5dcd76d6e2a476dd","sanctioned":false,"exchange_or_hub":true,"busy":true,"funded_wallets":null,"recent_recipients":null},"holds_pct":0,"vesting":null,"holds_with_vesting_pct":0,"extensions_pct":0,"launch_tokens":{"received":6416006425.8854265,"sent_pct":100,"first_send_after_sec":26,"sent_90pct_after_sec":26,"held_at_launch":6416006425.8854265,"held_1h":0,"held_1h_after_sec":3600,"sent_1h_pct":100,"held_now":0,"held_now_after_sec":86400,"sent_now_pct":100},"clanker_launches_24h":1,"launches_24h":{"total":1,"by_launchpad":{"clanker":1,"doppler":0,"zora":0,"virtuals":0,"other":0},"span_sec":0,"read_to":"2026-10-20T16:42:07.000Z","capped":false}},"supply":{"mints_after_launch":0,"minted_after_launch":null,"to_creator":0,"minted_to_creator":null,"capped":false,"extensions":[]},"liquidity":{"locked_by":"clanker","pools":null,"capped":false},"flags":["creator_sent_launch_tokens","new_creator"],"as_of_block":52840675,"limits":"On-chain facts about the launch, the supply and the wallet that sent the launch transaction, which can be a bot, relayer or smart wallet acting for someone else; in a bundle of several smart wallets' operations, it is the one whose operation the token's first log came in. Tokens the launch wallet received at launch and sent out are not traced further: they may have been sold, moved or locked. What it sent out is read from its balance at the end of the launch block and about an hour later, and from its first 100 transfers. Its age is its own activity, its transactions and code a week before the launch, where that was read, and otherwise its first transfer in; its first funder is the first wallet that sent it ETH or a listed token above a dust floor, not an airdrop of another token. Its share of the supply is its balance plus, for a Doppler launch, the tokens still vesting to it (Doppler's vesting data for it, from up to 3 schedules); for a Clanker launch, the supply in Clanker's vault and airdrop contracts is reported apart and not counted in it. Liquidity: Clanker, Zora, Doppler and Virtuals hold the liquidity of their launches, so those pools are not read. For any other token, the check reads the Uniswap v2 and Aerodrome basic pools created since the launch (the first 10) and what the launch wallet put in and took out of each, through LP tokens minted to it and LP tokens it sent back to the pool; LP tokens it passed to another wallet or a locker are not followed, and Uniswap v3 and v4 pools, Aerodrome concentrated pools and other exchanges are not read. It does not check whether liquidity is locked or how much a pool holds today, does not simulate a sale (a honeypot check), and does not measure holder concentration. Mints are read from their first 100 records. For a Clanker launch, the launches of the launch wallet are the transactions it sent straight to the Clanker factory in the 24 hours up to and including this one (the newest 1,000); launches through another contract, and launches made for another admin, are not counted. no_flags means none of these checks matched; it is not a clearance.","checked_at":"2026-10-20T16:42:07.000Z","cached":false,"age_seconds":0}}}}},"400":{"description":"Malformed address, a chain other than Base, or NOT_A_TOKEN: the address is not a token (error.details.flag is not_a_contract or not_a_token); not charged"},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"},"503":{"description":"SOURCES_UNAVAILABLE: the chain data source did not answer; not charged. Retry-After says when to ask again","headers":{"Retry-After":{"description":"Seconds to wait before asking again","schema":{"type":"integer"}}}},"504":{"description":"CHECK_TIMEOUT: the check did not finish in time; not charged. It keeps running and caches its answer; Retry-After says when to ask again","headers":{"Retry-After":{"description":"Seconds to wait before asking again","schema":{"type":"integer"}}}}}}},"/api/paid/termix-wallets/file":{"get":{"operationId":"datasetFile_termix_wallets","summary":"TermiX escrow: every wallet that settled a job through Sep 29, tiered, as CSV, paid over x402","description":"Every wallet in a published ChainWard audit, tiered, with the transactions behind each one. GET /api/paid lists what is available; GET /api/paid/{slug}/lookup/{address} says for free whether one wallet is listed and in which tier. Not charged if the file does not exist.","parameters":[],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"10"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"The dataset","content":{"text/csv":{}}},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"},"404":{"description":"No dataset with that slug; not charged"}}}},"/api/paid/termix-wallets/check":{"get":{"operationId":"datasetCheck_termix_wallets","summary":"Is one wallet in \"TermiX escrow: every wallet that settled a job through Sep 29, tiered\", and at what tier, paid per call over x402","description":"Listed or Not listed for one address against the dataset named by the slug, with the tier and the row's own fields as the reason and the dataset's window as the limit. The free web lookup only says listed and tier; this returns the row's own fields. Not charged if the address is malformed or the dataset does not exist.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","example":"0x00048bfe5972a462c5ca6adc2e373f2b49c4874d"},"description":"Wallet to look up"}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"listed or not_listed, with the reason, the limit and every matching row","content":{"application/json":{"example":{"success":true,"data":{"verdict":"listed","reason":"A1 (base) in TermiX escrow: every wallet that settled a job through Sep 29, tiered","limit":"TermiX escrow: every wallet that settled a job through Sep 29, tiered covers only its own window (built 2026-10-03); not listed means not seen there, nothing more.","slug":"termix-wallets","address":"0x00048bfe5972a462c5ca6adc2e373f2b49c4874d","dataset":"TermiX escrow: every wallet that settled a job through Sep 29, tiered","as_of":"2026-10-03","matches":[{"chain":"base","tier":"A1","fields":{"cluster":"B0004","first_seen":"2026-08-10","fees_paid_usd":93,"jobs_as_buyer":103,"jobs_as_seller":104,"exchange_withdrawal_burst":null}}],"full_dataset":"https://api.chainward.ai/api/paid/termix-wallets/file"}}}}},"400":{"description":"Malformed address; not charged"},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"},"404":{"description":"No dataset with that slug; not charged"}}}},"/api/paid/set-and-earn-week-one/file":{"get":{"operationId":"datasetFile_set_and_earn_week_one","summary":"Set and Earn week one: every wallet that hired an agent, Oct 1 to 8, with tier and groups, as CSV, paid over x402","description":"Every wallet in a published ChainWard audit, tiered, with the transactions behind each one. GET /api/paid lists what is available; GET /api/paid/{slug}/lookup/{address} says for free whether one wallet is listed and in which tier. Not charged if the file does not exist.","parameters":[],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"10"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"The dataset","content":{"text/csv":{}}},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"},"404":{"description":"No dataset with that slug; not charged"}}}},"/api/paid/set-and-earn-week-one/check":{"get":{"operationId":"datasetCheck_set_and_earn_week_one","summary":"Is one wallet in \"Set and Earn week one: every wallet that hired an agent, Oct 1 to 8, with tier and groups\", and at what tier, paid per call over x402","description":"Listed or Not listed for one address against the dataset named by the slug, with the tier and the row's own fields as the reason and the dataset's window as the limit. The free web lookup only says listed and tier; this returns the row's own fields. Not charged if the address is malformed or the dataset does not exist.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","example":"0x03a92db75947be1653c069d252f3d36a990bb61c"},"description":"Wallet to look up"}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"listed or not_listed, with the reason, the limit and every matching row","content":{"application/json":{"example":{"success":true,"data":{"verdict":"listed","reason":"A1 (base) in TermiX escrow: every wallet that settled a job through Sep 29, tiered","limit":"TermiX escrow: every wallet that settled a job through Sep 29, tiered covers only its own window (built 2026-10-03); not listed means not seen there, nothing more.","slug":"termix-wallets","address":"0x00048bfe5972a462c5ca6adc2e373f2b49c4874d","dataset":"TermiX escrow: every wallet that settled a job through Sep 29, tiered","as_of":"2026-10-03","matches":[{"chain":"base","tier":"A1","fields":{"cluster":"B0004","first_seen":"2026-08-10","fees_paid_usd":93,"jobs_as_buyer":103,"jobs_as_seller":104,"exchange_withdrawal_burst":null}}],"full_dataset":"https://api.chainward.ai/api/paid/termix-wallets/file"}}}}},"400":{"description":"Malformed address; not charged"},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"},"404":{"description":"No dataset with that slug; not charged"}}}},"/api/risk/counterparty":{"get":{"operationId":"counterpartyCheckByName","summary":"Verdict label pay / hold / unknown for a Base or BNB Chain address, with a human text, the reason and the full report, paid per call over x402","description":"The same check as GET /api/risk/x402, under its plain name. Returns a verdict label pay / hold / unknown with a human text (Pay, Hold, Inactive, No track record, Couldn't check or Payer hidden), the reason, and the evidence: a report no older than 24h (a fresh check runs when needed) with every flag, its evidence and source, what was not assessed, and the EAS attestation if one exists. Screens the US Treasury OFAC sanctions list; a listed address always answers Hold. A known reserve or relayer of the px402 privacy pool answers Payer hidden: the real payer can't be screened. A strong label from ChainWard's published investigations or detectors (for example, one of a group of wallets that appear to be run together) answers Hold with the label as the reason (flag known_label); no label is not a clearance. Not charged if the check fails.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","example":"0x4baadba26c3c0bdef9e8faf173925d463aa53bb2"},"description":"Address to check"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","enum":["base","bsc"],"default":"base"},"description":"Chain the address is on. Payment is USDC on Base either way."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.05"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Report (status \"ready\") or status \"no_history\"","content":{"application/json":{"example":{"success":true,"data":{"status":"ready","report":{"address":"0x4baadba26c3c0bdef9e8faf173925d463aa53bb2","chain":"base","verdict":{"label":"hold","text":"Hold","reason":"USDC balance held in a dormant wallet: Holds 5451.386272 USDC while classified dormant.","limits":"On-chain behavior only. Absence of flags is not a clearance of the counterparty."},"band":"high-signal","flags":[{"id":"stranded_value","severity":"high","title":"USDC balance held in a dormant wallet","evidence":"Holds 5451.386272 USDC while classified dormant","source":"https://base.blockscout.com/address/0x4baadba26c3c0bdef9e8faf173925d463aa53bb2"}],"not_assessed":["Contract bytecode or source auditing","Social-engineering or off-chain reputation"],"freshness":{"as_of_block":51846337,"generated_at":"2026-09-27T04:07:05.375Z","ttl_state":"fresh"},"attestation":{"uid":"0xda5dc4ca34777d908c3f16fc9eb10a75325d2c83683adb7539c8bc4ade6f6560","explorer_url":"https://base.easscan.org/attestation/view/0xda5dc4ca34777d908c3f16fc9eb10a75325d2c83683adb7539c8bc4ade6f6560"},"disclaimer":"Risk flags from on-chain behavior only. ChainWard cannot see social engineering, off-chain agreements, or intent. Absence of flags is not a guarantee of safety."}}}}}},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"},"503":{"description":"SOURCES_UNAVAILABLE: the on-chain sources the check reads were down, so no report was built; not charged"},"504":{"description":"Check did not finish in time; not charged"}}}},"/api/risk/ofac":{"get":{"operationId":"ofacScreen","summary":"Is this address on the OFAC SDN list? One cent, before every payment","description":"The same screen as GET /api/risk/sanctions, under its plain name. Screens one address against the US Treasury OFAC SDN list of digital currency addresses (EVM, the same on every chain). sanctioned answers Hold; anything else answers Not listed, which is not a clearance: wallets linked to a listed party and addresses added after the snapshot date are not covered. Answers at once from a bundled list; the snapshot date is in the response.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","example":"0x4baadba26c3c0bdef9e8faf173925d463aa53bb2"},"description":"EVM address to screen"}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.01"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Sanctions screen","content":{"application/json":{"example":{"success":true,"data":{"address":"0x4baadba26c3c0bdef9e8faf173925d463aa53bb2","sanctioned":false,"verdict":{"label":"not_listed","text":"Not listed","reason":"This exact address is not among the 124 EVM addresses OFAC has published."},"list":{"name":"US Treasury OFAC SDN list, digital currency addresses (EVM)","source":"https://github.com/0xB10C/ofac-sanctioned-digital-currency-addresses","fetched_at":"2026-10-11","addresses":124},"limit":"Not listed is not a clearance: wallets that belong to or deal with a listed party, and addresses added after the snapshot date, are not covered. For behavior (activity, counterparties, flags) use the counterparty check.","full_check":"https://api.chainward.ai/api/risk/x402?address=0x4baadba26c3c0bdef9e8faf173925d463aa53bb2"}}}}},"400":{"description":"Malformed address; not charged"},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"}}}},"/api/risk/token":{"get":{"operationId":"tokenCheckByName","summary":"Rug check for a Base token: who launched it and what the launch wallet and the supply did after, with a hold / review / no_flags verdict","description":"The same check as GET /api/risk/rugcheck, under its plain name. For an ERC-20 token on Base: the launch block and transaction and the wallet that launched it: the sender, the smart wallet behind an ERC-4337 bundle, or for a Virtuals agent token the prototype's creator (a buyer's purchase graduates it). Clanker's factory and Virtuals' bonding curve are named when their contracts confirm the token. Then the launch wallet: OFAC sanctions, its age at launch, its first funder, the share of supply it holds, whether it had sent out 90% or more of the tokens it received at launch (within the hour, or later, read from its balance now), and how many tokens it launched through Clanker, Doppler and Zora in the busiest 24 hours that include this launch, read through to the time of the check (creator.launches_24h). When the launch receipt names one other wallet the launch was made for (Clanker's token_admin, Zora's payout recipient, or the one wallet a Doppler token vests to), the wallet checks run on that wallet: launch.made_for names it and creator.role says which wallet the facts describe. And the supply: mints after the first issuance, and how many went to the launch wallet. hold if the launch wallet or its first funder is sanctioned, mints after launch gave it 1% or more of today's supply, or it took back most of the liquidity it added (creator_removed_liquidity); review for other mints after launch, a fast send-out, a large holding, a serial launcher (5 or more launches through Clanker, Doppler or Zora in 24 hours), a launch wallet with a strong label from ChainWard's published investigations or detectors (creator_labeled; its labels are listed in creator.labels), a new launch wallet, a shared funder (a first funder whose recent recipients were mostly brand-new wallets) or a launch it could not trace; no_flags otherwise, which is not a clearance. An address that is not a token answers 400 NOT_A_TOKEN and is never charged: an empty address, or a contract without totalSupply(), is refused before the 402, and an NFT collection once the check has read it. A token whose name or symbol passes for USDC, USDT or another well-known token through look-alike or hidden characters answers hold (imitates_known_token), even when it is not a full ERC-20. Every answer carries checked_at, cached and age_seconds: when it was read, whether it came from the cache, and its age in seconds. It also reads whether the launch wallet removed the liquidity it added to the token's Uniswap v2 or Aerodrome pool, and supply still vesting to it from a Doppler launch, which counts in its share. Not a honeypot or sell simulation, and not a holder-concentration check. The launch wallet can be a bot or launch service acting for someone else. Not charged if the check fails.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$","example":"0x5f13d8f3bd2a9bd439d6ec9734ac1b4fb32b3b07"},"description":"Token contract on Base (?token= works too)"},{"name":"chain","in":"query","required":false,"schema":{"type":"string","enum":["base"],"default":"base"},"description":"Base only for now. Payment is USDC on Base."}],"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.02"},"protocols":[{"x402":{}}]},"responses":{"200":{"description":"Token check","content":{"application/json":{"example":{"success":true,"data":{"token":"0x5f13d8f3bd2a9bd439d6ec9734ac1b4fb32b3b07","chain":"base","verdict":{"label":"review","reason":"The wallet that launched it received 6,416,006,425.89 tokens in the launch transaction and had sent out 100% of them 26 seconds later."},"token_info":{"name":"Clanker hook","symbol":"HOOK","decimals":18,"total_supply":100000000000},"launch":{"block":41628163,"time":"2026-02-02T15:21:13.000Z","tx":"0x2f7eae9f2bba106190fa1c3ff6e6726ad8f49281eb967e12f180c76529dc5a03","creator":"0xdbd1c0e6c6252492bd5b99da162558de7f08d68b","via":"0xe85a59c628f7d27878aceb4bf3b35733630083a9","launcher":"clanker","launcher_note":"Launched through Clanker's current factory, which deploys every token from one verified template with no owner mint, pause, blacklist or transfer tax.","token_admin":"0xdbd1c0e6c6252492bd5b99da162558de7f08d68b","made_for":null},"creator":{"address":"0xdbd1c0e6c6252492bd5b99da162558de7f08d68b","role":"launch_wallet","type":"wallet","sanctioned":false,"first_seen":"2026-02-02T14:39:03.000Z","age_days_at_launch":0,"sent_txs":8,"week_before_launch":{"block":52538275,"sent_txs":0,"has_code":false},"first_funder":{"address":"0xb0818aebe3afd4fbc5dccde0b5a370140b1380a7","tx":"0x2353f506566e79dc6dd4c35fbebe065373d78c7a5010f48f5dcd76d6e2a476dd","sanctioned":false,"exchange_or_hub":true,"busy":true,"funded_wallets":null,"recent_recipients":null},"holds_pct":0,"vesting":null,"holds_with_vesting_pct":0,"extensions_pct":0,"launch_tokens":{"received":6416006425.8854265,"sent_pct":100,"first_send_after_sec":26,"sent_90pct_after_sec":26,"held_at_launch":6416006425.8854265,"held_1h":0,"held_1h_after_sec":3600,"sent_1h_pct":100,"held_now":0,"held_now_after_sec":86400,"sent_now_pct":100},"clanker_launches_24h":1,"launches_24h":{"total":1,"by_launchpad":{"clanker":1,"doppler":0,"zora":0,"virtuals":0,"other":0},"span_sec":0,"read_to":"2026-10-20T16:42:07.000Z","capped":false}},"supply":{"mints_after_launch":0,"minted_after_launch":null,"to_creator":0,"minted_to_creator":null,"capped":false,"extensions":[]},"liquidity":{"locked_by":"clanker","pools":null,"capped":false},"flags":["creator_sent_launch_tokens","new_creator"],"as_of_block":52840675,"limits":"On-chain facts about the launch, the supply and the wallet that sent the launch transaction, which can be a bot, relayer or smart wallet acting for someone else; in a bundle of several smart wallets' operations, it is the one whose operation the token's first log came in. Tokens the launch wallet received at launch and sent out are not traced further: they may have been sold, moved or locked. What it sent out is read from its balance at the end of the launch block and about an hour later, and from its first 100 transfers. Its age is its own activity, its transactions and code a week before the launch, where that was read, and otherwise its first transfer in; its first funder is the first wallet that sent it ETH or a listed token above a dust floor, not an airdrop of another token. Its share of the supply is its balance plus, for a Doppler launch, the tokens still vesting to it (Doppler's vesting data for it, from up to 3 schedules); for a Clanker launch, the supply in Clanker's vault and airdrop contracts is reported apart and not counted in it. Liquidity: Clanker, Zora, Doppler and Virtuals hold the liquidity of their launches, so those pools are not read. For any other token, the check reads the Uniswap v2 and Aerodrome basic pools created since the launch (the first 10) and what the launch wallet put in and took out of each, through LP tokens minted to it and LP tokens it sent back to the pool; LP tokens it passed to another wallet or a locker are not followed, and Uniswap v3 and v4 pools, Aerodrome concentrated pools and other exchanges are not read. It does not check whether liquidity is locked or how much a pool holds today, does not simulate a sale (a honeypot check), and does not measure holder concentration. Mints are read from their first 100 records. For a Clanker launch, the launches of the launch wallet are the transactions it sent straight to the Clanker factory in the 24 hours up to and including this one (the newest 1,000); launches through another contract, and launches made for another admin, are not counted. no_flags means none of these checks matched; it is not a clearance.","checked_at":"2026-10-20T16:42:07.000Z","cached":false,"age_seconds":0}}}}},"400":{"description":"Malformed address, a chain other than Base, or NOT_A_TOKEN: the address is not a token (error.details.flag is not_a_contract or not_a_token); not charged"},"402":{"description":"Payment required: x402 v2 challenge in the PAYMENT-REQUIRED header"},"503":{"description":"SOURCES_UNAVAILABLE: the chain data source did not answer; not charged. Retry-After says when to ask again","headers":{"Retry-After":{"description":"Seconds to wait before asking again","schema":{"type":"integer"}}}},"504":{"description":"CHECK_TIMEOUT: the check did not finish in time; not charged. It keeps running and caches its answer; Retry-After says when to ask again","headers":{"Retry-After":{"description":"Seconds to wait before asking again","schema":{"type":"integer"}}}}}}}}}