FanDuel API endpoint
Returns the Sportsbook's own search results, grouped into sport tabs (for example `Basketball`, `Ice Hockey`, `American Football`) and 20 per page. `tabs` lists the sports that have matches and the selected one is returned in `tab`; pass a tab title as `tab` to read another sport. A query without `tab` also lists competition `pills` for the selected sport, and passing `pill` with `tab` keeps only that competition. `found` counts the matches in the selected tab (and pill), `total_results` the matches across the whole query, and `next_start_index` is the `start_index` of the next page while more remain. Events and competitions are returned without markets; use the `search` route for markets.
/fanduel/sportsbook/search/tabsReturns the Sportsbook's own search results, grouped into sport tabs and paged 20 at a time, without markets.
q (required): search text, 3 to 100 characters, without < or >.tab (optional): a sport tab title from a previous response's tabs[].title, such as Basketball, Ice Hockey or American Football. The set depends on the query, so it is discovered from the response, not fixed. An unknown title returns no results.pill (optional): a competition title from the response pills[].title, such as NBA, or All; needs tab. The filtering is the Sportsbook's own: for q=nba in Basketball, NBA returned 14 of 15 results (including the NBA Futures competition), WNBA - Playoff Series returned its 1 result and All returned all 15, while the listed pill NBA Futures returned none. Compare found with the unfiltered count; a listed pill is not guaranteed to return results. A title that is not listed returns none.start_index (optional): 0 to 9999; default 0. Use the response next_start_index to page in steps of 20.timezone (optional): an IANA name such as America/New_York; default UTC. An unknown zone 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.found counts the matches in the selected tab (and pill); total_results counts the matches across the whole query.next_start_index is set while more results remain and is omitted on the last page.tab and pill are handled for you (+ and %20 behave identically upstream).tab lists the competition pills; with tab the pill is applied (and echoed in pill) but pills is empty.ancestry is the result's path, for example sport, competition and event.search route returns the same events with their markets.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.
| Field | Filled in, of 11 checked | Values in the sample |
|---|---|---|
| type | 11 | Event in all 11 |
| subtype | 11 | NonFixture in all 11 |
| title | 11 | “New Orleans Pelicans @ Denver Nuggets” and 10 other values |
| result_id | 11 | |
| start_date | 11 | 2023-07-08 to 2026-10-26 |
| sport_id | 11 | |
| sport | 11 | Basketball in all 11 |
| competition_id | 11 | |
| competition | 11 | NBA (10), NBA Futures (1) |
| event_category | 11 | 62 to 64, median 62 |
| exchange_id | 11 | |
| ancestry | 11 | median 3 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | Yes | Search text, 3 to 100 characters, without `<` or `>` | nba | |
| tab | string | No | Sport tab title from a previous response's `tabs[].title`, such as `Basketball`; default is the tab with the most relevant matches | ||
| pill | string | No | Competition title from the response `pills[].title`, such as `NBA`; needs `tab` | ||
| start_index | integer | No | Index of the first result, 0 to 9999, in steps of 20; default 0 Minimum: 0. Maximum: 9999. | ||
| timezone | string | No | IANA time zone for result times, such as `America/New_York`; default `UTC` | ||
| 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/search/tabs?q=nba" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"state": "nj",
"query": "nba",
"tab": "Basketball",
"pill": "All",
"tabs": [
{
"id": "0",
"title": "Basketball"
}
],
"pills": [
{
"id": 0,
"title": "All"
}
],
"found": 15,
"total_results": 15,
"start_index": 0,
"page_size": 20,
"results": [
{
"type": "Event",
"subtype": "NonFixture",
"title": "Atlanta Hawks @ Charlotte Hornets",
"result_id": "36220988",
"start_date": "2026-10-23T23:10:00Z",
"sport_id": "7522",
"sport": "Basketball",
"competition_id": "10547864",
"competition": "NBA",
"event_category": 62,
"exchange_id": 7,
"ancestry": [
{
"id": "7522",
"name": "Basketball"
}
]
}
],
"fetched_at": "2026-10-23T17:39:59Z"
},
"msg": "OK"
}Request schema
No body schema
Response schema
#/definitions/fanduel.sportsbookSearchTabsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | fanduel.SportsbookSearchTabsResponse | No | ||||
| data.fetched_at | string | No | ||||
| data.found | integer | No | ||||
| data.next_start_index | integer | No | ||||
| data.page_size | integer | No | ||||
| data.pill | string | No | ||||
| data.pills | array | No | ||||
| data.pills[].id | integer | No | ||||
| data.pills[].title | string | No | ||||
| data.query | string | No | ||||
| data.results | array | No | ||||
| data.results[].ancestry | array | No | ||||
| data.results[].ancestry[].id | string | No | ||||
| data.results[].ancestry[].name | string | No | ||||
| data.results[].competition | string | No | ||||
| data.results[].competition_id | string | No | ||||
| data.results[].event_category | integer | No | ||||
| data.results[].exchange_id | integer | No | ||||
| data.results[].result_id | string | No | ||||
| data.results[].sport | string | No | ||||
| data.results[].sport_id | string | No | ||||
| data.results[].start_date | string | No | ||||
| data.results[].subtype | string | No | ||||
| data.results[].title | string | No | ||||
| data.results[].type | string | No | ||||
| data.start_index | integer | No | ||||
| data.state | string | No | ||||
| data.tab | string | No | ||||
| data.tabs | array | No | ||||
| data.tabs[].id | string | No | ||||
| data.tabs[].title | string | No | ||||
| data.total_results | 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/sportsbook/search/tabs?q=nba" \
-H "x-api-key: $CRAWLORA_API_KEY"