---
title: "Progress of a backfill job"
method: GET
path: "/v1/racing/horses/backfill/{job_id}"
tags: ["Racing"]
---

# Progress of a backfill job

`GET /v1/racing/horses/backfill/{job_id}`

## Request

- Base URL: `https://api.puntersedge.online`
- URL: `https://api.puntersedge.online/v1/racing/horses/backfill/{job_id}`
- Auth: API key in header `X-API-Key`

Cost: free. Poll as often as your rate limit allows.

`credits_blocked` is the one field worth watching: the worker bills 3 credits per
horse as it delivers it, and when your balance drops below that it stops taking rows
for your key and leaves them queued. Nothing is lost — collection resumes when your
credits reset on the 1st, or immediately if you upgrade.

`upstream` says whether Racing Australia is answering form reads at all. `state: walled`
means RA is serving its bot-protection challenge to every fresh read, so NO horse can be
collected — by us or by anyone — until that stops; `walled_since` and `walled_hours` say
how long it has been going on, which is the difference between a queue that is slow and a
queue that is stopped. Your rows stay queued and unbilled throughout and collection
resumes on its own; there is nothing to re-submit. While it lasts,
GET /v1/racing/horses/runs answers from our own settled results instead and needs no
Racing Australia read at all. The block is additive: every other field, and all billing
and queue behaviour, is exactly as it was before 2026-09-21.

## Path parameters

- `job_id` string, required

## Headers

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

## Response `200`

Successful Response

- BackfillStatusOut
  - `job_id` string, required
  - `submitted_at` string, nullable
  - `total` integer, required
  - `done` integer, required
  - `queued` integer, required
  - `failed` integer, required
  - `credits_charged` integer, required: 3 per horse delivered so far.
  - `credits_blocked` boolean, required: True when your remaining credits are below the cost of one horse, which pauses collection until they reset or you upgrade.
  - `queue_position` integer, nullable: Horses ahead of this job's oldest waiting row, across all jobs.
  - `estimated_ready` string, nullable
  - `ready_to_collect` integer, required: Completed rows you have not yet read.
  - `upstream` UpstreamBlock, required
    - `state` string, required: `ok` when Racing Australia is answering form reads, `walled` when it is serving its bot-protection challenge to every fresh read and nothing can be collected.
    - `walled_since` string, nullable: UTC time of the first refusal in the current streak, null when `state` is `ok`. This is the field that tells you a stalled queue is hours old rather than minutes.
    - `walled_hours` number, nullable: How long the current streak has run, in hours, null when `state` is `ok`.
    - `note` string, required: One sentence saying what that means for this job, in plain words.

## 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
- `422`: Validation Error
- `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)
