Free public JSON API
The derived data of this site as JSON: news ratings, signals, the scoreboard, token risk blocks, and system health. No key. No sign-up.
Quick start
Base address: https://cryptonews.org/api/cn/v1. Each answer is JSON. Each answer allows any origin (CORS), so a web page can call it.
# The scoreboard: hit rates by signal kind and by JEV impact class
curl -s https://cryptonews.org/api/cn/v1/scoreboard
# Headlines with the JEV verdict (title, outlet, link, ratings)
curl -s https://cryptonews.org/api/cn/v1/news
# One checked token: identity, label, chance band, flags, and outcome states
curl -s https://cryptonews.org/api/cn/v1/token/base/0xdfeb982f51d7e467248637bd73b0746bc0bd5048
# Ask again only if the data changed (the server sends an ETag)
curl -si -H 'If-None-Match: "0123456789abcdef"' https://cryptonews.org/api/cn/v1/signals | head -n 1
- Every answer has the form
{"name", "generated_at", "data"}.generated_atis Unix seconds. - A value that the collector does not know is
null. We never fill a gap with a guess. - The server caches for 5 seconds (
Cache-Control: public, max-age=5, stale-while-revalidate=30). Polling faster gives you nothing new. - If a section has not been published, the answer is HTTP 503 with a JSON error. An unknown name gives HTTP 404.
- Raw prices and market data are shown on our pages for people. They are not licensed for redistribution and the raw endpoints need the page token. The public endpoints below serve our own derived data.
- Limits. The public endpoints below have no per-address limit yet: the 5 second cache absorbs repeat calls, and we ask you to be kind. A limit can come later. The raw endpoints (prices, market data, price history) are for our own pages: they need the page token, answer same-origin requests only, and have no other per-address limit. The token check on the site is not part of this API. It allows 10 checks per address per hour and 120 per hour for the whole site. See the terms.
- General information, not investment advice. Ratings can be wrong.
Endpoints
| Endpoint | What it returns | Now |
|---|---|---|
| GET / | The list of endpoints as JSON. | Live |
| GET /token/{chain}/{address} | One checked token: the identity and our risk block (label, chance band rug_band_1h, flags, basis, check time) and the outcome states. No prices and no liquidity. HTTP 404 when we hold no file for the token. Example. | Live |
| GET /news | Headlines with the JEV verdict: impact, sentiment, category, sponsor odds, and story clusters. Title, outlet, and link only. No article text. | Stale 16d |
| GET /signals | The last 300 public signals, each with the price move 1 h, 4 h, and 24 h later. | Stale 16d |
| GET /scoreboard | Hit rates and average absolute moves by signal kind and by JEV impact class. | Stale 16d |
| GET /health | Collector sources, JEV latency, and how the local models agree with the official one. | Stale 16d |
| GET /dex | Token identity and our risk block: label, chance band, flags, and the JEV note. No prices and no liquidity. | Stale 16d |
| GET /tokens_index | The newest checked tokens, newest first: chain, address, symbol, label, chance band for a collapse within an hour, and outcome. | Stale 16d |
Sample: /scoreboard
lists cut to two
{
"name": "scoreboard",
"generated_at": 1791019019.2442973,
"data": {
"by_kind": [
{
"kind": "depeg",
"signals": 9,
"logged": 10,
"1h": {
"n": 9,
"hit_rate": null,
"hit_rate_ci": null,
"avg_abs_move_pct": 0.16,
"baseline_abs_move_pct": null
},
"4h": {
"n": 9,
"hit_rate": null,
"hit_rate_ci": null,
"avg_abs_move_pct": 0.445,
"baseline_abs_move_pct": null
},
"24h": {
"n": 6,
"hit_rate": null,
"hit_rate_ci": null,
"avg_abs_move_pct": 0.553,
"baseline_abs_move_pct": null
}
},
{
"kind": "funding_extreme",
"signals": 18,
"logged": 18,
"1h": {
"n": 18,
"hit_rate": null,
"hit_rate_ci": null,
"avg_abs_move_pct": 0.572,
"baseline_abs_move_pct": 0.291
},
"4h": {
"n": 18,
"hit_rate": null,
"hit_rate_ci": null,
"avg_abs_move_pct": 0.907,
"baseline_abs_move_pct": 0.574
},
"24h": {
"n": 13,
"hit_rate": null,
"hit_rate_ci": null,
"avg_abs_move_pct": 2.182,
"baseline_abs_move_pct": 0.918
}
}
],
"by_impact": [
{
"impact": "market_moving",
"signals": 4,
"logged": 4,
"1h": {
"n": 4,
"avg_abs_move_pct": 0.113
},
"4h": {
"n": 4,
"avg_abs_move_pct": 1.285
},
"24h": {
"n": 4,
"avg_abs_move_pct": 3.186
}
}
],
"min_sample_for_rate": 30,
"total_signals": 31,
"logged_total": 32,
"baseline": {
"days": 7,
"step_minutes": 30
},
"reaction": {
"horizons_min": [
5,
15
],
"since": 1790667652.971303,
"rows": [
{
"impact": "market_moving",
"n": 6,
"h5": {
"n": 6,
"mean_abs_pct": 0.087,
"median_abs_pct": 0.088
},
"h15": {
"n": 6,
"mean_abs_pct": 0.114,
"median_abs_pct": 0.13
},
"h60": {
"n": 6,
"mean_abs_pct": 0.132,
"median_abs_pct": 0.129
},
"baseline_h60_mean_abs_pct": 0.274,
"baseline_mean_abs_pct": {
"h5": 0.081,
"h15": 0.124,
"h60": 0.274
}
},
{
"impact": "notable",
"n": 213,
"h5": {
"n": 213,
"mean_abs_pct": 0.102,
"median_abs_pct": 0.075
},
"h15": {
"n": 213,
"mean_abs_pct": 0.171,
"median_abs_pct": 0.101
},
"h60": {
"n": 213,
"mean_abs_pct": 0.397,
"median_abs_pct": 0.258
},
"baseline_h60_mean_abs_pct": 0.302,
"baseline_mean_abs_pct": {
"h5": 0.089,
"h15": 0.138,
"h60": 0.302
}
}
],
"market_moving_vs_routine": null,
"lag_first_seen_s": {
"n": 3,
"median_s": 137,
"p25_s": 114,
"p75_s": 958
},
"population": {
"stories": 1594,
"unscored": 851,
"before_collector_start": 243,
"no_asset": 129,
"asset_without_ticks": 38,
"no_start_price": 0,
"counted": 333
},
"baseline": {
"days": 7,
"step_minutes": 30,
"min_pairs": 24
},
"note": "The rows show how far the price of the story coin moved after the first publication of the story, and how far the same coins move at any time (the baseline). They do not show why the price moved. Stories on the same coin at the same time share one price path, so the p value is too optimistic. Many stories also follow a move that has already happened. A row with a small n is a hint and not a result."
}
}
}
Sample: /news
lists cut to two
{
"name": "news",
"generated_at": 1791019014.5523293,
"data": {
"items": [
{
"id": "bfd9020a4522ab1b",
"title": "‘Exceeded its authority!’ – Banking group sues OCC over crypto trust charter approvals",
"url": "https://ambcrypto.com/exceeded-its-authority-banking-group-sues-occ-over-crypto-trust-charter-approvals/",
"source": "AMBCrypto",
"source_kind": "media",
"published": 1791018914.0,
"fetched": 1791019012.862618,
"summary": null,
"image": null,
"impact": null,
"impact_p": null,
"sentiment": null,
"sentiment_p": null,
"category": null,
"category_p": null,
"sponsored_p": null,
"recap_p": null,
"assets": [],
"cluster_id": "fd9dabc1b4935a20",
"cluster_size": 3,
"cluster_sources": [
"Crypto Briefing",
"The Defiant"
],
"signal_score": 0,
"scored": false
},
{
"id": "46966788e919e904",
"title": "Hyperliquid’s USDC Yield Program Gets $14.6 Million for HYPE Buybacks",
"url": "https://thedefiant.io/news/tokens/hyperliquid-s-usdc-yield-program-gets-14-6-million-for-hype-buybacks",
"source": "The Defiant",
"source_kind": "media",
"published": 1791018847.0,
"fetched": 1791019012.862618,
"summary": null,
"image": null,
"impact": null,
"impact_p": null,
"sentiment": null,
"sentiment_p": null,
"category": null,
"category_p": null,
"sponsored_p": null,
"recap_p": null,
"assets": [
"HYPE",
"USDC"
],
"cluster_id": "46966788e919e904",
"cluster_size": 1,
"cluster_sources": [
"The Defiant"
],
"signal_score": 0,
"scored": false
}
],
"top": [],
"counts": {
"market_moving": 0,
"notable": 0,
"routine": 0,
"promo_or_noise": 0
},
"sources": [
{
"name": "Crypto Briefing",
"items": 139
},
{
"name": "CoinGape",
"items": 19
}
]
}
}