AERONDocs GitHub
rwa.aeron.sh

Tokenized-stock data.

Prices, holdings, and corporate actions for the 194 Robinhood stock tokens — with the share price and the token price kept apart.

Prices, holdings, and corporate actions for the 194 Robinhood stock tokens on Robinhood Chain, sold per call. The catalogue is free so an agent can see what exists before paying; the three data routes are bought through the marketplace.

The number most integrations get wrong

Every stock token carries an ERC-8056 corporate-action multiplier:

formula
token price = underlying share price × multiplier

Robinhood’s REST /prices returns the share price. The on-chain Chainlink feed returns the token price. They are different numbers: 8 of the 194 assets have a multiplier away from 1.0, and CRWD’s is 4.0 — read the wrong one and you are out by 4×.

This service returns both, named share and token, and never mixes them. Money is computed from unrounded inputs and rounded once, at six decimals, because rounding a unit price before multiplying by a quantity pushes the error up with the quantity.

Endpoints

EndpointPaid
GET /v1/assetsfreeThe catalogue — what exists, before you pay for anything.
POST /v1/quotepaidShare price, token price, multiplier, halt flag.
POST /v1/holdingspaidEvery tokenized asset a wallet holds, valued.
POST /v1/corporate-actionspaidSplits and dividends with their process dates.
POST /v1/askpaidA question in words, answered from the three above. Refuses advice.
GET /healthzfreeStatus and the marketplace signer this service trusts.
GET /.well-known/agent-card.jsonfreeThe same data as an A2A agent; see below.
bashbuy a quote
curl -X POST https://market.aeron.sh/s/aeron-rwa-quote \
  -H 'content-type: application/json' \
  -d '{"symbols":["AAPL","CRWD"]}'

That answers 402 first. Pay it with the wallet, or with your own signer.

The paid routes accept calls forwarded by the marketplace and refuse strangers: /healthz names the signer address they trust, which is how a merchant on this rail tells a paid call from an unpaid one.

As an A2A agent

The same skills are published as an A2A 0.3 agent, paid through the A2A x402 extension: x402 v1, scheme exact, USDG on eip155:4663, the same rail as the routes above. The card is at /.well-known/agent-card.json; the JSON-RPC endpoint is POST /a2a with message/send, tasks/get and tasks/cancel. No streaming, no push.

SkillPrice
assetsfreeThe catalogue.
quote0.65 USDGShare price, token price, multiplier, halt flag.
holdings0.80 USDGEvery tokenized stock a wallet holds, valued.
corporate-actions0.65 USDGSplits, dividends, mergers with process dates.
ask1.00 USDGA question in words, every figure returned in sources.

A paid skill takes two messages. The first stops at input-required with the price under metadata["x402.payment.required"]. The second carries the same taskId and a signed authorization under x402.payment.payload, and is settled in the order the rail settles everything:

order
verify → run the skill → settle → completed, with x402.payment.receipts

Nothing settles until the skill has answered, so an upstream failure costs the buyer nothing. ask is screened before a price exists: a question asking for advice is rejected and never sees a payment request. A replayed authorization fails as DUPLICATE_NONCE before the facilitator is asked. A price stands for ten minutes; after that the task closes itself and the client asks again.

bashprice a quote
curl -s https://rwa.aeron.sh/a2a -H 'content-type: application/json' -d '{
  "jsonrpc":"2.0","id":1,"method":"message/send",
  "params":{"message":{"messageId":"m1","role":"user",
    "parts":[{"kind":"data","data":{"symbols":["AAPL","CRWD"]}}]}}}'

Skills are picked from metadata.skill, or from the shape of the message: a data part with an address is holdings, one with symbols is quote, plain text is ask. The artifact is the body the REST route returns, and ask adds its prose as a text part beside it.

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