FanDuel API endpoint
Returns the Sportsbook's bet-builder content for one event: the `groups` and `cards` (bet templates such as who will win, player lines, bullseye ranges, player podium, either-player and head-to-head groups) with their selectable options, the `players` and `teams` on offer, the `periods` and every priceable `choice` with its `choice_id` and description. Choices carry no odds here; price them with `builder/quotes` using this response's `ramp_event_id`. `head-to-head` and `player-combos` return `404` when the event has no cards for that experience.
/fanduel/sportsbook/builderevent_id (required): an event id from the builder/events route. An unknown event returns 404.experience (optional): yourway (default), head-to-head, player-combos, bullseye, player-podium, or-bets. Any other value returns 400.state (optional): market code, including on for Ontario; default nj. An unknown code returns 400. The data was identical in NJ, PA, ON and CO when tested.yourway is the same-game builder; bullseye, player-podium, or-bets, head-to-head and player-combos are the FanDuel Labs experiences. head-to-head and player-combos return 404 when the event has no cards for that experience.layout is the display order of groups and cards; groups[].card_ids lists a group's cards and cards follows that order.selected_options, available_options, legs) differ by card type and are passed through with snake_case keys. A leg's choice_id links it to choices.choices carries no odds (the Sportsbook sends zeros here): price them with builder/quotes using this response's ramp_event_id.teams can include a "Both Teams" entry with no side.Data is read from the Sportsbook's own services and is shown as published at the time of the request; it is not a betting recommendation. 503 on upstream failure, including when the Sportsbook's edge refuses the request.
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| event_id | integer | Yes | Event id from the `builder/events` route (`events[].event_id`) | 36188995 | |
| experience | string | No | Builder experience: `yourway` (default), `head-to-head`, `player-combos`, `bullseye`, `player-podium`, `or-bets` Allowed values: yourway, head-to-head, player-combos, bullseye, player-podium, or-bets. | ||
| state | string | No | Market code, including `on` for Ontario; default `nj` | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/fanduel/sportsbook/builder?event_id=36188995&experience=yourway" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"state": "nj",
"experience": "bullseye",
"event_id": 36188995,
"ramp_event_id": 16712244,
"event_name": "Tampa Bay Buccaneers @ Carolina Panthers",
"competition": "NFL",
"competition_id": 12282733,
"game_status": "PRE_PLAY",
"status": "ACTIVE",
"start_time": "2026-10-25T17:01:00Z",
"layout": [
"group:bullseye"
],
"groups": [
{
"id": "group:bullseye",
"title": "Choose a bullseye for a player...",
"type": "BULLSEYE",
"layout_type": "PILLS",
"card_ids": [
"card:bullseye_receiving_yards:"
]
}
],
"cards": [
{
"id": "card:bullseye_receiving_yards:",
"type": "BULLSEYE",
"title": "Receiving Yds",
"props": [
"ReceivingYards"
],
"prop_key": "receiving_yards",
"selected_options": {
"line": {
"value": 43
},
"mode": "EXACT",
"participants": [
{
"id": "80",
"type": "PLAYER"
}
],
"periods": [
"Match"
],
"range": {
"lower": 20,
"upper": 66
}
},
"available_options": {
"line": {
"increment": 1,
"max": 124,
"min": 13
},
"participants": [
{
"id": "8015",
"type": "PLAYER"
}
],
"periods": [
"Match"
],
"range": {
"lower": 13,
"upper": 124
}
},
"legs": [
{
"choice_id": "dadc5a4a4cbefeb3926eb257caf4409d8fe5a36787809ce197ae3d59f50d5871",
"type": "SIMPLE"
}
]
}
],
"players": [
{
"id": "1554",
"name": "Carolina Defense",
"short_name": "Carolina Defense",
"team_id": "26"
}
],
"teams": [
{
"id": "26",
"name": "Carolina Panthers",
"abbr": "CAR",
"side": "HOME",
"logo_url": "https://assets.sportsbook.fanduel.com/images/team/nfl/carolina_panthers.png"
}
],
"periods": [
"Half1"
],
"choices": [
{
"choice_id": "2763248ae1c5094d3aff3f30eb484612655c4cea3c3d386788b3b75628961795",
"description": "Bryce Young exactly 254 - Passing Yds",
"status": "ACTIVE",
"template_id": "v1-synth"
}
],
"fetched_at": "2026-10-23T17:39:59Z"
},
"msg": "OK"
}Request schema
No body schema
Response schema
#/definitions/fanduel.sportsbookBuilderResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | fanduel.SportsbookBuilderResponse | No | ||||
| data.cards | array | No | ||||
| data.cards[].available_options | object | No | ||||
| data.cards[].description_template | string | No | ||||
| data.cards[].id | string | No | ||||
| data.cards[].legs | array | No | ||||
| data.cards[].prop_key | string | No | ||||
| data.cards[].props | array | No | ||||
| data.cards[].selected_options | object | No | ||||
| data.cards[].title | string | No | ||||
| data.cards[].type | string | No | ||||
| data.choices | array | No | ||||
| data.choices[].choice_id | string | No | ||||
| data.choices[].description | string | No | ||||
| data.choices[].status | string | No | ||||
| data.choices[].template_id | string | No | ||||
| data.competition | string | No | ||||
| data.competition_id | integer | No | ||||
| data.event_id | integer | No | ||||
| data.event_name | string | No | ||||
| data.experience | string | No | ||||
| data.fetched_at | string | No | ||||
| data.game_status | string | No | ||||
| data.groups | array | No | ||||
| data.groups[].card_ids | array | No | ||||
| data.groups[].id | string | No | ||||
| data.groups[].layout_type | string | No | ||||
| data.groups[].title | string | No | ||||
| data.groups[].type | string | No | ||||
| data.layout | array | No | ||||
| data.periods | array | No | ||||
| data.players | array | No | ||||
| data.players[].headshot_url | string | No | ||||
| data.players[].id | string | No | ||||
| data.players[].name | string | No | ||||
| data.players[].short_name | string | No | ||||
| data.players[].team_id | string | No | ||||
| data.ramp_event_id | integer | No | ||||
| data.start_time | string | No | ||||
| data.state | string | No | ||||
| data.status | string | No | ||||
| data.teams | array | No | ||||
| data.teams[].abbr | string | No | ||||
| data.teams[].id | string | No | ||||
| data.teams[].logo_url | string | No | ||||
| data.teams[].name | string | No | ||||
| data.teams[].side | 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/sportsbook/builder?event_id=36188995&experience=yourway" \
-H "x-api-key: $CRAWLORA_API_KEY"