Read endpoints for bots and builders. Everything here is what the site
itself reads: every token on Robinhood Chain (chain 4663), found from the
chain itself (mint logs, every five minutes), with every launchpad's own events
layered on top where an adapter exists (hood.fun, Hashling, Noxa, Flap, lemon).
Uniswap v3 and v2 pools are indexed for every token, with swaps captured live.
Free, no key. If you post from it, say via hashling.xyz
and link the project page. Questions: [email protected].
https://hashling.xyz. JSON, CORS *./api/new, /api/board,
/api/search 60 s, /api/sparks 30 s,
/api/project and /api/history 120 s,
/alerts.xml 300 s, /api/tail not cached. Polling
faster than that returns the same bytes./api/*; over it
you get a block page. If you need more, email us with what you are building.User-Agent that names your bot (e.g. mybot/1.0 (+https://…)). Cloudflare's browser check returns 403 (error 1010) for a few default library agents such as Python-urllib; requests, curl and named agents pass.https://hashling.xyz/p/<slug>; it unfurls with the token's
art or banner.Newest launches across every venue, newest first. The endpoint to poll.
| param | default | meaning |
|---|---|---|
limit | 50 | 1 to 200 |
since | 0 | unix seconds; only rows first seen after this. Pass back the newest you last received. |
launchpad | all launchpads | default excludes asset (registry sync, not launches); hashling, main, custom (both hood.fun factories), noxa, flap, lemon, asset, unknown (found on chain, no adapter yet) |
curl 'https://hashling.xyz/api/new?limit=5'
{ "count": 5, "newest": 1786900259, "projects": [ … ] }
Without parameters: the legacy payload (curve tokens that have traded on the
hood.fun and Hashling factories, counts, provenance). With
launchpad= it is the paged board over the whole index, server
sorted, 500 per page:
| param | values |
|---|---|
launchpad | any (everything) · all (launchpad index, no noxa/asset) · hashling · main · custom · noxa · flap · lemon · asset · unknown |
status | hatched · bonding · near_graduation · graduated · abandoned · unclassified |
active | 1 = traded in the last 24 h on any venue (curve or pool) |
sort | newest · active (last trade) · volume (24 h, ETH-equivalent) · trades (24 h count) · change (24 h gainers) · losers · bonding · raise |
page | 0-based |
curl 'https://hashling.xyz/api/board?launchpad=any&active=1&sort=volume'
{ "page": 0, "pageSize": 500, "total": 2652, "pages": 6, "projects": [ … ] }
Global search over every token on the chain, never filtered by venue:
address (exact), then symbol, then name (prefix, then contains). Ranked by
24 h volume first, so the token that actually trades outranks its clones.
limit 1 to 50 (20). Same rows as the board.
Sparkline series for up to 60 tokens in one call: window=0
(default) returns the last 40 trades (curve and pool merged); window=N
seconds returns the last N seconds sampled to 40 buckets (last price per bucket,
carried forward). { "window": N, "sparks": { "0x…": { "points": [[ts, price], …] } } }
One project by slug, any venue.
What traded in a window across curves and pools: minutes
(minimum 10), limit, and scope. Use
scope=all for trade counts and market type. Venue scopes are
hoodfun, noxa, lemon, flap,
and asset. The backward-compatible default scope=curves
returns curve-balance
deltaPct, deltaWei, and awakened.
Curves that crossed a threshold: minutes, min
(percentage points gained), optional address for one token.
/alerts.xml is the same as RSS, for readers and bots that speak
feeds.
Price history for one token, for charts: curve trades from its first buy
and Uniswap pool swaps (any venue) merged in time order. Pool points
carry venue: "pool" and quote: "WETH" | "USDG"
(prices and ethWei volumes are normalized to ETH; quote
records the pool's original quote asset). /api/tail?address=&since=
returns only points after since, uncached, for live refresh.
{
"slug": "spynxter-cffa4e", // page: https://hashling.xyz/p/<slug>
"name": "Spynxter", "symbol": "SPYNXTER",
"launchpad": "custom", // hashling | main | custom | noxa | flap | lemon | asset | unknown
"status": "bonding", // hatched | bonding | near_graduation | graduated | abandoned | unclassified
"bondingPct": 4.99, "realEth": "0.101683", "realEthWei": "…",
"creator": "0x…", "firstSeen": 1786…, "graduatedAt": null,
"pool": "0x…" | null, // known Uniswap v2 or v3 pool
"verified": true, "confidence": "…", // true only when a venue adapter enumerated it; "unknown" rows are unverified
"traded": true, // curve ETH held, graduated, curve trade log, or any pool swap
"lastTradeAt": 1787…, "trades24h": 12, "vol24hEth": 3.2, // any venue; nulls/0 when never traded in a pool
"lastPriceEth": 0.0000021, "change24h": 0.12 | null, // change needs 24 h of history
"image": "/img/…" | null, "banner": "…" | null,
"description": "…", "links": { "site": "…", "x": "…", "telegram": "…" },
"addresses": [ { "kind": "token", "chainId": 4663, "address": "0x…" } ],
"assetKind": null, "issuer": null, "poolPair": null, "poolDepth": null
}
There is no trade API and there does not need to be: trades are signed by your own wallet against verified contracts. Sources and ABIs: github.com/hashlingxyz/hashling-contracts. See /security for what each contract holds.
0x3b38c6Fa9Cc41d3A20d64111325231E7dEF7D523:
buy(address token, uint256 minTokensOut) payable,
sell(address token, uint256 tokensIn, uint256 minEthOut),
launch(string name, string symbol, uint256 supply, string artUri).launchpad main/custom): trade on hood.fun's own
verified factories (see the row's _source.factories on
/api/board); Hashling is not involved in those calls.launchpad=flap): trade on the verified Portal
0x26605f322f7ff986f381bb9a6e3f5dab0beaeb09. Quote with
quoteExactInput((address,address,uint256)) and execute with
swapExactInput((address,address,uint256,uint256,bytes)).
Portal quotes include protocol fees and token tax. The Portal is an
upgradeable third-party proxy; verify its implementation and simulate
before sending.HashlingSwap 0x16Bc3720C90c3d5b5B99acf2Df746bAC03Cb53a1, a 1%
fee wrapper over SwapRouter02, no custody:
buy(address token, uint24 poolFee, uint256 minOut, uint256 deadline) payable
(send ETH; poolFee is the pool tier, 100 / 500 / 3000 / 10000)sell(address token, uint24 poolFee, uint256 amountIn, uint256 minOut, uint256 deadline)
(approve the token to HashlingSwap first)Pick the tier by liquidity: factory.getPool(token, WETH, tier)
and compare liquidity(). Simulate with eth_call before
sending; thin pools move a lot on small orders. Or call SwapRouter02
directly and skip the fee, that is allowed and expected; the wrapper is for
people trading on the site.
# quote a buy by simulating (cast, Foundry)
cast call 0x16Bc3720C90c3d5b5B99acf2Df746bAC03Cb53a1 \
'buy(address,uint24,uint256,uint256)(uint256)' <token> 3000 0 9999999999 \
--value 0.001ether --from <funded address> --rpc-url https://rpc.mainnet.chain.robinhood.com
Hashling indexes Flap’s V2 graduation pools and swap history, but the in-page V2 transaction route has not shipped yet. Do not send a graduated Flap token through the v3 route.
/p/ link./api/new with since; do not refetch the whole board every few seconds.