memestockmarket

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.

FreeNo key, no sign-upCORS openRead onchainDexScreener-compatibleJSON + plain text

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/tokens gives every token with its figures; ?sort=volume, new or change orders them.
  • A token page. /api/v1/tokens/{id} for the figures and the basket, /chart for the price line, /trades for the tape, /logo for the image, info for the description and socials.
  • Plug into code that already reads DexScreener. Add ?format=dexscreener and the answer is a DexScreener pair.
  • Supply endpoints for CoinGecko and CoinMarketCap. /total-supply and /circulating-supply answer a bare number.
  • Show only real tokens. official.isGenuine is 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).

sortmarketcap (default), volume (24 h), new (latest launch first), change (24 h move)
formatdexscreener: the list as DexScreener pairs, { schemaVersion, pairs: [...] }
test1: 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.

formatdexscreener: { 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.

limit1 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.

days1 (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

FieldTypeWhat
tickerstringThe ticker the IMO house fixed (BRK.M).
name, symbolstringThe token's own name and symbol.
chain, chainIdstring, number"base", 8453.
tokenaddressThe memestock's contract, a B20 token on Base (18 decimals).
hookaddressIts Uniswap V4 hook: the market maker that holds the unsold supply and the basket.
poolIdbytes32The Uniswap V4 pool id (what DexScreener and GeckoTerminal call the pair address).
houseaddress | nullThe IMO house that sold it.
launchedAtISO date | nullWhen the market launched.
officialobject{ factory, isGenuine }: its launch factory and that factory's isGenuine(hook), read onchain.

Price and size

FieldTypeWhat
priceUsdnumber | nullDollars per token.
priceQuotenumberPrice in the quote: the tokenized stock the market trades against (quote.symbol).
quoteobject{ token, symbol, decimals, priceUsd }: the tokenized stock and its dollar price.
marketCapUsdnumber | nullpriceUsd × supply.circulating.
fdvUsdnumber | nullpriceUsd × (supply.total − supply.burned).
supplyobject{ total, burned, locked, circulating, inPool }, in whole tokens.
holdersobject | null{ count, top10Pct }: wallets holding it and the share of the ten biggest (pools, burn addresses and contracts left out).

Moves and trading

FieldTypeWhat
priceChangeobject{ 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.
priceChangeQuoteobjectThe same, in the quote: the token's own move, without the stock's.
priceChange24hPctnumber | nullShortcut for priceChange.h24.
volumeobject{ m5, h1, h6, h24, d7 }: dollars traded in each window.
txnsobject{ m5, h1, h6, h24, d7 }: { buys, sells } counted in each window.
volume24hUsd, trades24hnumber | nullShortcuts for the 24-hour window.
tradingOpenbooleanPublic trading is open (before publicAt only the IMO house trades).
liquidatedbooleanThe holders voted the market's emergency exit: trading stopped for good, holders exit in kind.

Liquidity and basket

FieldTypeWhat
liquidityUsdnumber | nullBoth sides of the pool: the supply the hook still holds for sale, at the price, plus the basket.
basketValueUsdnumber | nullThe basket at the last realized prices of its holdings: what pays every sell.
basketValueQuotenumberThe same, in the quote.
backingPerTokenUsdnumber | nullbasketValueUsd ÷ circulating supply.
basketLeg[] (one token only)[{ token, symbol, weightBps, core, amount, valueUsd }]: each holding of the basket.

Fees, presentation, links

FieldTypeWhat
feesobject{ tradingBps, burnBps, brokerageBps, holdersBps, managementBps, brokerage, broker }: the trading fee and its split, in bps of the fee.
infoobject{ description, logo, website, x, telegram, other }: what the token's broker published with its prospectus.
linksobject{ trade, api, explorer, dexscreener, geckoterminal }.
block, updatedAtstringThe 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 block and updatedAt.
  • Errors: 404 for a token that is not ours, 400 for an unknown field, 502 / 503 when 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.