---
title: "Trigger Refresh"
method: POST
path: "/api/odds/refresh"
tags: ["odds"]
---

# Trigger Refresh

`POST /api/odds/refresh`

## Request

- Base URL: `https://api.fairline.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.fairline.io/api/odds/refresh`
- Auth: HTTP bearer

Force an on-demand odds refresh from the pipeline control panel.

Re-fetches book lines and re-runs value detection for the requested sport
(or every supported sport when `sport` is omitted) against the persisted
projection probs, exactly like the worker's loop but on demand and without
waiting for the next tick. Runs inline so the response carries each sport's
outcome for the UI; the same `odds_refreshed` SSE event still fires, so open
slates auto-refresh. The rate-limit cooldown is bypassed because an operator
asked for fresh odds. The pipeline-in-flight guard still applies, and an
empty ODDS_API_KEY removes only odds_api while other sources proceed.

`refresh_sport_odds` self-serializes on the pipeline advisory lock
`pipeline:{sport}`, shared with the full pipeline, so a manual refresh
fired while the worker or a projection run is mid-write skips instead of
racing. It surfaces that as status=skipped, skip_reason=skipped_overlap in
its RefreshResult, carried straight into the response below.

## Query parameters

- `sport` string, nullable
- `date` string, date

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/fairline/apis/fairline-api.md) · [All operations](https://skmtc.dev/fairline/apis/fairline-api/llms.txt) · [OpenAPI document](https://skmtc.dev/fairline/apis/fairline-api/revisions/9f7ed2bfdf75?raw)
