INFINITYBLOCKS API

Real-time Solana DEX data — launches, trades, candles, pool activity, live WebSocket streams, signed webhooks, and transaction submission with auto-rebroadcast and Jito bundles across every major venue.

OPEN INTERACTIVE API EXPLORER →

Overview

The InfinityBlocks Solana API serves real-time, execution-accurate DEX data indexed directly from our own mainnet infrastructure. Coverage includes Raydium (AMM v4, CLMM, CPMM, Launchpad, Stable), pump.fun (bonding curve, event-sourced), PumpSwap, Meteora (DLMM, DAMM v2), Orca Whirlpools, Moonshot, Lifinity, and Phoenix. Trades carry executed amounts (not quoted minimums), correct token decimals, true chain block times, and buy/sell direction.

Base URL: https://solana-api.infinityblocks.io

Authentication

Every request requires an API key in the X-API-Key header (or Authorization: Bearer …). Keys are issued per tenant with individual rate limits; exceeding your limit returns 429.

curl -H "X-API-Key: ib_live_your_key_here" \
  "https://solana-api.infinityblocks.io/v1/health"

Endpoints

EndpointDescription
POST /v1/rpcFull standard Solana JSON-RPC (every method incl. getProgramAccounts, batches supported), served from our node with archive failover. Drop-in RPC URL: …/v1/rpc?api-key=KEY works directly in web3.js Connection. WebSocket pubsub (accountSubscribe, logsSubscribe, programSubscribe, slotSubscribe…) at wss://…/v1/rpc/ws?api-key=KEY — pass both URLs to Connection(url, {wsEndpoint}) for a complete drop-in.
GET /v1/healthFreshness-gated health: includes data_freshness_seconds; returns 503 when indexed data is more than 120s behind. No auth required.
GET /v1/statsPlatform-wide stats: trades, USD/SOL volume, active tokens, traders, launches (1h/24h), live SOL price.
GET /v1/trendingTokens ranked by USD volume in a window, with names/symbols.
Params: window (1h|4h|24h), limit (≤100)
GET /v1/tokens/{mint}/priceLatest price in native cash and USD, from the most recent trade (archive fallback for older tokens).
GET /v1/launchesToken launches across all covered launchpads with creator, name/symbol, and lifecycle status (createdtradinggraduated). Extends into the archive.
Params: status, limit (≤500), offset
GET /v1/metadata/{mint} · /v1/metadata?mints=a,bToken metadata single or batched (≤100): name, symbol, uri, decimals, live supply, mint/freeze authorities.
GET /v1/wallets/{wallet}/tradesFull trade history for a wallet across all venues, newest first, with USD amounts. Extends into the archive.
Params: limit (≤1000)
GET /v1/wallets/{wallet}/holdingsLive on-chain wallet holdings (Token + Token-2022 + native SOL), valued in USD at latest observed prices; keyset paging via after/nextCursor.
Params: limit (≤50), after
GET /v1/wallets/{wallet}/token-accountsRaw on-chain token accounts (Token + Token-2022), live from the node.
Params: include_zero
GET /v1/tokens/{mint}/bonding-curveLive bonding-curve state for any launchpad token (platform auto-detected): status (bondinggraduatinggraduated), progress %, real/virtual reserves, graduation target, on-curve price. Archive fallback for older tokens.
GET /v1/tokens/{mint}/poolsAll pools for a token across venues with live vault reserves (raw + UI units). Archive listing for pre-live tokens.
GET /v1/tokens/{mint}/candlesOHLCV candles, deterministic from trades.
Params: interval (1m 5m 15m 30m 1h 4h 1d 1w), cash (default wrapped SOL), currency (native | usd), limit (≤1000 buckets)
GET /v1/tokens/{mint}/tradesRecent trades for a token: venue, trader, buy/sell, executed amounts, price — plus amount_usd / price_usd from per-minute SOL pricing. Extends into the archive past the live window.
Params: limit (≤1000)
GET /v1/pools/{pool}/activityPer-minute event count and volume for a specific pool.
Params: limit (≤1440)

Example — token launches feed

# newest launches with names
curl -H "X-API-Key: $KEY" \
  "https://solana-api.infinityblocks.io/v1/launches?limit=5"
{
  "tenant": "yourapp",
  "data": [{
    "ingested_at": "2026-08-20 08:34:22.911",
    "slot": 440438112,
    "venue": "pumpfun_bc",
    "pool": "GReZ…",
    "creator": "8kfe…",
    "mint": "GReZeKfAD4…",
    "symbol": "HYENA",
    "name": "Mayhem Hyena"
  }]
}

Example — USD candles

curl -H "X-API-Key: $KEY" \
  "https://solana-api.infinityblocks.io/v1/tokens/<MINT>/candles?currency=usd&limit=60"
{
  "data": [{
    "ts": "2026-08-20 08:52:00",
    "open": 0.00327, "high": 0.00341, "low": 0.00320, "close": 0.00338,
    "volume_usd": 15423.11, "volume_token": 4571002.4, "trades": 87
  }]
}

Example — token trades

curl -H "X-API-Key: $KEY" \
  "https://solana-api.infinityblocks.io/v1/tokens/<MINT>/trades?limit=3"

Data semantics

FieldMeaning
is_buy1 when the trader spent SOL/USDC/USDT to acquire the token; 0 for the reverse.
cash_amount / token_amountExecuted amounts parsed from on-chain transfers or program events — not quoted minimums — adjusted to human units.
priceCash per token for that fill (in the pair's cash currency).
ts / block timesTrue chain block time.

Streaming (WebSocket)

Live event delivery with sub-second latency from our own node. Connect, subscribe to channels, receive events as they execute on chain.

Endpoint: wss://solana-api.infinityblocks.io/v1/stream?key=YOUR_KEY
(or pass X-API-Key as a header)

Channels

ChannelDelivers
launchesEvery new token launch across all covered launchpads (pump.fun, Raydium Launchpad, Moonshot), with mint, creator, and token name/symbol where emitted on-chain.
trades:<MINT>Every trade for that token, all venues, with executed amounts and direction.
pool:<POOL>Every event on a specific pool (trades, liquidity where decoded).
price:<MINT>Compact price ticks for a token: {mint, price, cash_mint, venue, slot, ts_ms, cursor}.
venue:<VENUE>Every event on one venue (e.g. venue:pumpswap, venue:launchpad) — platform-level firehose.
poolsPool registry creations/updates across all venues (live-only, no replay).
curvesLaunchpad lifecycle: new curves and graduations/migrations across all launch platforms.

Protocol

# after connecting you receive:
{"type":"hello","tenant":"yourapp","channels":["launches","trades:<mint>","pool:<pool>"]}

# subscribe (up to 50 channels per connection); add/remove any time:
{"subscribe":["launches","trades:GReZeKfAD4…"]}
{"unsubscribe":["launches"]}
→ {"type":"subscribed","channels":["trades:GReZeKfAD4…"]}

# keepalive:
{"ping":true} → {"type":"pong"}

# events:
{"type":"event","channel":"launches","data":{
  "slot":440499967,"venue":"pumpfun_bc","event":"create",
  "base_mint":"78MpKoNd…","symbol":"SIMPSONS","name":"The Simpsons",
  "user":"…creator…","ts_ms":1787240138096}}

Example (Python)

import asyncio, json, websockets

async def main():
    uri = "wss://solana-api.infinityblocks.io/v1/stream?key=" + KEY
    async with websockets.connect(uri) as ws:
        await ws.recv()                              # hello
        await ws.send(json.dumps({"subscribe": ["launches"]}))
        async for msg in ws:
            m = json.loads(msg)
            if m.get("type") == "event":
                print(m["channel"], m["data"]["venue"], m["data"].get("symbol"))

asyncio.run(main())

Semantics & limits

ItemBehavior
ts_msServer-side ingest timestamp (ms). Use it for latency measurement; slot gives chain ordering.
Slow consumersEach connection buffers up to 2,000 events; if your client cannot keep up, oldest undelivered events are dropped. Keep handlers fast or fan work out.
Auth failuresInvalid key → connection rejected (HTTP 403 / close 4401).
cursorEvery event carries a monotonic cursor. Store the last one you processed.
Reconnects & replayReconnect and subscribe with {"subscribe":[…],"since":<last_cursor>} — the gap is replayed from storage in order (events marked "replay":true), then {"type":"replay_complete","cursor":…} and the stream switches to live. No loss, no duplicates. A since older than the replay horizon gets a beyond_replay_horizon warning and replays from the horizon; reconcile older ranges via REST. Health & horizon: GET /v1/stream/health (no auth).

Webhooks

Prefer push over holding a socket? Register an HTTPS endpoint and we deliver the same channel events as signed, batched POSTs. Managed entirely via the API with your key.

Manage

# create (secret is returned once — store it; deliveries start within ~15s)
curl -X POST -H "X-API-Key: $KEY" -H "content-type: application/json" \
  -d '{"url":"https://your.app/hooks/ib","channels":["launches","trades:<MINT>"]}' \
  https://solana-api.infinityblocks.io/v1/webhooks

# list / delete / re-enable / send a test event
curl -H "X-API-Key: $KEY" https://solana-api.infinityblocks.io/v1/webhooks
curl -X DELETE -H "X-API-Key: $KEY" https://solana-api.infinityblocks.io/v1/webhooks/ID
curl -X POST -H "X-API-Key: $KEY" https://solana-api.infinityblocks.io/v1/webhooks/ID/enable
curl -X POST -H "X-API-Key: $KEY" https://solana-api.infinityblocks.io/v1/webhooks/ID/test

Payload

POST your-url
Content-Type: application/json
X-IB-Webhook-Id: 7
X-IB-Timestamp: 1787241000123
X-IB-Signature: sha256=<hex hmac>

{"webhook_id":7,"batch_ts":1787241000123,"events":[
  {"channel":"launches","data":{"venue":"pumpfun_bc","event":"create","base_mint":"…","symbol":"…","name":"…","slot":440499967,"ts_ms":1787240138096}},
  {"channel":"trades:…","data":{"venue":"pumpswap","event":"buy","exec_in":"…","exec_out":"…","slot":440500014,"ts_ms":…}}
]}

Verify the signature

import hashlib, hmac

def verify(secret: str, timestamp: str, raw_body: bytes, header: str) -> bool:
    want = "sha256=" + hmac.new(secret.encode(),
        timestamp.encode() + b"." + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(header, want)

Delivery semantics

ItemBehavior
BatchingUp to 64 events per POST, flushed at least every 500 ms. Respond 2xx quickly.
RetriesFailed batches retry after 5 s and 30 s, then the batch is dropped (no infinite buffering — reconcile with REST if you were down).
Auto-disable20 consecutive failed deliveries deactivate the webhook; fix your endpoint and call …/enable.
BackpressurePer-webhook buffer of 5,000 events; overflow drops oldest and the next batch carries a dropped count.
Limits5 webhooks per tenant, 50 channels each. URLs must be http(s) on publicly-routable hosts.

Transactions

Submit signed transactions through our node with automatic rebroadcast, and price your priority fees from live cluster data.

Send

# body: base64-encoded, fully signed transaction
curl -X POST -H "X-API-Key: $KEY" -H "content-type: application/json" \
  -d '{"tx":"AZx3…base64…","skip_preflight":true}' \
  https://solana-api.infinityblocks.io/v1/tx/send
→ {"signature":"3d8kjR7…"}

We forward straight to the current leader and then rebroadcast every 2 seconds until the transaction is confirmed, fails, or its blockhash expires (~60s). Preflight simulation is skipped by default for latency — pass "skip_preflight": false to simulate first.

Track

curl -H "X-API-Key: $KEY" \
  https://solana-api.infinityblocks.io/v1/tx/<SIGNATURE>/status
→ {"signature":"…","status":"confirmed","err":null,"slot":440504607,"rebroadcasts":2,"tracking":false}

status is processedconfirmedfinalized; unknown means the cluster has not seen it (yet).

Priority fees

# global floor (often 0), or scoped to the accounts your tx locks:
curl -H "X-API-Key: $KEY" \
  "https://solana-api.infinityblocks.io/v1/priority-fees?accounts=<MARKET>,<POOL>"
→ {"samples":150,"slot_range":[440504458,440504607],
   "micro_lamports_per_cu":{"p25":0,"p50":1200,"p75":8000,"p90":25000,"max":410000}}

Always pass the writable accounts your transaction touches — fee markets on Solana are per account, so the global floor is usually 0 while a hot pool needs real priority. Use p75p90 for time-sensitive swaps.

Jito — MEV-protected sends & atomic bundles

Route through the Jito block engine for MEV protection, revert protection, and better landing during congestion. Jito requires a tip: include a system transfer to any tip account inside your transaction (or the last transaction of a bundle).

# current tip accounts + live tip floor (lamports)
curl -H "X-API-Key: $KEY" https://solana-api.infinityblocks.io/v1/tx/tips
→ {"tip_accounts":["96gYZG…", …],
   "floor_lamports":{"p25":1000,"p50":1024,"p75":6492,"p95":47403,"p99":58850,"ema_p50":2644}}

# single transaction via Jito; revert_protection = lands only if it succeeds
curl -X POST -H "X-API-Key: $KEY" -H "content-type: application/json" \
  -d '{"tx":"AZx3…","via":"jito","revert_protection":true}' \
  https://solana-api.infinityblocks.io/v1/tx/send

# atomic bundle: 1-5 transactions execute in order, all-or-nothing
curl -X POST -H "X-API-Key: $KEY" -H "content-type: application/json" \
  -d '{"txs":["AZx3…","AKm9…"]}' \
  https://solana-api.infinityblocks.io/v1/tx/bundle
→ {"bundle_id":"e3a1…"}

curl -H "X-API-Key: $KEY" \
  https://solana-api.infinityblocks.io/v1/tx/bundle/<BUNDLE_ID>/status

Tip guidance: p50 for normal conditions, p75+ when racing (launches, liquidations). Minimum accepted tip is 1,000 lamports. Bundle status unknown means the engine no longer tracks it — check your transaction signatures via /v1/tx/<SIG>/status.

Historical depth

Token-scoped endpoints (/trades, /candles, token overview) extend past our live indexing window into an imported, chain-verified archive going back to late May 2026. Archive rows and candles carry "source":"archive"; rows without it are from the live pipeline. Archive USD figures use per-trade historical SOL/USD pricing.

RangeCoverage
2026-08-19 → now (live)All 13 venues, executed amounts, full event detail, streaming + replay.
~2026-05-31 → 2026-08-19 (archive)Raydium (AMM v4, CLMM, CPMM, Launchpad, Stable), Meteora (DLMM, DAMM v1+v2, DBC). Not covered historically: PumpSwap, pump.fun bonding curve, Orca, Moonshot, Lifinity, Phoenix. Archive is quality-filtered (anomalous prices excluded).
2026-05-03 → 2026-05-31Sparse (Raydium CPMM + Launchpad only, partial).

Revenue tracking (watched addresses)

Register any addresses — fee wallets, treasuries, creator fee keys — under your API key and we ledger every balance change (SOL and tokens) they see, with the causing transaction, fee attribution, and best-effort counterparty. Capture runs on our own node and starts within ~30 seconds of registration.

# watch an address (up to 200 per tenant)
curl -X POST -H "X-API-Key: $KEY" -H "content-type: application/json" \
  -d '{"url_unused": 0, "address":"<FEE_WALLET>","label":"protocol fees","role":"fee_wallet"}' \
  https://solana-api.infinityblocks.io/v1/revenue/accounts

curl -H "X-API-Key: $KEY" …/v1/revenue/accounts        # list + per-address inflow/net
curl -H "X-API-Key: $KEY" …/v1/revenue/totals?window=86400
curl -H "X-API-Key: $KEY" …/v1/revenue/events?limit=100 # raw ledger, newest first
curl -H "X-API-Key: $KEY" …/v1/revenue/coverage         # honest coverage incl. known gaps

Where an imported archive ledger exists for your platform, totals and events extend into it ("source":"archive"), and /coverage states any gap between archive end and live start explicitly.

Rate limits & errors

StatusMeaning
401Missing or invalid API key.
429Per-minute rate limit exceeded — the response states your limit. Back off until the next minute.
502Transient upstream issue — retry with backoff.

Try it live

The interactive API explorer (OpenAPI/Swagger) lets you authorize with your key and execute requests from the browser.