Receipt verifier

Buyer-side verification for signed inference receipts. Pure Go, no runtime dependencies.
Status: Pending. Offline verification of current receipts is pending a verifier update. The released verifier (verify-v1.1.0) cannot parse the receipts buyers receive today: it rejects them with exit code 65 (unknown field "model_hash"). Its built-in default receipt-key host is also no longer valid, so do not rely on default key lookup. This page is kept as a reference for the flags and result semantics.
The verifier binary is macprovider-verify. It checks a signed receipt against the request and response you recorded, resolves the provider’s receipt key, and returns a deterministic valid, invalid, or inconclusive result. Some non-streaming responses carry a v0.3 receipt in the X-MacProvider-Receipt response header (currently roughly a quarter to a third). Streams never do. For the rest, use GET /v1/receipts. See Signed receipts.

Install

Releases are published on GitHub (Augustas11/macprovider) under tags named verify-v<version>. The current release is verify-v1.1.0.

macOS Apple Silicon

macOS Intel

Linux amd64

The release also ships output.schema.json, the JSON Schema for --json output.

Usage (pending)

The verifier takes either a captured header value plus canonical prompt and output hashes (--receipt, --prompt-hash, --output-hash), or a bundle JSON file with the receipt, the OpenAI request body, the OpenAI response body, and optionally provider_id (--bundle). With the released 1.1.0 binary, both modes stop at the input-format error above for current receipts. Instructions will return here once an updated verifier ships.

CLI reference

Environment

Running against a private receipt-key host

By default, --coordinator rejects literal loopback, RFC1918, link-local, and unspecified IP hosts. This stops you from verifying against a private endpoint when you expected the public one. For local development or an explicitly private deployment, set MACPROVIDER_VERIFY_ALLOW_PRIVATE_COORDINATOR=1. The guard checks literal IPs only. It does not block hostnames, so you are responsible for choosing trusted DNS names.

Input modes

--bundle and --receipt cannot be combined. --offline prevents live fetches. With --pubkey, a resolver failure cannot downgrade an otherwise valid explicit-key verification.

Exit codes

Version compatibility

1.0.x verifiers report v0.3 receipts as invalid. Neither release verifies the v0.4 settlement receipts the network uses internally. Those are never sent in buyer response headers. See Verified model settlement.

Trust boundary

A valid result proves two things: the tuple was signed by a holder of the provider’s receipt key, and the verifier resolved that key through the trust source you configured. It does not prove model honesty, timestamp honesty, response uniqueness, privacy, or replay resistance. See Security & trust model.