AERONDocs GitHub
market.aeron.sh

A directory of paid endpoints.

List a machine-payable endpoint without an account, or find one to call. Buyers settle straight to the merchant’s wallet.

A registry of machine-payable endpoints. A merchant lists an endpoint and a price in USDG; an agent finds it in the directory, calls it through the marketplace, answers the 402, and the money lands in the merchant’s own wallet.

Design decision

x402’s exact scheme settles one transfer to one recipient, so “the builder gets paid” and “Aeron takes a cut” cannot both happen in one transfer without a splitter contract. This service picks the builder: payTo on every 402 is the address on the listing, never Aeron’s. The take-rate is recorded per sale as an accrued receivable and billed out of band.

Endpoints

Endpoint
GET /v1/servicesThe directory. Filter with ?category= and ?q=.
GET /v1/services/{slug}One listing.
POST /v1/servicesRegister a listing. Wallet signature, no account.
PATCH /v1/services/{slug}Change price, endpoint, or status. Owner only.
POST /s/{slug}Call a service, paid via x402.
GET /ledger/statsPublic sales ledger.
GET /healthzStatus and facilitator mode.

Listing without an account

There are no accounts. A merchant proves control of an address by signing a statement that names exactly what it authorises:

textthe signed statement
Aeron Marketplace
Sign to prove this wallet controls the listing. This authorises no payment.

action: register
slug: acme-ocr
address: 0x…
issued: 2026-08-30T09:00:00.000Z
body: <sha256 of the request body>

Sent as x-aeron-address, x-aeron-signature, x-aeron-issued. Change the action, the slug, or a byte of the body after signing and the signature stops matching, so one signature cannot be reused for a different call. Signatures expire after five minutes and are spendable exactly once.

What a listing may point at

Every listing becomes a URL this Worker fetches on a buyer’s behalf, so an unchecked endpoint is an SSRF hole. Plaintext http, embedded credentials, loopback, private and link-local ranges, cloud metadata, and internal-only suffixes are rejected — at registration and again at call time, so a listing edited after the rules tightened is not reachable.

It matches on the hostname as written, so it cannot stop a public name that resolves to a private address. It is a filter on obvious abuse, not a guarantee.

Requests to merchants are rebuilt rather than forwarded: the buyer’s payment header, cookies, and credentials never cross over. Only the body and two identifying headers do — x-aeron-buyer and x-aeron-payment-ref — and the marketplace signs its forwarded calls so a merchant can tell a paid call from a stranger’s.

Order of operations

A payment is verified and settled before the merchant is called. A merchant that fails afterwards leaves a buyer who has already paid, so that call is recorded as failed_after_settle rather than dropped — including a 5xx from the merchant — and can be reconciled.

That is the opposite order from a single seller, and deliberately so: the marketplace cannot know whether a third-party merchant delivered, so it records the discrepancy instead of pretending to judge it.

Updated 1 September 2026. Everything on this page is read from the running services; report a drift at github.com/aeronlabs.