MCAP$2.91T-2.18%
BTC$85,060-0.20%ETH$2,683-0.54%SOL$119.02-2.06%XRP$1.49-0.88%
GOLD$4,160-0.07%
OIL$101.16-1.07%
BTC DOM58.7%
FEAR & GREED70Greed
Updated
News API · v1

API documentation

Base URL: https://bullishmarketcap.com/api/v1 · JSON over HTTPS · times in UTC (ISO 8601).

Quick start

  1. Open the dashboard and sign in with Phantom (one signature, no fees).
  2. Copy your API key — every account starts on the Free plan.
  3. Call an endpoint:
# latest important Bitcoin news
curl "https://bullishmarketcap.com/api/v1/news?coin=BTC&min_importance=7" \
  -H "X-API-Key: bmc_live_YOUR_KEY"

Authentication

Send your key in the X-API-Key header (or Authorization: Bearer …). Keep it secret — anyone with it uses your quota. If it leaks, make a new one in the dashboard; the old key stops working at once.

GET /news

The latest stories, newest first.

ParameterDescription
coinOne or more tickers, comma separated: BTC,ETH,SOL
categorye.g. regulation, etfs, markets, hacks, token-unlocks, macro, just-in
min_importance1–10. Only stories at or above this score (Pro and up)
sinceISO time — only stories newer than this (use it when polling)
cursorISO time from the previous page's "next" — older stories
limit1–50 (Free: up to 20). Default 20
{
  "data": [{
    "id": "sec-approves-3x-leveraged-bitcoin-futures-etf",
    "title": "SEC Approves 3x Leveraged Bitcoin Futures ETF",
    "summary": "…",              // Pro+
    "importance": 8,              // Pro+
    "breaking": true,             // Pro+
    "category": "regulation",
    "coins": ["BTC"],             // Pro+
    "tags": ["Bitcoin", "ETF"],   // Pro+
    "image": "https://…webp",     // Pro+
    "url": "https://bullishmarketcap.com/news/…",
    "body_markdown": "…",         // Business
    "source_url": "https://…",    // Business
    "published_at": "2026-10-05T18:16:04Z",
    "updated_at": "2026-10-05T18:16:04Z"
  }],
  "next": "2026-10-05T18:16:04Z",
  "plan": "pro",
  "delayed_minutes": 0
}

Free keys see stories 1 hour after publication with id, title, category, url and time.

Polling tip

Ask every 30–60 seconds with since= the newest published_at you already have. You only get new stories and use few requests.

GET /news/{id}

One story by its id (the same fields as in the list).

GET /breaking Pro

Only JUST IN alerts and stories scored 8/10 or higher. Accepts the same parameters as /news.

GET /calendar Pro

ParameterDescription
fromYYYY-MM-DD (default: today, UTC)
days1–14, default 7
impacthigh · medium (high + medium, default) · all
{ "data": [{ "id": "3f9c…", "title": "CPI m/m", "country": "USD", "time": "2026-10-14T12:30:00Z",
  "impact": "High", "forecast": "0.3%", "previous": "0.4%", "actual": null, "url": "https://…/calendar/3f9c…" }] }

GET /unlocks Pro

ParameterDescription
days1–90, default 7
min_usdOnly unlocks worth at least this many dollars
min_pctOnly unlocks of at least this % of circulating supply
{ "data": [{ "id": "movement-1791557940", "token": "Movement", "symbol": "MOVE", "time": "2026-10-09T14:39:00.000Z",
  "tokens": 164583333, "usd": 1665786, "pct_of_supply": 3.66, "recipient": "Investors",
  "split": [{ "label": "Investors", "n": 62500000 }, …], "url": "https://…/unlocks/movement" }] }

Webhooks Business

Save an https URL in the dashboard. Each new story is POSTed to it seconds after publication:

POST https://yourapp.com/hooks/bmc
Content-Type: application/json
X-BMC-Signature: sha256=<hex HMAC of the raw body with your webhook secret>

{ "event": "story.published", "data": { …same fields as /news… }, "sent_at": "2026-10-05T18:16:05Z" }

Check the signature before trusting the body (Node.js):

const crypto = require("crypto");
const sig = "sha256=" + crypto.createHmac("sha256", process.env.BMC_WEBHOOK_SECRET).update(rawBody).digest("hex");
if (sig !== req.headers["x-bmc-signature"]) return res.status(401).end();

Answer with any 2xx within 6 seconds. Use the dashboard's Send test button to try it.

Limits & plans

PlanPer dayPer minuteDelay
Free10560 min
Pro10,00060none
Business100,000300none

Every answer carries X-RateLimit-Remaining-Day and X-Plan headers. Daily limits reset at 00:00 UTC. Plans run for 30 days per payment and are not renewed automatically; when a plan ends the key keeps working on Free.

Errors

ParameterDescription
401Missing, invalid or replaced API key
403Your plan does not include this endpoint, or the key is blocked
404Story not found
429Rate limit — see retry_after (seconds) in the body
5xxTemporary problem — retry after a few seconds

Questions? Contact us or message us on Telegram.