{"openapi":"3.1.0","info":{"title":"nasdegen.fun public API","version":"1.0.0","summary":"Launch a coin paired with a stock, a coin or the chain's own. On Base, Robinhood Chain, BNB Chain and Solana.","description":"Read-only JSON over the launch index (Base 8453, Robinhood Chain 4663), the integration kit and a server-sent-event stream. No API key. Full guide: https://nasdegen.fun/integrate","contact":{"name":"@nasdegen on X","url":"https://x.com/nasdegen"}},"servers":[{"url":"https://nasdegen.fun"}],"tags":[{"name":"launches"},{"name":"protocol"},{"name":"integration"}],"paths":{"/api/launch/list":{"get":{"operationId":"get_launch_list","summary":"Browse launches","description":"The list every tab of the home page reads. Raw amounts are decimal integer strings in the quote's decimals (`quote_decimals`); `price_quote` / `fdv_quote` are numbers in the quote asset; `*_usd` fields are null when the quote has no price. Cache: public, s-maxage=2, stale-while-revalidate=10. Example: /api/launch/list?chain=base&sort=new&limit=50","parameters":[{"name":"chain","in":"query","description":"one chain; omitted = every chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"sort","in":"query","description":"live (outside-wallet activity first; trending is an alias), new, mcap, volume, gainers, holders","schema":{"type":"string","enum":["live","new","mcap","volume","gainers","holders"]}},{"name":"window","in":"query","description":"the volume window for sort=volume|gainers","schema":{"type":"string","enum":["1h","24h","all"]}},{"name":"filter","in":"query","description":"a facet","schema":{"type":"string","enum":["fee0","burn","usdg","gitlawb","today","stock","holders","platform","parasite","posters"]}},{"name":"limit","in":"query","description":"rows per page, 1..200","schema":{"type":"integer"}},{"name":"offset","in":"query","description":"page offset, up to 100000","schema":{"type":"integer"}},{"name":"quote","in":"query","description":"one exact quote-asset address: every coin paired with it (combine with `chain`)","schema":{"type":"string","format":"address"}},{"name":"format","in":"query","description":"csv = the same rows as text/csv (RFC 4180, CRLF); omitted = JSON","schema":{"type":"string","enum":["json","csv"]}}],"responses":{"200":{"description":"{ sort, window, chain, filter, quote, limit, offset, has_more, ethUsd, launches: LaunchRow: { chain, chain_id, token, token_id, launcher (raw on-chain: the LaunchAndBuy router for a router launch), creator (the wallet that launched: use this for display / attribution), quote, quote_key (eth|usdg|stock|custom), quote_symbol, quote_decimals, pool_id, hooks, start_tick, lp_fee (pips), supply (wei string), name, symbol, image_url, description, website, x_handle, telegram (https://t.me/…), tweet_url (https://x.com/<user>/status/<id>), kind (pool|curve|listing), curve, graduated, refunding, graduation_threshold, phantom_quote, creator_tax_bps, curve_raised, snipe_window, snipe_start_bps, airdrop_bps, airdrop_pool, pool_opened_at, pools[] { pool_id, quote, token_is_currency0, sqrt_price_x96, tick, supply_bps }, sqrt_price_x96, tick, price_quote, fdv_quote, quote_usd, price_usd, fdv_usd, volume_quote, volume_1h, volume_24h, volume_usd, buys, sells, trades_1h, trades_24h, traders_1h_ex, traders_24h_ex, holders, last_trade_at, block_time, tx_hash, recipients[], reward_pool, fee_vault, fee_mode, x_recipients[] }[] }. With format=csv: text/csv, one row per launch (chain, chain_id, token, name, symbol, launcher, kind, quote, quote_symbol, quote_decimals, lp_fee_pips, supply, price_quote, price_usd, fdv_quote, fdv_usd, volume_quote, volume_usd, volume_24h_quote, buys, sells, holders, block_time, tx_hash).","content":{"application/json":{"schema":{"type":"object","description":"{ sort, window, chain, filter, quote, limit, offset, has_more, ethUsd, launches: LaunchRow: { chain, chain_id, token, token_id, launcher (raw on-chain: the LaunchAndBuy router for a router launch), creator (the wallet that launched: use this for display / attribution), quote, quote_key (eth|usdg|stock|custom), quote_symbol, quote_decimals, pool_id, hooks, start_tick, lp_fee (pips), supply (wei string), name, symbol, image_url, description, website, x_handle, telegram (https://t.me/…), tweet_url (https://x.com/<user>/status/<id>), kind (pool|curve|listing), curve, graduated, refunding, graduation_threshold, phantom_quote, creator_tax_bps, curve_raised, snipe_window, snipe_start_bps, airdrop_bps, airdrop_pool, pool_opened_at, pools[] { pool_id, quote, token_is_currency0, sqrt_price_x96, tick, supply_bps }, sqrt_price_x96, tick, price_quote, fdv_quote, quote_usd, price_usd, fdv_usd, volume_quote, volume_1h, volume_24h, volume_usd, buys, sells, trades_1h, trades_24h, traders_1h_ex, traders_24h_ex, holders, last_trade_at, block_time, tx_hash, recipients[], reward_pool, fee_vault, fee_mode, x_recipients[] }[] }. With format=csv: text/csv, one row per launch (chain, chain_id, token, name, symbol, launcher, kind, quote, quote_symbol, quote_decimals, lp_fee_pips, supply, price_quote, price_usd, fdv_quote, fdv_usd, volume_quote, volume_usd, volume_24h_quote, buys, sells, holders, block_time, tx_hash)."}},"text/csv":{"schema":{"type":"string","description":"The same rows as CSV (RFC 4180, CRLF), one header line then one line per row."}}}},"503":{"description":"the database is busy: retry after the `retry-after` header (2 s) and keep your last data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/launch/live":{"get":{"operationId":"get_launch_live","summary":"One call for a live page","description":"The activity feed, the site totals, the trending strip and (with `sort`) one list page, in one response. The site polls it every ~5 s. Cache: public, s-maxage=2, stale-while-revalidate=10. Example: /api/launch/live?chain=base&sort=live&limit=40","parameters":[{"name":"chain","in":"query","description":"one chain; omitted = every chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"sort","in":"query","description":"live (outside-wallet activity first; trending is an alias), new, mcap, volume, gainers, holders","schema":{"type":"string","enum":["live","new","mcap","volume","gainers","holders"]}},{"name":"window","in":"query","description":"the volume window for sort=volume|gainers","schema":{"type":"string","enum":["1h","24h","all"]}},{"name":"filter","in":"query","description":"a facet","schema":{"type":"string","enum":["fee0","burn","usdg","gitlawb","today","stock","holders","platform","parasite","posters"]}},{"name":"limit","in":"query","description":"rows per page, 1..200","schema":{"type":"integer"}},{"name":"offset","in":"query","description":"page offset, up to 100000","schema":{"type":"integer"}},{"name":"quote","in":"query","description":"one exact quote-asset address: every coin paired with it (combine with `chain`)","schema":{"type":"string","format":"address"}}],"responses":{"200":{"description":"{ at, feed: FeedItem[], totals: { launches, trades, volume_usd, fees_burned_usd, fees_to_creators_usd, usd_partial }, ethUsd, launches: LaunchRow[] | null, has_more, posts, trending: { window, items } }","content":{"application/json":{"schema":{"type":"object","description":"{ at, feed: FeedItem[], totals: { launches, trades, volume_usd, fees_burned_usd, fees_to_creators_usd, usd_partial }, ethUsd, launches: LaunchRow[] | null, has_more, posts, trending: { window, items } }"}}}},"503":{"description":"the database is busy: retry after the `retry-after` header (2 s) and keep your last data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/launch/feed":{"get":{"operationId":"get_launch_feed","summary":"Latest launches and trades","description":"The newest 24 launch and swap events across every chain, newest first. Cache: public, s-maxage=2, stale-while-revalidate=10. Example: /api/launch/feed","parameters":[{"name":"format","in":"query","description":"csv = the same rows as text/csv (RFC 4180, CRLF); omitted = JSON","schema":{"type":"string","enum":["json","csv"]}}],"responses":{"200":{"description":"{ items: ({ kind: 'launch', chain, at, tx_hash, token, name, symbol, launcher, lp_fee, quote_key, quote_symbol, launch_kind, image_url, ... } | { kind: 'swap', chain, at, tx_hash, token, name, symbol, trader, is_buy, is_dev, quote_wei, quote_key, quote_symbol, quote_decimals, usd, image_url })[] }. With format=csv: text/csv, launches and swaps in one flat shape (kind, chain, at, tx_hash, token, name, symbol, trader, is_buy, quote_amount, quote_symbol, quote_decimals, usd).","content":{"application/json":{"schema":{"type":"object","description":"{ items: ({ kind: 'launch', chain, at, tx_hash, token, name, symbol, launcher, lp_fee, quote_key, quote_symbol, launch_kind, image_url, ... } | { kind: 'swap', chain, at, tx_hash, token, name, symbol, trader, is_buy, is_dev, quote_wei, quote_key, quote_symbol, quote_decimals, usd, image_url })[] }. With format=csv: text/csv, launches and swaps in one flat shape (kind, chain, at, tx_hash, token, name, symbol, trader, is_buy, quote_amount, quote_symbol, quote_decimals, usd)."}},"text/csv":{"schema":{"type":"string","description":"The same rows as CSV (RFC 4180, CRLF), one header line then one line per row."}}}},"503":{"description":"the database is busy: retry after the `retry-after` header (2 s) and keep your last data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/launch/search":{"get":{"operationId":"get_launch_search","summary":"Search by name, symbol or address","description":"Substring match on name / symbol, exact match on a token address; at most 20 rows. Cache: public, s-maxage=5, stale-while-revalidate=30. Example: /api/launch/search?q=pepe&chain=base","parameters":[{"name":"q","in":"query","required":true,"description":"up to 80 characters","schema":{"type":"string"}},{"name":"chain","in":"query","description":"one chain; omitted = every chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}}],"responses":{"200":{"description":"{ q, launches: LaunchRow[] }","content":{"application/json":{"schema":{"type":"object","description":"{ q, launches: LaunchRow[] }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"503":{"description":"the database is busy: retry after the `retry-after` header (2 s) and keep your last data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/launch/candles":{"get":{"operationId":"get_launch_candles","summary":"OHLCV candles","description":"Sparse whole buckets in quote per token (multiply by `quote.usd` for dollars), at most 2000 including the current bucket; fill gaps from `baseline.price`. `launch.price` is the opening price from the start tick. Cache: public, s-maxage=5, stale-while-revalidate=30. Example: /api/launch/candles?chain=base&token=0x...&interval=5m","parameters":[{"name":"chain","in":"query","required":true,"description":"the chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"token","in":"query","required":true,"description":"the launch token address","schema":{"type":"string","format":"address"}},{"name":"interval","in":"query","description":"default 5m","schema":{"type":"string","enum":["1m","5m","15m","1h","4h","1d"]}},{"name":"from","in":"query","description":"unix seconds; bounded to the launch time and the bucket cap","schema":{"type":"integer"}},{"name":"wallet","in":"query","description":"also return that wallet's trades as markers (`mine`)","schema":{"type":"string","format":"address"}}],"responses":{"200":{"description":"{ interval, from, asOf, baseline: { price, hasPriorTrades }, launch: { t, price }, quote: { symbol, decimals, usd }, supply, candles: { t, open, high, low, close, volume, trades }[], mine }","content":{"application/json":{"schema":{"type":"object","description":"{ interval, from, asOf, baseline: { price, hasPriorTrades }, launch: { t, price }, quote: { symbol, decimals, usd }, supply, candles: { t, open, high, low, close, volume, trades }[], mine }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"503":{"description":"the database is busy: retry after the `retry-after` header (2 s) and keep your last data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/launch/holders":{"get":{"operationId":"get_launch_holders","summary":"Holder distribution","description":"Top holders, concentration, the creator's position and sniper-window buyers. `synced` is false while the token's transfer history is still being backfilled. Cache: no-store (5 s server memo). Example: /api/launch/holders?chain=base&token=0x...","parameters":[{"name":"chain","in":"query","required":true,"description":"the chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"token","in":"query","required":true,"description":"the launch token address","schema":{"type":"string","format":"address"}}],"responses":{"200":{"description":"{ synced, holders, supply, top: { holder, balance, bps, tag }[], top10Bps, poolBps, creator: { address, bps, bought, sold, sells }, sniper: { wallets, bps }, notes[] }","content":{"application/json":{"schema":{"type":"object","description":"{ synced, holders, supply, top: { holder, balance, bps, tag }[], top10Bps, poolBps, creator: { address, bps, bought, sold, sells }, sniper: { wallets, bps }, notes[] }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/launch/rewards":{"get":{"operationId":"get_launch_rewards","summary":"Reward-coin payouts","description":"For a launch in the holders fee mode: what its RewardPool has paid out, from the index of Rewarded / TokenLegBurned. Cache: no-store (5 s server memo). Example: /api/launch/rewards?chain=base&token=0x...","parameters":[{"name":"chain","in":"query","required":true,"description":"the chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"token","in":"query","required":true,"description":"the launch token address","schema":{"type":"string","format":"address"}},{"name":"wallet","in":"query","description":"also total that wallet's payouts (`mine`)","schema":{"type":"string","format":"address"}}],"responses":{"200":{"description":"{ total, burned, rounds, holders_paid, last_at, mine }","content":{"application/json":{"schema":{"type":"object","description":"{ total, burned, rounds, holders_paid, last_at, mine }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/launch/sisters":{"get":{"operationId":"get_launch_sisters","summary":"Sister-coin candidates","description":"Launches on the chain quoted in the same asset that own a RewardPool or a FeeVault (the FeeVault sister mode picker). Cache: no-store. Example: /api/launch/sisters?chain=base&quote=0x0000000000000000000000000000000000000000","parameters":[{"name":"chain","in":"query","required":true,"description":"the chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"quote","in":"query","required":true,"description":"the quote asset address","schema":{"type":"string","format":"address"}},{"name":"q","in":"query","description":"name / symbol filter","schema":{"type":"string"}}],"responses":{"200":{"description":"{ candidates: { token, name, symbol, sister, module, fee_mode, image_url }[] }","content":{"application/json":{"schema":{"type":"object","description":"{ candidates: { token, name, symbol, sister, module, fee_mode, image_url }[] }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/public/v1/fees":{"get":{"operationId":"get_public_v1_fees","summary":"Public fee data: totals and per coin","description":"Fees every coin has generated and where they went, from indexed events only: creator wallets, holders (RewardPool), handles (social vaults), posters (PosterPool), fee modules (FeeVault), cross-chain routers, the protocol (FeeRouter), burned (0x…dEaD, the protocol's coin-leg share included), credited and awaiting claim, and curve rows indexed before their split was stored (unattributed). Totals per chain and quote asset across ALL coins (quote legs only: coin legs are different tokens); one page of coins with both legs. Every bucket: { amount | quote + coin, events, txs (its newest tx hashes) }. Solana: fee claims into the treasury multisig by source, in lamports. Raw integer strings, no USD. CORS open; unknown parameters are refused at the edge; a busy database answers 503 + retry-after. Cache: public, s-maxage=60, stale-while-revalidate=300. Example: /api/public/v1/fees?chain=base&limit=50","parameters":[{"name":"chain","in":"query","description":"one chain; omitted = every chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"limit","in":"query","description":"coins per page, 1..200 (default 50)","schema":{"type":"integer"}},{"name":"offset","in":"query","description":"page offset","schema":{"type":"integer"}}],"responses":{"200":{"description":"{ version, generated_at, chain, limit, offset, has_more, totals: { chain, quote, quote_symbol, quote_decimals, coins, generated, to: { creator, holders, handles, posters, modules, xchain, protocol, burn, credited, unattributed }, posters_paid_out }[], coins: CoinFees[], solana: { by_source: { source, amount, events, txs }[], asset, note, coins } | null }","content":{"application/json":{"schema":{"type":"object","description":"{ version, generated_at, chain, limit, offset, has_more, totals: { chain, quote, quote_symbol, quote_decimals, coins, generated, to: { creator, holders, handles, posters, modules, xchain, protocol, burn, credited, unattributed }, posters_paid_out }[], coins: CoinFees[], solana: { by_source: { source, amount, events, txs }[], asset, note, coins } | null }"}}}},"503":{"description":"the database is busy: retry after the `retry-after` header (2 s) and keep your last data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/public/v1/fees/{chain}/{token}":{"get":{"operationId":"get_public_v1_fees_chain_token","summary":"Public fee data: one coin, event by event","description":"One coin's fee breakdown (generated; to creator / holders / handles / posters / modules / xchain / protocol / burn / credited / unattributed; protocol_coin_burned; posters_paid_out; summary { creator_side, protocol, burned, pending_claim, unattributed }; reconciled per leg) and its fee events newest first, each with tx_hash and log_index. chain = solana takes a mint and returns that coin's treasury claims by source. Cache: public, s-maxage=60, stale-while-revalidate=300. Example: /api/public/v1/fees/base/0x...","parameters":[{"name":"chain","in":"path","required":true,"description":"base | robinhood | bnb | solana","schema":{"type":"string","enum":["base","robinhood","bnb","solana"]}},{"name":"token","in":"path","required":true,"description":"the coin (0x address, or a Solana mint)","schema":{"type":"string"}},{"name":"limit","in":"query","description":"events per page, 1..200 (default 100)","schema":{"type":"integer"}},{"name":"offset","in":"query","description":"events offset","schema":{"type":"integer"}}],"responses":{"200":{"description":"{ version, generated_at, chain, token, name, symbol, kind, quote: { address, symbol, decimals }, coin: { symbol, decimals }, fees: { generated, to, protocol_coin_burned, posters_paid_out, summary, reconciled, last_at }, events: { kind, category, tx_hash, log_index, block_number, block_time, currency, account, amount, quote_amount, token_amount, protocol_amount, creator_amount, tax_amount }[], limit, offset, has_more }","content":{"application/json":{"schema":{"type":"object","description":"{ version, generated_at, chain, token, name, symbol, kind, quote: { address, symbol, decimals }, coin: { symbol, decimals }, fees: { generated, to, protocol_coin_burned, posters_paid_out, summary, reconciled, last_at }, events: { kind, category, tx_hash, log_index, block_number, block_time, currency, account, amount, quote_amount, token_amount, protocol_amount, creator_amount, tax_amount }[], limit, offset, has_more }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"503":{"description":"the database is busy: retry after the `retry-after` header (2 s) and keep your last data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/launch/meta/{token}":{"get":{"operationId":"get_launch_meta_token","summary":"Token metadata by address","description":"Name, symbol, description, logo and links the creator registered. The logo is a 512x512 WebP on this domain when it was uploaded here, else the https URL the creator gave. Cache: public, max-age=300. Example: /api/launch/meta/0x...?chain=base","parameters":[{"name":"token","in":"path","required":true,"description":"the launch token address","schema":{"type":"string","format":"address"}},{"name":"chain","in":"query","description":"one chain; omitted = every chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}}],"responses":{"200":{"description":"{ name, symbol, description?, image?, external_url?, x?, website?, twitter?, telegram?, tweet?, extensions?: { website?, twitter?, telegram? }, token, x_recipients?: { handle, vault, bps, user_id? }[] }","content":{"application/json":{"schema":{"type":"object","description":"{ name, symbol, description?, image?, external_url?, x?, website?, twitter?, telegram?, tweet?, extensions?: { website?, twitter?, telegram? }, token, x_recipients?: { handle, vault, bps, user_id? }[] }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/launch/meta/{launcher}/{key}":{"get":{"operationId":"get_launch_meta_launcher_key","summary":"Token metadata by its on-chain URI","description":"The form of `metadataURI` written on-chain by Launched / CurveLaunched / Listed: the launcher address and a 32-byte key. Same JSON as the by-address form. Cache: public, max-age=300. Example: /api/launch/meta/0x<launcher>/0x<key>","parameters":[{"name":"launcher","in":"path","required":true,"description":"the launcher wallet","schema":{"type":"string","format":"address"}},{"name":"key","in":"path","required":true,"description":"the 0x-prefixed 32-byte metadata key","schema":{"type":"string"}}],"responses":{"200":{"description":"{ name, symbol, description?, image?, external_url?, x?, website?, twitter?, telegram?, tweet?, extensions?, token, x_recipients? }","content":{"application/json":{"schema":{"type":"object","description":"{ name, symbol, description?, image?, external_url?, x?, website?, twitter?, telegram?, tweet?, extensions?, token, x_recipients? }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/vote":{"get":{"operationId":"get_vote","summary":"Advisory holder votes","description":"For a launch with a fee module: the proposals to switch its mode, their tallies (weight = min(balance when voting, balance at close), from the holder index) and, with `wallet`, that wallet's own vote. Advisory only: the creator decides; nothing here changes the fee split. Cache: no-store. Example: /api/vote?chain=base&token=0x...","parameters":[{"name":"chain","in":"query","required":true,"description":"the chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"token","in":"query","required":true,"description":"the launch token address","schema":{"type":"string","format":"address"}},{"name":"wallet","in":"query","description":"also return that wallet's vote and what it may do","schema":{"type":"string","format":"address"}}],"responses":{"200":{"description":"{ proposals: { id, chain, token, proposer, mode, sister, title, body, created_at, closes_at, state (open|closed|applied), tally: { for, against, voters }, passed, applied_at, applied_tx, my_choice }[], can_vote, can_propose, open_id }","content":{"application/json":{"schema":{"type":"object","description":"{ proposals: { id, chain, token, proposer, mode, sister, title, body, created_at, closes_at, state (open|closed|applied), tally: { for, against, voters }, passed, applied_at, applied_tx, my_choice }[], can_vote, can_propose, open_id }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/quotes":{"get":{"operationId":"get_quotes","summary":"Quote assets on a chain","description":"The fixed quotes (ETH; USDG on Robinhood Chain) and the chain's tokenized-stock registry with live USD prices. Only registry addresses are ever labelled stocks. Cache: no-store (30 s server memo). Example: /api/quotes?chain=base&q=AAPL","parameters":[{"name":"chain","in":"query","required":true,"description":"the chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"q","in":"query","description":"a ticker (AAPL) or an address","schema":{"type":"string"}}],"responses":{"200":{"description":"{ fixed: { key, address, symbol, decimals, usd }[], stocks: { key: 'stock', address, symbol, name, decimals, usd, usdAsOf, logo }[] }","content":{"application/json":{"schema":{"type":"object","description":"{ fixed: { key, address, symbol, decimals, usd }[], stocks: { key: 'stock', address, symbol, name, decimals, usd, usdAsOf, logo }[] }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/quotes/inspect":{"get":{"operationId":"get_quotes_inspect","summary":"Can this ERC-20 be a quote?","description":"On-chain reads, DexScreener depth and (Base) a GoPlus scan for an arbitrary quote coin. Per-IP limit: 30 per minute. Cache: no-store (10 min server cache). Example: /api/quotes/inspect?chain=base&address=0x...","parameters":[{"name":"chain","in":"query","required":true,"description":"the chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"address","in":"query","required":true,"description":"the ERC-20","schema":{"type":"string","format":"address"}}],"responses":{"200":{"description":"{ ok, symbol, name, decimals, usd, liquidityUsd, warnings[], blockers[] }","content":{"application/json":{"schema":{"type":"object","description":"{ ok, symbol, name, decimals, usd, liquidityUsd, warnings[], blockers[] }"}}}},"400":{"description":"a required or malformed parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/health":{"get":{"operationId":"get_health","summary":"Index freshness","description":"Database reachability and the indexer cursor per chain (block lag, last run, last error). Cache: no-store. Example: /api/health","parameters":[],"responses":{"200":{"description":"{ ok, alerts[], sync: { cursor_block, head_block, last_run_at, last_error }, chains[] }","content":{"application/json":{"schema":{"type":"object","description":"{ ok, alerts[], sync: { cursor_block, head_block, last_run_at, last_error }, chains[] }"}}}}}}},"/api/integrate/kit.json":{"get":{"operationId":"get_integrate_kit_json","summary":"This kit, machine-readable","description":"Contracts, Uniswap v4 addresses, event signatures and topics, constants, the REST reference and the stream description; versioned. Cache: public, s-maxage=60, stale-while-revalidate=300. Example: /api/integrate/kit.json","parameters":[],"responses":{"200":{"description":"{ version, generatedAt, site, chains: { base, robinhood }, apis[], stream, metadata, brand, solana }","content":{"application/json":{"schema":{"type":"object","description":"{ version, generatedAt, site, chains: { base, robinhood }, apis[], stream, metadata, brand, solana }"}}}},"503":{"description":"the database is busy: retry after the `retry-after` header (2 s) and keep your last data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/openapi.json":{"get":{"operationId":"get_openapi_json","summary":"OpenAPI 3.1","description":"The public read API, this kit and the stream as an OpenAPI 3.1 document. Cache: public, s-maxage=300, stale-while-revalidate=3600. Example: /api/openapi.json","parameters":[],"responses":{"200":{"description":"OpenAPI 3.1 document","content":{"application/json":{"schema":{"type":"object","description":"OpenAPI 3.1 document"}}}},"503":{"description":"the database is busy: retry after the `retry-after` header (2 s) and keep your last data","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/api/stream":{"get":{"operationId":"get_stream","summary":"Real-time events (SSE)","description":"Server-sent events: new launches, swaps, curve state changes, holder-reward payouts and fee splits as the indexer writes them. Resume with `Last-Event-ID` or `since=`. Cache: no-store. Example: /api/stream?chain=base","parameters":[{"name":"chain","in":"query","description":"one chain; omitted = every chain","schema":{"type":"string","enum":["base","robinhood","bnb"]}},{"name":"since","in":"query","description":"a cursor from a previous event id, or a moment (unix seconds, unix ms, ISO date; at most 24 h back); omitted = only what happens next","schema":{"type":"string"}}],"responses":{"200":{"description":"text/event-stream","content":{"text/event-stream":{"schema":{"type":"string","description":"text/event-stream"}}}}}}}}}