ArrowPad Docs

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/tokens
const 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"])
Example response
{
  "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"])
Example response
{
  "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/latest
let 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/0x073D75e385E8319f4e10C3C64277AC29F9Ee7Bc0
const 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")
Example response
{
  "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 timeframe1, 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 candle
import 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"])
Example response
{
  "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
Example response
{
  "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
Example response
{
  "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/0x4A2f8b6c4C43b0E286f3C6c84E58922ab1EFE64F
const 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")
Example response
{
  "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/config and /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 Eth are ETH; Usd uses the returned ethUsd rate, except /api/creator-fees, which values each collect at the rate when it happened. Trade timestamps are exact block times.
  • 503 means an upstream is briefly unavailable, not that you were blocked — retry shortly. 400 is a malformed address, 404 a 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.

ThingValue
Chain ID4663
RPChttps://rpc.mainnet.chain.robinhood.com
ArrowPadFactory0x69225A43B20B824F4027B201731d9a21368Bf6Bc
WETH0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73
SwapRouter020xCaf681a66D020601342297493863E78C959E5cb2
QuoterV20x33e885eD0Ec9bF04EcfB19341582aADCb4c8A9E7
Pool fee tier1% (10000)

New launches: watch the factory's TokenCreated event. Trades: each token pool's Swap event.

On this page