paybondpaybond
Sign in

Agent Receipt Standard (ARS)

A verifiable receipt for autonomous actions—not just payments. A signed receipt anyone can verify—even without Paybond.

A verifiable receipt for autonomous actions—not just payments.

ARS gives you a signed JSON document that proves what an agent did, who authorized it, and what settled—without handing verifiers your raw prompts or tenant secrets. Anyone can check the Gateway signature offline.

From agent intent to a signed Agent Receipt Standard document: policy gates the tool, execution and evidence bind digests, Gateway composes the receipt.

Happy path

  1. Prompt / agent intent
  2. Policy authorization
  3. Tool execution
  4. Evidence and payment digests
  5. Signed ARS receipt

From agent intent to a signed Agent Receipt Standard document: policy gates the tool, execution and evidence bind digests, Gateway composes the receipt.

What is ARS?

One envelope, many proofs

ARS composes existing Paybond artifacts into a single portable document. It complements—not replaces—settlement receipts, Harbor evidence, and funding credentials.

The Agent Receipt Standard (ARS) answers one question for auditors, downstream agents, and compliance tooling:

This action happened, under this policy, by this model configuration, with this payment and evidence proof—and here is the Gateway signature.

ARS composes authorization decisions, execution digests, evidence bindings, and funding receipts into one offline-verifiable envelope. Verifiers correlate the story without calling Paybond's live API for every field.

Why ARS exists

Portable proof for multi-tool agents

Side-effecting agents produce many calls per intent. Operators and partners need stable, handoff-friendly proof.

Multi-tool agents produce many side-effecting calls per intent. Operators and partners need:

  • Portable proof they can verify outside Paybond's live API
  • Stable correlation across authorization, Harbor evidence, funding transport, and settlement
  • Agent-to-agent handoff without embedding full JSON in prompts

ARS ships that proof as a Gateway-signed JSON document with a published JSON Schema and public verify endpoint.

Where should I start?

I'm emitting receipts

Wire Kit middleware so authorize → execute → evidence produces an action-scope receipt automatically.

I'm consuming / verifying

Fetch signed JSON by receipt id, then verify signatures—online or offline.

I'm auditing

Export compliance bundles, map receipts to OTEL spans, and trace intent lifecycle.

Interactive example

Travel booking → signed receipt

A hotel booking agent matches policy, submits evidence, records settlement, and Gateway emits one portable ARS document.

Travel booking agent example showing policy, evidence, settlement, and the resulting Agent Receipt Standard document.

Example scenario

Travel booking agent

  • Policy matched (spend cap $150)
  • Evidence submitted (hotel confirmation)
  • Settlement recorded

How ARS relates to other artifacts

ARS links what you already have

Each proof type already exists in Paybond. ARS references them by digest so one document tells the full story.

How Agent Receipt Standard composes payment receipts, evidence, and policy decisions into one signed envelope.
  1. Proves funding transport (MPP / x402)

  2. Evidence

    Proves execution — Harbor completion and payee signature digests

  3. Policy decision

    Proves authorization — spend decision digest at verify time

  4. Agent Receipt Standard (ARS)

    Links them in one signed, offline-verifiable envelope

Full artifact reference
ArtifactWhat it proves
Protocol settlement receiptFinal outcome for AP2/mandate flows
Harbor completion evidencePayee-signed predicate satisfaction
MPP / x402 funding headersFunding transport credentials
Spend authorization decisionPer-verify policy decision (not exported as a receipt)
Agent run traceOperator observability timeline
Agent receipt (paybond.agent_receipt_v1)Per-action composite of the above by digest

How it works

From prompt to signed receipt

Most integrations follow the middleware path: policy gates the tool, evidence submits, Gateway composes the receipt.

  1. Authorize — Kit middleware checks spend policy and records a spend decision digest.
  2. Execute — The guarded tool runs; argument and result digests bind what happened.
  3. Submit evidence — Harbor evaluates the predicate; evidence and payee signature digests are recorded.
  4. Compose receipt — Gateway assembles authorization, execution, evidence, payment, and outcome blocks, then signs canonical JSON.

For a hands-on walkthrough without writing integration code, use sandbox smoke (see API below) or Agent middleware.

Receipt structure

For implementers — full block reference

Expand each block when you need field-level detail. Middleware integrations usually touch authorization, execution, and evidence first.

Every paybond.agent_receipt_v1 document composes the blocks below. Each row shows its purpose collapsed — expand for key fields.

Agent Receipt Standard paybond.agent_receipt_v1 block reference for implementers.
Top-levelDocument identity and tenant binding

Key fields

  • kind
  • schema_version
  • scope
  • receipt_id
  • issued_at
  • tenant_id
authorizationWho authorized the action and which policy matched

Key fields

  • principal
  • agent model family
  • config_hash_sha256_hex
  • prompt_hash_sha256_hex
  • policy digest
  • spend decision
  • mandate_digest_sha256_hex (optional)
  • mandate_reference_id (optional)
executionWhat tool ran (action scope)

Key fields

  • run_id
  • tool_call_id
  • tool_name
  • operation
  • arguments_digest_sha256_hex
  • result_digest_sha256_hex
  • timestamps
evidenceHarbor completion and payee signature digests — not raw payloads

Key fields

  • evidence.payload_digest_sha256_hex
  • payee signature digest
paymentFunding transport proof

Key fields

  • MPP Payment-Receipt digest
  • x402 delivery receipt digest
outcomeHarbor state and categorical settlement claim

Key fields

  • harbor_state
  • spend_reservation_outcome
  • settlement_outcome (intent_terminal: SETTLED | PENDING_FINALITY | REVERSED | FAILED)
referencesCross-artifact correlation

Key fields

  • intent_id
  • settlement_receipt_id (optional)
  • audit correlation
SignatureGateway attestation over canonical JSON

Key fields

  • ed25519-sha256-json-v1
  • message_digest_sha256_hex
operator_attestationOptionalDetached operator counter-signature over the Gateway digest

Key fields

  • operator Ed25519 signature
  • model attestation metadata
continuityOptionalOptional hash chain across action receipts in the same run

Key fields

  • run_id
  • sequence_number
  • prev_message_digest_sha256_hex (when sequence > 1)
external_attestationsOptionalPartner-native proofs without making them canonical

Key fields

  • SEP-2828
  • x402
  • AP2 mandate and protocol receipts

Partner external attestations

ARS optionally carries external_attestations[] for partner-native proofs. Supported sources today:

  • SEP-2828 — MCP decision/outcome receipt pairs
  • x402 — signed delivery receipts
  • AP2 — signed agent mandates (agent_mandate_v1), protocol authorization receipts (protocol_authorization_receipt_v1), and protocol settlement receipts (protocol_settlement_receipt_v1)

Kit verifies each artifact locally and normalizes it to a digest entry on the signed receipt. When a verified agent_mandate_v1 entry is present, compose also promotes its digest into load-bearing authorization.mandate_digest_sha256_hex (and optional mandate_reference_id); offline verify fail-closes if those fields disagree with the matching attestation. See Kit agent integrations — external attestations.

Scopes: per action vs final outcome

Two emission points

Action receipts cover one guarded tool call. Final-outcome receipts wrap the intent when Harbor reaches a terminal state.

Comparison of action-scope and intent_terminal Agent Receipt Standard emission points.

Per action

action
When emitted
After evidence submit for a side-effecting tool call
receipt_id
sha256(intent_id + "\x00" + tool_call_id) hex
Status
Shipped — Gateway compose, fetch, verify, audit export

Final outcome

intent_terminal
When emitted
Harbor reaches terminal state (final outcome)
receipt_id
receipt_id = intent_id (UUID)
Status
References references.settlement_receipt_id; compose follows protocol settlement receipts

Most integrations start with action receipts — one signed envelope per guarded tool call. Add intent_terminal when you need a single receipt that summarizes the settled intent.

API

Fetch and verify signed receipts

Tenant-bound fetch for your receipts; public verify accepts the full JSON body without a live session.

After middleware evidence submit

Gateway composes and persists action receipts when Kit middleware completes the authorize → execute → evidence path (and when agent-receipt signing is configured). Persisted receipts are first-write-wins: identical recomposes are idempotent; a different digest for the same receipt_id conflicts and leaves the stored row unchanged. Compose or persist failures surface as structured agent_receipt fields on the Harbor evidence response (compose_status, optional warning_code / warning_message) — do not assume a receipt always exists after evidence success.

Fetch by receipt id or by intent and tool call:

HTTP (tenant-bound):

GET /protocol/v2/agent-receipts/{receipt_id}
GET /protocol/v2/agent-receipts?intent_id={uuid}&tool_call_id={id}

Kit:

paybond-session.ts

TS
Code exampleSwipe to inspect long lines
const receipt = await paybond.agent.getReceipt({
  intentId: "…",
  toolCallId: "…",
});
// or: await paybond.agent.getReceipt({ receiptId: "…" });

CLI:

Terminal
Terminal commandSwipe to inspect long lines
paybond login
paybond receipts get <receipt_id> --kind agent --format json
paybond receipts verify <receipt_id> --kind agent --format json

Offline verify (no tenant fetch): POST /protocol/v2/agent-receipts/verify with the full receipt JSON body, or Kit TypeScript/Python verify helpers. Pass ?validity_tier=operational|primary|attested (default operational) when auditors need a stronger multi-party bar — see Verify modes.

Sandbox-friendly workflow

Run a local middleware smoke path, then inspect receipts:

Terminal
Terminal commandSwipe to inspect long lines
paybond dev loop --offline   # terminal 1
paybond dev trace            # terminal 2 — timeline at http://127.0.0.1:9477

Or explicit smoke:

Terminal
Terminal commandSwipe to inspect long lines
paybond login
paybond agent sandbox smoke \
  --operation paid-tool \
  --requested-spend-cents 100 \
  --evidence-preset cost_and_completion \
  --result-body '{"status":"ok","cost_cents":100}' \
  --format json

After evidence submit, use paybond receipts get … --kind agent with the returned receipt_id or derived id from intent and tool call. See Agent middleware for the full bind → execute → evidence flow.

MCP resource handoff

Agent-to-agent receipt fetch

Hosts pass paybond://receipt/{receipt_id} between agents. resources/read verifies at the operational tier before handing off signed JSON.

The Paybond MCP server’s ARS role is agent-to-agent receipt handoff—not a full auditor console:

ItemValue
URI templatepaybond://receipt/{receipt_id}
MIME typeapplication/json
SourceTenant-bound GET /protocol/v2/agent-receipts/{receipt_id}
Verify on readOperational-tier signature check (schema, digest, Gateway Ed25519)

Hosts call resources/read on paybond://receipt/{receipt_id} to fetch signed JSON without embedding it in prompts. Verification failure returns a clear error. Readonly tools paybond_get_agent_receipt_v1 and paybond_verify_agent_receipt_v1 (optional validity_tier) mirror the settlement-receipt pattern. Validity tiers beyond a quick handoff check, continuity-chain, inclusion proofs, owner disclosure, and ACTA/PEF/SCITT adapters stay on Kit TypeScript/Python, CLI, and Gateway. Details: MCP server — agent receipt resources. For MCP spend setup, see MCP agent spend controls.

Operator counter-signature (optional)

When present, operator_attestation is a detached Ed25519 signature over the Gateway message_digest_sha256_hex — not a second canonical body. Verifiers must confirm the attestation digest matches the Gateway digest before checking the operator key. The attestation operator_did must equal authorization.agent.operator_did.

Gateway compose does not require this block. Kit attach helpers add it when an operator signing key is available (model attestation for downstream trust registries). Authenticated verify with trust_mode=tenant_registry defaults operator registry checks on (empty registry rejects the attestation). Public Gateway JWKS verify leaves registry checks opt-in unless you request the attested validity tier.

Verify modes (validity tiers)

Auditors and downstream verifiers can require a named bar beyond “Gateway signature verifies”:

TierRequirements
operational (default)Gateway signature, schema, and receipt_id binding
primaryOperational plus Harbor-verified payee signature digest present and consistent with the intent
attestedPrimary plus operator attestation with a registry-checked signing key

Gateway: POST /protocol/v2/agent-receipts/verify?validity_tier=primary (or attested). Offline verify helpers use the same tier names. Details: Agent receipts — trust model.

Continuity across a run

For multi-step agent runs, action compose may attach optional continuity fields (run_id, sequence_number, prev_message_digest_sha256_hex) that hash-link each action receipt to the prior one in the same run. Verify fail-closes when continuity is present and broken. Receipts without continuity remain valid at the requested validity tier.

Mandate binding and settlement outcome

When an AP2 mandate attestation is attached, the signed receipt may also carry load-bearing authorization fields:

FieldMeaning
authorization.mandate_digest_sha256_hexVerified mandate envelope digest (must match an agent_mandate_v1 external attestation)
authorization.mandate_reference_idOptional mandate reference (must match the attestation reference_id when both are set)

For intent-terminal receipts, compose also sets a categorical outcome.settlement_outcome:

Harbor / dispute-terminal statesettlement_outcome
released, resolved_splitSETTLED
refundedREVERSED
escalated_external, disputedPENDING_FINALITY
failedFAILED

references.settlement_receipt_id remains available as today. Older receipts without these optional fields remain valid.

Tenant transparency (inclusion proofs)

When a receipt persists, Gateway also appends an idempotent leaf (message_digest_sha256_hex) to a tenant-scoped append-only Merkle log (RFC 6962-style). Possession of signed JSON plus an inclusion proof proves issuance against a published Signed Tree Head (STH):

RoutePurpose
GET /protocol/v2/agent-receipts/tree-headCurrent STH for the authenticated tenant (signed with the agent-receipt key)
GET /protocol/v2/agent-receipts/{receipt_id}/inclusion-proofInclusion proof and embedded STH for one receipt

Offline helpers: Kit TypeScript/Python verifyAgentReceiptInclusion / verify_agent_receipt_inclusion. Cross-tenant proof fetch returns not found. This is not a public world log — leaves never leave the authenticated tenant boundary.

Interop export adapters

After you have a verified ARS receipt, Kit can project or wrap it for partner ecosystems without changing the native wire format:

  • ACTA — decision-receipt shaped JSON for MCP/governance handoff
  • PEF — content-addressed Payment Evidence Frame (claim_type=paybond_agent_receipt_v1); audit export includes a companion *.pef.json alongside the signed receipt
  • SCITT — COSE Signed Statement over the ARS message digest for registration elsewhere

These are export adapters over a verified receipt — not alternate compose paths.

Confidential owner disclosure

When an operator needs a confidential handoff beyond the public receipt, Kit can encrypt a derived, still hash-only disclosure package to an owner's key. The signed public receipt stays digest-only; owner disclosure is a separate artifact and is never part of the signed body.

Optional TEE / ZK digest slots

The schema reserves optional slots for TEE execution and ZK policy-proof digests. Verifiers accept well-formed digests when present; Gateway compose does not emit them yet.

Audit export and Signal inputs

  • Compliance bundles — opt-in agent_receipts include stores each receipt at agent_receipts/{receipt_id}.json plus a PEF companion *.pef.json. Verify with paybond receipts verify --kind agent or POST /protocol/v2/agent-receipts/verify. See Ledger and provenance.
  • Signal fraud inputsAGENT_RECEIPT_VOLUME_SPIKE and AGENT_RECEIPT_POLICY_DRIFT derive from gateway receipt rows (score-neutral operator signals).

Derived views

ViewDoc
Human-readable PDFAgent receipt PDF export
OpenTelemetry span attributesAgent receipt OTEL mapping

PDFs are presentation-only; signed JSON remains canonical. Before rendering or accepting a PDF, run the verification gate documented in Agent receipt PDF export: verify signed JSON first, validate paybond.agent_receipt_pdf_export_manifest_v1, stamp receipt_id and message_digest_sha256_hex in the footer, and never embed unsigned JSON as authority.

Specification

Normative references

This guide is product-oriented. Implementers should use the platform doc and published schema for field-level contracts.

  • Platform reference: Agent receipts
  • Conformance: kit/agent-receipt/conformance/ in the repository
  • JSON Schema: GET /.well-known/agent-receipt-v1.json
  • Signing keys (JWKS): GET /.well-known/agent-receipt-signing-keys.json