prizepicksapi

Freshness & status

Know how fresh PrizePicks API data is.

A successful HTTP response and fresh data are separate facts. Every response carries collection health so your application can decide whether a line is current enough for its purpose.

The five source states

source_statusMeaningTypical response
freshLatest collection succeeded and is at most 10 minutes old.Display normally, still with observed_at.
partialLatest collection is recent but completeness was not verified.Show observed rows; do not infer absences.
staleLatest collection is more than 10 minutes old.Label as dated; suppress real-time alerts.
failedLatest collection attempt failed or was blocked.Show an outage notice; keep last good data labeled.
not_configuredNo live collection has been stored.Use the demo for development only.

Alongside source_status, meta.observed_at is the latest collection time and meta.observation_age_seconds its age at response time. meta.warnings carries collection warnings when present.

What active really means

With the default status=active, a projection must have been seen in the latest successful collection for its scope and confirmed within the last ten minutes. status=all includes retained records that may be stale, and status=unavailable returns offers last recorded as unavailable. Choose all only for analysis that handles each row’s own observed_at.

Projection pages also include stale_record_count, the number of rows on the page whose observed_at is more than ten minutes old, and a freshness_notice reminding clients that collection health does not make every row current.

Drop-in freshness gate

function freshnessGate(page, { maxAgeSeconds = 600, allowPartial = false } = {}) {
  const m = page.meta;
  if (m.mode !== "live") return { ok: false, reason: "demo data" };
  if (m.source_status === "partial" && !allowPartial) return { ok: false, reason: "partial collection" };
  if (!["fresh", "partial"].includes(m.source_status)) return { ok: false, reason: m.source_status };
  if (m.observation_age_seconds == null || m.observation_age_seconds > maxAgeSeconds) {
    return { ok: false, reason: "collection too old" };
  }
  const now = Date.now();
  const rows = page.data.filter((p) => (now - Date.parse(p.observed_at)) / 1000 <= maxAgeSeconds);
  return { ok: true, rows, dropped: page.data.length - rows.length };
}

Apply a stricter maxAgeSeconds for alerts and a looser one, or none, for dated reports. Log the reason when the gate closes so on-call staff can tell an upstream outage from an application bug.

Show freshness to people

  • Print observed_at next to any line or at the top of a table, in the viewer’s time zone with UTC available.
  • Use plain wording such as “Observed 14 minutes ago” rather than “Live”.
  • When stale, keep the data visible but labeled; hiding it entirely removes useful context.
  • Link to the public status page so users can check collection health themselves.

Frequently asked questions

How old can data be and still be called fresh?

source_status is stale when the latest collection is more than 600 seconds old. Fresh describes the latest collection, so individual retained records can still be older.

What does partial mean?

The latest collection completed without verified completeness. Observed records are real, but a missing offer is not proof that it does not exist.

References

Current API documentation ↗Machine-readable OpenAPI contract ↗Source status page ↗

PrizePicks API is an independent data service. It is not affiliated with or endorsed by PrizePicks. Observations, completeness, and freshness are separate claims; consult source status before relying on a stored line.