PumpFlarePumpFlare
Back to docs

PumpFlare Data API

The same real-time pump.fun index that powers the PumpFlare terminal and charts, exposed as a plain REST API. Token discovery, trade streams, OHLCV candles, holder distribution, per-trader P&L — plus unsigned transaction builders for buys, sells, launches and fee claims.

Base URL

https://pumpflare.fun/api/v1

All responses are JSON. CORS is open on the read endpoints, so you can call them straight from a browser.

Authentication

Create a key under Settings → Developer (wallet sign-in required, up to 5 active keys). Keys look like pf_live_… and are shown exactly once — we only store a SHA-256 hash, so a lost key must be revoked and replaced.

x-api-key: pf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
Authorization: Bearer pf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Keys are secrets. Call the API from your backend — anything you ship to a browser or a mobile app is readable by your users. Revoke a leaked key immediately from Settings; it stops working within seconds.

Tiers & rate limits

TierPer minutePer dayFor
Free6010,000Hobby projects, prototypes and evaluation.
Pro300200,000Production dashboards, bots and trading tools.
VIP1,000unlimitedHigh-frequency consumers. No daily cap.

Every response carries the current budget. The minute window is a rolling 60 seconds; the daily quota resets at 00:00 UTC.

X-RateLimit-Tier:      free
X-RateLimit-Limit:     60
X-RateLimit-Remaining: 57
X-RateLimit-Reset:     1755820860   # unix seconds
Retry-After:           12           # on 429 only

New keys start on Free. Need more? Reach out and we will move your key to Pro or VIP.

Data endpoints

  • GET/api/v1/tokens

    Live token list — newest launches, tokens about to graduate, or migrated ones.

    filter=newest|graduating|migrated · sort · limit (max 100)

  • GET/api/v1/token/{mint}

    Full token detail: metadata, bonding-curve progress, market cap, price, holder count, graduation state.

  • GET/api/v1/trades/{mint}

    Recent trades for a token, newest first. Buys and sells with SOL and token amounts.

    limit (default 500, max 5000) · from · to (unix seconds)

  • GET/api/v1/ohlcv/{mint}

    Candles for charting, backed by a persistent candle store (1m/1h/1d kept forever).

    resolution=1s|15s|30s|1m|5m|15m|1h|4h|1d (required) · from · to (unix seconds)

  • GET/api/v1/holders/{mint}

    Accurate holder count and top-holder distribution, cached server-side.

  • GET/api/v1/top-traders/{mint}

    Per-trader P&L aggregation: realized/unrealized SOL, volume, buy/sell counts, dev flag.

    limit (default 20, max 100) · sort=pnl|volume|netSol

  • GET/api/v1/dev-trades/{mint}

    The creator wallet's own trades — the fastest way to spot a dev sell.

    limit (default 200)

  • POST/api/v1/backfill/{mint}

    Kick off a historic trade backfill from chain (202 + job status). Poll the same path with GET.

    from · to (unix seconds) — narrow the window to keep it cheap

Transaction builders

These return unsigned base64 transactions — we never see or hold a private key. Sign and submit them yourself. Wildcard CORS is deliberately off here: call them server-side with your key.

  • POST/api/v1/buy

    Build an unsigned buy transaction (bonding curve or post-graduation route).

  • POST/api/v1/sell

    Build an unsigned sell transaction.

  • POST/api/v1/create

    Build an unsigned token-creation transaction (uploads metadata).

  • POST/api/v1/bundle

    Build several buy/sell transactions in one call.

  • POST/api/v1/claim-fee

    Build a creator-fee claim transaction for one mint.

  • POST/api/v1/claim-fees

    Build claim transactions for every mint a creator owns.

Status endpoints

  • GET/api/v1/health

    Liveness probe — RPC reachability and latency. No key needed.

  • GET/api/v1/status

    Service status: indexer, streams, trade store, feature flags. No key needed.

Examples

curl

# Newest launches
curl -H "x-api-key: pf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  "https://pumpflare.fun/api/v1/tokens?filter=newest&limit=20"

# 1-minute candles for the last hour
curl -H "x-api-key: pf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  "https://pumpflare.fun/api/v1/ohlcv/<MINT>?resolution=1m&from=$(($(date +%s)-3600))"

# Authorization: Bearer works too
curl -H "Authorization: Bearer pf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  "https://pumpflare.fun/api/v1/token/<MINT>"

JavaScript (fetch, with 429 backoff)

const API = 'https://pumpflare.fun/api/v1';
const KEY = process.env.PUMPFLARE_API_KEY;

async function pumpflare(path, init = {}) {
  const res = await fetch(API + path, {
    ...init,
    headers: { 'x-api-key': KEY, ...(init.headers || {}) },
  });

  if (res.status === 429) {
    // Back off for exactly as long as we're told, then retry once.
    const wait = Number(res.headers.get('Retry-After') || 1);
    await new Promise((r) => setTimeout(r, wait * 1000));
    return pumpflare(path, init);
  }
  if (!res.ok) throw new Error((await res.json()).error);

  console.log('remaining this minute:', res.headers.get('X-RateLimit-Remaining'));
  return res.json();
}

const { tokens } = await pumpflare('/tokens?filter=graduating&limit=10');

Example response — GET /tokens

{
  "tokens": [
    {
      "mint": "8Xy...pump",
      "name": "Example",
      "symbol": "EXMPL",
      "creator": "9aB...xyz",
      "marketCap": 41230.55,
      "price": 0.0000412,
      "bondingCurveProgress": 78.4,
      "graduated": false,
      "createdAt": 1755820000
    }
  ],
  "count": 1
}

Errors

Errors are JSON with a stable machine-readable code. Branch on the code, not the message.

{
  "error": "An API key is required. Send it as `x-api-key: pf_live_…`.",
  "code": "API_KEY_REQUIRED",
  "docs": "https://pumpflare.fun/docs/api"
}
StatusCodeMeaning
400BAD_REQUESTBad or missing query parameter (e.g. invalid mint, missing resolution).
401API_KEY_REQUIREDNo key presented on an endpoint that needs one.
401INVALID_API_KEYUnknown, malformed or revoked key.
404—Unknown mint, or no data recorded for it yet.
429RATE_LIMITEDPer-minute limit exceeded. See Retry-After.
429DAILY_QUOTA_EXCEEDEDDaily quota exhausted. Resets at 00:00 UTC.
500INTERNAL_ERRORSomething broke on our side. Retry with backoff.
503KEY_VERIFICATION_UNAVAILABLEWe can't verify keys right now — your key is fine. Retry after the interval in Retry-After.

Twitter Alerts

View All Alerts