Developers

Read every fill
as it lands

The public API stays free and needs no key. A key, a plan and a stream are for the bots and funds that read it all day.

Start

01

Read without a key

Coins, trades, events, quotes and stats, edge-cached, for anyone. The reference is /docs#api and the schema is openapi.json.

02

Make a key

One wallet signature below. Send it as x-api-key or Authorization: Bearer pk_…; it holds your requests to your plan instead of the per-address limit.

03

Stream or subscribe

Hold the firehose open for every fill on a chain, or register a webhook for the coins you care about and let us call you.

A keyed read
curl -s -H 'x-api-key: pk_…' 'https://parabolic.family/api/v1/events?limit=50'

Plans

PlanPriceA minuteA dayStreamsWebhooksCoins watched
Free keyFree6020,000None110
Pro keyWith Pro600250,000None350
Hyper keyWith Hyper3,0001,000,000110200
Data Bot49 USDC a month1,2002,000,000310200
Data Fund299 USDC a month6,00020,000,00020251,000

A key carries the larger of its wallet's Pro plan and its Data plan, limit by limit, so buying one never lowers the other. The daily figure is a fair-use ceiling counted per UTC day and approximate within one write batch. Nothing renews by itself.

Checkout

Coming
FromConnect a wallet
Total49 USDC

Sends 49 USDC to the treasury 0x9704…E123 on Arc. The plan starts when the payment lands; nothing renews.

Data plans open soon

Usage

Paste a key to read its own usage. It is sent once, to this site, and kept nowhere.

Keys

API keys

A key lifts the public API to your plan's limit: 60 a minute on Free, 600 on Pro, 3,000 on Hyper. The API stays open without one.

The firehose

Every fill, launch and graduation on one chain, oldest first, as server-sent events. Each frame's id is a cursor: reconnect with it as Last-Event-ID (or ?cursor=) and the stream sends everything after it that the server still holds, then carries on live. If it cannot be sure nothing is missing it says so in one gap frame with the REST call that fills it. A stream closes cleanly after 50 seconds with a bye frame naming where to resume, because the host's functions have a ceiling; it is server-sent events and not a socket for the same reason. Filters: kinds, minQuote in the coin's own quote units, and up to 200 coins. Hyper holds one stream; the Data plans hold more.

Coming The firehose opens with the Data plans.

Open it with curl
curl -sN -H 'x-api-key: pk_…' \
  'https://parabolic.family/api/v1/data/stream?kinds=buy,sell&minQuote=100'
Read it from Node, resuming
// Node 22: read the firehose, resume from the last id after every reconnect.
let cursor = "";
for (;;) {
  const res = await fetch("https://parabolic.family/api/v1/data/stream?chain=arc", {
    headers: { "x-api-key": process.env.PARABOLIC_KEY, ...(cursor ? { "last-event-id": cursor } : {}) },
  });
  if (!res.ok) { console.error(await res.text()); await new Promise((r) => setTimeout(r, 5000)); continue; }
  let buf = "";
  for await (const chunk of res.body.pipeThrough(new TextDecoderStream())) {
    buf += chunk;
    let i;
    while ((i = buf.indexOf("\n\n")) >= 0) {
      const frame = buf.slice(0, i); buf = buf.slice(i + 2);
      const id = /^id: (.+)$/m.exec(frame)?.[1];
      const data = /^data: (.+)$/m.exec(frame)?.[1];
      if (/^event: event$/m.test(frame) && data) { const e = JSON.parse(data); console.log(e.kind, e.ticker, e.quote); }
      if (id) cursor = id;
    }
  }
}

Webhooks

Any wallet, on any plan, can have us POST on-chain events to an https URL: a new launch on a chain, a fill above a size, a graduation, or the creator selling, on the coins you name. Each delivery is signed with a secret shown once, retried after 30 seconds, 2 minutes, 10 minutes and an hour, and a webhook that fails 20 deliveries in a row is switched off until you switch it back on. We deliver only to a public https host on port 443, never follow a redirect, and check the address before every connection.

Your webhooks

Connect a wallet to see and set its webhooks.

New webhook

Coming
Events

Webhook delivery opens soon

The body
{
  "type": "coin.fill",
  "id": "9f2c…",            // the same on every retry: drop a duplicate by it
  "hook": "a1b2c3d4e5f6",
  "at": 1790985600,
  "chain": "rhc",
  "coin": { "chain": "rhc", "address": "0x3663…5d02", "ticker": "PARAHOOD", "name": "ParaHood", "url": "https://www.parabolic.family/coin/rhc:0x3663…" },
  "event": { "id": "0xab…-12", "kind": "buy", "timestamp": 1790985598, "account": "0x…", "quote": 250, "tokens": 1840000, "pair": "USDG", "txHash": "0xab…" }
}
Check the signature (Node)
import { createHmac, timingSafeEqual } from "node:crypto";

// x-parabolic-signature: t=<unix seconds>,v1=<hex HMAC-SHA256(secret, "<t>.<raw body>")>
export function verify(rawBody, header, secret, toleranceSec = 300) {
  const t = /t=(\d+)/.exec(header)?.[1], v1 = /v1=([0-9a-f]{64})/.exec(header)?.[1];
  if (!t || !v1 || Math.abs(Date.now() / 1000 - Number(t)) > toleranceSec) return false;
  const want = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
  return timingSafeEqual(want, Buffer.from(v1, "hex"));
}

Agents

The MCP server builds unsigned transactions for an agent and never holds a key (/docs#mcp). The agent launch kit is a template on top of it: it launches a coin, posts its status and manages the coin inside hard limits on spend, slippage and the balance of its own small hot wallet, and it never sells the creator's coins without a person approving that exact sale. It runs against a local fork by default. Write to contact@parabolic.family for the template while the repository is private.

The API is a read of public chain data. Nothing here ranks coins as buys, promises a return or reorders anybody's trade: a paid plan gets more requests and earlier data, never a better fill.