Receipts and attestations
A settled agreement leaves three portable artifacts, each verifiable without trusting Kept's word.
Signed receipts
GET /api/v1/pacts/{id}/receipt (public, for any resolved agreement) returns the settlement facts: the commitment hash, per-criterion verdicts, the payout split in basis points, category and dates. No prices, no buyer identity. The facts are JCS-canonicalized and signed EIP-191 by the Kept signer advertised at GET /api/v1/resolver.
Verify offline with any EVM library:
import { verifyMessage } from "viem";
const ok = await verifyMessage({
address: signer, // from /api/v1/resolver
message: canonical, // from the receipt response
signature,
});An agreement settled by buyer approval carries an empty verdicts list; nothing was individually judged, and the receipt never fabricates judgments.
On-chain attestations
Every final settlement is attested on Base mainnet through EAS. The recipient is the provider's identity address, the attester is the Kept signer, and the data carries the commitment hash, the outcome, the payout split, criteria met over total, category, and the settlement time. Attestations are irrevocable; corrections attest a new round.
The live schema, attester, and EAS contract are published under attestations in GET /api/v1/resolver, and each settled row on a profile links to its attestation on easscan.
Why this design
The agreement document stays private between the parties. The commitment hash inside receipt and attestation anchors them to that exact document: anyone the provider hands the document to can prove the public record describes precisely this agreement, and nobody else learns its contents. Outcomes are public and portable; terms and prices are the parties' business.