Signals
Signals are structured observations about the market, the teams, or the game state. They're typed — each signal_type has its own params shape — and the per-type predictiveness endpoint surfaces hit-rate + lift over a rolling window.
#List signals
/api/v1/signalsCross-game feed. The API rejects requests from Lite and Free with
403 tier_insufficient.Query parameters
typestring[]optionalCSV of signal types.
min_strengthnumberoptionalDecimal in
[0, 1]. Rejects out-of-range values with 422.sportstringoptionalLeague key (lower-cased).
datestringoptionaltoday or YYYY-MM-DD.limitintegeroptionalDefault 25, max 100.
cursorstringoptionalPagination token (present in the response envelope; currently always null).
Try it
curl "https://api.closeline.io/v1/signals?type=SHARP_PUBLIC_DIVERGENCE&min_strength=0.7" \
-H "Authorization: Bearer $CLOSELINE_API_KEY"const signals = await cl.signals.list({
type: ["SHARP_PUBLIC_DIVERGENCE", "POST_OPEN_INJURY"],
min_strength: 0.7, // 0..1
sport: "nba", // league key
date: "today", // or "YYYY-MM-DD"
limit: 50, // max 100
});
for (const s of signals.data) {
console.log(s.signal_type, s.strength, s.summary);
}#Predictiveness
/api/v1/signals/{type}/predictivenessHit-rate and lift summary for a single signal type, over a rolling window. Sharp tier and higher.
const report = await cl.signals.predictiveness("SHARP_PUBLIC_DIVERGENCE", {
window: "90d", // "30d" | "90d" | "180d" | "all" (default "90d")
});Until 90 days of validated outcomes exist, responses carry zero-sample rows — the shape is stable so consumer code can ship ahead of the numbers being meaningful.
#Tier gating recap
GET /signals— Pro and above.GET /signals/{type}/predictiveness— Sharp and above.GET /games/{id}/signals— any authenticated user (per-game view is cheaper to compute).