API documentation
Base URL: https://bullishmarketcap.com/api/v1 · JSON over HTTPS · times in UTC (ISO 8601).
Quick start
- Open the dashboard and sign in with Phantom (one signature, no fees).
- Copy your API key — every account starts on the Free plan.
- 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.
| Parameter | Description |
|---|---|
| coin | One or more tickers, comma separated: BTC,ETH,SOL |
| category | e.g. regulation, etfs, markets, hacks, token-unlocks, macro, just-in |
| min_importance | 1–10. Only stories at or above this score (Pro and up) |
| since | ISO time — only stories newer than this (use it when polling) |
| cursor | ISO time from the previous page's "next" — older stories |
| limit | 1–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
| Parameter | Description |
|---|---|
| from | YYYY-MM-DD (default: today, UTC) |
| days | 1–14, default 7 |
| impact | high · 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
| Parameter | Description |
|---|---|
| days | 1–90, default 7 |
| min_usd | Only unlocks worth at least this many dollars |
| min_pct | Only 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
| Plan | Per day | Per minute | Delay |
|---|---|---|---|
| Free | 10 | 5 | 60 min |
| Pro | 10,000 | 60 | none |
| Business | 100,000 | 300 | none |
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
| Parameter | Description |
|---|---|
| 401 | Missing, invalid or replaced API key |
| 403 | Your plan does not include this endpoint, or the key is blocked |
| 404 | Story not found |
| 429 | Rate limit — see retry_after (seconds) in the body |
| 5xx | Temporary problem — retry after a few seconds |
Questions? Contact us or message us on Telegram.