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.
https://solana-api.infinityblocks.ioAuthentication
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
| Endpoint | Description |
|---|---|
POST /v1/rpc | Full 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/health | Freshness-gated health: includes data_freshness_seconds; returns 503 when indexed data is more than 120s behind. No auth required. |
GET /v1/stats | Platform-wide stats: trades, USD/SOL volume, active tokens, traders, launches (1h/24h), live SOL price. |
GET /v1/trending | Tokens ranked by USD volume in a window, with names/symbols. Params: window (1h|4h|24h), limit (≤100) |
GET /v1/tokens/{mint}/price | Latest price in native cash and USD, from the most recent trade (archive fallback for older tokens). |
GET /v1/launches | Token launches across all covered launchpads with creator, name/symbol, and lifecycle status (created → trading → graduated). Extends into the archive. Params: status, limit (≤500), offset |
GET /v1/metadata/{mint} · /v1/metadata?mints=a,b | Token metadata single or batched (≤100): name, symbol, uri, decimals, live supply, mint/freeze authorities. |
GET /v1/wallets/{wallet}/trades | Full trade history for a wallet across all venues, newest first, with USD amounts. Extends into the archive. Params: limit (≤1000) |
GET /v1/wallets/{wallet}/holdings | Live 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-accounts | Raw on-chain token accounts (Token + Token-2022), live from the node. Params: include_zero |
GET /v1/tokens/{mint}/bonding-curve | Live bonding-curve state for any launchpad token (platform auto-detected): status (bonding → graduating → graduated), progress %, real/virtual reserves, graduation target, on-curve price. Archive fallback for older tokens. |
GET /v1/tokens/{mint}/pools | All pools for a token across venues with live vault reserves (raw + UI units). Archive listing for pre-live tokens. |
GET /v1/tokens/{mint}/candles | OHLCV 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}/trades | Recent 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}/activity | Per-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
| Field | Meaning |
|---|---|
is_buy | 1 when the trader spent SOL/USDC/USDT to acquire the token; 0 for the reverse. |
cash_amount / token_amount | Executed amounts parsed from on-chain transfers or program events — not quoted minimums — adjusted to human units. |
price | Cash per token for that fill (in the pair's cash currency). |
ts / block times | True 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.
wss://solana-api.infinityblocks.io/v1/stream?key=YOUR_KEY (or pass
X-API-Key as a header)Channels
| Channel | Delivers |
|---|---|
launches | Every 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. |
pools | Pool registry creations/updates across all venues (live-only, no replay). |
curves | Launchpad 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
| Item | Behavior |
|---|---|
ts_ms | Server-side ingest timestamp (ms). Use it for latency measurement; slot gives chain ordering. |
| Slow consumers | Each 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 failures | Invalid key → connection rejected (HTTP 403 / close 4401). |
cursor | Every event carries a monotonic cursor. Store the last one you processed. |
| Reconnects & replay | Reconnect 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
| Item | Behavior |
|---|---|
| Batching | Up to 64 events per POST, flushed at least every 500 ms. Respond 2xx quickly. |
| Retries | Failed batches retry after 5 s and 30 s, then the batch is dropped (no infinite buffering — reconcile with REST if you were down). |
| Auto-disable | 20 consecutive failed deliveries deactivate the webhook; fix your endpoint and call …/enable. |
| Backpressure | Per-webhook buffer of 5,000 events; overflow drops oldest and the next batch carries a dropped count. |
| Limits | 5 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 processed → confirmed → finalized; 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 p75–p90 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.
| Range | Coverage |
|---|---|
| 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-31 | Sparse (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
| Status | Meaning |
|---|---|
401 | Missing or invalid API key. |
429 | Per-minute rate limit exceeded — the response states your limit. Back off until the next minute. |
502 | Transient 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.