FanDuel API endpoint
Lists today's races (about 500 across all tracks) with track, number, post time, minutes to post, status, race type, surface, class, distance, purse and runner count. Filter by track, country, race type, status, open or closed, or the next N minutes; sort by minutes to post, post time or race number. `total` counts every match so `page` and `limit` page through them.
/fanduel/racing/racestrack (optional, repeatable or comma-separated): track codes such as LRL; malformed codes return 400. List codes with the tracks route.country (optional, repeatable or comma-separated): upper-case three-letter country codes such as USA, CAN, GBR, AUS, FRA, IRL, SWE. Today's codes are in the filters route's countries. Lower-case, two-letter or malformed values return 400; a well-formed code that is not racing today returns an empty list.exclude_country (optional, repeatable or comma-separated): drop these countries; same codes as country.race_type (optional, repeatable or comma-separated): T Thoroughbred, H Harness, Q QuarterHorse, L Thoroughbred LARC. Any other value returns 400; no greyhound races were on the service on 2026-10-23.status (optional, repeatable or comma-separated): O Open, IC Up Next, SK Race Off, RO Race Official. Any other value returns 400.open (optional): true for races still open for betting (O and IC), false for off or official races (SK, RO); omit for both.within_minutes (optional): keep races that post within this many minutes, 1 to 1440; other values return 400.sort (optional): mtp (minutes to post), post_time, race_number. Any other value returns 400.order (optional): asc or desc; default asc. Valid only with sort.page (optional): page number from 1 to 10000; default 1; a value outside that range returns 400.limit (optional): items per page, 1 to 200; default 50.total counts every match, and the page is cut here, so page and limit are exact.400 instead.mtp is 0 for races that are off or official.Data is read from FanDuel Racing's own public service and is shown as published at the time of the request; it is not a betting recommendation, and prices, pools and statuses change by the minute. 503 on upstream failure.
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| id | 40 | |
| track_code | 40 | |
| track_name | 40 | AU1 - Maryborough (10), Downs at Albuquerque (9), AU - Coonabarabran (8) and 2 more |
| country | 40 | AUS (26), USA (14) |
| number | 40 | 1 to 10, median 4 |
| race_date | 40 | 2026-10-24 |
| mtp | 40 | 0 to 179, median 0 |
| post_time | 40 | 2026-10-24 to 2026-10-25 |
| status | 40 | |
| race_type | 40 | |
| surface | 40 | |
| race_class | 40 | |
| distance | 40 | “4.5f” and 12 other values |
| purse | 40 | 2,812 to 65,000, median 5,625 |
| runner_count | 40 | 7 to 16, median 10 |
| live_streaming | 40 | true in 40 of 40 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| track | string | No | Keep only these track codes (repeat the parameter or comma-separate), such as `LRL`; list codes with the `tracks` route | ||
| country | string | No | Keep only races or tracks in these countries (repeat the parameter or comma-separate): upper-case three-letter codes such as `USA`, `GBR`, `AUS`. Today's codes are listed in the `filters` route's `countries`; lower-case or two-letter values return `400` | ||
| exclude_country | string | No | Drop these countries (repeat the parameter or comma-separate), same codes as `country` | ||
| race_type | string | No | Keep only these race types (repeat the parameter or comma-separate): `T` Thoroughbred, `H` Harness, `Q` QuarterHorse, `L` Thoroughbred LARC Allowed values: T, H, Q, L. | ||
| status | string | No | Keep only these race statuses (repeat the parameter or comma-separate): `O` Open, `IC` Up Next, `SK` Race Off, `RO` Race Official Allowed values: O, IC, SK, RO. | ||
| open | boolean | No | `true` for races still open for betting (`O` and `IC`), `false` for off or official races; omit for both | ||
| within_minutes | integer | No | Keep races that post within this many minutes, 1 to 1440 Minimum: 1. Maximum: 1440. | ||
| sort | string | No | Sort: `mtp` (minutes to post), `post_time`, `race_number`; default is the service's own order Allowed values: mtp, post_time, race_number. | ||
| order | string | No | `asc` or `desc`; default `asc`. Only valid together with `sort` Allowed values: asc, desc. | ||
| page | integer | No | Page number, from 1; default 1, at most 10000 Minimum: 1. Maximum: 10000. | ||
| limit | integer | No | Items per page, 1 to 200; default 50 Minimum: 1. Maximum: 200. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/fanduel/racing/races?country=us&race_type=T&status=O&open=true&sort=mtp&order=asc&page=1&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"race_date": "2026-10-23",
"total": 14,
"page": 1,
"limit": 3,
"races": [
{
"id": "A04-1",
"track_code": "A04",
"track_name": "AU - Ascot",
"country": "AUS",
"number": "1",
"race_date": "2026-10-23",
"mtp": 702,
"post_time": "2026-10-24T03:44:00Z",
"status": {
"code": "O",
"name": "Open"
},
"race_type": {
"code": "T",
"name": "Thoroughbred"
},
"surface": {
"code": "T",
"name": "Turf"
},
"race_class": {
"code": "OPEN",
"name": "OPEN"
},
"distance": "5f",
"purse": 56219,
"runner_count": 8,
"live_streaming": true
}
],
"fetched_at": "2026-10-23T16:09:31Z"
},
"msg": "OK"
}Request schema
No body schema
Response schema
#/definitions/fanduel.racingRacesResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | fanduel.RacingRacesResponse | No | ||||
| data.fetched_at | string | No | ||||
| data.limit | integer | No | ||||
| data.page | integer | No | ||||
| data.race_date | string | No | ||||
| data.races | array | No | ||||
| data.races[].country | string | No | ||||
| data.races[].distance | string | No | ||||
| data.races[].id | string | No | ||||
| data.races[].live_streaming | boolean | No | ||||
| data.races[].mtp | integer | No | ||||
| data.races[].number | string | No | ||||
| data.races[].post_time | string | No | ||||
| data.races[].purse | number | No | ||||
| data.races[].race_class | fanduel.RacingCodeName | No | ||||
| data.races[].race_class.code | string | No | ||||
| data.races[].race_class.name | string | No | ||||
| data.races[].race_date | string | No | ||||
| data.races[].race_type | fanduel.RacingCodeName | No | ||||
| data.races[].race_type.code | string | No | ||||
| data.races[].race_type.name | string | No | ||||
| data.races[].runner_count | integer | No | ||||
| data.races[].status | fanduel.RacingCodeName | No | ||||
| data.races[].status.code | string | No | ||||
| data.races[].status.name | string | No | ||||
| data.races[].surface | fanduel.RacingCodeName | No | ||||
| data.races[].surface.code | string | No | ||||
| data.races[].surface.name | string | No | ||||
| data.races[].track_code | string | No | ||||
| data.races[].track_name | string | No | ||||
| data.total | integer | 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/races?country=us&race_type=T&status=O&open=true&sort=mtp&order=asc&page=1&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"