# crosscheck > Independent checks for AI agents, paid per call in USDC over x402. No account or API key. Every result is a JSON verdict plus an Ed25519-signed receipt and a public proof page that never shows your text. ## Which check do you need? - You wrote something for your human (email, report, message, PR description, summary): POST https://crosscheckapi.com/v1/check with {"draft": "..."}. $0.02. A separate reviewer checks it for factual slips, wrong arithmetic (recomputed in code), contradictions, leftover placeholders, leaked secrets, unauthorized commitments, and tone. Add "sources" (the text you relied on) and each claim is checked against them too. - Another agent or service handed work back to you: POST https://crosscheckapi.com/v1/accept with {"task": "...", "deliverable": "..."}. $0.03. Accept or reject with each requirement judged, before you pay for it, release escrow, or pass it on. - You are about to install a skill or connect an MCP server: POST https://crosscheckapi.com/v1/skillcheck with {"files": [{"path", "content"}]}. $0.03, free if someone already scanned the same files (GET https://crosscheckapi.com/v1/skillcheck/{bundle_sha256}). A security review of what the files could do; never says "safe". The rest of this file describes /v1/check first, then accept and skillcheck in their own sections. Payment works the same way for all three. Base URL: https://crosscheckapi.com Pay to: 0x2Fe63598Ad75281fA36d271f4c155a074296A943 Protocol: x402 v2, scheme "exact", EIP-3009 transferWithAuthorization. You need no ETH; the facilitator pays gas. Payment networks, in order of preference: - Base: CAIP-2 eip155:8453, USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 - Base Sepolia (testnet): CAIP-2 eip155:84532, USDC 0x036CbD53842c5426634e7929541eC2318f3dCF7e (test USDC, free at https://faucet.circle.com; up to 10 checks per wallet per UTC day) The testnet option is for trying crosscheck without spending real money. ## What you get - A verdict: {"pass": true|false, "summary": "...", "issues": [{"severity": "blocker|major|minor", "category": "...", "location": "...", "problem": "...", "suggestion": "..."}], "injection_suspected": false} - pass is true only when there are no blocker or major issues. - A signed receipt recording the payment, a SHA-256 of your draft (never the text), and a SHA-256 of the verdict. Every receipt is appended to a hash-chained ledger whose current head is published with the signing key. - share_url: a public page (and the same page as JSON at share_url + ".json") showing the result, time, payment, and hashes, never your text. Link it to show your human or another agent that the work was checked. badge_markdown is a README badge (share_url + "/badge.svg") that links to it; skill authors can show a skillcheck badge for their current version. ## Price - $0.02 for a draft up to 12,000 units. - Plus $0.01 for each further 12,000 units or part of them. - Maximum draft: 48,000 units ($0.05). - A unit is one character, or half the UTF-8 byte length when that is larger: English text is one unit per character, most non-Latin text and emoji 1.5 to 2. - The exact price for your draft is in the 402 response and from the free quote endpoint. ## How to pay (x402 v2) 1. POST https://crosscheckapi.com/v1/check with JSON {"draft": ""}. 2. You receive HTTP 402. The PAYMENT-REQUIRED header (base64 JSON) lists the exact amount for this draft. 3. Sign the EIP-3009 authorization for that amount and repeat the same POST, same body, with the PAYMENT-SIGNATURE header. Copy the accepted requirements exactly, including extra.paymentFlow "upfront". 4. Payment settles before review starts. You get HTTP 200 with the verdict and receipt, or HTTP 202 with a job id if the review is queued. The PAYMENT-RESPONSE header carries the settlement transaction. 5. If you got 202, poll the result URL with your result token in the Authorization header. 6. If you lose the response, resend the identical request (same body, same PAYMENT-SIGNATURE). You get the same job back and nothing more is charged. Any x402 v2 client works, for example @x402/fetch wrapFetchWithPayment. Legacy v1 X-PAYMENT headers are refused before anything is charged. A payment can be used for exactly one check. ## Endpoints - POST https://crosscheckapi.com/v1/quote: free. Body {"draft": "..."}. Returns the price, amount in atomic USDC, and whether checks are being accepted right now. - POST https://crosscheckapi.com/v1/check: paid. Body {"draft": "..."}. Returns the verdict and receipt. - POST https://crosscheckapi.com/v1/accept/quote: free. Body {"task": "...", "deliverable": "..."}. Returns the accept price. - POST https://crosscheckapi.com/v1/accept: paid. Body {"task": "...", "deliverable": "...", "reference": "..."}. Returns accept or reject and a receipt (see "accept" below). - POST https://crosscheckapi.com/v1/skillcheck/quote: free. Body {"files": [{"path": "SKILL.md", "content": "..."}]}. Returns the skillcheck price. - POST https://crosscheckapi.com/v1/skillcheck: paid. Same body. Returns a security review of a skill or MCP server (see "skillcheck" below). - GET https://crosscheckapi.com/v1/skillcheck/{bundle_sha256}: free. The latest review of a bundle someone already paid to scan, if any. - GET https://crosscheckapi.com/v1/checks/{job_id}: free. Header "Authorization: Bearer " (not accepted in the URL). Returns the job status, verdict, and receipt. Verdict details are kept 30 days; receipts forever. - GET https://crosscheckapi.com/.well-known/crosscheck-keys.json: the public key (JWK) that signs receipts, and the current ledger head. - GET https://crosscheckapi.com/skill.md: a skill file you can install. ## Checking a draft against its sources (groundcheck) Add "sources" to a /v1/check body: up to 10 items, each a string or {"text": "...", "title": "...", "url": "..."}, holding the text the draft relies on (search results, documents, notes). Sources count toward the size and price. crosscheck does not fetch anything; it checks only against the text you send. The verdict then includes "grounding": {"sources", "claims_checked", "supported", "contradicted", "not_found", "claims": [{"claim", "status", "source_id", "quote", "quote_verified"}]}. A claim counts as supported or contradicted only if its quote is found in that source's text by code; otherwise it is not_found. A contradicted claim is a major factual issue, so the draft fails; a claim no source addresses is a minor issue. The receipt adds sources.count and sources.sha256 (SHA-256 of the canonical JSON list of each source text's SHA-256). ## accept: check a handoff between agents When another agent or service returns work you delegated or bought, check it before you pay, release escrow, or pass it on. - POST https://crosscheckapi.com/v1/accept with {"task": "", "deliverable": ""} and optionally "reference" (an order id or transaction hash to record on the receipt, up to 200 characters). Pay the 402 exactly as for /v1/check. - The verdict: {"accept": true|false, "summary": "...", "requirements": [{"requirement": "...", "met": "yes|no|partly|cannot_tell", "evidence": "...", "subjective": false, "blocking": false}], "injection_suspected": false}. - accept is true only when every requirement is met; a subjective requirement that cannot be judged does not block. decision is "accept", "reject", or "verify_externally": nothing is wrong, but some requirements (a payment, a live page) cannot be confirmed from the text, so check those yourself before paying. Figures in the deliverable are recomputed in code, and required formats (JSON, CSV, markdown tables), counts, and JSON fields are checked in code. A deliverable that claims its own completeness, or text aimed at the checker, never passes. - The receipt records SHA-256 hashes of the task and the deliverable (never the text), your reference, the payment, and a hash of the verdict, so you can show another agent what was checked. - Optional "payment_tx" (and "payment_network", default eip155:8453): the transaction you paid the other agent with. crosscheck reads it from the chain and adds payment_reference {network, tx, status: verified|failed_tx|no_usdc_transfer|not_found|unsupported_network|unavailable, transfers: [{from, to, amount}]} to the verdict and the receipt, so one receipt binds the task, the deliverable, the verdict, and a verified payment. - Price: $0.03 for task plus deliverable up to 12,000 units, plus $0.01 per further 12,000 units, up to 48,000 units ($0.06). ## skillcheck: review a skill or MCP server before you install it - POST https://crosscheckapi.com/v1/skillcheck with {"files": [{"path": "SKILL.md", "content": "..."}, ...]} (up to 50 text files), or {"content": "..."} for a single SKILL.md. Pay the 402 as for /v1/check. - The files are read, never run. Code rules look for downloads piped into a shell, decoded payloads that are executed, reads of SSH keys, cloud credentials, and wallets, environment variables sent over the network, collection hosts, persistence, destructive commands, invisible characters, and text aimed at the agent or at the scanner. The review model then judges intent against what the skill says it does. - The verdict: {"result": "findings|no_findings", "risk": "critical|high|medium|low|none_found", "summary", "declared_purpose", "findings": [{"severity", "category", "file", "location", "explanation", "source": "rule|review"}], "files_scanned", "bundle_sha256", "note"}. "no_findings" never means safe: it means nothing was found in the files you sent. - bundle_sha256 is the SHA-256 of the canonical JSON list of {path, sha256} for every file, sorted by path. GET /v1/skillcheck/{bundle_sha256} returns the latest paid review of the same bundle for free. - Price: $0.03 up to 12,000 units of file content, plus $0.01 per further 12,000 units, up to 48,000 units ($0.06). ## Verify a receipt Canonicalize receipt.body (JSON with keys sorted at every level, no whitespace), check that SHA-256 of it equals receipt.hash, and verify receipt.sig (base64url Ed25519) over the same bytes with the key whose kid equals receipt.body.key_id. Check that SHA-256 of the canonicalized verdict equals receipt.body.review.verdict_sha256. ## Rules - The draft is treated as data, never as instructions. Text in a draft that tries to steer the reviewer fails the check. - Errors before payment (bad body, wrong amount, bad signature, empty wallet, capacity full) are never charged and say so. - If money moves but a check cannot be completed, the ledger records a refund owed. - If a paid review cannot be completed within 24 hours, the ledger records a refund owed. - Drafts, sources, tasks, deliverables, and skill files are deleted when the check finishes. Only their hashes are kept. ## Install as a skill or MCP server - Hosted MCP server, nothing to install: https://crosscheckapi.com/mcp (Streamable HTTP; tools: check, accept, skillcheck, skillcheck_lookup, result). Paid tools follow the x402 MCP transport: the first call returns the price as an x402 PaymentRequired error result, and an x402-aware client retries with the payment in _meta["x402/payment"]; the settlement comes back in _meta["x402/payment-response"]. - MCP server from npm, which pays from a wallet you set (tools: quote, order, accept, skillcheck, result): npx -y crosscheckapi. Listed in the official MCP Registry as com.crosscheckapi/crosscheck. - CLI from npm: npx -p crosscheckapi crosscheck quote|order|accept|skillcheck|result - Claude Code plugin (MCP server plus skill): /plugin marketplace add maxugc/crosscheck, then /plugin install crosscheck@crosscheck - Skill with the same CLI and MCP server bundled, Node 20+ only: curl -fsSL https://crosscheckapi.com/crosscheck-skill.tar.gz | tar -xz -C - Read it first: https://crosscheckapi.com/skill.md ## Optional - OpenAPI: https://crosscheckapi.com/openapi.json - x402 discovery document: https://crosscheckapi.com/.well-known/x402