Search news
Find articles by keyword, symbol, source, time and sentiment, then drill into a story.
Search
GET /v1/news/search (scope news:read)
| Parameter | Meaning |
|---|---|
q | Web-search syntax: "rate cut" OR etf -rumor |
symbols | Repeatable: symbols=BTC&symbols=ETH matches either |
source_id | Repeatable |
since, until | Default: the last 7 days. Articles are kept 30 days, so that is the furthest back |
sentiment | positive, negative or neutral |
min_impact | 0 to 1 |
include_duplicates | Default false: one article per story |
sort | recent (default, cursor-paginated) or relevance (requires q) |
limit, cursor | Up to 200 per page; pass back next_cursor for the next page |
{"items": [{"id": "01a1…", "published_at": "2026-10-04T13:45:28Z", "title": "…", "summary": "…",
"url": "https://…", "source": "CoinDesk", "source_id": "…", "cluster_id": "01a1…", "is_duplicate": false,
"symbols": ["BTC"], "sentiment": {"label": "positive", "score": 0.62, "confidence": 0.81, "impact": 0.54}}],
"next_cursor": "WyIyMDI2…"}sentiment is the written analysis's verdict when the story has one, otherwise the model score.
Stories, not headlines
Syndicated and rewritten copies of the same story share a cluster_id. By default search returns one article per cluster, so a rumour
echoed by a dozen sites counts once. Pass include_duplicates=true to see every copy.
Article detail
GET /v1/news/{id} returns the article plus every model's sentiment (sentiments[], with the written explanation where there is
one), the detected entities[], and related[]: the other articles in the same story.
Similar articles
GET /v1/news/{id}/similar?limit=10 returns semantically similar articles, across stories.
We store headlines, summaries and links: every item points back to the original publisher.