Skip to content

Runner

Object type

FieldArgsTypeDescription
id—ID! required—
status—RunnerStatus! required—
cloth—Int—
reservePosition—IntReserve-runner ordering within the race (R1, R2, …). Non-null only when status is RESERVE; the entries_reserve_position_only_when_reserve check constraint enforces the invariant at the database level. Sourced from the IHRB reserve="y" attribute at ingest, or set by operators when manually marking a runner as a reserve.
stall—Int—
race—RaceThe parent race this runner is entered into. Useful for entry-list views (e.g. a horse’s form table) where each row needs its own race context. Nullable: races are soft-deleted (deleted_at IS NOT NULL) but entry rows may still reference them; the loader returns null for those, and we’d rather surface that than nullify the entire Runner via a non-null violation. Form-history queries already filter out soft-deleted races.
horse—Horse—
jockey—Jockey—
trainer—Trainer—
ownership—[Ownership!]—
silk—Silk—
weight—Weight! required—
officialRating—Int—
adjustedRating—Int—
overweight—IntOverweight carried (lb) — jockey could not make the allocated weight.
allowance—IntApprentice/conditional jockey claim/allowance (lb).
penalty—IntPenalty weight (lb) for a race won after declaration. Fed by IHRB (per-runner penalty attribute) and Weatherbys (4-day card offset 211, RAC-9443); operator-editable, RAT-3 override-locked.
outOfHandicap—IntOut-of-handicap weight (lb): surplus carried when rated below the race minimum.
recentForm—String—
startingPrice—Price—
equipment—[EquipmentItem!]—
medication—[MedicationType!]Operator-editable medication (POD-574). WIND_OPERATION is also written by the Weatherbys OD feed (POD-686).
lastRunDays—Int—
courseWinner—Boolean—
distanceWinner—Boolean—
beatenFavorite—Boolean—
casualtyReason—CasualtyReason—
withdrawnReason—String—
withdrawnAt—DateTime—
result—RunnerResult—
winnings—MonetaryAmountPrize money this runner earned in the race (POD-539). Derived at read time from the finishing position against the race’s per-position prize breakdown (Race.prizeMoney.places) — there is no per-entry winnings column. Null (never 0) in four cases, and they are indistinguishable from one another here — all four surface as a plain null: - a non-finisher (no finishing position); - an unplaced runner (finished outside the paid places); - a race that carries no prize breakdown; - the runner’s race has been deleted. The prize breakdown outlives the race row, so an amount is still derivable — but the CURRENCY lives on the race (Race.prizeMoney), and a deleted race cannot supply it. Returning null is deliberate: the alternative was a real figure stamped with a default currency, which reads as a correct answer and is not one. Runner.race is null for the same runner, so the two agree. Dead heats share the pooled prize for the tied placings equally (racing convention). Disqualified / amended results earn against the revised finishing position, matching how placings are officially settled.
source—String! requiredOrigin of the runner row. 'manual' for runners added via createRunner; 'ingested' (or a provider tag) for runners written by ingestion pipelines. Drives destructive-action gating in the UI: “Delete from race” is offered when the parent race is manual or this runner was added manually.
version—Int! required—
createdAt—DateTime! required—
updatedAt—DateTime! required—