For agents and the people who run them

Discover a door, read what is free, pay through x402, verify against the public root.

Five steps, each one a request you can make right now. The door list, the free and paid tool names and the verify route below are read from the live manifest when this page loads. The amount for any paid door lives only in the 402 challenge that door returns — nothing on this page types a price.

1 · Discover — one GET, every door

The manifest is the source of truth for what exists. Each entry names the method, what the payment is for, and which public indexes carry it. Read it every time; do not cache door lists.

curl -s https://councilof.ai/.well-known/x402.json | jq '.resources[] | {url, method, paid_for}'

The manifest did not load in this browser. The command above reads it directly.

2 · Read what is free

Most doors have a free preview that returns the live read without the signed, deliverable form. The MCP server exposes the free tools the manifest names; a client needs no wallet for them.

curl -s 'https://councilof.ai/api/<door>?preview=1' | jq '.card.payload'
# MCP (Streamable HTTP) — no wallet needed for the free tools
curl -s -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \
  -X POST https://councilof.ai/mcp -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

3 · Pay a door — the 402 is the contract

Call the door with no payment. It answers 402 with a PAYMENT-REQUIRED body: an accepts[] entry naming scheme, network, asset, payee and the amount in atomic units, plus the bazaar extension an index reads. Settle that entry with any x402 client; retry with the payment header and the door returns the deliverable. A settlement of zero is not a purchase, and our own wallets are never counted as buyers.

curl -si 'https://councilof.ai/api/<door>' | sed -n '1p;/^{/,$p' | jq '.accepts[0] | {scheme, network, asset, payTo, maxAmountRequired}'
# with an x402 client (any implementation that speaks x402 v2), e.g.
npx -y x402-fetch 'https://councilof.ai/api/<door>'   # pays the challenge from the caller's wallet, prints the response

The same paid tools are reachable through MCP: call a paid tool without x_payment to get its challenge, then pass the payment as the x_payment argument.

4 · Verify — signature, then inclusion

Every deliverable is a card: Ed25519-signed under the published DID key, and either already a leaf of the public Merkle root or staged for the next one. Verify the signature offline, then the leaf against the root the site publishes. A signature proves who signed the bytes; it does not make the read correct — that is what the correction path is for.

curl -s https://councilof.ai/root.json | jq '{card_count, merkle_root, as_of}'
curl -s https://councilof.ai/interop/root-witness-pointer.json | jq '.witnesses'   # OTS (Bitcoin) + Rekor

In a browser: /gspc-verify recomputes the signature client-side. In MCP: the verify tools the manifest names.

5 · Correct — the path is public

A read can be wrong: a stale escrow address, a predicate that missed a case. Corrections are published beside the record, never by editing signed bytes. The register is at /corrections; the revenue contract and the count of distinct outside payers live at /api/revenue.

Measurement, never certification. A grade is never sold. Verify stays free.