STALE

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_at is 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

API endpoints
EndpointWhat it returnsStale afterNow
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 /newsHeadlines with the JEV verdict: impact, sentiment, category, sponsor odds, and story clusters. Title, outlet, and link only. No article text.15m Stale 16d
GET /signalsThe last 300 public signals, each with the price move 1 h, 4 h, and 24 h later.15m Stale 16d
GET /scoreboardHit rates and average absolute moves by signal kind and by JEV impact class.15m Stale 16d
GET /healthCollector sources, JEV latency, and how the local models agree with the official one.5m Stale 16d
GET /dexToken identity and our risk block: label, chance band, flags, and the JEV note. No prices and no liquidity.15m Stale 16d
GET /tokens_indexThe newest checked tokens, newest first: chain, address, symbol, label, chance band for a collapse within an hour, and outcome.15m 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
      }
    ]
  }
}

Keyboard shortcuts

j k
Next and previous story
o
Open the story that has focus
/
Search the news
g then h
Go home
g then n
Go to news
g then m
Go to markets
g then s
Go to signals
t
Switch the theme
?
Show this list