API reference · v1
Docs
It's a read-only REST API. You fetch news, we don't want anything back. Three endpoints, one auth header, JSON out. If something here is unclear, that's a bug in the docs, so tell us.
Base URL https://api.coinnewspot.com
Authentication
Put your key in the X-API-Key header. Keep it server-side. A key in browser JavaScript or a public repo is a leaked key.
Before the first call, add your server to the key's allowlist (Dashboard → API → Allowlist): its IP address (IPv4, IPv6 or a range like 203.0.113.0/24) or your website. A key works only from those, so a copied key is useless elsewhere. A website matches only when the calls come from that website's own server; behind Cloudflare or another proxy, add the server's IP address.
GET /v1/news HTTP/1.1
Host: api.coinnewspot.com
X-API-Key: YOUR_API_KEYGET /v1/news
Newest first. All parameters are optional.
| Parameter | Type | What it does |
|---|---|---|
| since_id | integer | Only items with an id above this. Store the last id you processed and send it back. |
| category | string | Comma-separated names from /v1/categories, any case. Example: Hacking News,Funding |
| from, to | date or ISO 8601 | Publish-time window, UTC. 2026-10-08 or 2026-10-08T14:30:00Z. A date in to includes that whole day. |
| q | string | Text match on title and description. |
| coins | string | Comma-separated coin symbols, any case: BTC,SOL. Only stories about those coins. Every story lists its coins. |
| limit | integer | 1 to 100. Default 20. |
| page | integer | Without since_id: 1 is the newest page, 2 the next, and so on. has_more tells you if there's another. |
| description | boolean | false leaves the description out, for a lighter response. Default true. |
curl "https://api.coinnewspot.com/v1/news?since_id=1200&limit=50" \
-H "X-API-Key: YOUR_API_KEY"GET /v1/categories
Returns the category names in use. Use them verbatim in the category filter.
- Hacking News
- Exploits, drained bridges, phishing waves, paused contracts.
- Exchange Listing
- An exchange adds a pair, a perp or a new market.
- New Coin Listing
- A token goes live for the first time on a DEX or CEX.
- Funding
- Seed to Series C, grants, treasury raises.
- All Time High
- A coin or the market prints a new record high.
- All Time Low
- A coin falls to its lowest price ever recorded.
- Price Prediction
- Analyst targets and model calls, labelled as opinion.
- Growth
- Users, TVL, volume or supply passing a real milestone.
- New Web Product
- Wallets, explorers, apps and tools that just shipped.
- Update
- Client releases, upgrades, migrations, deprecations.
- Event
- Conferences, webinars, meetups, governance votes and deadlines, with dates.
- Hackathon
- Hackathons and coding competitions: announcements, deadlines, results.
- Company Update
- Product releases, changelogs and company news from the teams themselves.
- People Update
- Hires, departures, promotions and awards.
- News
- Regulation, macro and everything that matters but fits nowhere else.
Coins
Each story is tagged with the coins it is about (from its symbol, a $SYMBOL or the coin's name). Filter with coins=BTC,SOL; the same filter is in the dashboard feed and the widget builder.
AAVE · ADA · ALGO · APT · ARB · ATOM · AVAX · BCH · BNB · BONK · BTC · CAKE · CRO · CRV · DAI · DOGE · DOT · ENA · ETC · ETH · FDUSD · FET · FIL · GT · HBAR · HYPE · ICP · IMX · INJ · JUP · KAS · LDO · LEO · LINK · LTC · MATIC · MKR · NEAR · OKB · ONDO · OP · PAXG · PEPE · POL · PUMP · PYTH · PYUSD · RAY · RENDER · SEI · SHIB · SOL · STX · SUI · TAO · TIA · TON · TRUMP · TRX · UNI · USDC · USDE · USDT · VET · WIF · WLD · XAUT · XLM · XMR · XRP
Response
{
"status": "ok",
"count": 2,
"has_more": false,
"next_since_id": 1,
"data": [
{
"id": 1,
"date_time": "2026-10-08T15:57:00.000Z",
"category": "Hacking News",
"title": "Lending protocol paused after $4.2M oracle exploit",
"description": "Short summary of the story, one or two sentences.",
"coins": [
"BTC"
]
},
{
"id": 2,
"date_time": "2026-10-08T15:34:00.000Z",
"category": "Exchange Listing",
"title": "Major exchange lists SUI perpetuals with 25x leverage",
"description": "Short summary of the story, one or two sentences.",
"coins": [
"BTC"
]
}
]
}Polling
- Store the highest
idyou have processed. - Every 60 seconds, call
/v1/news?since_id=<that id>&limit=100. has_moreis true? Call again right away withnext_since_iduntil it's false.
That's it. No webhooks to register, no cursor to expire.
Errors
| HTTP | Code | Meaning |
|---|---|---|
| 400 | bad_request | A parameter is wrong. The message says which one. |
| 401 | invalid_key | No key, or one we don't recognise. |
| 402 | plan_expired | Your API plan or trial ran out. Renew in Billing. |
| 403 | key_disabled | The key was revoked or the account is disabled. |
| 403 | allowlist_required | Every key needs its allowlist first: add your server's IP address or website in Dashboard → API. The message says which address called. |
| 403 | ip_not_allowed | This server isn't on your key's allowlist. The message says which address called; add it in Dashboard → API. |
| 404 | not_found | No such endpoint. Check the path. |
| 429 | rate_limited | Slow down. Wait for the number of seconds in Retry-After. |
| 429 | quota_exceeded | You used every request in your trial or 30-day term. |
| 500 | server_error | Our fault. Retry with backoff. |
Rate limits
- Paid: 60 requests a minute, 100,000 per 30 days.
- Trial: 1,000 requests total, 7 days.
- Every response carries
X-RateLimit-RemainingandX-RateLimit-Reset.
Website widget
Build the widget in your dashboard (Widgets), add your website's domain, save, and copy the code for your platform: plain HTML, WordPress, React / Next.js, or PHP and site builders. Each tab has the steps.
<div data-coinnewspot-widget="YOUR_WIDGET_ID"></div>
<script async src="https://coinnewspot.com/embed/widget.js"></script>- Paste both lines where the news should appear, inside <body>.
- Add your site's domain (example.com) to the widget's allowed domains and save.
- Open your page. The news shows within a second and refreshes every minute.
Not showing? Press F12 and open Console: the widget says why (domain, plan or ID). Troubleshooting
Widget not showing?
Visitors never see an error: the box simply stays empty. You can see why: open the page, press F12 (on a Mac Cmd+Option+J), open Console and look for a line starting with [Coin News Pot].
| Console says | What to do |
|---|---|
| …isn't in the widget's allowed domains | Dashboard → Widgets → your widget → add the domain shown (example.com also covers www and other subdomains) → Save. |
| …The Widget plan isn't active… | Start or renew the Widget plan in Billing. Without it the widget runs only in test mode, on localhost. |
| …doesn't exist | The ID in the code is wrong. Copy the code again from Dashboard → Widgets. |
| …is switched off | Turn the widget on again in Dashboard → Widgets. |
| …sign in again to confirm their email | The account owner signs in once with the email code; the widget comes back by itself. |
| …Couldn't reach Coin News Pot | A network problem or an ad / script blocker on that computer. It retries every minute. |
| …this browser is too old | The visitor's browser can't run the widget safely; they are asked to update it. |
WordPress plugin
No code needed. The plugin is included with the Widget plan and uses the same one website as your widgets. It shows the same seven designs, follows your theme's fonts and colours, and adds a full news page with pagination.
- Dashboard → Widgets → WordPress plugin: download the zip, enter your website's domain and create a License Key. The key is shown once, so copy it.
- In WordPress: Plugins → Add New → Upload Plugin → choose the zip → Install → Activate.
- WordPress → Coin News Pot: paste the key and save. Pick a design and style in the other tabs; the preview updates as you go.
- Add
[coinnewspot]to any page, post or widget area. The news page with pagination is[coinnewspot_page].
Testing on localhost is free and doesn't count as your website. Lost the key? Create a new one: the old key stops working.
Visitors never see an error. Signed in as an administrator, you see a short note on the page and in WordPress that says why:
| The plugin says | What to do |
|---|---|
| Paste your License Key to start showing news. | Dashboard → Widgets → WordPress plugin → Create key, copy it, paste it in WordPress → Coin News Pot → Save. |
| This License Key is not valid… | The key was replaced or mistyped. Copy the newest key from the dashboard and paste it again. |
| Add this site's domain in your Coin News Pot User Panel first. | Dashboard → Widgets → WordPress plugin → enter this site's domain → Save. |
| This key is linked to another domain… | Change the website in the dashboard to this domain (3 moves in 30 days). |
| Your trial period is over… / Your subscription has expired… | Start or renew the Widget plan in Billing. News comes back within a few minutes. |
| This licence is suspended… | Contact support. |
| Unable to reach Coin News Pot server… | Your host can't reach us right now. The plugin keeps showing the last news it has and retries by itself. |
Chrome extension
Live news in a small window on your desktop, included with every plan (Journalist, Widget and API). New stories appear by themselves every 30 seconds; nothing to refresh. Needs Google Chrome 120 or newer, on Windows or Mac.
- Dashboard → Chrome extension: download the zip and unzip it. You get a folder called
coinnewspot-chrome. Keep it: Chrome runs the extension from this folder. - Open
chrome://extensionsand switch on Developer mode (top right). - Click Load unpacked and choose the
coinnewspot-chromefolder. The Coin News Pot window opens. - Enter your email, then the 6-digit code we send you. It stays signed in; your website login is not affected. One extension per account: signing in on another computer signs the old one out.
- Pin it in Chrome's toolbar (puzzle icon), so one click opens the window again.
Using it. Click a story to read its description. The pin button in the window keeps it above every app, also with Chrome minimised (Chrome asks for that one click each time it starts). The gear opens settings: title only or title with description, open the window when Chrome starts, the 15 categories, and Log out. The line at the top shows your plan's time left; 5, 3 and 1 days before the end it turns yellow and you get a reminder.
Lost the computer? Dashboard → Chrome extension → Sign the extension out. To remove it: chrome://extensions → Coin News Pot → Remove.
| The extension says | What to do |
|---|---|
| Trial has ended · Buy a plan (red line) | Your trial or plan ran out, so news stopped. Buy or renew a plan in Billing; news comes back within a minute. |
| No connection. We'll keep trying. | Your internet or a firewall blocks api.coinnewspot.com. The stories you have stay on screen and it retries every 30 seconds. |
| You were signed out. Please sign in again. | The extension was signed in on another computer, signed out from the dashboard, or by support. Sign in again with your email code. |
| No categories ticked… | Open settings (the gear) and tick at least one category, or click All. |
| New version x.y.z available · Download | Download the new zip from Dashboard → Chrome extension, replace the files in your folder, then click the reload arrow on the extension in chrome://extensions. |
| No Load unpacked button | Turn on Developer mode at the top right of chrome://extensions. On a work computer your IT team may have blocked it. |
| "Disable developer mode extensions" when Chrome starts | Chrome shows this for every extension added with Load unpacked. Click the X (or Keep) to close it; don't click Disable, or the extension stops until you switch it on again in chrome://extensions. |
| The extension vanished or shows an error after a while | Chrome loads it from the folder you chose. Keep the coinnewspot-chrome folder where it is (not in Downloads you clear, not on a USB stick); if you moved it, choose Load unpacked again. |
Android app
Live news on your phone and a home-screen widget, included with every plan (Journalist, Widget and API). New stories arrive within seconds, also when the app is closed. Needs Android 8.0 or newer.
- Dashboard → Android app: download the APK on your phone (or send it to your phone).
- Open it and tap Install. The first time, Android asks you to allow installs from your browser or file manager.
- Open Coin News Pot, enter your email, then the 6-digit code we send you. It stays signed in; your website login and the Chrome extension are not affected. One phone per account: signing in on another phone signs the old one out.
- Tap Add widget when the app asks. Resize it like any widget: long-press it and drag the edges.
Using it. Home lists the stories with their date and time; tap one to read it, then Previous / Next at the bottom, Back at the top left. Settings: title only or with description, the 15 categories, the widget, your plan and Log out. Each widget has its own settings (gear on the widget). History: the last 3 days on a trial, the last 30 days on a paid plan. 5, 3 and 1 days before your plan ends the app reminds you.
The widget stops updating? Some phones stop apps in the background: Settings in the app → Background updates → Coin News Pot → no restrictions. Lost the phone? Dashboard → Android app → Log out the phone.
For AI apps (MCP)
Give Claude, ChatGPT, Cursor, your own agent or a local model live crypto news. This needs an AI Starter or AI Pro package and an AI key (cnp_ai_…) from Dashboard → AI; the API plan's key above doesn't work here. AI keys need no allowlist, because hosted AIs call from changing addresses. Step-by-step guides for each AI app are in Dashboard → AI → Setup.
- MCP server: https://api.coinnewspot.com/mcp. Streamable HTTP; the key goes in
Authorization: Bearer(or?key=for apps that can't set headers). - REST: https://api.coinnewspot.com/ai/v1, the same key as Bearer or
X-API-Key. - OpenAPI for ChatGPT GPT Actions and API tools: https://api.coinnewspot.com/ai/openapi.json
{
"mcpServers": {
"coinnewspot": {
"url": "https://api.coinnewspot.com/mcp",
"headers": { "Authorization": "Bearer YOUR_AI_KEY" }
}
}
}MCP tools. There is also a prompt, crypto_brief, for a short briefing.
| Tool | What it does |
|---|---|
| latest_news | Newest stories, optionally by category. |
| search_news | Search by words (smart search on AI Pro). |
| coin_news | News about one coin by symbol. |
| market_movers | All-time highs and lows. |
| list_categories | The categories it can filter by. |
| get_story | One story by id. |
REST endpoints (under /ai/v1). Every story has id, time, category, title, description, coins and url.
| Endpoint | What it does |
|---|---|
| GET /news | Latest stories. category, since (a story id or ISO time), limit (1 to 50), format=text for fewer tokens. |
| GET /search | q (2 to 200 characters). mode=smart (AI Pro) also finds related words: "hacks" finds "exploit" and "drained". |
| GET /coins/{symbol}/news | Stories that mention one coin, e.g. /coins/SOL/news. |
| GET /movers | All-time highs and lows. |
| GET /stories/{id} | One story. |
| GET /categories | The category names you can filter by. |
| GET /me | Your package, limits and usage. Free. |
| GET /stream | AI Pro: Server-Sent Events, one event per new story. Resume with Last-Event-ID. |
| GET /export | AI Pro: a time range as JSON lines for a RAG index, 5,000 per call, follow X-Next-Cursor. |
Attribution. Wherever you show a story, show "via Coin News Pot" with its link. Answers carry attribution while it is on: always on AI Starter; AI Pro may switch it off in Dashboard → AI → Settings. Training AI models on the data isn't allowed (see the Terms). The story link opens publicly 24 hours after publishing.
Webhooks (AI Pro). Add a URL in Dashboard → AI → Real-time and we POST each new story within seconds. Check X-CNP-Signature: t=…,v1=…: the HMAC-SHA256 of <t>.<body> with your signing secret. Failed deliveries are retried after 1, 5 and 30 minutes.
| HTTP | Code | Meaning |
|---|---|---|
| 400 | bad_request | A parameter is wrong. The message says which one. |
| 400 | unknown_category | The message lists the valid categories, so an AI can correct itself. |
| 401 | invalid_key | No AI key, or one we don't recognise. |
| 402 | plan_required | No active AI Starter or AI Pro package or trial. An API plan key doesn't work here. |
| 403 | key_disabled | The AI key was deleted, or replaced more than 24 hours ago. |
| 403 | pro_only | Smart search, webhooks, stream and export are part of AI Pro. |
| 429 | rate_limited | Too many calls a minute. Wait for Retry-After. |
| 429 | quota_exceeded / trial_limit | The trial (500 calls) or 30-day allowance is used up. |
Changelog
v1.0: first release. News and categories.
v1.1: coins filter, and every story lists its coins.
AI v1: MCP server and AI API for AI apps (AI Starter, AI Pro).