Solana settlement verification: settle_v1

Published 2026-09-01. Binding specification, frozen after publication.

This document is the binding specification for the settlement verification envelope, schema version settle_v1. It is frozen after publication. Changes happen only at an announced version boundary with a new schema_version.

The service answers one question about one Solana mainnet transaction and returns one signed verdict: did transaction tx credit amount atomic units of mint to payee, and optionally was payer a signer. It reads only public on chain data over the mainnet-beta JSON RPC. The paid call is 0.01 dollars in USDC on Base.

What it is

One call, one subject, one verdict. There is no composition and no aggregate score. The envelope carries the asserted claim, the verdict, a per field breakdown when the transaction is finalized, and the observation context (commitment, slot, confirmations), all signed.

The amount check is exact and at the token account level: the observed amount is the net of the asserted mint credited to the payee across the transaction's pre and post token balances. VERIFIED requires that total to equal the asserted amount exactly, not merely to be at least it.

The request

GET /settle with query parameters:

The verdict envelope

Present depending on verdict:

The verdicts

Refusal shapes

Two refusals are part of the contract from the first version, both before any RPC read, both no charge, both no envelope:

Signatures and offline verification

Signer: 0x57fF0F084Cba33e6761503f90eEF0Da9F159350c, published in the proof manifest as the signer of the settle service entry. Signing is Ethereum EIP-191 personal_sign over canonical JSON: json.dumps with sort_keys true and separators of a comma and a colon, which escapes non ASCII as backslash u sequences.

To verify an envelope offline:

  1. Take the envelope. Remove signature only. Keep signer.
  2. Canonicalize the remainder: keys sorted, compact separators, non ASCII escaped.
  3. Recover the signer from the EIP-191 signature over that string. It must equal signer.

What the schema cannot express, verify these yourself

JSON Schema validation is necessary but not sufficient. A document can be schema valid and still be wrong or tampered. A consumer MUST also perform these checks in code, because the schema cannot express them:

If any of these fail, treat the envelope as untrusted, the same as a signature mismatch.

Point in time, not a guarantee

Every verdict is point in time evidence at its observed_at. A finalized Solana transaction is irrevocable, so VERIFIED and REFUTED over a finalized transaction do not decay. UNCONFIRMED and NOT_FOUND are snapshots that can change as the chain advances. This verifies that a transfer happened, not what it was for; binding a request to a payment is the facilitator layer, not this service.

Example envelope

This is the verified fixture, a real historical finalized USDC transfer on Solana mainnet. The signature is truncated here; the published fixture carries it in full.

{
 "schema_version": "settle_v1",
 "request": {
  "tx": "5ygvXjuYao3MtHQkWzBvgXxjg9vWAoG6rMM6qVjPDLym...",
  "asserted": { "payee": "8SfS2XEedD595GqpNGjgYpRhSAUidThXQHznExpbDwEX", "amount": "415803", "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" }
 },
 "verdict": "VERIFIED",
 "chain": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
 "observed_at": "2026-09-01T...Z",
 "limitations": ["verifies the transfer happened, not what it paid for; request-to-payment binding is the facilitator layer", "..."],
 "signer": "0x57fF0F084Cba33e6761503f90eEF0Da9F159350c",
 "manifest": { "url": "https://x402.nsgoods.org/proof/index.json", "entry": "settle" },
 "fields": [
  { "field": "payee", "asserted": "8SfS2XEe...", "observed": "8SfS2XEe...", "match": true },
  { "field": "mint", "asserted": "EPjFWdd5...", "observed": "EPjFWdd5...", "match": true },
  { "field": "amount", "asserted": "415803", "observed": "415803", "match": true }
 ],
 "commitment": "finalized",
 "slot": 443406404,
 "confirmations": null,
 "signature": "0x..."
}

Preview

GET /settle/preview is free and returns a locked preview of a real historical verification: the verified envelope above, frozen once. Three fields, preview, note and demo_note, are added after signing. To verify the preview, strip preview, note and demo_note, then remove signature and keep signer, canonicalize, and recover.

Fixtures and schema

verified and refuted-amount are the same real transaction: the first with the correct asserted amount, the second with the asserted amount off by one atomic unit, a real REFUTED run with the amount field mismatch shown. not-found is a valid format signature that does not exist, a real NOT_FOUND run. invalid-subject is the real HTTP 400 refusal body. signing-unavailable is the HTTP 503 refusal body.

The paid /payable and /screen endpoints and the preflight composite are unrelated to this service. Signed report manifest at /proof/index.json.