For builders
Public API
Montra's indexer reads the chain and serves what it finds as a public JSON API: tokens, prices, charts, trades, holders and wallets. It is read-only, needs no key, and is the same API this site runs on.
On this page
- Base URL
- https://api.montramarkets.xyz
- Auth
- None
- Open to any origin for reads.
- Live trades
- SSE
- Server-sent events, up to 12 streams open at once per client.
- Format
- JSON
- Pages of tokens; trades and events paged with before.
How answers are written
Every route that reads is a GET; the two that store a launch's image and document are POST, under Launch a token. Amounts are integer strings in the asset's smallest unit; prices are decimal strings in the quote asset per whole token, to 36 decimal places, and market caps decimal strings in the quote asset, never with an exponent; times are milliseconds since 1970, except the day of /api/stats/daily, a date written YYYY-MM-DD; addresses are lowercase, and an address not set is null.
Requests are rate limited per client: a 429 means slow down. A bad parameter answers 400 and names the field. The API never signs anything and holds no key; anything that moves value is a transaction from your own wallet.
curl -s "https://api.montramarkets.xyz/api/tokens?sort=new&limit=5"
{
"tokens": [{
"address": "0x…", "name": "…", "symbol": "…", "poolId": "0x…",
"quote": { "address": "0x0000…0000", "symbol": "HYPE", "decimals": 18, "native": true, "usd": 40.5 },
"supply": "1000000000000000000000000000",
"price": "0.000000003500000000000000000000000000", "marketCap": "3.5", "volume24h": "…",
"totalFeePips": 20000, "recipientKind": "holders",
"graduation": { "stage": "new", "progressBps": 1640, "graduatedAt": null },
"lpLine": { "progressBps": 410, "active": false, "activeAt": null }
}],
"total": 41, "page": 1, "pages": 9
}Token cards
/api/tokens, a wallet's token lists and the top of /api/tokens/{token} answer with the same card. Its amounts are in the token's smallest unit (18 decimals) or the quote's, as the table says.
Field
address,name,symbol- Typestring
- What it isThe token, as launched.
imageUrl- Typestring or null
- What it isA URL a browser can load, null for no image.
creator,poolId- Typestring
- What it isThe wallet that launched it, and its pool.
quote- Typeobject
- What it is
address,symbol,decimalsandnative, withusd(dollars per whole unit, null where nothing prices it),usdSource(dollar,hypercoreorroute) andusdAt(when it was read, null for a dollar or no price). supply,burned- Typestring
- What it isTokens minted, and burned since.
price,priceUsd- Typestring or null, number or null
- What it isThe pool's price after the last trade, in the quote per whole token, and in dollars at the quote's price now.
marketCap,marketCapUsd- Typestring or null, number or null
- What it is
pricetimessupplylessburned. volume24h,volume24hUsd- Typestring, number or null
- What it isThe last 24 hours' volume, in the quote's smallest unit and in dollars.
volume1h,volume1hUsd,traders1h- Typestring, number or null, number
- What it isThe last hour's volume, and how many wallets traded.
change24hPct- Typenumber or null
- What it isPercent, from the close of the last hourly candle begun 24 hours ago or more; null before there is one.
holders,swaps- Typenumber
- What it isWallets holding it, the pool and other custody left out, and trades so far.
launchedAt,lastTradeAt- Typenumber, number or null
- What it isBlock times.
totalFeePips- Typenumber
- What it isThe pool's total fee now, in pips.
recipient,recipientKind- Typestring
- What it isWho the pool's creator fees pay, and what that is:
holders(the token itself),creator,splitterorwallet. liquiditySealed- Typeboolean
- What it isThe pool refuses outside liquidity.
rewardsReceived- Typestring
- What it isWhat its holders' rewards have received, in the quote's smallest unit.
trend- Typenumber or null
- What it isThe score
sort=trendingranks by: dollars moving now, from how many wallets, how much of it buying and how young the market is. Null for a quote with no dollar price, which is left unranked. graduation- Typeobject
- What it is
stage, below;progressBps, how far from the opening to the line in basis points of the quote the seed collects on the way, 10,000 past it;graduatedAt, a time or null. lpLine- Typeobject
- What it isThe same for the LP line:
progressBps,activeandactiveAt.
| Field | Type | What it is |
|---|---|---|
address, name, symbol | string | The token, as launched. |
imageUrl | string or null | A URL a browser can load, null for no image. |
creator, poolId | string | The wallet that launched it, and its pool. |
quote | object | address, symbol, decimals and native, with usd (dollars per whole unit, null where nothing prices it), usdSource (dollar, hypercore or route) and usdAt (when it was read, null for a dollar or no price). |
supply, burned | string | Tokens minted, and burned since. |
price, priceUsd | string or null, number or null | The pool's price after the last trade, in the quote per whole token, and in dollars at the quote's price now. |
marketCap, marketCapUsd | string or null, number or null | price times supply less burned. |
volume24h, volume24hUsd | string, number or null | The last 24 hours' volume, in the quote's smallest unit and in dollars. |
volume1h, volume1hUsd, traders1h | string, number or null, number | The last hour's volume, and how many wallets traded. |
change24hPct | number or null | Percent, from the close of the last hourly candle begun 24 hours ago or more; null before there is one. |
holders, swaps | number | Wallets holding it, the pool and other custody left out, and trades so far. |
launchedAt, lastTradeAt | number, number or null | Block times. |
totalFeePips | number | The pool's total fee now, in pips. |
recipient, recipientKind | string | Who the pool's creator fees pay, and what that is: holders (the token itself), creator, splitter or wallet. |
liquiditySealed | boolean | The pool refuses outside liquidity. |
rewardsReceived | string | What its holders' rewards have received, in the quote's smallest unit. |
trend | number or null | The score sort=trending ranks by: dollars moving now, from how many wallets, how much of it buying and how young the market is. Null for a quote with no dollar price, which is left unranked. |
graduation | object | stage, below; progressBps, how far from the opening to the line in basis points of the quote the seed collects on the way, 10,000 past it; graduatedAt, a time or null. |
lpLine | object | The same for the LP line: progressBps, active and activeAt. |
graduation.stage, and the stage filter, are three columns of a board, not the chain's five stages. graduated is a pool the hook has graduated for good (PoolConfig.stage 2, 3 or 4) or one with no line. graduating is any other pool at 5,000 basis points of progressBps or more, at chain stage Below or Crossed. new is the rest. For the chain's own stage read LaunchHook.poolConfig(poolId).stage, under Contract reference. There is no bonding curve and nothing migrates: how a terminal tracks these.
/api/tokens/{token} adds what the launch named, pool (its terms), stats, rewards, splitter, config, liquidity and live, the pool read from the chain, null when that read fails. pool.feeFixed is true when nobody can lower the total any more: it is locked, at its floor, or paid to holders or a splitter.
Trades and the live stream
/api/tokens/{token}/trades answers { trades: [...] }, and each event of a stream carries one trade with its poolId and token added.
Field
id- Typenumber
- What it isThe trade's row here: what
beforepages by, and the stream's event id. block,logIndex,txHash- Typenumber, number, string
- What it isWhere its
Swaplog is. t- Typenumber
- What it isIts block's time.
sender- Typestring
- What it isWho traded, as below: not always the transaction's
from, nor theSwap'ssender, which is a router. isBuy- Typeboolean
- What it isTrue when the pool gave tokens out.
quoteAmount- Typestring
- What it isWhat the trader paid on a buy, the hook's fee included, or received on a sale, after it: the size of the
Swap's quote amount plushookFeeon a buy, less it on a sale. tokenAmount- Typestring
- What it isThe tokens that moved.
hookFee- Typestring
- What it isThe hook's fee, the
FeeAccruedevent'sfee, an anti-snipe rate's included. The LP fee is apart. price- Typestring
- What it isThe pool's price after this swap, not what the trade paid on average.
| Field | Type | What it is |
|---|---|---|
id | number | The trade's row here: what before pages by, and the stream's event id. |
block, logIndex, txHash | number, number, string | Where its Swap log is. |
t | number | Its block's time. |
sender | string | Who traded, as below: not always the transaction's from, nor the Swap's sender, which is a router. |
isBuy | boolean | True when the pool gave tokens out. |
quoteAmount | string | What the trader paid on a buy, the hook's fee included, or received on a sale, after it: the size of the Swap's quote amount plus hookFee on a buy, less it on a sale. |
tokenAmount | string | The tokens that moved. |
hookFee | string | The hook's fee, the FeeAccrued event's fee, an anti-snipe rate's included. The LP fee is apart. |
price | string | The pool's price after this swap, not what the trade paid on average. |
sender is the trader as far as the chain says. Through Montra's router it is the router's caller (Swapped's sender). On a launch's first buy it is the creator. Through any other router it is the address the token moved to on a buy, or from on a sale, in that swap's transfer, which names the wallet where the Swap names only the router. A router that holds the tokens on the way, or nets two swaps into one transfer, leaves only itself. A contract trading for someone is named in their place.
id: 1042
event: trade
data: {"id":1042,"poolId":"0x…","token":"0x…","block":1234567,"logIndex":2,"txHash":"0x…","t":1793000000000,"sender":"0x…","isBuy":true,"quoteAmount":"250000000000000000","tokenAmount":"71428571428571428571428571","hookFee":"5000000000000000","price":"0.000000003500000000000000000000000000"}A stream opens with a retry: line and sends a : ping comment every 15 seconds. Reconnecting with Last-Event-ID sends the latest 200 trades after it, then goes live; take anything older from the trades route. A client has ten such replays a minute, and past them a stream still opens, live alone. A client that falls a mebibyte behind is dropped.
A client may hold 12 streams at once, a client being an IPv4 address or an IPv6 /64, and an IPv6 /48 may hold 150 in all: past either a new stream answers 429. A stream gives its place back when it closes. Past 5,000 streams in all, a new one answers 503 with retry-after.
Reading the figures
- Volume is the pool's side. Every volume here (
volume24h,volume1h,stats.volume, a candle'svolumeQuote, and the platform's totals) sums theSwap's quote amount, which leaves out the hook's fee. So in an anti-snipe window a pool's fees over its volume can pass 100%. To see what traders spent, sumquoteAmountover the token's trades: what each buyer paid, and on a sale what the seller received. - Candles.
tis the start of the bucket, a whole multiple of the interval counted from 1970. Each figure is the pool's price after a trade, soopenis the bucket's first trade's, not the last bucket'sclose, and a bucket of one trade is flat. A bucket with no trades is not in the answer.fromandtoboundt, both included.volumeTokenis in the token andtradescounts them. - A token with no trades.
price,priceUsd,marketCapandmarketCapUsdare null until its first trade, though the pool has an opening price. Read it from the chain:live.sqrtPriceX96in/api/tokens/{token}, which in the quote per whole token is 2^192 / sqrtPriceX96² × 10^(18 − the quote's decimals) with the quote as currency0, and sqrtPriceX96² / 2^192 × 10^(18 − the quote's decimals) with it as currency1 (pool.quoteIsCurrency0). - Holders.
circulatingin/api/tokens/{token}/holdersissupplylessburned, whoever holds it, the pool included: not what is in wallets.pct,top10Pct,inPoolPctandcreatorPctare percent of it. The list andcountleave out the token, its hook and the pool manager. - Dollar totals.
volumeUsd,volume24hUsd,feesUsdandfees24hUsdin/api/statsadd each quote at its dollar price now, not at each trade's, and skip a quote with no price:quotesshows which have none, andbyQuoteeach quote's totals in its own units. If no quote has a price they read 0. - The buyback's keys. In
/api/buyback,kntqandkntqFloware the one currency the vault's buyback lane keeps out of the sale for HYPE and sells straight for its token, by those keys whatever that currency is: read itssymbolandaddress.statusandtokenare the vault's word, not the registry's:livesays only that the lane pays out in a token through a burner.
Every route
Platform
- /api/config
- The chain id, the contracts' addresses with Uniswap's Universal Router, Permit2 and quoter (each null until the registry names it), the venue, the launch fee and the quote assets a launch can pair with. GET /api/config
- /api/stats
- Totals across every token: launches, holders, volume, fees and swaps, overall and per quote asset. GET /api/stats
- /api/stats/daily
- The last 90 days, per day and quote asset: launches, swaps, volume, fees and the protocol's part. GET /api/stats/daily
- /api/protocol/fees
- The protocol's share of fees: what waits in each hook, what has reached the vault and what it has paid out. GET /api/protocol/fees
- /api/buyback
- The vault's buyback lane: what it holds while no token is named, and once its burner is, what its sales spent and bought and the burner destroyed, by day, with the token's supply and the currency the lane keeps out of the HYPE sale. GET /api/buyback
Tokens
- /api/tokens ?sort, stage, quote, search, creator, route, page, limit
- A page of tokens as cards, 24 unless limit says, up to 100. sort: trending (the default), new, old, mcap, volume, holders, progress, graduated; stage: new, graduating, graduated; route: holders, creator, splitter, wallet. quote and creator are lowercase addresses: a checksummed address or a symbol answers 400. To find a token by name or symbol, use search. GET /api/tokens?sort=new&limit=5
- /api/tokens/{token}
- One token in full: its card, its pool's terms and stats, its holder-reward stats and the pool read live.
GET /api/tokens/{token} - /api/tokens/{token}/trades ?before, limit
- Its trades, newest first, 50 unless limit says, up to 200. Page back with before, the last id you have.
GET /api/tokens/{token}/trades?limit=50 - /api/tokens/{token}/candles ?interval, from, to, limit
- Price candles, the newest 500 unless limit says, up to 2,000, oldest first: interval 1m, 5m (the default), 15m, 1h, 4h or 1d; from and to in milliseconds.
GET /api/tokens/{token}/candles?interval=1h&limit=48 - /api/tokens/{token}/holders ?limit
- The largest holders with their share, the top ten's share, the pool's and the creator's; up to 200.
GET /api/tokens/{token}/holders?limit=20 - /api/tokens/{token}/liquidity ?from, to
- Hourly volume and liquidity in its pool, the positions outside the seed and its pools elsewhere in the same pool manager; a week by default.
GET /api/tokens/{token}/liquidity - /api/tokens/{token}/events ?before, limit
- Its pool's events other than trades: claims, sweeps, fee changes, graduation, the LP fee switching on.
GET /api/tokens/{token}/events - /api/tokens/{token}/rewards ?before, limit
- Its holder-reward events: distributions, claims and pushes.
GET /api/tokens/{token}/rewards - /api/tokens/{token}/rewards/{wallet}
- A holder's rewards read live from the chain: earned now, and the stream it comes from.
GET /api/tokens/{token}/rewards/{wallet} - /api/tokens/{token}/earned/{wallet}
- What holding the token has paid a wallet, automatically and by its own claims, and the block that stands at. Add the token's
earned(wallet)for everything holding it has earned.GET /api/tokens/{token}/earned/{wallet} - /api/tokens/{token}/position/{wallet}
- A wallet's balance of the token and what it has bought and sold.
GET /api/tokens/{token}/position/{wallet}
Wallets
- /api/wallets/{wallet}/holdings
- Every token the wallet holds, as cards with its balance and value.
GET /api/wallets/{wallet}/holdings - /api/wallets/{wallet}/earned
- What holding has paid it, token by token, with the tokens it has sold out of that pay holders, and the block that stands at.
GET /api/wallets/{wallet}/earned - /api/wallets/{wallet}/launches
- The tokens it launched.
GET /api/wallets/{wallet}/launches - /api/wallets/{wallet}/lanes
- The pools whose creator fees it is paid, directly or through a split.
GET /api/wallets/{wallet}/lanes - /api/wallets/{wallet}/trades
- Its last 100 trades across every token, newest first.
GET /api/wallets/{wallet}/trades
Builders
- /api/builders/programme
- Montra Builders: the rules in force (the shares, the caps, the minimum), the terms' version and hash, the week under way and the programme's totals. GET /api/builders/programme
- /api/builders
- The approved builders: each one's codes, name, kind, website and what has been credited and paid to it. GET /api/builders
- /api/builders/periods
- Every week drafted or final: the protocol's revenue, the caps, what builders earned and are owed, the rates, and a final week's hash. GET /api/builders/periods
- /api/builders/accounts/{wallet}
- The builder a wallet is the account of, by its first code, and its standing.
GET /api/builders/accounts/{wallet} - /api/builders/launch-check/{tx}
- A launch transaction as the programme read it: the codes it carried, and whom it credited.
GET /api/builders/launch-check/{tx} - /api/builders/{code}
- A builder's record: its codes and contracts, what it is owed, holds and has been paid, and its week so far.
GET /api/builders/{code} - /api/builders/{code}/stats
- What its public page prints: the tokens launched through it, what they have traded, its top tokens and what it has been paid.
GET /api/builders/{code}/stats - /api/builders/{code}/next-payout
- What the next batch would pay it as things stand, and why it would pay less or nothing.
GET /api/builders/{code}/next-payout - /api/builders/{code}/launches ?page, limit
- The launches credited to it, newest first, with the trades, volume and protocol fee in each one's window and what it came to on final statements; up to 100 a page.
GET /api/builders/{code}/launches?limit=25 - /api/builders/{code}/trades ?page, limit
- The trades through its routers, newest first, and whether each counts; up to 100 a page.
GET /api/builders/{code}/trades?limit=25 - /api/builders/{code}/statements
- Its final statements, one a week: what it is owed and held, its lines and the statement's hash.
GET /api/builders/{code}/statements - /api/builders/{code}/statements/{period}
- One statement in full: the document its hash is of, every line with its pool, trades, protocol fee, share, rate and state.
GET /api/builders/{code}/statements/{period} - /api/builders/{code}/payouts
- Its payouts: each batch's amount, its state and the treasury's transaction that paid it.
GET /api/builders/{code}/payouts
Live
- /api/stream
- Every trade as it is indexed, as server-sent events named trade. Reconnect with Last-Event-ID to be sent what you missed. GET /api/stream
- /api/tokens/{token}/stream
- The same, for one token's pool.
GET /api/tokens/{token}/stream
Metadata and health
- /metadata/{id}.json
- A metadata document stored here: name, symbol, description, image and links, by the id its upload was answered with, which no token route gives. A token launched through Montra names its document on IPFS (ipfs://…), pinned as this one: read it from metadata in /api/tokens/{token}, which metadataUri names. The id in a card's imageUrl is the image's, and answers 404 here.
GET /metadata/{id}.json - /health
- The indexer's state: the block it has read to, the chain's head and how far behind it is. GET /health
