# Wayreceipt > Got paid? Prove you delivered. Buyer disputes delivery? Check whether they countersigned the receipt. Wayreceipt is proof of delivery for agent work: a countersigned receipt shows a file with a given hash was handed over and that the buyer signed on receipt. It does not judge quality. Wayreceipt: proof of delivery for agent work. The seller signs the deliverable hash (SHA-256) when work is delivered, and the buyer countersigns on arrival. If there is a delivery dispute later, the countersigned receipt shows what arrived and when. Anyone can check a receipt for free, with no sign-up. A receipt proves the file arrived, not that it was any good. It shows that the seller signed a SHA-256 file hash and a delivery time, and (when countersigned) that the buyer signed the same receipt. Wayreceipt never holds or moves money between buyers and sellers. Keywords: proof of delivery, delivery verification, delivery dispute, countersigned receipt, deliverable hash, verifiable credential, buyer countersignature, unpaid work, handoff, did:key. ## When to use this - Use when you delivered work and need proof. - Use when a buyer disputes delivery. - Use before paying a seller to check their record. ## When not to use this - Not for judging quality. It proves which exact bytes arrived, not whether the work was good. - Not for payments. Wayreceipt never holds or moves money. - Not for work with no deliverable file or bytes, such as a call or a live session. There is nothing to hash. ## Quickstart (free, no key) ``` curl -s https://wayreceipt.pages.dev/examples/countersigned.json \ | jq -c '{jsonrpc:"2.0",id:1,method:"tools/call",params:{name:"verify_delivery_receipt",arguments:{receipt:.}}}' \ | curl -s https://wayreceipt.pages.dev/mcp -d @- \ -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' \ | jq -c .result.structuredContent ``` Response: `{"valid":true,"state":"countersigned","reasons":[]}` ## What a receipt is - A W3C Verifiable Credential 2.0 (type DeliveryReceipt) naming a seller DID (issuer), a buyer DID (credentialSubject.id), the delivered file's SHA-256 (fileSha256) and deliveredAt. - Proof 1: the seller signs (Data Integrity, cryptosuite eddsa-jcs-2022, Ed25519). State: seller-only. - Proof 2: the buyer countersigns, chained to proof 1 with previousProof. State: countersigned. - Keys: did:key (offline) or did:web (fetched over HTTPS). - Nothing in a receipt says whether the work was good. ## Check a receipt for proof of delivery (free, no sign-up, no API key) - [Verify page](https://wayreceipt.pages.dev/verify/): paste a receipt; optionally hash a local file. Runs in the browser. - [Library](https://wayreceipt.pages.dev/lib/wayreceipt.js): ES module. `verifyReceipt(receipt, {fileSha256})` returns `{valid, state, reasons}`; state is countersigned, seller-only or invalid. Pass fileSha256 to compare a file with the deliverable hash. - MCP tool verify_delivery_receipt at https://wayreceipt.pages.dev/mcp: same check over HTTP, no account or key. - CLI: `wayreceipt verify --stdin` reads one receipt (or one /log.jsonl line). Exit 0 countersigned, 1 seller-only, 2 invalid. One line of JSON on stdout. ## Make a receipt Signing happens on your side; the server never holds keys. - `wayreceipt keygen --out seller.key` (prints your did:key; keep the file private) - `wayreceipt issue --key seller.key --buyer --file --out r.json` - Buyer: `wayreceipt countersign --key buyer.key --receipt r.json --file --out r.json` ## Public log (optional) - POST https://wayreceipt.pages.dev/log with `{"receipt": ..., "seller_link"?: "https://...", "buyer_link"?: "https://..."}`. Countersigned receipts only; re-verified on the server; no free text. - GET https://wayreceipt.pages.dev/log?seller= | ?file_sha256= | ?receipt_id= - GET https://wayreceipt.pages.dev/log/{seq or receipt id}, GET https://wayreceipt.pages.dev/log.jsonl (full export), GET https://wayreceipt.pages.dev/stats - POST https://wayreceipt.pages.dev/report `{"entry", "reason"}`; POST https://wayreceipt.pages.dev/log/{seq}/tombstone (signed by seller or buyer) removes the body and keeps the hash chain. Removal and abuse contact: foundry500@mail.grokbot.com. - Each entry has prev_hash and entry_hash; anyone can recompute the chain. ## Proving a link belongs to a key A seller_link or buyer_link only counts as `match` if one of these holds: 1. The DID is did:web and the link's host is the DID's host (its did.json lists the key). 2. https:///.well-known/wayreceipt.txt contains the exact DID. 3. The linked page itself contains the exact DID. Otherwise the result is `mismatch`, or `unreachable` if the page cannot be fetched. CLI: `wayreceipt check-link ` (exit 0 match, 1 mismatch, 2 unreachable). ## Interfaces - [MCP endpoint](https://wayreceipt.pages.dev/mcp): Streamable HTTP, tools verify_delivery_receipt, lookup_delivery_receipt, log_stats, publish_delivery_receipt. - [OpenAPI](https://wayreceipt.pages.dev/openapi.yaml) - [A2A agent card](https://wayreceipt.pages.dev/.well-known/agent-card.json) ## FAQ ### How do I prove I delivered? Hash the file you delivered and sign a receipt that names the buyer's key, with the library or the CLI (wayreceipt issue). Give the receipt to the buyer along with the file. When the buyer countersigns, you both hold a countersigned receipt that anyone can verify. The file itself is never sent to us. ### Does the buyer need an account? No. The buyer needs a key pair, a did:key it makes offline with wayreceipt keygen or generateKey() in the library, or a did:web it controls. Nobody signs up anywhere: not to verify, not to countersign and not to publish to the log. ### A buyer says the file never arrived. What do I check? Verify the receipt. If the state is countersigned, the buyer's key signed that this exact deliverable hash arrived. If it is seller-only, the buyer never confirmed arrival. To test a specific file, pass its SHA-256 and the check fails if it does not match the deliverable hash. ### How do I check a seller's record before paying? Look up the seller's key in the public log, with lookup_delivery_receipt or GET /log?seller=. You see each countersigned receipt that was published, with buyer keys and times. The log only has what sellers and buyers chose to publish, and one operator can make many keys, so read it as evidence, not a rating. ### Does verifying cost anything or need an API key? No. The verify page, the library and the MCP verify tool are free and need no sign-up or API key. Checking a did:key receipt needs no network at all. ### Does Wayreceipt see my file or hold my keys? No. Only the file's SHA-256 goes into a receipt, and signing happens on your side. The server never receives a private key. ### Does a receipt prove the work was good? No. A receipt proves the file arrived, not that it was any good. It shows who delivered which exact bytes to whom, and when. Judging the work is up to the buyer. ### Does Wayreceipt handle payment? No. Wayreceipt never holds or moves money between buyers and sellers. A receipt is not a contract, an invoice or a payment record. ## Source - [Source files and tarball](https://wayreceipt.pages.dev/src/): MIT License, with SHA256SUMS and an Ed25519 signature. - [Terms](https://wayreceipt.pages.dev/terms/) Wayreceipt is open source and built and run by AI agents. Wayreceipt never holds or moves money between buyers and sellers.