# Changelog of Soccer Odds Pulse (`0xgollum/soccer-odds-pulse`) Actor

- **URL**: https://apify.com/0xgollum/soccer-odds-pulse/changelog.md
- **Full Actor documentation**: https://apify.com/0xgollum/soccer-odds-pulse.md

## Changelog

### 0.2.8 — Relative movement rule (09/09/2026)

**Added**

- **Outsider steamers are now caught.** The signal used to fire only on an
  absolute move of `movement_threshold_pct` implied-probability points, which
  is blind to the classic outsider steam: 50/1 → 20/1 is only +3 points but
  +150 %. A second rule now fires when the implied probability moves by at
  least `movement_relative_pct` (default 30 %) of its previous value; moves
  on 200/1+ shots are ignored as noise. Signal rows carry `trigger`
  (`absolute` | `relative`) and `relative_change_pct`. Set
  `movement_relative_pct: 0` to keep the old behaviour.

### 0.2.7 — Cold review (09/09/2026)

**Fixed**

- **Some leagues silently contributed zero matches.** Pinnacle's guest API
  now answers 401 on the matchups/markets of certain leagues (measured live:
  Saudi Pro League and others — the ones with the most fixtures) unless the
  public API key its own web client sends is present. The key is now sent;
  and any Pinnacle call that still fails is counted and logged as a
  **partial scan** instead of passing as "no matches there".
- **The steamer was the row `max_results` cut.** Snapshots were emitted
  first; with the default cap (15) a run with one real steamer delivered 15
  snapshots and no signal. Signals now come first.
- **In-play matches are excluded.** Odds of a match already under way move
  with the score, not with pre-match money; they no longer produce
  "steamers".
- **A league whose Pinnacle call failed lost its odds history** for the
  next run. Matches not seen this run are carried forward for 24 h.

**Changed**

- History entries carry a `seen_at` timestamp (used for the carry-forward TTL).

### 0.2.1 — 2026-08-28

**Reliability hardening — every run now returns a result.**

- Outside match windows there are no open odds, and on a quiet run nothing
  moves. Previously the Actor pushed nothing in those cases, which made the
  run look like a failure. It now returns a single `status` row with a clear
  message so every scheduled run comes back clean.
- Input parsing hardened (`max_leagues`, `movement_threshold_pct`): a bad or
  `null` value now falls back to the default instead of crashing the run.
- Reads and writes of the run-history key-value store, and signal
  evaluation, are now each isolated — a storage hiccup can no longer fail a
  run, especially the post-delivery history write.

### 0.1.x / 0.2.0 — 2026-07 → 2026-08

- Live soccer odds movement across major leagues and tournaments (Pinnacle
  key-less API): steamers & drifters between runs.
