Skip to content

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_KEY

GET /v1/news

Newest first. All parameters are optional.

Query parameters for GET /v1/news
ParameterTypeWhat it does
since_idintegerOnly items with an id above this. Store the last id you processed and send it back.
categorystringComma-separated names from /v1/categories, any case. Example: Hacking News,Funding
from, todate or ISO 8601Publish-time window, UTC. 2026-10-08 or 2026-10-08T14:30:00Z. A date in to includes that whole day.
qstringText match on title and description.
coinsstringComma-separated coin symbols, any case: BTC,SOL. Only stories about those coins. Every story lists its coins.
limitinteger1 to 100. Default 20.
pageintegerWithout since_id: 1 is the newest page, 2 the next, and so on. has_more tells you if there's another.
descriptionbooleanfalse 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

  1. Store the highest id you have processed.
  2. Every 60 seconds, call /v1/news?since_id=<that id>&limit=100.
  3. has_more is true? Call again right away with next_since_id until it's false.

That's it. No webhooks to register, no cursor to expire.

Errors

HTTP error codes
HTTPCodeMeaning
400bad_requestA parameter is wrong. The message says which one.
401invalid_keyNo key, or one we don't recognise.
402plan_expiredYour API plan or trial ran out. Renew in Billing.
403key_disabledThe key was revoked or the account is disabled.
403allowlist_requiredEvery key needs its allowlist first: add your server's IP address or website in Dashboard → API. The message says which address called.
403ip_not_allowedThis server isn't on your key's allowlist. The message says which address called; add it in Dashboard → API.
404not_foundNo such endpoint. Check the path.
429rate_limitedSlow down. Wait for the number of seconds in Retry-After.
429quota_exceededYou used every request in your trial or 30-day term.
500server_errorOur 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-Remaining and X-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>
  1. Paste both lines where the news should appear, inside <body>.
  2. Add your site's domain (example.com) to the widget's allowed domains and save.
  3. 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].

Widget console messages
Console saysWhat to do
…isn't in the widget's allowed domainsDashboard → 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 existThe ID in the code is wrong. Copy the code again from Dashboard → Widgets.
…is switched offTurn the widget on again in Dashboard → Widgets.
…sign in again to confirm their emailThe account owner signs in once with the email code; the widget comes back by itself.
…Couldn't reach Coin News PotA network problem or an ad / script blocker on that computer. It retries every minute.
…this browser is too oldThe 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.

  1. 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.
  2. In WordPress: Plugins → Add New → Upload Plugin → choose the zip → Install → Activate.
  3. WordPress → Coin News Pot: paste the key and save. Pick a design and style in the other tabs; the preview updates as you go.
  4. 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:

WordPress plugin messages
The plugin saysWhat 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.

  1. 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.
  2. Open chrome://extensions and switch on Developer mode (top right).
  3. Click Load unpacked and choose the coinnewspot-chrome folder. The Coin News Pot window opens.
  4. 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.
  5. 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.

Chrome extension messages
The extension saysWhat 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 · DownloadDownload 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 buttonTurn 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 startsChrome 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 whileChrome 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.

  1. Dashboard → Android app: download the APK on your phone (or send it to your phone).
  2. Open it and tap Install. The first time, Android asks you to allow installs from your browser or file manager.
  3. 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.
  4. 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.

MCP tools
ToolWhat it does
latest_newsNewest stories, optionally by category.
search_newsSearch by words (smart search on AI Pro).
coin_newsNews about one coin by symbol.
market_moversAll-time highs and lows.
list_categoriesThe categories it can filter by.
get_storyOne story by id.

REST endpoints (under /ai/v1). Every story has id, time, category, title, description, coins and url.

AI REST endpoints
EndpointWhat it does
GET /newsLatest stories. category, since (a story id or ISO time), limit (1 to 50), format=text for fewer tokens.
GET /searchq (2 to 200 characters). mode=smart (AI Pro) also finds related words: "hacks" finds "exploit" and "drained".
GET /coins/{symbol}/newsStories that mention one coin, e.g. /coins/SOL/news.
GET /moversAll-time highs and lows.
GET /stories/{id}One story.
GET /categoriesThe category names you can filter by.
GET /meYour package, limits and usage. Free.
GET /streamAI Pro: Server-Sent Events, one event per new story. Resume with Last-Event-ID.
GET /exportAI 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.

AI error codes
HTTPCodeMeaning
400bad_requestA parameter is wrong. The message says which one.
400unknown_categoryThe message lists the valid categories, so an AI can correct itself.
401invalid_keyNo AI key, or one we don't recognise.
402plan_requiredNo active AI Starter or AI Pro package or trial. An API plan key doesn't work here.
403key_disabledThe AI key was deleted, or replaced more than 24 hours ago.
403pro_onlySmart search, webhooks, stream and export are part of AI Pro.
429rate_limitedToo many calls a minute. Wait for Retry-After.
429quota_exceeded / trial_limitThe 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).