Skip to main content

Indexer API

A read-only REST API (Ponder + Postgres, hosted on Railway) that indexes every IndexPad contract — including tokens launched after deployment, via the factory pattern. CORS is open; all bigint values are serialized as strings.

Base URL (testnet): https://indexpad-indexer-production.up.railway.app

info

The indexer is a convenience for UIs. Nothing in the protocol depends on it — every value can be read directly from the contracts.

GET /stats

Global protocol totals.

{
"id": "global",
"indexCount": 1,
"reserveProcessed": "4000000000000000000000",
"protocolCutTotal": "400000000000000000000",
"distSpentTotal": "3000000000000000000000",
"ipadRedeemedReserve": "0"
}

GET /indexes?limit=50

All index tokens, newest first (limit ≤ 100). Each row includes the launch config (name, symbol, totalSupply, buyFeeBps, sellFeeBps, stocks[], rfvShareBps, treasury, creator, createdAt, txHash) plus a live holders count.

GET /index/:address

One index with its recent history:

{
"address": "0xa4d1…58ee",
"symbol": "MAG7",
"rfvShareBps": 1500,
"holders": 3,
"converts": [ { "reserveIn": "…", "protocolCut": "…", "rfvCut": "…", "distSpent": "…", "timestamp": 1752, "txHash": "0x…" } ],
"dividends": [ { "stock": "0x…", "amount": "…", "timestamp": 1752, "txHash": "0x…" } ],
"claims": [ { "account": "0x…", "stock": "0x…", "amount": "…" } ],
"redemptions": [ { "burned": "…", "reserveOut": "…" } ]
}

Returns 404 {"error": "not found"} for unknown addresses. Limits: 25 converts, 50 dividends, 50 claims, 25 redemptions.

GET /activity?limit=8

A merged, time-sorted feed across all indexes (limit ≤ 30) — powers the app's live activity panel. Event shapes by type:

typeExtra fields
launchsymbol, stockCount
convertreserveIn, distSpent
dividendstock, amount
redemptionburned, reserveOut

All events carry index, symbol, timestamp, txHash.

GET /token-holders/:address

Every non-zero holder of an index:

[ { "account": "0x9C10…30C8e", "balance": "989999999999999999999900" } ]

Running your own

The indexer lives in indexer/ — configuration via CHAIN_ID, PONDER_RPC_URL, INDEX_FACTORY_ADDRESS, FEE_PROCESSOR_ADDRESS, PROTOCOL_TREASURY_ADDRESS, START_BLOCK, and DATABASE_URL (PGlite locally). See the deployment runbook.