DEVELOPERS · TOKEN API v1
Every memestock, as data
Price, market cap, FDV, volume, liquidity and the value of the basket behind every token launched on memestock.market, with its trades, its price history, its supply, its logo and its links. For launchpads, screeners, wallets, bots and dashboards that list our tokens and want to show exactly the figures we show. Every number is read from Base itself, not from a third party.
Base URL: https://memestock.market/api/v1
Quick start
Three calls cover most integrations: the list, one token, one number.
# every token curl https://memestock.market/api/v1/tokens # one token (ticker, token address or hook address) curl https://memestock.market/api/v1/tokens/BRK.M # one number, as text curl https://memestock.market/api/v1/tokens/BRK.M/price
Try it
Every call below runs live against Base from this page.
curl "https://memestock.market/api/v1/tokens/BRK.M"
What you can build
- List our tokens on your launchpad or screener.
/api/v1/tokensgives every token with its figures;?sort=volume,neworchangeorders them. - A token page.
/api/v1/tokens/{id}for the figures and the basket,/chartfor the price line,/tradesfor the tape,/logofor the image,infofor the description and socials. - Plug into code that already reads DexScreener. Add
?format=dexscreenerand the answer is a DexScreener pair. - Supply endpoints for CoinGecko and CoinMarketCap.
/total-supplyand/circulating-supplyanswer a bare number. - Show only real tokens.
official.isGenuineis the launch factory's own word that the token is ours, and you can check it onchain yourself. - Widgets, bots, alerts. One number at
/price,/marketcap,/change-24h; a small HTML card is below.
Endpoints
All are GET, answer JSON unless said otherwise, and accept the token as its ticker (any case, with or without the dot), its token address or its hook address.
GET/api/v1/tokens
Every token launched on memestock.market, with its full figures (no basket breakdown).
| sort | marketcap (default), volume (24 h), new (latest launch first), change (24 h move) |
| format | dexscreener: the list as DexScreener pairs, { schemaVersion, pairs: [...] } |
| test | 1: include the rehearsal markets (test houses), off by default |
→ { ok, count, updatedAt, source, docs, tokens: Token[] }
GET/api/v1/tokens/{id}
One token, with its basket holding by holding. {id} is the ticker in any case, with or without the dot (BRK.M, brk.m, BRKM), the token address or the hook address.
| format | dexscreener: { schemaVersion, pairs: [Pair] } |
→ { ok, ...Token, basket: Leg[] }
GET/api/v1/tokens/{id}/{field}
One number as plain text, never in exponent notation: price, marketcap, fdv, volume (24 h), volume-7d, liquidity, basket, change-24h, change-7d, holders, total-supply, circulating-supply.
→ text/plain, e.g. 0.0000412
GET/api/v1/tokens/{id}/trades
The last trades of the past 24 hours, newest first.
| limit | 1 to 100, default 50 |
→ { ok, ticker, quote, window, trades: [{ time, block, tx, side, amountTokens, amountQuote, amountUsd, priceUsd }] }
GET/api/v1/tokens/{id}/chart
The price back in time, as the chain held it at each step.
| days | 1 (every hour, 25 points, default), 7 (every 6 hours), 30 (every day) |
→ { ok, days, step, points: [{ time, priceUsd, priceQuote }] }
GET/api/v1/tokens/{id}/logo
The token's logo as an image (or a redirect to it), ready for an <img> tag.
→ image/png | image/jpeg | image/webp | image/svg+xml, or 404
Response fields
Amounts are whole tokens and dollars, never raw units. Percentages are percent (6.85 means +6.85%). A figure that cannot be read right now is null, never 0.
Identity
| Field | Type | What |
|---|---|---|
ticker | string | The ticker the IMO house fixed (BRK.M). |
name, symbol | string | The token's own name and symbol. |
chain, chainId | string, number | "base", 8453. |
token | address | The memestock's contract, a B20 token on Base (18 decimals). |
hook | address | Its Uniswap V4 hook: the market maker that holds the unsold supply and the basket. |
poolId | bytes32 | The Uniswap V4 pool id (what DexScreener and GeckoTerminal call the pair address). |
house | address | null | The IMO house that sold it. |
launchedAt | ISO date | null | When the market launched. |
official | object | { factory, isGenuine }: its launch factory and that factory's isGenuine(hook), read onchain. |
Price and size
| Field | Type | What |
|---|---|---|
priceUsd | number | null | Dollars per token. |
priceQuote | number | Price in the quote: the tokenized stock the market trades against (quote.symbol). |
quote | object | { token, symbol, decimals, priceUsd }: the tokenized stock and its dollar price. |
marketCapUsd | number | null | priceUsd × supply.circulating. |
fdvUsd | number | null | priceUsd × (supply.total − supply.burned). |
supply | object | { total, burned, locked, circulating, inPool }, in whole tokens. |
holders | object | null | { count, top10Pct }: wallets holding it and the share of the ten biggest (pools, burn addresses and contracts left out). |
Moves and trading
| Field | Type | What |
|---|---|---|
priceChange | object | { m5, h1, h6, h24, d7 }: % move in dollars over 5 minutes, 1 hour, 6 hours, 24 hours, 7 days. null when the market is younger. |
priceChangeQuote | object | The same, in the quote: the token's own move, without the stock's. |
priceChange24hPct | number | null | Shortcut for priceChange.h24. |
volume | object | { m5, h1, h6, h24, d7 }: dollars traded in each window. |
txns | object | { m5, h1, h6, h24, d7 }: { buys, sells } counted in each window. |
volume24hUsd, trades24h | number | null | Shortcuts for the 24-hour window. |
tradingOpen | boolean | Public trading is open (before publicAt only the IMO house trades). |
liquidated | boolean | The holders voted the market's emergency exit: trading stopped for good, holders exit in kind. |
Liquidity and basket
| Field | Type | What |
|---|---|---|
liquidityUsd | number | null | Both sides of the pool: the supply the hook still holds for sale, at the price, plus the basket. |
basketValueUsd | number | null | The basket at the last realized prices of its holdings: what pays every sell. |
basketValueQuote | number | The same, in the quote. |
backingPerTokenUsd | number | null | basketValueUsd ÷ circulating supply. |
basket | Leg[] (one token only) | [{ token, symbol, weightBps, core, amount, valueUsd }]: each holding of the basket. |
Fees, presentation, links
| Field | Type | What |
|---|---|---|
fees | object | { tradingBps, burnBps, brokerageBps, holdersBps, managementBps, brokerage, broker }: the trading fee and its split, in bps of the fee. |
info | object | { description, logo, website, x, telegram, other }: what the token's broker published with its prospectus. |
links | object | { trade, api, explorer, dexscreener, geckoterminal }. |
block, updatedAt | string | The Base block the figures were read at, and when. |
DexScreener format
?format=dexscreener on /api/v1/tokens or /api/v1/tokens/{id} returns the same data as DexScreener pairs: prices as decimal strings, txns, volume and priceChange by window, liquidity, fdv, marketCap, pairCreatedAt (ms) and info with the image, websites and socials. Code that parses DexScreener reads it unchanged.
curl "https://memestock.market/api/v1/tokens/BRK.M?format=dexscreener" curl "https://memestock.market/api/v1/tokens?format=dexscreener"
Verifying a token
Names, tickers and logos can be copied. What cannot: a memestock.market token is launched by our launch factory, and that factory answers isGenuine(hook) = true for its hook only. The API reads it for you (official.isGenuine); you can also ask the chain directly. A token the API does not know answers 404.
const t = await fetch("https://memestock.market/api/v1/tokens/0xTokenAddress").then((r) => r.json());
const official = t.ok && t.official.isGenuine === true;CoinGecko and CoinMarketCap
Both ask a listed token for supply endpoints that answer a bare number. Give them these:
- Total supply:
https://memestock.market/api/v1/tokens/BRK.M/total-supply - Circulating supply:
https://memestock.market/api/v1/tokens/BRK.M/circulating-supply
Circulating is the total, less what was burned (at 0x…dEaD) and what is still locked in the IMO house (the backers' and the broker's tokens not yet vested or claimed).
A price widget
Paste it into any page: it reads the API from the browser (CORS is open) and shows the logo, price, 24-hour move, market cap, volume and basket.
<div id="msm-card" style="font-family:system-ui;border:1px solid #ddd;border-radius:12px;padding:12px;max-width:280px">
<img id="msm-logo" width="32" height="32" alt="" style="border-radius:8px;vertical-align:middle" onerror="this.remove()">
<strong id="msm-name"></strong>
<div id="msm-price" style="font-size:22px;margin-top:6px"></div>
<div id="msm-meta" style="font-size:12px;color:#666"></div>
</div>
<script>
(async () => {
const id = "BRK.M";
const t = await fetch("https://memestock.market/api/v1/tokens/" + id).then((r) => r.json());
if (!t.ok) return;
const usd = (n) => n == null ? "—" : "$" + n.toLocaleString("en-US", { maximumFractionDigits: n < 1 ? 8 : 0 });
const pct = (n) => n == null ? "" : (n >= 0 ? "+" : "") + n.toFixed(2) + "%";
document.getElementById("msm-logo").src = "https://memestock.market/api/v1/tokens/" + id + "/logo";
document.getElementById("msm-name").textContent = " " + t.ticker;
document.getElementById("msm-price").textContent = usd(t.priceUsd) + " " + pct(t.priceChange.h24);
document.getElementById("msm-meta").textContent =
"MC " + usd(t.marketCapUsd) + " · Vol 24h " + usd(t.volume.h24) + " · Basket " + usd(t.basketValueUsd);
})();
</script>How every figure is read
A memestock trades in one Uniswap V4 pool whose hook makes the market: it holds the supply not yet sold and a basket bought with what buyers pay (the tokenized stock, ₸USD and the strategic holdings), and pays every sell from that basket. So:
- Price: the pool's own, from the hook's curve, in the quote; in dollars at the quote's USDC pool (the first hop of the market's own route).
- Moves: against the price the chain held at the start of each window (5 min, 1 h, 6 h, 24 h, 7 days), read at that block.
- Volume and trades: the hook's own Buy and Sell events, so trades made through any router or aggregator count. Quote paid in on buys, quote paid out on sells, at the quote's dollar price now.
- Market cap: price × circulating supply. FDV: price × the supply not burned.
- Liquidity: the supply the hook holds for sale, at the price, plus the basket.
- Basket: every holding at its last realized price (the hook's
reserveValue). - Holders: from Blockscout, refreshed hourly; pools, burn addresses and contracts left out of the top 10.
- Description, logo, links: what the broker published with the prospectus (ProspectusInfo and the prospectus's logo). Presentation only: the token's terms live in its contracts.
The basket and the market are explained in the basket, the fee split in fees and staking.
Caching, errors and limits
- Caching: responses are cached 30 seconds at the edge (the chart 5 minutes, the logo a day). Polling faster returns the same figures; every response carries
blockandupdatedAt. - Errors:
404for a token that is not ours,400for an unknown field,502/503when Base cannot be read right now (retry after a few seconds). JSON errors carry{ ok: false, error }. - Limits: no key and no quota. Since answers change every 30 seconds at most, cache on your side and keep to about a call per token every 30 seconds: plenty for any page, and it keeps the API free for everyone.
- Stability: v1 only grows. Fields are added, never renamed or removed; a breaking change would be v2, at a new path.
- Attribution: welcome, not required: "Data: memestock.market".
For agents and code generators
- /openapi.json: the OpenAPI 3.1 description of this API and the market API.
- /llms.txt: the site and its APIs, for language models.
https://memestock.market/api/mcp: an MCP server (Streamable HTTP) for Claude, Cursor or any MCP client.- Market-wide data on every memecoin paired against a tokenized stock, on Base, Robinhood Chain and Solana: the market API.
Nothing here is investment advice. Most memecoins go to zero.