Public API
Free JSON API over every token launched on ArrowPad — no key, no signup, open CORS. Prices, market caps, metadata and trades.
Free JSON API over everything launched on ArrowPad — no key, no signup, open
CORS. All responses are application/json. Build trading bots, dashboards, or
aggregators; everything mirrors public on-chain state, so you can always verify
against the contracts directly.
Base URL: https://arrowpad.fun
The API is served by the app itself, not by this docs site. These endpoints live on
arrowpad.fun and are unaffected by anything that happens here.
GET /api/tokens
Every token launched on ArrowPad, newest first — name, symbol, metadata (image, socials), price, market cap, liquidity (ETH + USD), pool, creator, timestamps.
curl -s https://arrowpad.fun/api/tokensconst res = await fetch("https://arrowpad.fun/api/tokens");
const { tokens, ethUsd } = await res.json();
console.log(tokens[0].symbol, tokens[0].marketCapUsd);import requests
r = requests.get("https://arrowpad.fun/api/tokens", timeout=10)
tokens = r.json()["tokens"]
print(tokens[0]["symbol"], tokens[0]["marketCapUsd"]){
"count": 8,
"ethUsd": 1858.67,
"tokens": [
{
"address": "0x0A76353E4AB1124c36FedF0af31fd227056A40A9",
"name": "WhiteCatCoin",
"symbol": "WCAT",
"description": "A White Cat of Elon Musk - 2026",
"image": "https://.../logo.png",
"website": "https://whitecatcoin.com",
"twitter": "https://x.com/WhiteCatCoin",
"pool": "0xb9235E9B241Fc3796171d9E3fE9E016f2782a827",
"positionId": "209040",
"creator": "0xB03abf424c2E17883EbDDd33c9061dcd405260D8",
"createdAt": 1784369121,
"createdAtIso": "2026-07-18T10:05:21.000Z",
"priceEth": 3.01699e-9,
"priceUsd": 5.6077e-6,
"marketCapEth": 3.01699,
"marketCapUsd": 5607.61,
"liquidityEth": 0.0301,
"liquidityUsd": 55.95,
"url": "https://arrowpad.fun/robinhood/token/0x0A76353E4AB1124c36FedF0af31fd227056A40A9",
"explorerUrl": "https://robinhoodchain.blockscout.com/token/0x0A76..."
}
]
}GET /api/trending
The coins ArrowPad currently calls trending — the top 5, strongest first;
the exact list the site's Hot Coins shelf and Trending tab show, plus a 24h
price change on every entry. The ranking runs server-side and only the order is
published; the scoring itself is not part of the response, which is also why
the response is capped at the product's own list: there is no parameter to
request a deeper ranking (a limit query param is accepted but ignored).
curl -s "https://arrowpad.fun/api/trending"const res = await fetch("https://arrowpad.fun/api/trending");
const { tokens } = await res.json();
tokens.forEach((t, i) => console.log(i + 1, t.symbol, t.marketCapUsd));import requests
r = requests.get("https://arrowpad.fun/api/trending", timeout=10)
for i, t in enumerate(r.json()["tokens"], 1):
print(i, t["symbol"], t["marketCapUsd"], t["change24hPct"]){
"count": 5,
"ethUsd": 1928.79,
"tokens": [
{
"address": "0x0BB6D7e8D0CE0f8601360507B4e9A064Fc7a7477",
"name": "TRumpCat",
"symbol": "TRUMPCAT",
"image": "https://.../logo.png",
"marketCapEth": 3.017,
"marketCapUsd": 5819.09,
"liquidityUsd": 20.83,
"change24hPct": -0.0019,
"url": "https://arrowpad.fun/robinhood/token/0x0BB6D7e8D0CE0f8601360507B4e9A064Fc7a7477"
}
]
}GET /api/tokens/latest
Just the newest launch — poll this instead of the full list to catch fresh tokens
quickly (refreshes ~5s). For millisecond-grade sniping, watch the factory's
TokenCreated event on-chain instead.
curl -s https://arrowpad.fun/api/tokens/latestlet seen;
setInterval(async () => {
const t = await (await fetch("https://arrowpad.fun/api/tokens/latest")).json();
if (t.address && t.address !== seen) {
seen = t.address;
console.log("NEW LAUNCH:", t.symbol, t.url);
}
}, 5000);import requests, time
seen = None
while True:
t = requests.get("https://arrowpad.fun/api/tokens/latest", timeout=10).json()
if t.get("address") and t["address"] != seen:
seen = t["address"]
print("NEW LAUNCH:", t["symbol"], t["url"])
time.sleep(5)GET /api/tokens/{address}
One token's full record — same shape as a list entry. 400 for a malformed
address, 404 if it wasn't launched here.
curl -s https://arrowpad.fun/api/tokens/0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0const res = await fetch(
"https://arrowpad.fun/api/tokens/0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0"
);
if (res.ok) {
const token = await res.json();
console.log(token.name, token.priceUsd);
}import requests
r = requests.get(
"https://arrowpad.fun/api/tokens/0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0",
timeout=10,
)
if r.ok:
token = r.json()
print(token["name"], token["priceUsd"])GET /api/trades/{address}
Recent swaps for a token (last 24h, newest first, limit ≤ 200): buy/sell, ETH and
token amounts, execution price, tx hash, block number, timestamp.
curl -s 'https://arrowpad.fun/api/trades/0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0?limit=20'const res = await fetch(
"https://arrowpad.fun/api/trades/0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0?limit=20"
);
const { trades } = await res.json();
for (const t of trades) console.log(t.type, t.ethAmount, "ETH");import requests
r = requests.get(
"https://arrowpad.fun/api/trades/0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0",
params={"limit": 20},
timeout=10,
)
for t in r.json()["trades"]:
print(t["type"], t["ethAmount"], "ETH"){
"token": "0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0",
"pool": "0xb2bE74745d023E3786Aa61395f645C995805897f",
"count": 2,
"trades": [
{
"type": "buy",
"ethAmount": 0.0125,
"tokenAmount": 4131093.02,
"priceEth": 3.0212e-9,
"txHash": "0xfbc4e4d90b5c919f06f1646ec03552b31a8748815502edafd215f5af44b3c967",
"blockNumber": 14417135,
"timestamp": 1784522003
},
{
"type": "sell",
"ethAmount": 0.004,
"tokenAmount": 1322530.11,
"priceEth": 3.0169e-9,
"txHash": "0x2c11ab19c8130b6cd0a2b1749a26e6ba49374556c74d3ad6ec6ba847f27e9d10",
"blockNumber": 14416988,
"timestamp": 1784521560
}
]
}GET /api/candles/{address}
OHLC candles since launch, built from the swap index. interval is in seconds
and is snapped to the nearest supported timeframe — 1, 15, 30, 60, 300, 900, 1800, 3600, 14400, 21600, 43200, 86400, 604800 (1s … 1w) — so any other
value simply lands on the closest one. volume is the WETH leg of the bucket,
in ETH; quiet buckets are flat-filled at the previous close. Answers 503
while the index doesn't cover the coin's whole history yet — read the chain
directly in that case.
curl -s 'https://arrowpad.fun/api/candles/0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0?interval=3600'const res = await fetch(
"https://arrowpad.fun/api/candles/0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0?interval=3600"
);
const { candles } = await res.json();
console.log(candles.at(-1)); // latest hourly candleimport requests
r = requests.get(
"https://arrowpad.fun/api/candles/0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0",
params={"interval": 3600},
timeout=10,
)
for c in r.json()["candles"][-3:]:
print(c["time"], c["open"], c["close"], c["volume"]){
"token": "0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0",
"interval": 3600,
"count": 2,
"candles": [
{ "time": 1784516400, "open": 3.0169e-9, "high": 3.0212e-9, "low": 3.0169e-9, "close": 3.0212e-9, "volume": 0.0125 },
{ "time": 1784520000, "open": 3.0212e-9, "high": 3.0212e-9, "low": 3.0169e-9, "close": 3.0169e-9, "volume": 0.004 }
]
}GET /api/stats
Protocol-wide totals: launches, combined market cap, 24h and all-time volume,
TVL, swap counts, total holders, graduated coins, and the creator fees those
swaps generated. All-time figures come from the swap index and are null
while it is unavailable.
curl -s https://arrowpad.fun/api/stats{
"tokensLaunched": 10,
"marketCapUsd": 58212.4,
"volume24hUsd": 2051.8,
"liquidityUsd": 512.7,
"ethUsd": 1868.68,
"swaps24h": 214,
"holdersTotal": 391,
"graduatedCount": 1,
"volumeAllTimeUsd": 48210.5,
"swapsAllTime": 5321,
"creatorFees24hUsd": 16.4,
"creatorFeesAllTimeUsd": 385.7
}GET /api/config
The protocol's addresses and fee parameters — everything an integrator needs
to talk to the contracts directly. creationFeeWei is a decimal string (wei
overflows a JS number); creatorFeeBps is the creator's share of swap fees in
basis points.
curl -s https://arrowpad.fun/api/config{
"locker": "0xBa9C247041a7715591c7B48f20dFBa520a7d68E9",
"positionManager": "0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3",
"creatorFeeBps": 8000,
"creationFeeWei": "0"
}GET /api/creator-fees/{wallet}
All-time collected creator fees for a wallet, per launched coin, summed
from the locker's on-chain FeesCollected events. collectedUsd values both
sides (token + WETH) at the prices when each collect happened, not
today's. Pending (not-yet-collected) fees are deliberately absent — read them
live by simulating LPLocker.collect(positionId). synced: false means the
server is still backfilling event history (first minutes after a fresh
deployment); treat totals as partial until it flips.
curl -s https://arrowpad.fun/api/creator-fees/0x4A2f8b6c4C43b0E286f3C6c84E58922ab1EFE64Fconst res = await fetch(
"https://arrowpad.fun/api/creator-fees/0x4A2f8b6c4C43b0E286f3C6c84E58922ab1EFE64F"
);
const { positions, totalCollectedUsd } = await res.json();
console.log(totalCollectedUsd, positions.length);import requests
r = requests.get(
"https://arrowpad.fun/api/creator-fees/0x4A2f8b6c4C43b0E286f3C6c84E58922ab1EFE64F",
timeout=10,
)
body = r.json()
for p in body["positions"]:
print(p["positionId"], p["collectedWeth"], "WETH", p["collectedUsd"], "USD"){
"creator": "0x4a2f8b6c4c43b0e286f3c6c84e58922ab1efe64f",
"synced": true,
"positions": [
{
"token": "0x064B9D9E8eC149C9CfeaA90A89f83632ec2ADFD5",
"positionId": "383441",
"collectedToken": 1223515.93,
"collectedWeth": 0.00445955,
"collectedUsd": 15.28
}
],
"totalCollectedWeth": 0.00445955,
"totalCollectedUsd": 15.28
}Freshness and fair use
- Every response is edge-cached, so polling every few seconds is fine and cheap —
you mostly hit a CDN, not our origin. Cache windows by endpoint: trades,
candles and protocol stats ~3s;
/api/tokens/latest~5s;/api/configand/api/creator-fees~15s;/api/tokens, one-token lookups and/api/trending~30s. Token metadata is immutable once launched. - Polling faster than the cache window gains you nothing — you get the same cached body back. For millisecond-grade work, read the chain (see below).
- No API key, no rate limit today. Be reasonable; abuse gets blocked.
- Amounts suffixed
Ethare ETH;Usduses the returnedethUsdrate, except/api/creator-fees, which values each collect at the rate when it happened. Trade timestamps are exact block times. 503means an upstream is briefly unavailable, not that you were blocked — retry shortly.400is a malformed address,404a token not launched here.- Token metadata (name, description, links, image URL) is creator-supplied and returned as-is. If you render it in a UI, escape it like any untrusted input.
- Need another endpoint? Email [email protected].
Trading bots: read the chain directly
For latency-critical work (sniping new launches, market making), skip HTTP and subscribe to on-chain events yourself — everything is public Uniswap V3 infrastructure.
| Thing | Value |
|---|---|
| Chain ID | 4663 |
| RPC | https://rpc.mainnet.chain.robinhood.com |
| ArrowPadFactory | 0x69225A43B20B824F4027B201731d9a21368Bf6Bc |
| WETH | 0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73 |
| SwapRouter02 | 0xCaf681a66D020601342297493863E78C959E5cb2 |
| QuoterV2 | 0x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7 |
| Pool fee tier | 1% (10000) |
New launches: watch the factory's TokenCreated event. Trades: each token pool's
Swap event.