{"openapi":"3.1.0","info":{"title":"ChainWard","version":"1.0.0","description":"On-chain risk reports for Base and BNB Chain addresses: check a counterparty before you pay it. Also sells the datasets behind published decodes. Never a safety verdict.","contact":{"url":"https://chainward.ai"}},"servers":[{"url":"https://api.chainward.ai"}],"paths":{"/api/risk/x402":{"get":{"operationId":"counterpartyCheck","summary":"Pay, Hold or Unknown for a Base or BNB Chain address, with the reason and the full report, paid per call over x402","description":"Returns a report no older than 24h, running a fresh check when needed: neutral signal band, every flag with its evidence and source, what was not assessed, and the EAS attestation if one exists. Not charged if the check fails.","parameters":[{"name":"address","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"},"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","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}$"},"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/paid/{slug}/file":{"get":{"operationId":"datasetFile","summary":"The full dataset behind a published decode, 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} checks one wallet for free. Not charged if the file does not exist.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,59}$","example":"termix-wallets"},"description":"Dataset slug from GET /api/paid"}],"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"}}}}}}