$ 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 }
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_keyA 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}
}
}
}| Field | Meaning |
|---|---|
| slot_ts | Unix start of the current five-minute round |
| prediction | UP, DOWN or null when the engines do not agree enough to call it |
| confidence | Ensemble confidence, 0 to 100 |
| engines | How many engines voted |
| price_to_beat | The level the round settles against, or null before it is set |
| accuracy | Raw 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 |
| odds | Live 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:
| Header | Value |
|---|---|
| X-Signature-256 | sha256= plus the HMAC-SHA256 of the raw body, keyed with your secret |
| X-Webhook-Event | The event name |
| X-Webhook-Timestamp | Unix 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:
| Endpoint | Returns |
|---|---|
| GET /api/accuracy | Per-asset graded counts, with the confidence interval and whether the edge is proven |
| GET /api/leaderboard | Public leaderboard standings |
| GET /api/facts | The figures on this site: rounds recorded, assets, calls graded |
| GET /api/health | Whether 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.