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

GET/api/v1/signals
Auth requiredPro
Cross-game feed. The API rejects requests from Lite and Free with 403 tier_insufficient.

Query parameters

typestring[]optional
CSV of signal types.
min_strengthnumberoptional
Decimal in [0, 1]. Rejects out-of-range values with 422.
sportstringoptional
League key (lower-cased).
datestringoptional
today or YYYY-MM-DD.
limitintegeroptional
Default 25, max 100.
cursorstringoptional
Pagination token (present in the response envelope; currently always null).

Try it

bash
curl "https://api.closeline.io/v1/signals?type=SHARP_PUBLIC_DIVERGENCE&min_strength=0.7" \
  -H "Authorization: Bearer $CLOSELINE_API_KEY"
ts
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

GET/api/v1/signals/{type}/predictiveness
Auth requiredSharp
Hit-rate and lift summary for a single signal type, over a rolling window. Sharp tier and higher.
ts
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).