Skip to content

Race

Object type

A single race within a meeting. Child of Meeting; parent container for Runner. Carries the race’s classification (type, surface, distance, class/pattern, handicap), eligibility, prize money, conditions overrides, and full lifecycle status. The auto-classified header-decomposition fields (jockeyCondition, experienceCondition, etc.) summarise the race’s conditions of entry in a queryable form.

FieldArgsTypeDescription
idID! requiredStable Podium identifier (UUID).
raceNumberInt! required1-indexed position of the race on the meeting card.
divisionIntDivision number (1, 2, …) when a race is split into divisions because the field is oversubscribed; null for an undivided race. Each division is its own race with its own id, runners and result. Symmetric across UK (Weatherbys) and Irish (IHRB) racing.
scheduledTimeDateTime! requiredAdvertised off-time (with timezone). May change pre-race-day if the card is reshuffled; on race day this value is fixed even if the race starts late — the actual start time is captured on offTime.
offTimeDateTimeActual time the race went off. Populated post-race; null until then.
statusRaceStatus! required
titleStringRace title from a titled feed (ED/OD/PD/IHRB/Calendar XML/RP-Calendar). Null until one lands — clients should render Race ${raceNumber} as the placeholder.
titleAbbreviatedStringShort title for compact displays (mobile, navigation). Null if the source did not provide one.
headerStringConditions-of-race header — the structured eligibility/penalty text that governs the race (distinct from title). Operationally important: gets decomposed into the jockeyCondition / experienceCondition / commerceCondition / handicapOption fields by the auto-classifier.
raceTypeRaceType! required
surfaceSurfaceTypeRacing surface for this race. Null until a surface-bearing feed lands.
distanceDistanceRace distance. Null until a distance-bearing feed lands.
classStringRace class as the CLASS_1CLASS_7 enum form. Class and pattern are distinct elements, but a pattern race is always CLASS_1 (see pattern). Null until a class-bearing feed lands.
patternPatternTypePattern designation for prestige races: Group 1–3, Grade 1–3, or Listed (Group = flat, Grade = jumps — one field). Null for ordinary races. When set, class is always CLASS_1.
handicapBoolean! requiredTrue when weights are assigned by official rating rather than race conditions.
eligibilityRaceEligibility
goingOfficialGoingTypeRace-level going override. When null, the race inherits meeting.conditions.going.official.
prizeMoneyPrizeMoney
declarationStageDeclarationStage! required
sourceDeclarationTypeStringProvider-specific declaration file type that produced the current declarationStage (e.g. WEATHERBYS_OD, IHRB_OVERNIGHT). Use for traceability back to the upstream feed; for lifecycle logic prefer the canonical declarationStage enum.
televisedBoolean! requiredTrue when the race is scheduled to be televised.
broadcasters[Broadcaster!]! requiredBroadcasters (TV channels) that broadcast this race, ordered by name.
maxRunnersIntSafety factor — the maximum declared runners the course/feed allows for this race. Sourced from Weatherbys RP-Calendar or the XML calendar feed; null until either lands. Use as the denominator for “active / max” displays.
activeRunnerCountInt! requiredActive declared runner count — excludes NON_DECLARED, NON_RUNNER, WITHDRAWN, and DISQUALIFIED entries. Use as a cheap “active runners” badge on race lists / tables where the full runners[] array would be over-fetch.
winningTimeSecondsFloatWinning time in seconds. Populated once the race result has been settled.
stewardsInquiryStringStatus of any stewards’ inquiry (NO_INQUIRY, STEWARDS_MAY_AFFECT, STEWARDS_NOT_AFFECT). Null when no inquiry has been called.
stewardsObjectionStringStatus of any objection raised. Null when no objection has been lodged.
stewardsResolutionStringResolution of an inquiry or objection (RESULT_STANDS, AMENDED_RESULT). Null until the matter is resolved.
jockeyConditionJockeyConditionJockey-condition component of the race header (e.g. LADIES, APPRENTICE). Derived by auto-classification, editor-reviewable.
experienceConditionExperienceConditionExperience-condition component of the race header (NOVICE, MAIDEN).
commerceConditionCommerceConditionCommerce-condition component of the race header (SELLER, CLAIMER, AUCTION).
handicapOptionHandicapOptionGranular handicap classification that supplements the boolean handicap field — distinguishes handicaps, conditional handicaps, conditions races, and stakes races.
headerConfidenceHeaderConfidenceAuto-classification confidence (HIGH, MEDIUM, LOW, MANUAL). MANUAL indicates an editor set the classification directly.
headerStatusHeaderStatusEditorial workflow status for the header classification (auto-classified, editor-confirmed, editor-corrected, pending review).
headerClassifiedAtDateTimeWhen the auto-classification pipeline last ran for this race.
headerReviewedByStringEditor who confirmed or corrected the classification, if any.
headerReviewedAtDateTimeWhen the editor review took place.
headerClassificationDetailHeaderClassificationDetailPer-field provenance and plausibility-rule diagnostics for the classification. Drives UI cues for uncertain fields.
abandonedReasonStringReason if the race has been abandoned (e.g. 'Course inspection failed'). Null otherwise.
abandonedAtDateTimeTimestamp the race was abandoned. Null otherwise.
meetingMeeting! requiredThe parent meeting this race belongs to.
runners[Runner!]! requiredAll runner entries for this race — declared, reserve, non-runner, and withdrawn alike. Filter on Runner.status for the active field.
pendingNonRunners[PendingNonRunner!]! requiredEntries held in PENDING_NON_RUNNER awaiting BHA verification. Empty when none are pending.
sourceString! requiredOrigin of the race row. 'manual' for races created via createRace; otherwise the ingestion provider tag (commonly 'ingested'). Drives destructive-action gating: only source = 'manual' races may be deleted; ingested races use abandonRace.
versionInt! requiredOptimistic-locking version counter — increments on every write.
createdAtDateTime! required
updatedAtDateTime! required
provenanceRaceProvenance! requiredAggregate freshness derived from change_log — the most recent change across the race row and its runners, verdicts, tips and comments. Prefer this over updatedAt for “last updated” provenance UI: updatedAt only tracks writes to the race row itself and goes stale when only a child entity changes.