GET /api/factsLive
$ curl https://tradelabsai.com/api/facts

{
  "rounds_recorded": 71406,
  "assets_recorded": 8,
  "recording_since": 1788856200,
  "predictions_graded": 22820,
  "accuracy": 52.7,
  "ci_low": 52.1,
  "ci_high": 53.4,
  "accuracy_proven": true,
  "min_sample": 100,
  "signal_engines": 23,
  "round_seconds": 300
}
Developers

API documentation

One authenticated endpoint, signed webhooks, and a handful of open endpoints behind the public pages.

Authentication

The REST endpoint is available to Pro+ accounts. Your key is in Settings and starts with pk_. Send it any of three ways:

X-Api-Key: pk_your_key
Authorization: Bearer pk_your_key
GET /api/v1/signals?key=pk_your_key

A missing or non-Pro+ key returns 403 with {"ok": false, "error": "..."}. Keep the key server-side: it identifies your account.

GET /api/v1/signals

The current five-minute call for each tracked coin, as the engines see it right now.

curl -H "X-Api-Key: pk_your_key" \
     https://tradelabsai.com/api/v1/signals
{
  "ok": true,
  "timestamp": 1789164737.2,
  "slot_ts": 1789164600,
  "signals": {
    "btc": {
      "prediction": "UP",
      "confidence": 61.4,
      "engines": 18,
      "price": 76853.24,
      "price_to_beat": 76812.26,
      "accuracy": {"pct": 50.2, "correct": 207, "total": 412},
      "odds": {"up": 0.55, "down": 0.45}
    }
  }
}
FieldMeaning
slot_tsUnix start of the current five-minute round
predictionUP, DOWN or null when the engines do not agree enough to call it
confidenceEnsemble confidence, 0 to 100
enginesHow many engines voted
price_to_beatThe level the round settles against, or null before it is set
accuracyRaw lifetime counters for that asset. This is not the published hit rate. See how we score for the test a figure must pass before we call it an edge
oddsLive prediction-market prices, or null

Rounds turn over every 300 seconds. Polling once every few seconds is plenty; the data behind it refreshes on its own schedule.

Webhooks

Pro+ accounts can have events pushed instead of polled. Set the endpoint and a secret in Settings. We POST JSON:

{"event": "prediction", "timestamp": 1789164737.2, "data": { ... }}

Every delivery carries these headers:

HeaderValue
X-Signature-256sha256= plus the HMAC-SHA256 of the raw body, keyed with your secret
X-Webhook-EventThe event name
X-Webhook-TimestampUnix seconds when it was sent

Verify before you trust it. Compare against the raw body, not a re-encoded one:

import hmac, hashlib
expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, request.headers["X-Signature-256"]):
    abort(401)

We wait up to 10 seconds for a 2xx and do not retry, so acknowledge first and do the work afterwards.

Open endpoints

No key needed, and they power the public pages:

EndpointReturns
GET /api/accuracyPer-asset graded counts, with the confidence interval and whether the edge is proven
GET /api/leaderboardPublic leaderboard standings
GET /api/factsThe figures on this site: rounds recorded, assets, calls graded
GET /api/healthWhether the service and the AI are up

Be reasonable with the open endpoints: they are rate limited, and abuse gets an address blocked. Building something with them? Tell us, because we would rather help than throttle you.

Outcome dataset files

The settled up/down rounds behind the market pages are downloadable by Pro accounts from the dataset page. A Pro+ key opens the same files from a script: send it in X-Api-Key to /up-down/data/outcomes.csv or /up-down/data/outcomes.json, with ?asset=btc for one coin. The files hold the most recent 30 days and are rebuilt every 10 minutes.

Open a chart and see what it draws.

The free plan gets you BTC calls, the live chart, paper trading and a daily AI allowance. Upgrade when you want the rest.

Counted from real data
Rounds recorded71,406
Calls graded22,820
Assets tracked8
Signal engines23