---
title: "Public Freshness"
method: GET
path: "/v1/freshness"
tags: ["Status"]
---

# Public Freshness

`GET /v1/freshness`

Per-bookmaker freshness — `last_update` summary across all markets.

Returns:
    bookmakers: [
      { key, market_count, latest_update, staleness_seconds, is_stale,
        market_classes: {
          game_lines: { market_count, latest_update, staleness_seconds },
          props:      { market_count, latest_update, staleness_seconds },
        } }
    ]
    stale_threshold_seconds
    as_of (server time the rows were sampled)

`staleness_seconds` is the time since the most recent successful
market write for the book — a rough proxy for "how fresh is the
freshest line on this book." It overstates per-event freshness
because any single market touch resets it; for the marketing page
that's fine since the public claim we're backing is "we ingest
book data continuously and recently."

`market_classes` splits that per class (game lines vs props) so a class
going dark behind fresh game lines — the Pinnacle 2026-08-02 prop
incident — is visible here too. Single grouped query, no Event join, so
unlike the monitor's query this split does NOT exclude futures markets
(they land under `props` and can keep it looking fresher than the
per-game prop board really is) — acceptable for a trust surface, and
worth keeping this public unauthenticated endpoint a single-table scan.

## Response `200`

Successful Response

- unknown

---

[API](https://skmtc.net/prop-line/apis/player-props-api.md) · [All operations](https://skmtc.net/prop-line/apis/player-props-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/prop-line/player-props-api/versions/36072dd255f2/schema)
