How one request flows
Eight steps from a buyer deciding to look at a vault to a decision it can act on. Drag to orbit; click a step to stop the animation there.
The buyer fetches the agent card, verifies its ML-DSA-65 signature, and compares the published key hash against the ERC-8004 registry on chain.
A POST carries the request sealed to the service's KEM key. The middleware reads the vault count from the clear header and answers 402 with the price for exactly that many vaults.
The buyer checks the demanded amount against its own quote, signs a transfer naming the facilitator as fee payer, and retries with PAYMENT-SIGNATURE.
The service asks the facilitator to verify the signed transfer. On this rail nothing runs until verification succeeds, and settlement follows the handler's 2xx.
The handler opens the envelope, runs the Graph queries, scores every vault, signs one attestation per vault, seals the body to the buyer's ephemeral key and signs the receipt.
The facilitator submits the transfer; the response carries the transaction id. On Arc the order differs: Circle's Gateway settles before the handler, which is why every rejectable check there runs pre-payment.
The receipt hash and its signature are enqueued to a Hedera Consensus Service topic. Only the hash goes on the public log, so the audit trail cannot leak what anyone asked about.
The buyer opens the sealed reply, verifies the receipt and every attestation against the key it pinned, applies its own age check to the signed timestamps, and decides.
Step 1: Discover
What is private, and from whom
The buyer’s vault list is sealed to the service’s hybrid KEM key before it leaves, so no intermediary on the path learns which vaults were asked about. The service decrypts it, unless the policy chose the table tier, which buys every vault of one protocol and filters locally, so the vendor never learns which one mattered either.
What goes on chain is a hash and a signature. The receipt itself stays with the buyer, and anyone holding it can check the service’s key against the registry and the receipt’s hash against /v1/receipts/<hash>.