Receipt verifier
Buyer-side verification for signed inference receipts. Pure Go, no runtime dependencies.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
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
Avalid 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.