FanDuel API endpoint
Returns one past race in full: conditions, the finish order with win, place and show payoffs, beaten lengths, starting price and the post-race report of each runner, the payoff of every wager type, and every entry with its morning-line and final odds and its horse, jockey, trainer, owner and pedigree. Needs a date, a track code and a race number from the `past-races` route; a race that did not run returns 404. A race whose results the service no longer holds returns no `results`.
/fanduel/racing/past-racedate (required): the day as YYYY-MM-DD, from 2008-01-01.track (required): a track code such as BEL, from past-tracks.number (required): the race number, 1 to 99, from past-races. A race that did not run on that day returns 404; malformed input returns 400.results.finishers are in finish order. win_payoff, place_payoff and show_payoff are the payoffs for a $2 bet; 0 means the runner did not pay in that pool. entry is the betting-interest number and timeform has beaten_lengths and its text form, total_beaten_lengths (the margin to the winner), starting_price (decimal) and post_race_report. winning_time is in seconds.results.payoffs lists every wager type with its wager_amount and winning selections (WN, PL, SH, EX, TR, SU, DB and P3 to P6 in the Belmont sample; decode a code with the wager-types route).entries are the numbers a bet named, with morning_line and final_odds (fractional and decimal), favorite and the runners (a coupled entry has more than one): name, entity_id when the horse has one (use it with search and horse), jockey, trainer, owner, sire, dam, dam_sire, sex, age, birth_year, weight, medication and scratched. A scratched horse is in entries but not in finishers, which is why 16 entries can have 12 finishers.results is omitted.Data is read from FanDuel Racing's own public service and is shown as published at the time of the request. 503 on upstream failure.
| Field | Filled in, of 16 checked | Values in the sample |
|---|---|---|
| number | 16 | 1 to 16, median 8 |
| number_color | 16 | #FFFFFF (8), #000000 (8) |
| saddle_color | 16 | “#BC0000” and 15 other values |
| favorite | 16 | true in 1 of 16 |
| morning_line | 16 | |
| final_odds | 12 | |
| runners | 16 | median 1 entry |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| date | string | Yes | Day as `YYYY-MM-DD`, from `2008-01-01` | 2026-10-02 | |
| track | string | Yes | Track code such as `BEL` | BEL | |
| number | string | Yes | Race number, 1 to 99 | 9 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/fanduel/racing/past-race?date=2026-10-02&track=BEL&number=9" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"id": "BEL-9-2026-10-02T00:00:00",
"track_code": "BEL",
"track_name": "Belmont",
"number": "9",
"date": "2026-10-02",
"distance": {
"value": 6.5,
"unit": "Furlongs",
"code": "F"
},
"purse": 105000,
"runner_count": 16,
"surface": {
"code": "I",
"name": "Inner Track"
},
"track_condition": "Firm",
"race_type": {
"code": "T",
"name": "Thoroughbred"
},
"race_class": {
"code": "ALW",
"name": "Allowance"
},
"has_replay": true,
"results": {
"winning_time": 74.53,
"finishers": [
{
"position": 1,
"number": "12",
"runner": "Amangani (Ire)",
"win_payoff": 7.34,
"place_payoff": 5.44,
"show_payoff": 3.58,
"entry": 12,
"timeform": {
"beaten_lengths": 0,
"total_beaten_lengths": 0,
"starting_price": 3.67,
"post_race_report": "3w pursuit, 6w uppr, bumped 3/16, up near 1/16, inched away"
}
}
],
"payoffs": [
{
"wager_type": {
"code": "WN",
"name": "WIN"
},
"wager_amount": 2,
"selections": [
{
"selection": "12",
"payout": 7.34
}
]
}
]
},
"entries": [
{
"number": 1,
"favorite": false,
"morning_line": {
"fractional": "6/1",
"decimal": 7
},
"final_odds": {
"fractional": "9/1",
"decimal": 10
},
"runners": [
{
"name": "La Tasmania (Arg)",
"runner_id": "1",
"jockey": "Davis Dylan",
"trainer": "Maker Michael J",
"owner": "La Valkiria",
"sire": "Mask",
"dam": "Donatella Rye (Arg)",
"dam_sire": "Catcher In The Rye (Ire)",
"sex": "F",
"age": 4,
"birth_year": 2022,
"weight": 126,
"scratched": false
}
]
}
],
"fetched_at": "2026-10-24T07:00:00Z"
},
"msg": "OK"
}Request schema
No body schema
Response schema
#/definitions/fanduel.racingPastRaceResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | fanduel.RacingPastRaceResponse | No | ||||
| data.claiming_price | number | No | ||||
| data.date | string | No | ||||
| data.description | string | No | ||||
| data.distance | fanduel.RacingPastDistance | No | ||||
| data.distance.code | string | No | ||||
| data.distance.unit | string | No | ||||
| data.distance.value | number | No | ||||
| data.entries | array | No | ||||
| data.entries[].favorite | boolean | No | ||||
| data.entries[].final_odds | fanduel.RacingOdds | No | ||||
| data.entries[].final_odds.decimal | number | No | ||||
| data.entries[].final_odds.fractional | string | No | ||||
| data.entries[].morning_line | fanduel.RacingOdds | No | ||||
| data.entries[].morning_line.decimal | number | No | ||||
| data.entries[].morning_line.fractional | string | No | ||||
| data.entries[].number | integer | No | ||||
| data.entries[].number_color | string | No | ||||
| data.entries[].runners | array | No | ||||
| data.entries[].runners[].age | integer | No | ||||
| data.entries[].runners[].birth_year | integer | No | ||||
| data.entries[].runners[].dam | string | No | ||||
| data.entries[].runners[].dam_sire | string | No | ||||
| data.entries[].runners[].entity_id | string | No | ||||
| data.entries[].runners[].jockey | string | No | ||||
| data.entries[].runners[].medication | string | No | ||||
| data.entries[].runners[].name | string | No | ||||
| data.entries[].runners[].owner | string | No | ||||
| data.entries[].runners[].runner_id | string | No | ||||
| data.entries[].runners[].scratched | boolean | No | ||||
| data.entries[].runners[].sex | string | No | ||||
| data.entries[].runners[].sire | string | No | ||||
| data.entries[].runners[].trainer | string | No | ||||
| data.entries[].runners[].weight | integer | No | ||||
| data.entries[].saddle_color | string | No | ||||
| data.fetched_at | string | No | ||||
| data.has_replay | boolean | No | ||||
| data.id | string | No | ||||
| data.number | string | No | ||||
| data.post_time | string | No | ||||
| data.purse | number | No | ||||
| data.race_class | fanduel.RacingCodeName | No | ||||
| data.race_class.code | string | No | ||||
| data.race_class.name | string | No | ||||
| data.race_type | fanduel.RacingCodeName | No | ||||
| data.race_type.code | string | No | ||||
| data.race_type.name | string | No | ||||
| data.results | fanduel.RacingResults | No | RacingResults record, 27 fields: finishers, payoffs, winning_time. Described under FanDuel Racing race detail API. | |||
| data.runner_count | integer | No | ||||
| data.surface | fanduel.RacingCodeName | No | ||||
| data.surface.code | string | No | ||||
| data.surface.name | string | No | ||||
| data.track_code | string | No | ||||
| data.track_condition | string | No | ||||
| data.track_name | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/fanduel/racing/past-race?date=2026-10-02&track=BEL&number=9" \
-H "x-api-key: $CRAWLORA_API_KEY"