Hashling API

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

Basics

GET /api/new

Newest launches across every venue, newest first. The endpoint to poll.

paramdefaultmeaning
limit501 to 200
since0unix seconds; only rows first seen after this. Pass back the newest you last received.
launchpadall launchpadsdefault 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": [ … ] }

GET /api/board

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:

paramvalues
launchpadany (everything) · all (launchpad index, no noxa/asset) · hashling · main · custom · noxa · flap · lemon · asset · unknown
statushatched · bonding · near_graduation · graduated · abandoned · unclassified
active1 = traded in the last 24 h on any venue (curve or pool)
sortnewest · active (last trade) · volume (24 h, ETH-equivalent) · trades (24 h count) · change (24 h gainers) · losers · bonding · raise
page0-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.

GET /api/sparks?addresses=a,b,…&window=

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], …] } } }

GET /api/project?slug=

One project by slug, any venue.

GET /api/movement

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.

GET /api/alerts and /alerts.xml

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.

GET /api/history?address=

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.

Project row

{
  "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
}

Trading from a bot

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.

Curve tokens (bonding)

Graduated tokens and assets (Uniswap v3)

HashlingSwap 0x16Bc3720C90c3d5b5B99acf2Df746bAC03Cb53a1, a 1% fee wrapper over SwapRouter02, no custody:

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

Graduated Flap tokens (Uniswap v2)

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.

Etiquette