Initial wedge

API/data commerce is the first market.

SettleProof should start where delivery evidence is objective: paid API responses, data feeds, reports, scraping, inventory checks, and other machine-readable resources. The agent pays, the merchant returns data, and the proof is a canonical hash of what was delivered.

Why this wedge first

ReasonWhy it matters
Objective deliveryHTTP status, response hash, request id, and timestamp are easier to verify than hotel quality or physical delivery.
Agent-nativeAutonomous agents already call APIs, scrape pages, buy reports, and query data services programmatically.
x402 fitHTTP 402 can initiate payment; SettleProof adds post-payment settlement evidence after the response is delivered.
Low beta riskMainnet beta can start with low-value API escrows and strict limits before moving into travel or commerce.

Canonical proof template

The primary template is api-delivered-v1. Merchants hash a canonical evidence payload, then submit the 32-byte digest as the on-chain proof_hash.

{
  "proof_template_id": "api-delivered-v1",
  "request_url": "https://merchant.example/api/report",
  "status_code": 200,
  "content_sha256": "<sha256 response body>",
  "delivered_at": "2026-04-28T12:00:00.000Z",
  "request_id": "req_123",
  "task_hash": "<escrow task hash>",
  "merchant_statement": "Merchant attests that the requested API response was delivered for the bound task hash."
}

Agent integration shape

import {
  AapClient,
  SettleProofApiClient,
  buildApiDeliveryEvidence,
  proofHashForEvidence,
  hexToBytes,
} from "@aap/sdk-ts";

const api = new SettleProofApiClient();
const quote = await api.prepareEscrow({
  agent_owner: agent.publicKey.toBase58(),
  merchant: merchantPubkey.toBase58(),
  mint: usdcMint.toBase58(),
  amount_stroops: "1000000",
  ttl_seconds: 3600,
  task_intent: "GET https://merchant.example/api/report?id=abc",
});

await client.createEscrow({
  agentOwner: agent,
  merchantPubkey,
  mint: usdcMint,
  amountStroops: 1_000_000n,
  taskHash: hexToBytes(quote.data.inputs.task_hash),
  ttlSeconds: 3600,
});

const evidence = await buildApiDeliveryEvidence({
  requestUrl: "https://merchant.example/api/report?id=abc",
  statusCode: 200,
  responseBody: responseJson,
  taskHash: quote.data.inputs.task_hash,
});

const proofHash = await proofHashForEvidence(evidence);

Expansion path

PhaseVerticalEvidence maturity
1API/data commerceResponse hash + request id + status code
2Digital goodsEntitlement/license hash
3TicketsTicket id + entitlement hash
4Travel/commerceBooking/shipment proof with stronger merchant policy

Positioning

x402 starts the payment. SettleProof settles whether delivery happened.