Developer reference · MCP and REST
On this page
Quickstart
Connect an agent or program in three steps.
- Sign in.
- Create a key on your account page.
- Connect your agent or program.
Claude (connector)
In claude.ai: Settings → Connectors → add the URL and sign in with OAuth.
https://mcp.cryptonews.is/mcp
Claude Code (OAuth)
claude mcp add --transport http cryptonews https://mcp.cryptonews.is/mcp
Claude Code with an API key
claude mcp add --transport http cryptonews https://mcp.cryptonews.is/mcp --header "Authorization: Bearer <key>"
Any MCP client
https://mcp.cryptonews.is/mcp Authorization: Bearer <key>
REST
curl https://api.cryptonews.is/v1/stories -H "Authorization: Bearer <key>"
Plans and limits
One account covers MCP and REST.
| Plan | Price | Calls/day | Per minute | Keys | What it unlocks |
|---|---|---|---|---|---|
| Free | $0 | 100 | 10 | 1 | latest_stories, get_sentiment, get_market, status |
| Standard | $29 / 30 days $290 / 12 months | 10,000 | 60 | 3 | latest_stories, get_story, get_developing, get_sentiment, get_sentiment_history, get_market, changes_since, status |
| Pro | $99 / 30 days $990 / 12 months | 50,000 | 300 | 10 | latest_stories, get_story, get_developing, search_stories, get_sentiment, get_sentiment_history, get_market, changes_since, status; daily exports and live stream |
Tools and endpoints
Use MCP tools or their GET endpoints.
| Tool / what it returns | REST path (GET) | Plans | Arguments |
|---|---|---|---|
latest_storiesRanked current stories. | /v1/stories | All | window, category, language, limit, coin |
get_storyStory detail and publisher reports, including archived stories. | /v1/stories/{id} | Standard, Pro | id, language |
get_developingDeveloping event threads and their cited synthesis pages. | /v1/developing/v1/developing/{slug} | Standard, Pro | slug, section |
search_storiesFull-text story search ranked by relevance. | /v1/search | Pro only | query, since, until, coin, category, limit, offset |
get_sentimentCurrent sentiment and its strongest drivers. | /v1/sentiment | All | window, limit, detail |
get_sentiment_historyHistorical sentiment readings. | /v1/sentiment/history | Standard, Pro | window, resolution, from, to |
get_marketMarket quotes, top coins, total market cap and coins named in current stories. | /v1/market | All | None |
changes_sinceStory changes since an edition cursor, ranked by prominence. | /v1/changes | Standard, Pro | cursor, limit, detail |
statusPlan, combined usage and upstream freshness. | /v1/status | All | None |
| REST onlyHourly archive records as daily JSONL files. | /v1/exports/{date}/{readings|stories}.jsonl | Pro only | UTC date, kind |
| REST onlyLive story and reading events. | /v1/stream | Pro only | None |
tools/list shows every tool on every plan; a tool your plan cannot use starts its description with the plan that unlocks it.
Common arguments
Use these values across tools and endpoints.
| Argument | Accepted values | Default | Notes |
|---|---|---|---|
window | 15/30/60/240/1440 minutes or 15m/30m/1h/4h/24h | — | Reading window. |
limit | Stories: max 100; sentiment drivers: max 50; search: max 50; changes: 1–500 | Stories, sentiment and search: 20; changes: 100 each for added and changed | Free: at most 20 stories or sentiment drivers. A larger Free limit returns 20 items and adds limit_applied: 20. Limits above the maximum return 400. |
detail | compact or full | compact | Sentiment compact is ~550 bytes per driver. Change-feed compact fields are listed below. |
coin | Symbol, such as BTC | — | Filter by coin. |
category | markets economy regulation technology security business adoption | — | Case-insensitive. Invalid categories return 400 invalid_category with supported_categories. |
language | enptesjakohiukthzh-Hansdeidruvitrbnurplarfrzh-Hantitfafilnlmsrocshe | — | Unsupported codes return 400 unsupported_language with supported_languages. |
id | Story id from a stories response | — | Full ids or unique short prefixes; see Story ids. |
from / to | ISO date-times; at most 72 hours per call | from: 24 hours before to | Page through longer spans; see Sentiment history for plan access. |
resolution | auto, raw, 1m, 5m, 15m or 1h | auto | UTC buckets; see Sentiment history. |
cursor | Cursor from a stories response | Required | Use with changes_since or /v1/changes. |
query / q | 1–200 characters, up to 12 terms | Required | MCP: query; REST /v1/search: q. Pro only. |
since / until | ISO date-times | Optional | Search filters compared with event_at. |
offset | 0–1000 | 0 | Returned for search paging. |
Story ids
Keep the full id or reader link when citing a story.
- A story’s id can change once grouping settles, and old ids keep resolving to the current story: a merged id returns the current story with
replaced_by(its id) andrequested_id(the id you asked for);archivedmarks archived responses. - A shortened id (at least 8 characters after an optional
rg-, a trailing … is ignored) resolves when exactly one story id starts with it; otherwise the answer is 400ambiguous_idwith up to 5candidates. - Cite stories by their full id or
reader_url.
Sentiment history
Read historical sentiment in bounded time ranges.
- History
fromandto: ISO date-times, at most 72 hours per call (page through longer spans); Standard reaches back 30 days:fromandto(and the defaultfrom, 24 hours beforeto) must all fall within the last 30 days, otherwise 403plan_requirednaming Pro. - Pro reaches the whole record.
recorded_fromis2026-10-29T02:17:00Z: minute history is recorded from then; earlier ranges return only the native’s live history or nothing.- History
resolution: auto (default), raw, 1m, 5m, 15m or 1h. - Buckets align to UTC and use the last sample’s score with
atstamped at the bucket start; auto chooses the smallest bucket returning at most 300 points, or 1h. - Raw keeps every point.
- Responses include the resolved
resolutionandavailable_from(earliest returned point, or null).
Archive, copy and search
Look up saved stories and search the indexed record.
- Standard and Pro story lookup includes archived stories and their publisher reports.
- Archived responses include
archived:true; a requested language uses the saved translation when available, otherwise English. - Story detail always includes
language; null means the copy is not written yet; missing language with completed copy defaults to English. - Every tool marks stories with empty or missing summaries as
copy_pending:true; completed copy omits the flag. copy_skipped: the story is rated negligible and will not get a summary; such stories carry nocopy_pending.- If the story later gains copy, the field disappears and the change arrives in
changes_since. event_atis the time of a story’s first report andupdated_atof its newest; a newer report is a change inchanges_since.- Search results from older archive rows may omit
updated_at. get_storyon a merged id addsrequested_report: up to five of that id’s own reports with their copy.
Search Pro
-
search_storiessearches indexed headlines, summaries, publisher headlines, sources and coins. - Use
queryin MCP orqon/v1/search(1–200 characters, up to 12 terms). - A story matches if it contains any term; English stop words such as who or what are ignored and English words are stemmed, so hacked finds hack.
- Common acronyms match their spelled-out forms (SEC, ETF, DPRK, Fed, …), and a coin symbol typed in capitals also matches the coin’s name.
- Results are ranked by relevance: stories that match more terms, especially in the headline, come first, and live, summarised and recently updated stories are boosted over archived or copy-pending ones; among matches of comparable relevance, the latest development comes first.
- Twins of one article (same publisher URL or headline) appear once.
- Optional
sinceanduntilare ISO date-times compared withevent_at;coinandcategoryfilter stories. - Search limit defaults to 20, maximum 50.
offsetis 0–1000, default 0, and is returned for paging.- Results mark current drivers
archived:false, othersarchived:true; archived ids resolve viaget_story, which may returnreplaced_by. - A merged id is returned as its current story with
replaced_by(its id) andrequested_id(the merged id). - Each result carries
reports: up to 3 of its outlets’ own English headlines and summaries (source_name,published_at): the earliest published report first, usually the original source, then those matching the query, summaries cut to two sentences. reports_totalcounts all of the story’s reports;get_storylists them whole.- Results include
totalandindexed_through; indexing runs every ten minutes and older archive coverage grows during backfill.
Change feed and cursors
Follow story changes from an edition cursor.
changes_since//v1/changesneeds acursor.- Take the first from
cursorin a stories response. limit: 1–500, default 100 each for added and changed, sorted by prominence descending; removed IDs are unbounded.- IDs in
removedthat were re-keyed appear inreplaced_bywith their new id. detail: compact (default) or full.- Compact stories keep id, headline, category, secondary_category, coins, sentiment_label, sentiment_score, prominence, coverage_count, event_at, updated_at, reader_url, language, copy_pending and copy_skipped when applicable.
- The cursor still advances to the newest edition.
- When
truncatedappears, its added/changed counts give the totals; calllatest_storiesfor the full current list. - A malformed cursor returns 400
invalid_cursor. reset:true(old epoch or expired cursor) comes with empty lists: re-readlatest_storiesand continue from its cursor.contributionon full-detail items is a snapshot; a change in it alone is not reported.
Example shape
Illustrative request and response; use the cursor from your stories response.
{
"name": "changes_since",
"arguments": {"cursor": "<cursor>", "limit": 100, "detail": "compact"}
}{
"cursor": "<next cursor>",
"added": [{"id": "<story id>", "headline": "<headline>"}],
"changed": [],
"removed": [],
"replaced_by": {}
}Live stream (Pro)
Subscribe to live events over REST.
- Pro only, REST:
/v1/streamreturnstext/event-streamusing the same Bearer header as other endpoints. - Events are
hello(cursor and method),story(added or changed story),removed(story IDs),reading(changed window reading), andreset. - A ping comment keeps idle connections active.
- Limits are two connections per account and 200 overall; excess connections return 429
stream_limit. - Each connection costs one call.
- Reconnect with backoff and re-read
/v1/storiesafterreset; the stream has no replay guarantee.
Daily exports (Pro)
Download archived hours one UTC day at a time.
- Pro only, REST:
/v1/exports/{date}/{readings|stories}.jsonlstreams hourly archive records in UTC hour order asapplication/x-ndjson. - Dates run from 2026-10-29 through yesterday; today and future dates return 400.
- Missing hours are listed in
X-Missing-Hours; no available hours returns 404. - Story rows retain archive duplicates.
- Each file costs one call.
Freshness
Check freshness before using time-sensitive data.
- When upstream is briefly unavailable, every read tool answers from its last good copy with
stale: trueandagein seconds. - Check them before using time-sensitive data.
changes_sincewith no saved answer returns your cursor with empty lists andstale: true: poll again with the same cursor.- When nothing can be served, the answer is 503
upstream_unavailablewithretry_afterand aRetry-Afterheader (MCP:isError).
What counts as a call
Daily usage is shared across both transports.
Both transports share your daily allowance.
Counted
- Every authenticated MCP
tools/calland REST request. - Rejected requests, including 400, 403
plan_required, 404 and 405.
Not counted
status(tools/call statusandGET /v1/status); it still counts toward the per-minute limit, andusage_todayleaves it out.- 429 responses.
- MCP initialize, tools/list, ping and notifications.
- Requests refused before the account is known: 401, suspended accounts, keys disabled by the plan.
Errors and headers
Use error codes and response headers to decide what to do next.
| Error | HTTP status | Meaning |
|---|---|---|
unauthorized | 401 | Invalid credentials. OAuth connector tokens cannot be used on REST. |
plan_required | 403 | The tool or history range needs a higher plan; required_plan names it. |
rate_limited | 429 | Per-minute limit reached; retry_after gives seconds to wait. |
quota_exceeded | 429 | Daily limit reached; retry_after gives seconds until reset. |
invalid_cursor | 400 | Malformed change-feed cursor. |
unsupported_language | 400 | Unsupported code; supported_languages lists accepted codes. |
invalid_category | 400 | Invalid category; supported_categories lists accepted categories. |
ambiguous_id | 400 | Story prefix does not resolve uniquely; up to 5 candidates. |
upstream_unavailable | 503 | No saved answer can be served; retry_after and Retry-After say when to retry. |
stream_limit | 429 | Live-stream connection limit reached. |
REST takes API keys (cnis_live_…) only. OAuth connector tokens work only on MCP; on REST they get 401 with a message saying so.
REST errors use these JSON shapes; MCP tool errors carry the same body in structuredContent with isError:
{"error":"unauthorized","status":401,"message":"Invalid credentials."}
{"error":"plan_required","status":403,"message":"get_story needs the Standard plan. Upgrade at mcp.cryptonews.is/account/upgrade or email api@cryptonews.is.","required_plan":"standard"}
{"error":"rate_limited","status":429,"message":"Per-minute limit reached.","retry_after":60}| Header | Meaning |
|---|---|
X-RateLimit-Limit | Daily allowance on metered responses. |
X-RateLimit-Remaining | Daily calls remaining on metered responses. |
X-RateLimit-Reset | Reset time in Unix seconds on metered responses. |
Retry-After | Seconds to wait on 429 and upstream_unavailable responses. |
X-Plan-Expires | Included on REST responses in the last 7 days of a paid plan. |
X-Missing-Hours | Missing UTC hours in a daily export. |
Requests that Cloudflare’s security layer (WAF) blocks as attacks get HTTP 403 with an HTML page, not a JSON error.
Method versions
Compare readings computed with the same method.
Every reading carries method, identifying how it was computed. METHOD.md describes the calculation and version changes; compare versions when comparing readings.
Attribution and use
Credit the source when displaying data.
Free is for personal use with credit. Standard and Pro may display data with credit and a link to the story’s reader_url. No resale or model training. Read the terms and privacy.
Upgrading
Choose the access your project needs.
Choose a plan at checkout. Standard is $29 / 30 days; Pro is $99 / 30 days. Free is $0. Paid plans return to Free at expiry.