Machines, agents, and developers find what's on the mesh and how to use it.
Every Anvil-Mesh node describes itself. Topics have metadata. Publishers have identities. Demand is visible. Payment requirements are published. A new participant — human, agent, or script — can arrive at any node and understand what's available without reading documentation.
curl http://any-node:9333/topicsReturns all topics with envelope counts, last update times, and metadata:
{
"topics": [
{"topic": "oracle:rates:bsv", "count": 42, "last_updated": 1712345678, "metadata": {"description": "BSV/USD price feed", "update_interval": "60s"}},
{"topic": "anvil:catalog", "count": 3, "last_updated": 1712340000}
],
"count": 2
}curl http://any-node:9333/topics/oracle:rates:bsvReturns everything about a topic: metadata, publisher, price, demand, and publisher identity if available.
curl http://any-node:9333/identity/02abc...defReturns the publisher's self-declared profile (name, description).
curl http://any-node:9333/.well-known/x402Returns all gated endpoints and their prices in satoshis.
curl http://any-node:9333/overlay/lookup?topic=anvil:mainnetReturns all known nodes with identity, domain, and version.
curl http://any-node:9333/mesh/nodesAuthoritative merged view of federation nodes from three sources: overlay
SHIP registrations (identity ↔ URL), signed heartbeat envelopes (live
liveness), and direct gossip adjacency (WebSocket peers). Each entry
carries evidence flags so consumers can decide which nodes to trust.
curl http://any-node:9333/mesh/statusLive snapshot including upstream_status.broadcast (healthy|degraded|
down) and headers_sync_lag_secs. Wallets poll this every 30–60s for
federation-node failover decisions. CORS-only, no rate limit, no x402.
curl http://any-node:9333/.well-known/anvilReturns the node manifest including any operator-declared custom capabilities (AVOS oracles, custom data relays, etc.). The shape is schema-less — agents parse whatever fields the operator chose to publish.
GET /topics → list of available data
GET /topics/{topic} → detail with metadata, price, demand
The machine reads topic metadata (schema, update interval, price) and decides whether to subscribe. Demand count shows how popular the topic is.
GET /data?topic=oracle:rates:bsv → 402 Payment Required (if priced)
Build a BSV transaction paying the challenge amount. Standard P2PKH — any BSV wallet SDK can build it.
GET /data?topic=oracle:rates:bsv
X402-Proof: <base64-encoded payment proof>
GET /data/subscribe?topic=oracle:rates:bsv → SSE stream
POST /sendMessage
{"recipient": "02abc...def", "messageBox": "inbox", "body": "hello"}
If you're building an AI agent that needs to:
- Find data —
GET /topicslists all available topics with metadata - Read real-time data —
GET /data/subscribe?topic=...for SSE push - Pay for premium data — read
/.well-known/x402, build payment, include proof - Publish data — sign an envelope and POST to
/data - Send messages to other agents —
POST /sendMessagewith recipient pubkey - Verify data authenticity — check envelope signatures (all fields are signed)
- Declare your identity — publish to
identity:<your-pubkey> - Describe your topics — publish to
meta:<your-topic>
The entire flow is HTTP + JSON. No WebSocket required for consumers. No API keys. No accounts.
Your node automatically participates by running. Every endpoint is discoverable. If you enable pricing, machines pay you directly.
To maximize discovery:
- Peer with other nodes (gossip spreads your registration)
- Set pricing if you want revenue (
payment_satoshis > 0) - Publish topic metadata so consumers know what you serve