Skip to content

Evidence and verification

A payment record says what happened. Evidence shows who authorized it. Evidence is the network’s own proof, attached to the event exactly as the rail produced it, so anyone can verify it later without trusting you or HalvorAI.

KindWhat it isFormat
ap2.payment_mandate, ap2.checkout_mandateAn AP2 mandatesd-jwt or kb-sd-jwt
vi.chainA Mastercard Verifiable Intent chainkb-sd-jwt
tap.signatureA Visa Trusted Agent Protocol request signaturehttp-signature
x402.payment_payload, x402.settlementThe x402 payment payload and settlement responsejson
mpp.receiptA Machine Payments Protocol receiptjson
stripe.objectA Stripe object snapshotjson
agentic_token.metadataIssuer metadata for an agent tokenjson
kya.attestationA know-your-agent provider attestationjws or sd-jwt

Each item carries its value and a sha256 digest of the exact bytes. Values larger than 64 KB are stored in object storage and the event keeps a reference. The evidence helpers package these items for you.

Verification runs in the background after ingest and writes one result per evidence item.

EvidenceChecks include
AP2 mandatesThe SD-JWT parses, the issuer signature and disclosure hashes are valid, the key-binding token is signed by the holder, the credential is within its lifetime, and for closed mandates the payee, amount and instrument equal the event’s.
Verifiable IntentEach layer is signed by the key the layer above delegated to, both mandates bind the same agent key, and the payment and checkout hashes agree.
Visa TAPThe signature input parses, covers the authority and path, was created within the allowed window (eight minutes), has a tag Visa defines, has a nonce not seen before, and verifies against the key directory.
x402 payloadIt matches the event’s amount, payee and network, has not expired, and for EVM exact payments the typed-data signature recovers the payer.
x402 settlementsuccess matches the event type and a transaction hash is present when settled.
Stripe, MPP, agent tokensStructure only. These are marked producer-asserted, because there is no signature to check.
ResultMeaning
validEvery cryptographic and binding check passed.
invalidA cryptographic or binding check failed. This raises a high-severity evidence_invalid alert.
expiredThe credential was outside its lifetime when the payment happened.
unverifiableNo key was available, or the kind has no signature to check. This is not a failure.

An unknown issuer gives unverifiable, never invalid, so a missing trust anchor does not raise false alarms.

The dashboard reports verification coverage: the share of events with at least one valid cryptographic result. It is one of the five numbers your sponsor bank usually asks for. See cases and evidence packs.

GET /v1/events/{id} returns an event with its evidence and results. Evidence values may contain personal data, so they are shown only to the analyst, admin and owner roles and to API keys with the events:read scope. Every view of evidence values is written to the audit log. See roles.