{"url":"https://paycheck.hectichustle.workers.dev/docs.json","canonical_html":"https://paycheck.hectichustle.workers.dev/docs","title":"Developer docs","updated":null,"license":null,"data":{"description":"Routes, prices, and request shapes for Kertivo, generated from the OpenAPI document.","source":"/openapi.json","openapiVersion":"1.0.0","forAgents":[{"path":"/machine.json","url":"https://paycheck.hectichustle.workers.dev/machine.json","note":"JSON twin of every human page."},{"path":"/llms.txt","url":"https://paycheck.hectichustle.workers.dev/llms.txt","note":"Plain-text guide. The route index at the bottom is generated from OpenAPI."},{"path":"/openapi.json","url":"https://paycheck.hectichustle.workers.dev/openapi.json","note":"The document this page is rendered from."}],"groups":[{"id":"check","title":"Check","blurb":"Did a Base USDC payment settle, and did the recipient and amount match?","operations":[{"id":"post-check","method":"POST","path":"/check","summary":"Check a Base USDC payment (paid, $0.01)","price":"$0.01","network":"eip155:8453","getVariant":"GET /check?txHash=&expectedPayTo=&expectedAmount=&selfAddresses=a,b (or ?from=&nonce=&validBefore= for an EIP-3009 authorization) with the x402 payment header: same price, same result as POST. Unpaid GET returns the same 402.","parameters":[],"requestNote":"Provide txHash, or authorization (EIP-3009) when you have no tx hash, or both.","requestExample":"{\n  \"txHash\": \"0xabababababababababababababababababababababababababababababababab\",\n  \"expectedPayTo\": \"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd\",\n  \"expectedAmount\": \"0.01\",\n  \"minAmount\": \"0.01\",\n  \"expectedPayer\": \"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd\",\n  \"authorization\": {\n    \"from\": \"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd\",\n    \"nonce\": \"0xabababababababababababababababababababababababababababababababab\",\n    \"validBefore\": 1893456000,\n    \"validAfter\": 1893456000\n  }\n}","responses":[{"status":"200","description":"Check result"},{"status":"400","description":"Bad input"},{"status":"402","description":"Payment required (x402 PAYMENT-REQUIRED header)"},{"status":"502","description":"Upstream RPC failure"}]},{"id":"post-check-deep","method":"POST","path":"/check/deep","summary":"Did this payment settle, and what is the payer's funding source? Deep scan: same as /check but reads the payer's Base USDC funding history from the Blockscout index (latest 500 transfers before the payment, then up to 5 more pages; coverage.historyComplete is true when that covered the full history), plus coverage stats and a recheckable sha256 receipt (paid, $0.05; not charged if the index is down)","price":"$0.05","network":"eip155:8453","getVariant":"GET /check/deep?txHash= with the x402 payment header: same price, same result as POST. Unpaid GET returns the same 402.","parameters":[],"requestNote":"Provide txHash (required for deep: it reads the payer's funding history before that payment). Authorization-only bodies get 400 and are not charged; use /check for those.","requestExample":"{\n  \"txHash\": \"0xabababababababababababababababababababababababababababababababab\",\n  \"expectedPayTo\": \"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd\",\n  \"expectedAmount\": \"0.01\",\n  \"minAmount\": \"0.01\"\n}","responses":[{"status":"200","description":"Deep check result: /check fields + coverage + receipt.recheck{payload,hash}"},{"status":"400","description":"Bad input, or an authorization-only body (deep needs txHash; use POST /check for settle-only): not charged"},{"status":"402","description":"Payment required"},{"status":"502","description":"Upstream RPC failure"},{"status":"503","description":"Indexer unavailable: not charged, retry later"}]},{"id":"post-demo","method":"POST","path":"/demo","summary":"Free demo on a fixed fixture tx","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"Check result"},{"status":"400","description":"Same 400 paid /check would return for this body (nothing charged on either route)"}]}]},{"id":"shield","title":"Shield","blurb":"Lookalike check before sending USDC.","operations":[{"id":"post-address-check","method":"POST","path":"/address/check","summary":"Address-poisoning check before sending USDC on Base (paid, $0.001; recent-window / RPC coverage)","price":"$0.001","network":"eip155:8453","getVariant":"GET /address/check?from=&to=&contacts=a,b (or contacts-only ?recipient=&known=a,b, or recipient-only ?address=) with the x402 payment header: same price, same result as POST. Unpaid GET returns the same 402.","parameters":[],"requestNote":"Two shapes: {from, to, contacts?} scans the sender's history; contacts-only {to, contacts} without from (aliases recipient/address + known_addresses/known) runs an offline lookalike check against contacts only (no RPC; from null, coverage.source contacts_only). Recipient-only {to} alone (alias address, e.g. Verdix {address, chain}) scans that address's OWN recent Base USDC history for poisoning fingerprints (from null, coverage.mode recipient_only, recipient{fingerprint: paid_after_zero_value|zero_value_only|zero_value_plus_activity|sub_cent_only|no_activity|none, counts}).","requestExample":"{\n  \"to\": \"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd\",\n  \"from\": \"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd\",\n  \"contacts\": [\n    \"string\"\n  ]\n}","responses":[{"status":"200","description":"{from, to, risk: low|medium|high, seenBefore, lookalikes[{address, inbound, outbound, dustTransfers, realOut, lastBlock, sampleTx, pattern}], reasons[], ignoredFields?/ignoredNote? (request fields Shield did not use, e.g. lookback_blocks/dust_threshold/tier), contacts?{checked, inContacts, lookalikes[{contact, prefixMatch, suffixMatch}]} (only when contacts sent), coverage{windowBlocks, scannedFrom, scannedTo, coveragePct, lowCoverage, complete, transfersSeen, counterparties, rpcCalls}}. coverage.lowCoverage=true when coveragePct < 10 (free RPCs scanned almost nothing): the first reason then says risk low is NOT a safety signal; retry, pass contacts, or use /address/check/full. Risk enum stays low|medium|high."},{"status":"400","description":"Bad input"},{"status":"402","description":"Payment required"},{"status":"502","description":"Upstream RPC failure"}]},{"id":"post-address-check-full","method":"POST","path":"/address/check/full","summary":"Full-history address-poisoning check (paid, $0.005; one Blockscout index call, up to 500 transfers; not charged if index down)","price":"$0.005","network":"eip155:8453","getVariant":"GET /address/check/full?from=&to= with the x402 payment header: same price, same result as POST. Unpaid GET returns the same 402.","parameters":[],"requestNote":null,"requestExample":"{\n  \"from\": \"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd\",\n  \"to\": \"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd\",\n  \"contacts\": [\n    \"string\"\n  ]\n}","responses":[{"status":"200","description":"Same shape as /address/check with coverage.source=blockscout, coverage.indexerMode (tokentx|v2), and historyComplete when the call reaches history start"},{"status":"400","description":"Bad input"},{"status":"402","description":"Payment required"},{"status":"502","description":"Upstream RPC failure"},{"status":"503","description":"Indexer unavailable: not charged, retry later or use /address/check"}]},{"id":"get-benchmarks-address-poisoning","method":"GET","path":"/benchmarks/address-poisoning","summary":"Free: dated benchmark of POST /address/check on live Base USDC poisoning attempts (summary, per-pair results with tx links, limitations)","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"Benchmark JSON"}]},{"id":"post-demo-address","method":"POST","path":"/demo/address","summary":"Free Shield demo: fixed contacts-only lookalike fixture (body ignored; same shape as paid POST /address/check contacts-only + mode:demo, demo:true, priceCharged:0)","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"{mode:demo, demo:true, priceCharged:0, from:null, to, risk:high, contacts, coverage.source:contacts_only, ...} same fields as contacts-only /address/check"}]}]},{"id":"index","title":"Index","blurb":"Grades from dated paid runs. Grades are earned, never bought.","operations":[{"id":"get-badge","method":"GET","path":"/badge","summary":"Free: same live SVG grade badge as /badge/{id}, with the endpoint in the url query.","price":null,"network":null,"getVariant":null,"parameters":[{"name":"url","in":"query","required":false,"type":"string","description":"Endpoint URL. Empty url returns the not-graded badge."}],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-badge-id","method":"GET","path":"/badge/{id}","summary":"Free: live \"Kertivo verified\" SVG grade badge from the latest Kertivo Index (earned, never sold). id = URL-encoded endpoint URL, optional .svg suffix (also GET /badge?url=<endpoint>). Ungraded/unknown endpoints get a 200 \"not graded\" badge. Cached 1h.","price":null,"network":null,"getVariant":null,"parameters":[{"name":"id","in":"path","required":true,"type":"string","description":"encodeURIComponent(endpoint URL), optionally followed by .svg"}],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"SVG badge"}]},{"id":"get-badge-id-evidence","method":"GET","path":"/badge/{id}/evidence","summary":"Free: Index history for the endpoint: every published run it appeared in, newest first (date, grade, price, payment tx, HTTP after pay), and its state (graded | not_in_this_run | ungraded_this_run | never_graded). HTML by default; JSON with ?format=json or Accept: application/json","price":null,"network":null,"getVariant":null,"parameters":[{"name":"id","in":"path","required":true,"type":"string","description":"encodeURIComponent(endpoint URL)"},{"name":"format","in":"query","required":false,"type":"json | html","description":""}],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"History page or JSON {url, state, gradedAs?, current, lastGraded, history[], runs}. gradedAs appears on our own routes when the run paid the same route on another of our hostnames (same payTo)."}]},{"id":"get-trust-index","method":"GET","path":"/trust-index","summary":"Free: human-readable Kertivo Index HTML scorecard (grades earned, never bought). JSON twin: GET /trust-index.json","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-trust-index-json","method":"GET","path":"/trust-index.json","summary":"Free: JSON twin of the Trust Index scorecard. Envelope {url, canonical_html, title, updated, license, data}. data.index is the same object as GET /trust-index/latest.json.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-trust-index-latest-json","method":"GET","path":"/trust-index/latest.json","summary":"Free: latest Kertivo Index results","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-trust-index-raw-jsonl","method":"GET","path":"/trust-index/raw.jsonl","summary":"Free: raw Kertivo Index rows","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-trust-index-runs","method":"GET","path":"/trust-index/runs","summary":"Free: every published Kertivo Index run (append-only, never rewritten), newest first, with sha256 and links to /trust-index/runs/{n}.json and .jsonl","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"{note, runs[{run,title,runAt,date,rows,sha256,json,jsonl}]}"}]},{"id":"get-trust-index-runs-file","method":"GET","path":"/trust-index/runs/{file}","summary":"Free: one frozen run, {n}.json (rows + metadata) or {n}.jsonl (frozen bytes; x-kertivo-sha256 header)","price":null,"network":null,"getVariant":null,"parameters":[{"name":"file","in":"path","required":true,"type":"string","description":"<run number>.json or <run number>.jsonl"}],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"Run rows"},{"status":"404","description":"No such run"}]},{"id":"get-trust-index-schema","method":"GET","path":"/trust-index/schema","summary":"Free: human page for the Kertivo Index data schema. JSON: GET /trust-index/schema.json. Markdown: GET /trust-index/schema.md.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-trust-index-schema-json","method":"GET","path":"/trust-index/schema.json","summary":"Free: Kertivo Index data schema as JSON.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-trust-index-schema-md","method":"GET","path":"/trust-index/schema.md","summary":"Free: Kertivo Index data schema as Markdown.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"post-trust-lookup","method":"POST","path":"/trust/lookup","summary":"Kertivo Index grade + evidence for an x402 endpoint (paid, $0.002)","price":"$0.002","network":"eip155:8453","getVariant":null,"parameters":[],"requestNote":null,"requestExample":"{\n  \"url\": \"https://seller.example/resource\"\n}","responses":[{"status":"200","description":"{url, status: indexed|not_indexed, grade, runDate, run, rawData, evidence{unpaidStatus, priceSeenUSDC, payTo, paymentTxHash, settled, onchain, httpStatusAfterPay, latencyMs, schemaCheck, deliveryResult, payToRotates?, payToRotatesNote?, payToRotatesEvidence?, payToChanged?, payToChange?{previous, current, basis}, payToChangedNote?}, payToRotates?, payToRotatesNote?}. payToRotates: true = the seller hands out a fresh payTo deposit address on every 402 (multi-probe evidence), so evidence.payTo is one sample, not a fixed address. payToChanged: true = the seller's receiving address differs from the previous Trust Index run (Index #3+; grade unaffected; confirm with the seller if you pinned the old address)"},{"status":"400","description":"Bad url"},{"status":"402","description":"Payment required"}]},{"id":"get-trust-lookup","method":"GET","path":"/trust/lookup","summary":"Free: grade + run date only (omit url for usage help)","price":null,"network":null,"getVariant":null,"parameters":[{"name":"url","in":"query","required":false,"type":"string","description":""}],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"With ?url=: {url, status, grade, runDate, run, rawData, payToRotates?, payToRotatesNote?, payToChanged?, payToChangedNote?, claims…}. Without url: {usage, paid, docs, examples} so directory probes (e.g. x402 Lens) see the route as up."},{"status":"400","description":"Bad url"}]}]},{"id":"claims","title":"Claims","blurb":"Public evidence when a buyer paid and the endpoint did not deliver.","operations":[{"id":"post-claim","method":"POST","path":"/claim","summary":"Free claims desk: file evidence that you paid an x402 endpoint but got no or bad response (evidence only; no custody or arbitration)","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":"{\n  \"endpoint\": \"https://seller.example/resource\",\n  \"txHash\": \"0xabababababababababababababababababababababababababababababababab\",\n  \"authorization\": {},\n  \"from\": \"0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd\"\n}","responses":[{"status":"200","description":"{claimId, url, status: payment_proven_delivery_disputed|payment_proven_delivered|payment_to_wrong_address|payment_to_unrecognized_address|payment_not_settled, reasons, evidence{endpoint, payment{txHash, settlement, block, from, to, amount}, buyerReport}, filer{payerVerified, signMessage}, seller{trustIndex (indexed|not_indexed|self_listed), grade, payTo, self?, disclosure?, payToRotates?, recipientMatch? (not_possible_rotating_payTo), indexedPayToSample?, note?}. For a seller that uses per-request deposit addresses (payToRotates) the recipient cannot be matched, so it is never marked payment_to_unrecognized_address and seller.payTo is null (a seller response is verified against the payment recipient), recheck{hash}, nextSteps, limits, stored, firstFiledAt, submissions, inputAliases?}. Only settled payments are stored as public claims: payment_not_settled (e.g. an unused EIP-3009 authorization, so no USDC moved) is returned with stored:false"},{"status":"400","description":"Bad input"},{"status":"409","description":"claim_locked_payer_verified: this claim was filed payer-verified, and an unsigned resubmission cannot change its buyer report. Body = the stored claim (unchanged) + note + signMessage; resubmit with payerSignature from evidence.payment.from to change it."},{"status":"502","description":"Upstream RPC failure"}]},{"id":"get-claim-id","method":"GET","path":"/claim/{id}","summary":"Free: a stored public claim (HTML for browsers via Accept text/html or ?format=html; JSON otherwise). The JSON record carries a signed `attestation` (see /.well-known/attestation); the HTML page is unsigned.","price":null,"network":null,"getVariant":null,"parameters":[{"name":"id","in":"path","required":true,"type":"string","description":""},{"name":"format","in":"query","required":false,"type":"html | json","description":""}],"requestNote":null,"requestExample":null,"responses":[]},{"id":"post-claim-id-response","method":"POST","path":"/claim/{id}/response","summary":"Free: seller's signed response to a claim. Only the seller can respond: its known payTo (claim.seller.payTo), or the settled payment's recipient if the seller isn't indexed; EOA personal_sign or ERC-1271. Message: \"x402 claim response <id>\\nrespondedAt: <respondedAt>\\n<text>\". One latest response kept; we record it, we do not arbitrate.","price":null,"network":null,"getVariant":null,"parameters":[{"name":"id","in":"path","required":true,"type":"string","description":""}],"requestNote":null,"requestExample":"{\n  \"text\": \"string\",\n  \"respondedAt\": \"string\",\n  \"signature\": \"string\"\n}","responses":[{"status":"200","description":"Stored"},{"status":"400","description":"Bad input"},{"status":"403","description":"Signature does not verify for seller payTo"},{"status":"404","description":"Claim not found"},{"status":"409","description":"Seller not indexed (no known payTo) or a newer response exists"}]},{"id":"get-claims","method":"GET","path":"/claims","summary":"Free: list claims, optionally ?endpoint=<url> (HTML for browsers via Accept text/html or ?format=html; JSON otherwise)","price":null,"network":null,"getVariant":null,"parameters":[{"name":"endpoint","in":"query","required":false,"type":"string","description":""},{"name":"format","in":"query","required":false,"type":"html | json","description":""}],"requestNote":null,"requestExample":null,"responses":[]}]},{"id":"discovery","title":"Discovery","blurb":"Files agents read to find routes, prices, and keys.","operations":[{"id":"get-well-known-agent-json","method":"GET","path":"/.well-known/agent.json","summary":"Free: ERC-8004 registration-v1 shaped agent file (also GET /agent.json). Kertivo + response signer; on-chain Identity Registry mint on Base (agentId 149639).","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"ERC-8004 registration JSON (registrations includes Base agentId 149639)"}]},{"id":"get-well-known-attestation","method":"GET","path":"/.well-known/attestation","summary":"Free: signed responses. Every 200 JSON from /check, /check/deep, /address/check, /address/check/full, paid POST /trust/lookup, JSON GET /claim/{id} (not the HTML page) and /demo, /demo/address carry `attestation` {v, alg eip191-personal_sign, signer, origin, route, issuedAt, sha256 (of the sorted-keys body minus attestation), statement, message, signature}. This route publishes the signer (not a wallet, holds no funds) and verification steps. Also exposes signers[{address, validFrom, validUntil}] for key rotation.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"{enabled, signer, signers[], alg, messagePrefix, signedRoutes, statements, howToVerify, agentRegistration}"}]},{"id":"get-well-known-infoharmoni-square-txt","method":"GET","path":"/.well-known/infoharmoni-square.txt","summary":"Free: Infoharmoni Square wallet proof. Proves payTo ownership for Infoharmoni Square once the sig line is present: one line `sig mb:hectichustlebot 0x<EIP-191 signature by payTo>`. 404 `not proven` until then.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"sig line"},{"status":"404","description":"not proven (no signature published yet)"}]},{"id":"get-well-known-llms-txt","method":"GET","path":"/.well-known/llms.txt","summary":"Free: same as /llms.txt","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"llms.txt guide"}]},{"id":"get-well-known-security-txt","method":"GET","path":"/.well-known/security.txt","summary":"Free: security.txt (RFC 9116). Contact, expires, canonical URL, and a policy link to /llms.txt. Also served at /security.txt.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-well-known-x402","method":"GET","path":"/.well-known/x402","summary":"Free: x402 discovery manifest (paid resources, prices, payTo)","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"x402 manifest"}]},{"id":"get-agent-json","method":"GET","path":"/agent.json","summary":"Free: same as /.well-known/agent.json","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"ERC-8004 registration JSON"}]},{"id":"get-guard-mjs","method":"GET","path":"/guard.mjs","summary":"Free: Kertivo Guard. A zero-dependency module. Pass it to client.onBeforePaymentCreation so an x402 client checks a seller against the Index before paying.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-llms-txt","method":"GET","path":"/llms.txt","summary":"Free: plain-text guide for agents/LLMs (payment terms, every paid route with price + body, free routes)","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"llms.txt guide"}]},{"id":"get-machine-json","method":"GET","path":"/machine.json","summary":"Free: index of every human page's JSON twin. New pages use a sibling .json path. Existing JSON URLs are listed and not duplicated.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-openapi-json","method":"GET","path":"/openapi.json","summary":"This document (free)","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-robots-txt","method":"GET","path":"/robots.txt","summary":"Free: crawl policy. User-agent *, Allow /, Sitemap, and content signals search=yes, ai-input=yes, ai-train=yes","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"robots.txt"}]},{"id":"get-security-txt","method":"GET","path":"/security.txt","summary":"Free: same as /.well-known/security.txt.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-sitemap-xml","method":"GET","path":"/sitemap.xml","summary":"Free: sitemap of public pages","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"Sitemap"}]}]},{"id":"pages","title":"Pages","blurb":"Human pages. Each one links a JSON twin with the same facts.","operations":[{"id":"get","method":"GET","path":"/","summary":"Docs + pricing (free)","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-about","method":"GET","path":"/about","summary":"Free: About. This section is not published yet. How grades are made is on /trust-index. HTML for browsers; JSON with ?format=json or Accept: application/json.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-directory","method":"GET","path":"/directory","summary":"Free: Directory. This section is not published yet. Graded endpoints are on /trust-index. HTML for browsers; JSON with ?format=json or Accept: application/json.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-docs","method":"GET","path":"/docs","summary":"Free: developer docs for every route, generated from this document. HTML. JSON twin: GET /docs.json.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-docs-json","method":"GET","path":"/docs.json","summary":"Free: JSON twin of /docs. Envelope {url, canonical_html, title, updated, license, data}. data.groups lists the same operations as this document.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-examples","method":"GET","path":"/examples","summary":"Free: copy-paste buyer recipes (curl 402 handshake, @x402/fetch client paying /check, verifying a payment to another seller)","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"Integration guide"}]},{"id":"get-guides","method":"GET","path":"/guides","summary":"Free: guides index (HTML). JSON twin: GET /guides.json.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-guides-json","method":"GET","path":"/guides.json","summary":"Free: JSON twin of the guides index","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-guides-slug","method":"GET","path":"/guides/{slug}","summary":"Free: one published guide (HTML). JSON twin: GET /guides/{slug}.json. Unknown or unpublished slugs are 404.","price":null,"network":null,"getVariant":null,"parameters":[{"name":"slug","in":"path","required":true,"type":"string","description":""}],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-guides-slug-json","method":"GET","path":"/guides/{slug}.json","summary":"Free: JSON twin of one published guide (markdown and FAQ from the same source as the HTML). /guides/about.json is the method page.","price":null,"network":null,"getVariant":null,"parameters":[{"name":"slug","in":"path","required":true,"type":"string","description":""}],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-guides-about","method":"GET","path":"/guides/about","summary":"Free: how these guides are written and checked. JSON twin: GET /guides/about.json.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]},{"id":"get-privacy","method":"GET","path":"/privacy","summary":"Free: privacy page (HTML for browsers; JSON with ?format=json or Accept: application/json). What Kertivo stores, that Base payments are public, and that grades are not sold.","price":null,"network":null,"getVariant":null,"parameters":[{"name":"format","in":"query","required":false,"type":"html | json","description":""}],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"Privacy page or JSON {name, url, updated, contact, summary, sections}"}]},{"id":"get-stats","method":"GET","path":"/stats","summary":"Free: aggregate counts of paid /check, /check/deep, /address/check, /address/check/full (verdicts/risk by source; byPayerClass outside|internal|unknown excludes hectic-spend/Index; deep + addressFull indexerMode + historyComplete, deep indexerPages buckets; per-route ignoredFieldNames / ignoredFieldNamesOutside count unused request field names only, never values; no addresses/txs; /demo excluded)","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"{note, allTime{since,updatedAt,byPayerClass,outsideSince,check,deep,addressCheck,addressFull}, today{day,...}}; each route may carry ignoredFieldNames{name:count} and ignoredFieldNamesOutside{name:count}"},{"status":"503","description":"stats storage not configured"}]},{"id":"get-terms","method":"GET","path":"/terms","summary":"Free: terms page (HTML for browsers; JSON with ?format=json or Accept: application/json). Grades are information from a dated paid run. No warranty. Not financial advice. Corrections and the right of reply use the public contact.","price":null,"network":null,"getVariant":null,"parameters":[{"name":"format","in":"query","required":false,"type":"html | json","description":""}],"requestNote":null,"requestExample":null,"responses":[{"status":"200","description":"Terms page or JSON {name, url, updated, contact, summary, sections}"}]},{"id":"get-tools","method":"GET","path":"/tools","summary":"Free: Tools. This section is not published yet. HTML for browsers; JSON with ?format=json or Accept: application/json.","price":null,"network":null,"getVariant":null,"parameters":[],"requestNote":null,"requestExample":null,"responses":[]}]}]}}