Build with Signal
Public data API
Base URL: https://signal.family. The GET endpoints below serve public indexed or cached data, with access-control-allow-origin: *. They are not a trading API, not a complete chain archive and not a latency promise. Nothing here signs or submits a transaction.
The API indexes the whole HyperEVM tape, not only tokens launched on Signal. A Signal launch is a row with born: 1. A Signal v4 launch also has launch_venue: "v4".
Rules of the road
- Follow redirects. Some reads answer
307to another origin that serves them. - An error can be HTTP 200. Several endpoints answer
200with anerrorkey:{"error": "bad address"},{"error": "never seen it trade"}. Check forerrorbefore reading fields. - A record can be partial. A token record that could not be built in time returns
partial: truewithroutable: false. Absence in a partial record means "not read", not "none". - Rate limits answer
429withretry-after. A busy or starting server answers503withretry-afterandbusyorbootingin the body. Back off; do not retry in a loop. - ETags. Most JSON endpoints send an ETag and answer
304toIf-None-Match. Use it. - Missing, stale, partial and unpriced values are different from zero. Do not turn a timeout into an empty wallet or a failed payout.
Endpoints
Configuration
| Endpoint | Use |
|---|---|
/api/config | Every launch type's deployment and admission state. ?light=1 leaves out the large curve list; /api/config/curves returns only that list |
/api/launch/pairs?q= | Search of the pair-asset catalog for Classic launches. Presence in the catalog is not launch admission |
/api/pad/terms | The Classic pad's fee numbers, read from the chain. Classic only |
/api/health | The indexer's liveness: ok, sha, indexer_beat_s, tape_block, hype (HYPE in USD) |
The Signal v4 keys of /api/config are v4_lane_v42 (release 4.2), v4_lane_v4 (release 4.1), v4_lane_v2, and two with no pools. Each carries:
| Field | Meaning |
|---|---|
enabled | The factory is open for launches: switched on, verified from the chain within the last ten minutes, and not paused |
paused | The factory's own paused() as last read |
warming | Switched on but not freshly verified. Read as "unknown", not as "closed" |
factory, hook, router, rules, tokens, flush, pool_manager, universal_router, quoter, state_view, permit2 | Addresses, lower case |
start_block | The first block to scan |
protocol_bps | The factory's share setting for new launches, as last read |
opening_max_bps, opening_max_s | The largest opening fee and longest opening window the release allows |
quotes[] | The admitted pair assets: asset, symbol, decimals, enabled, start_tp (the start tick), bands (how the supply is placed), and for an asset that taxes its own transfers tax_bps and router |
Tokens
| Endpoint | Use | Limits |
|---|---|---|
/api/token/<address> | One token's record: price, 24-hour figures, route, launch facts, safety summary | Rebuilt at most every 2 seconds; can be partial |
/api/tokens | The market ranked by 24-hour volume. ?depth= up to 600, ?q= searches the whole catalog (two characters minimum), ?pair= lists markets by pair asset | q and pair: 60 requests a minute |
/api/trending | The hour's most active tokens | |
/api/discover | One filtered view: lens (trending, new, top, gainers, echo, paying, gems), cat, pair, cap, limit, cursor | 120 a minute. The new lens hides launches with fewer than three buyers unless active=0 |
/api/born | The 24 newest launches. ?every=1 pages every launch ever: limit up to 300, before=<next> | every=1: 60 a minute |
/api/births/<wallet> | Launches by one creator | |
/api/meta/<token> | The ERC-7572 document a release 4.2 token's contractURI() points at | 404 for a token Signal did not see born |
A Signal v4 token's record adds:
| Field | Meaning |
|---|---|
kind: "v4", venue: "Signal pool", launch_venue: "v4" | Marks |
pool | The pool id, 0x + 64 hex. Not a contract address |
pool_key | {currency0, currency1, fee: 0, tickSpacing: 200, hooks} |
router | The router that trades this pool: the release's router, or the pair asset's own router when router_kind is "taxed" (then quote_tax_bps is that asset's cut) |
quote, quote_symbol | The pair asset; quote is null on a HYPE pair |
price, price_source: "pool", mcap | The pool's own price and that price times the supply. Not a trade's price, which carries the hook's fee |
chg_5m, chg_1h | Null on a pool-priced record |
liq, liq_quote, liq_source: "hook_reserve" | The pair-asset side of the pool, the side a sale draws on: buys add to it and sales take from it. A new pool reads near zero. Compare it with the hook's poolState(id).reserve before relying on it |
opening | Before the first trade only: the launch's own start price |
v4_launch | The launch record, below |
v4_launch carries pool_id, pool_key, token_is0, creator, born_block, born_tx, contracts, and:
terms: the hook'sterms(poolId)read at the launch block. See fees and rules for every field.state: the hook's views as last read (buy_rate,sell_rate,prices,pool_state,stats,held, and more), withstate_read_at. Amounts are raw pair-asset units as decimal strings.recent: the newest hook events for this pool (flushed,boughtback,potwon,legpaid, and the change events).destinationsandmodule: who may re-point the fee, open proposals and when they can activate.
state is a cache. During an opening window the live rate moves every second: read the hook.
Trades and charts
| Endpoint | Use | Limits |
|---|---|---|
/api/tape | The newest 80 trades site-wide. ?token=<address> gives one token's newest 60 | No paging. Not an archive |
/api/hist/<address>?h=<hours> | [[ts, price, usd, buy], ...], 1 to 168 hours | 240 a minute |
/api/candles/<address>?s=<seconds>&n=<bars> | [[t, o, h, l, c, volume, buyVolume, count], ...] for 1h, 4h, 12h, 1D, 1W | 240 a minute |
/api/live | Server-sent events: trades as they land and launch, graduation, route and hook events | 8 open streams per address |
A trade row has ts, tx, log_index, token, side, usd, price, pool, who (the swap's recipient, usually a router), origin (the transaction's sender), via (the contract the transaction called), suspect and leg.
suspectabove zero marks a print the site leaves out of every figure it derives: priced far from the token's own recent prints (1), a quote leg that is not a verified asset (2), a small fill through a thin side pool (3), a second copy of a print (4). The tape still lists it. Filter onsuspect == 0.legmarks a print that is part of a route and not a position:"hop","loop","internal". Null is a trade.- On a Signal v4 pool
usdandpriceare the pool's amounts, without the hook's fee. Where the indexer paired the swap with the hook'sFeeTaken,hook_fee_usdandpaid_usdgive the fee and what the trader paid or received. They can be null; do not rely on them for every print.
/api/live first answers 307; follow it. Every message is a bare data: line of JSON with no event name and no id, so there is no replay: after a reconnect, read /api/tape and the records you show again. A heartbeat arrives every five seconds. The stream carries the whole chain's trades, not only Signal's.
Safety
/api/safety/<address> returns Signal's reading of a token: verdict (ok, caution, danger, unknown, or pending), reasons, ts, stale, check_failed, and what was measured (sells, round_trip_cost_pct, transfer_tax_pct, static, concentration). A 503 with check_failed: true and no verdict means the check could not run and no reading stands. 60 requests a minute.
For most tokens the reading includes a simulated buy, transfer and sale. A Signal v4 pool is not simulated this way. Its reading describes the launch's fixed code and locked liquidity and says nothing about its opening fee, taxes or extras. Read those from v4_launch.terms and from the hook.
A verdict is a reading with a time, not a guarantee. See token safety for how the site uses it.
Holders, rewards and payouts
| Endpoint | Use |
|---|---|
/api/holders/<token> | The largest balances among wallets the tape has seen trade the token. The body says whether it is complete |
/api/dividends/<token> | Recent holder-payment receipts. Not a balance and not a lifetime total |
/api/paid/<token>/<wallet> | What a holders token has paid one wallet, by receipt |
/api/fees/<wallet> | A launcher's Classic fees owed and claimed, and v4_creator_payouts[] with delivered and owed amounts per hook |
/api/distributions/<wallet> | Every payment to one wallet: holder payments, referral, relief |
/api/revenue?range= | Classic-launch fee receipts, payouts and burns. Can answer 503 while it prepares |
/api/echo/vaults, /api/echo/<token>, /api/echo/<token>/<wallet> | Echo vault reads |
/api/relief, /api/relief/<wallet> | The relief pool and one wallet's rows |
Money owed is not money paid. Figures labelled paid come from payment receipts on chain.
People
| Endpoint | Use |
|---|---|
/api/leaderboard/pnl | Traders with a chosen @name ranked by profit and loss. ?window= is one of 24h, 7d, 30d, all. The body carries its own rules text; quote it instead of restating it |
/api/leaderboard | The weekly points board |
/api/points/<wallet>, /api/ref/me/<wallet> | One wallet's points and referral figures |
/api/calls?token= | Signals posted on a token |
/api/u/<name or wallet> | A profile |
Classic and perp reads
/api/pool-fees/<token>, /api/core/markets, /api/strategies and /api/strategies/holder?token=&holder= serve Classic launches and perp rewards as described in their guides. None of them describes a Signal v4 pool.
A bounded request
curl --fail --location --max-time 20 \
https://signal.family/api/token/0x1b67a2ac4dc5faab20554d379af5148b8b70f626For trading, use the API for discovery and context, then read and simulate the contracts.
Fast clients without waste
Share one snapshot among everything that shows the same resource. Cache configuration and identities. Use the stream to know when to re-read, not as the data of record. Send If-None-Match. Avoid cache-busting query strings and independent rapid polling by every card.
Keep source times and block numbers where the API supplies them. Your fetch time does not make an old observation fresh. Rebuild durable history from chain logs when your product needs completeness.
Fields can be added over time. Validate what you depend on, and reject a version you do not know instead of guessing.