---
title: "Scan the live window for runners that moved: time-anchored, breadth-gated"
method: GET
path: "/v1/racing/intelligence/scan"
tags: ["Racing"]
---

# Scan the live window for runners that moved: time-anchored, breadth-gated

`GET /v1/racing/intelligence/scan`

## Request

- Base URL: `https://api.puntersedge.online`
- URL: `https://api.puntersedge.online/v1/racing/intelligence/scan`
- Auth: API key in header `X-API-Key`

Cost: 5 credits. Every race inside the 60-minute capture window, analysed exactly as
GET /v1/racing/intelligence analyses one race, with the runners that cleared the filters
returned largest move first. This is the time-anchored, breadth-gated form of
/v1/racing/movers, and /movers keeps serving unchanged.

`window` selects the movement figure the gate applies to: `60m` for the move since the
T-60 consensus, `15m` since T-15, `5m` over the last five minutes — the late-window
figure a last-minute mover product wants. `min_books` is the breadth gate: a runner needs
that many books with two or more captured prices, so a single book repricing cannot clear
it. `signal` keeps only the named classes. The response carries the race header beside
each runner so nothing has to be joined.

Served from a 15-second cache shared by every caller with the same filters; `cached`
says so and `as_of` is the moment the scan was computed.

Plus and above. 5 credits. An unknown parameter value is a free 422.

## Query parameters

- `window` string: Which movement gates the result: 60m (move_from_t60_pct), 15m (move_from_t15_pct) or 5m (move_last_5m_pct).
- `min_move_pct` number: Minimum absolute consensus move, in percent.
- `min_books` integer: Minimum books with history on the runner (breadth).
- `direction` string, nullable: firming or drifting; omit for both.
- `signal` string, nullable: Comma-separated signal classes to keep, e.g. strong_firm,firm.
- `country` string, nullable: Country code, e.g. AU or NZ.
- `categories` string, nullable: Comma-separated subset of horse, greyhound, harness.
- `limit` integer

## Headers

- `X-API-Key` string
- `X-RapidAPI-Proxy-Secret` string

## Response `200`

Successful Response

- ScanOut
  - `as_of` string, required
  - `window_minutes` integer, required
  - `races_scanned` integer, required
  - `filters` object, required
  - `method` object, required
  - `results` object[]: Runners that cleared the filters, largest move first, each with its race header.
  - `cached` boolean

## Other responses

- `401`: Missing or invalid API key. Send `X-API-Key`. See https://puntersedge.online/developers/errors
- `402`: Monthly credit allowance exhausted for this plan. Upgrade at https://puntersedge.online/api/pricing
- `403`: The scan is available on Plus, Business, Platform and Scale plans. The refusal is free.
- `422`: Unparseable parameter. Nothing was charged.
- `429`: Rate limit exceeded for this plan. Honour the `Retry-After` header (seconds) before retrying. See https://puntersedge.online/developers/rate-limits
- `500`: Unexpected server error. Safe to retry with backoff.

---

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