FanDuel API endpoint
Returns the Sportsbook's Parlay Hub: popular parlays, same-game parlays (SGP) and SGP+ combinations, each with the number of tickets placed on it (`total_bets`), combined odds, the legs and an editor's narrative when there is one. `view` picks the list: `popular` (the homepage list), `all` (every card, filterable by `type`), `next-to-start` (grouped by the events starting soonest) or `event` (popular cards for one event). The Sportsbook returns at most 50 cards per request. `filters` lists the competition groups its own filter bar offers. A request returns at most 50 cards (`card_cap`); `truncated` is true when it filled that cap, and narrower `type`, sport, competition or decimal-odds filters reveal the cards beyond it.
/fanduel/sportsbook/parlaysview (optional, default popular): which list. One of popular (the homepage list, about 10 cards), all (every card, up to 50), next-to-start (cards for the events starting soonest, with event_groups), event (popular cards for one event). Any other value returns 400.event_id (required for view=event, rejected otherwise): numeric event id from any events listing.type (optional, view=all only; repeat or comma-separate): card types to keep. One of PARLAY (multi-event parlay), SGP (same-game parlay), SGP_PLUS (SGPs combined across games). The upstream accepts no other value, so NEXT_TO_START and MULTIPLE_TYPES return 400.event_type_id (optional, view=all and view=next-to-start): sport id. One of 6423 (American Football), 1 (Soccer), 7522 (Basketball), 3 (Golf), 7511 (Baseball), 7524 (Ice Hockey), 2 (Tennis), 26420387 (Mixed Martial Arts), 2593174 (Table Tennis), 3503 (Darts), 6 (Boxing), 5 (Rugby Union), 4 (Cricket), 8 (Motor Sport), 1477 (Rugby League), 6422 (Snooker), 468328 (Handball), 28608997 (Lacrosse), and 998917 (Volleyball), 4726642 (Surfing), 10 (Special Bets), 2378961 (Politics). Availability differs by market (Volleyball was Ontario-only until 2026-10-23 and is now also offered in NJ, PA, CO and AZ). Any other value returns 400.competition_id (optional, view=all and view=next-to-start; repeat or comma-separate, up to 20): competition ids. The Sportsbook's own filter bar groups them (for example the NFL group holds four ids), listed in the response filters.min_odds, max_odds (optional, view=all and view=next-to-start): combined decimal odds bounds, 1.01 to 10000; min_odds must not exceed max_odds. A range with no cards returns an empty list.state (optional, default nj): market to query. One of ar, az, co, ct, dc, ia, il, in, ks, ky, la, ma, md, mi, mo, mr, nc, nj, ny, oh, on, pa, pr, tn, va, vt, wv, wy. Any other value returns 400.parlays[].legs flatten every selection; an SGP+ card's nested same-game groups become legs with their own event_id. selection is the Sportsbook's display name for the pick (a player name for prop legs) and market the market it belongs to.types counts cards by type for the returned list. featured_by names the creator or partner for curated cards.filters lists the competition groups of the Sportsbook's filter bar. The Sportsbook sends it only for an unfiltered view=all or view=next-to-start request, so call once without filters to discover the groups.event_groups (next-to-start) groups cards by event, in start order, with the event name, start time and teams; parlay_ids reference parlays[].id.card_cap is that limit and truncated is true when a request filled it, meaning more matching cards may exist. Filters that match nothing return an empty parlays list, not an error.page, offset, limit, cursor, sort and others) changed nothing when tried, so the way past the cap is to slice with the filters. Measured on 2026-10-23: the unfiltered view=all list had 50 cards, while 18 slices (type PARLAY, SGP and SGP_PLUS crossed with decimal-odds bands 1.01-5, 5-20, 20-100, 100-500, 500-3000 and 3000-10000) returned 403 distinct cards, and several slices were themselves full. Narrow further with event_type_id or competition_id when a slice is truncated.503 on upstream failure.| Field | Filled in, of 50 checked | Values in the sample |
|---|---|---|
| id | 50 | |
| type | 50 | SGP (28), PARLAY (17), SGP_PLUS (5) |
| total_bets | 50 | 5 to 14,596, median 613 |
| american_odds | 50 | 237 to 4,906, median 2,113 |
| decimal_odds | 50 | 3.37 to 50.06, median 22.13 |
| narrative | 28 | “Tight End Zone: Kittle & Likely lead the NFL in TE TDs; Ges…” and 27 other values |
| is_editable | 26 | true in 26 of 26 |
| legs | 50 | median 4 entries |
| event_id | 28 | |
| event_name | 28 | “Kansas City Chiefs @ Seattle Seahawks” and 13 other values |
| competition_id | 28 | |
| competition_name | 28 | NFL (20), NFL Futures (4), Spanish La Liga (2) and 1 more |
| home_team | 22 | “Seattle Seahawks” and 11 other values |
| away_team | 22 | “Kansas City Chiefs” and 11 other values |
| featured_by | 1 | “Gronk Same Game Parlay” |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| view | string | No | Which list: `popular` (default), `all`, `next-to-start` or `event` Allowed values: popular, all, next-to-start, event. | ||
| event_id | integer | No | Event id, required for `view=event` and rejected otherwise | ||
| type | string | No | Card type filter for `view=all` (repeat or comma-separate): `PARLAY` (multi-event parlay), `SGP` (same-game parlay), `SGP_PLUS` (SGP combined across games) Allowed values: PARLAY, SGP, SGP_PLUS. | ||
| event_type_id | string | No | Sport filter for `view=all` and `view=next-to-start`: 6423 American Football; 1 Soccer; 7522 Basketball; 3 Golf; 7511 Baseball; 7524 Ice Hockey; 2 Tennis; 26420387 Mixed Martial Arts; 2593174 Table Tennis; 3503 Darts; 6 Boxing; 5 Rugby Union; 4 Cricket; 8 Motor Sport; 1477 Rugby League; 6422 Snooker; 468328 Handball; 28608997 Lacrosse; 998917 Volleyball, 4726642 Surfing, 10 Special Bets and 2378961 Politics; availability differs by market (Volleyball is also offered in NJ, PA, CO and AZ), and a sport a market does not offer returns 404 Allowed values: 6423, 1, 7522, 3, 7511, 7524, 2, 26420387, 2593174, 3503, 6, 5, 4, 8, 1477, 6422, 468328, 28608997, 998917, 4726642, 10, 2378961. | ||
| competition_id | string | No | Competition filter for `view=all` and `view=next-to-start` (repeat or comma-separate, up to 20 ids); the groups in the response `filters` list valid ids | ||
| min_odds | number | No | Minimum combined decimal odds (1.01 to 10000) for `view=all` and `view=next-to-start` | ||
| max_odds | number | No | Maximum combined decimal odds (1.01 to 10000) for `view=all` and `view=next-to-start` | ||
| state | string | No | Market to query; default nj Allowed values: ar, az, co, ct, dc, ia, il, in, ks, ky, la, ma, md, mi, mo, mr, nc, nj, ny, oh, on, pa, pr, tn, va, vt, wv, wy. | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/fanduel/sportsbook/parlays?view=popular&type=PARLAY&event_type_id=6423&state=ar" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"state": "nj",
"view": "all",
"parlays": [
{
"id": "bo-6293a30-popular",
"type": "SGP",
"event_id": 36188999,
"event_name": "New York Giants @ Houston Texans",
"competition_id": 12282733,
"competition_name": "NFL",
"home_team": "Houston Texans",
"away_team": "New York Giants",
"total_bets": 70,
"american_odds": 2631,
"decimal_odds": 27.31,
"narrative": "Battle of the Wideouts: Collins & Nabers each haul in 100+ rec yards & find the end zone",
"is_editable": true,
"legs": [
{
"event_id": 36188999,
"event_name": "New York Giants @ Houston Texans",
"competition_id": 12282733,
"market_id": "734.193112655",
"selection_id": 40988199,
"selection": "N.Collins 100+ Yards",
"market": "Alt Receiving Yds",
"market_type": "PLAYER_X_ALT_RECEIVING_YARDS_HIGH"
},
{
"event_id": 36188999,
"event_name": "New York Giants @ Houston Texans",
"competition_id": 12282733,
"market_id": "734.193075091",
"selection_id": 26919599,
"selection": "N.Collins",
"market": "Any Time Touchdown Scorer",
"market_type": "ANY_TIME_TOUCHDOWN_SCORER"
}
]
}
],
"types": [
{
"type": "SGP",
"count": 50
}
],
"filters": [],
"card_cap": 50,
"truncated": true,
"fetched_at": "2026-10-23T03:52:08Z"
},
"msg": "OK"
}Request schema
No body schema
Response schema
#/definitions/fanduel.sportsbookParlaysResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | fanduel.SportsbookParlaysResponse | No | ||||
| data.card_cap | integer | No | ||||
| data.event_groups | array | No | ||||
| data.event_groups[].away_team | string | No | ||||
| data.event_groups[].event_id | integer | No | ||||
| data.event_groups[].event_name | string | No | ||||
| data.event_groups[].home_team | string | No | ||||
| data.event_groups[].open_date | string | No | ||||
| data.event_groups[].parlay_ids | array | No | ||||
| data.event_id | integer | No | ||||
| data.fetched_at | string | No | ||||
| data.filters | array | No | ||||
| data.filters[].competition_ids | array | No | ||||
| data.filters[].id | string | No | ||||
| data.filters[].text | string | No | ||||
| data.parlays | array | No | ||||
| data.parlays[].american_odds | integer | No | ||||
| data.parlays[].away_team | string | No | ||||
| data.parlays[].competition_id | integer | No | ||||
| data.parlays[].competition_name | string | No | ||||
| data.parlays[].decimal_odds | number | No | ||||
| data.parlays[].event_id | integer | No | ||||
| data.parlays[].event_name | string | No | ||||
| data.parlays[].featured_by | string | No | ||||
| data.parlays[].home_team | string | No | ||||
| data.parlays[].id | string | No | ||||
| data.parlays[].is_editable | boolean | No | ||||
| data.parlays[].is_manually_created | boolean | No | ||||
| data.parlays[].legs | array | No | ||||
| data.parlays[].legs[].competition_id | integer | No | ||||
| data.parlays[].legs[].event_id | integer | No | ||||
| data.parlays[].legs[].event_name | string | No | ||||
| data.parlays[].legs[].market | string | No | ||||
| data.parlays[].legs[].market_id | string | No | ||||
| data.parlays[].legs[].market_type | string | No | ||||
| data.parlays[].legs[].selection | string | No | ||||
| data.parlays[].legs[].selection_id | integer | No | ||||
| data.parlays[].narrative | string | No | ||||
| data.parlays[].total_bets | integer | No | ||||
| data.parlays[].type | string | No | ||||
| data.state | string | No | ||||
| data.truncated | boolean | No | ||||
| data.types | array | No | ||||
| data.types[].count | integer | No | ||||
| data.types[].type | string | No | ||||
| data.view | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/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/parlays?view=popular&type=PARLAY&event_type_id=6423&state=ar" \
-H "x-api-key: $CRAWLORA_API_KEY"