FanDuel API endpoint
Returns numberFire's fantasy projections for MLB, NBA, NFL, NHL and golf in the service's rank order: each row has the player, team, game, FanDuel DFS salary and value (daily projections), and the stat columns of the player kind (points, rebounds and assists for the NBA; passing, rushing and receiving for NFL skill players; kicker, defense and individual defensive player columns; skater, goalie, batter and pitcher columns; golf finish odds). `type` picks the table: `DAILY` (needs `slate_id`), `WEEKLY`, `YEARLY`, `REMAINING`, `PPR` or `SEASON_STATS`; not every sport has every type, and `position` and `scope` depend on the table, so read them from the projection-tables route. An unknown slate is refused instead of silently returning other projections. Weekly NBA and MLB tables are empty outside their weeks. A player id can appear more than once in a yearly table.
/fanduel/research/projectionsReturns numberFire's fantasy projections as published on FanDuel Research, in the service's rank order, one row per projected player line, with the DFS salary and value for daily slates and the stat columns of the player's kind.
sport (required): mlb, nba, nfl, nhl, golf.type (required): DAILY, WEEKLY, YEARLY, REMAINING, PPR, SEASON_STATS (case-insensitive). A sport only has some of them; the 400 names them. DAILY needs slate_id; the NFL season-long table is WEEKLY (there is no NFL YEARLY).position (optional): the position tab. Allowed values: batters, pitchers, c, 1b, 2b, 3b, ss, of, sp, rp (MLB); qb, rb, wr, te, flex, k, defense, idp (NFL); all, pg, sg, guards, sf, pf, forwards, centers (NBA); skaters, goalies, forwards, wingers, centers, d (NHL); all (golf). Which a table offers is listed by projection-tables; the default is the table's default tab (all, batters, skaters, qb, or rb for PPR), and a tab the table lacks returns 400.scope (optional): TOTAL or PER_GAME, for the NBA tables that take it (WEEKLY, YEARLY, REMAINING, SEASON_STATS); default TOTAL. Any other table returns 400.slate_id (optional): a slate id from projection-slates, required for DAILY. Golf defaults to its only slate. Other types return 400. The service answers an unknown id with someone else's projections, so an id that is not a slate of that sport and day returns 400.event_id (optional): a golf event id from projection-slates; golf only, defaults to the only current event, and an event that is not current returns 400.date, week, season (optional): the day (YYYY-MM-DD; mlb, nba, nhl) or NFL week and season of a slate_id that is not today's. DAILY only.page (optional): 1 to 10000; default 1. limit (optional): 1 to 200; default 50. total is the number of rows after the position tab is applied.DAILY row has salary (FanDuel DFS dollars) and value (projected points per $1,000), and game (home and away team and start time). Other tables send N/A for both, which is left out.stats holds the player kind's columns in snake_case, as numbers (or text such as the golf finish odds 58.68%); a column the service sends as null is left out. Kinds and columns: NBA minutes, field_goals_made, field_goals_attempted, three_points_made, three_points_attempted, free_throws_made, free_throws_attempted, assists, steals, blocks, turnovers, points, rebounds, games_played, field_goal_shooting_percentage, three_points_shooting_percentage, free_throw_shooting_percentage, fantasy, position_rank, overall_rank; NFL skill players completions_attempts, passing_yards, passing_touchdowns, interceptions_thrown, rushing_attempts, rushing_yards, rushing_touchdowns, receptions, targets, receiving_yards, receiving_touchdowns, fum, fum_lost, fum_td, sacks, tpc_r, tpc_p, tpc_v, forty_rush, fifty_rush, forty_pass, fifty_pass, forty_rec, fifty_rec, fantasy, position_rank, overall_rank, opponent_defensive_rank; NFL kickers extra-point and field-goal made, missed and attempted totals and by distance (field_goals_made_0_to_19, _20_to_29, _30_to_39, _40_to_49, _50_plus), fantasy, position_rank, opponent_defensive_rank; NFL defense and special teams points_allowed, yards_allowed, sacks, interceptions, fumbles_recovered, touchdowns, fantasy, position_rank, opponent_offensive_rank; NFL individual defenders tackles, sacks, interceptions, touchdowns, passes_defended, fumbles_recovered, opponent_offensive_rank; NHL skaters and goalies, MLB batters and pitchers, and golfers have their own columns (goals, assists, saves, save_percent, strikeouts, batting_average, made_cut, top_ten, birdies and others), each with fantasy.SG/PG, is in the tab's group (see matches in projection-tables).WEEKLY NBA and MLB tables are empty outside their weeks. The whole table is cached for five minutes, so paging does not refetch it.Projections are estimates published by FanDuel Research and shown as published at the time of the request; they are not a prediction guarantee or betting advice. 400 for an unsupported combination, 503 on upstream failure.
| Field | Filled in, of 40 checked |
|---|---|
| player | 40 |
| team | 40 |
| stats | 40 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| sport | string | Yes | Sport Allowed values: mlb, nba, nfl, nhl, golf. | nba | |
| type | string | Yes | Projection type Allowed values: DAILY, WEEKLY, YEARLY, REMAINING, PPR, SEASON_STATS. | SEASON_STATS | |
| position | string | No | Position tab of the table; default is the table's default tab. Allowed values: `batters`, `pitchers`, `c`, `1b`, `2b`, `3b`, `ss`, `of`, `sp`, `rp` (MLB); `qb`, `rb`, `wr`, `te`, `flex`, `k`, `defense`, `idp` (NFL); `all`, `pg`, `sg`, `guards`, `sf`, `pf`, `forwards`, `centers` (NBA); `skaters`, `goalies`, `forwards`, `wingers`, `centers`, `d` (NHL); `all` (golf). Which of them a table offers is listed by projection-tables Allowed values: batters, pitchers, c, 1b, 2b, 3b, ss, of, sp, rp, qb, rb, wr, te, flex, k, defense, all, pg, sg, guards, sf, pf, forwards, centers, skaters, goalies, wingers, d, idp. | ||
| scope | string | No | `TOTAL` or `PER_GAME`; only NBA WEEKLY, YEARLY, REMAINING and SEASON_STATS take it, default `TOTAL`; other tables return `400` Allowed values: TOTAL, PER_GAME. | ||
| slate_id | string | No | its only slate | Slate id from the projection-slates route; required for DAILY (golf defaults to its only slate); other types return `400` | |
| event_id | string | No | the only current event | Golf event id from the projection-slates route; golf only, defaults to the only current event | |
| date | string | No | Day of the slate as `YYYY-MM-DD` when `slate_id` is not from today; MLB, NBA and NHL DAILY only | ||
| week | integer | No | NFL week of the slate when `slate_id` is not from this week; NFL DAILY only Minimum: 1. Maximum: 30. | ||
| season | integer | No | NFL season of the slate; NFL DAILY only Minimum: 2000. Maximum: 2100. | ||
| page | integer | No | Page number, from 1; default 1, at most 10000 Minimum: 1. Maximum: 10000. | ||
| limit | integer | No | Rows 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/research/projections?sport=nba&type=SEASON_STATS&position=batters&scope=TOTAL&page=1&limit=10" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"data": {
"sport": "nba",
"type": "DAILY",
"table": "dfs-projections",
"table_name": "NBA Daily Fantasy Projections",
"position": "all",
"position_label": "All Positions",
"slate_id": "1049029",
"slate_name": "Main",
"total": 151,
"page": 1,
"limit": 1,
"rows": [
{
"player": {
"id": 2161,
"name": "C.J. McCollum",
"position": "SG/PG",
"page_url": "https://sportsbook.fanduel.com/teams/nba/roster/c-j-mccollum-2161"
},
"team": {
"id": 1,
"name": "Atlanta Hawks",
"abbreviation": "ATL"
},
"game": {
"home_team": {
"id": 35,
"name": "Charlotte Hornets",
"abbreviation": "CHA"
},
"away_team": {
"id": 1,
"name": "Atlanta Hawks",
"abbreviation": "ATL"
},
"game_time": "2026-10-23T23:00:00Z"
},
"salary": 5400,
"value": 5.57,
"stats": {
"minutes": 29,
"points": 18.5,
"rebounds": 3.3,
"assists": 3.7,
"three_points_made": 2.6,
"fantasy": 30.1
}
}
],
"fetched_at": "2026-10-24T05:20:00Z"
},
"msg": "OK"
}Request schema
No body schema
Response schema
#/definitions/fanduel.researchProjectionsResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | fanduel.ResearchProjectionsResponse | No | ||||
| data.event_id | string | No | ||||
| data.event_name | string | No | ||||
| data.fetched_at | string | No | ||||
| data.limit | integer | No | ||||
| data.page | integer | No | ||||
| data.position | string | No | ||||
| data.position_label | string | No | ||||
| data.rows | array | No | ||||
| data.rows[].game | fanduel.ResearchProjectionGame | No | ||||
| data.rows[].game.away_team | fanduel.ResearchProjectionTeam | No | ||||
| data.rows[].game.away_team.abbreviation | string | No | ||||
| data.rows[].game.away_team.id | integer | No | ||||
| data.rows[].game.away_team.image_url | string | No | ||||
| data.rows[].game.away_team.name | string | No | ||||
| data.rows[].game.game_time | string | No | ||||
| data.rows[].game.home_team | fanduel.ResearchProjectionTeam | No | ||||
| data.rows[].game.home_team.abbreviation | string | No | ||||
| data.rows[].game.home_team.id | integer | No | ||||
| data.rows[].game.home_team.image_url | string | No | ||||
| data.rows[].game.home_team.name | string | No | ||||
| data.rows[].player | fanduel.ResearchProjectionPlayer | No | ||||
| data.rows[].player.handedness | string | No | ||||
| data.rows[].player.id | integer | No | ||||
| data.rows[].player.image_url | string | No | ||||
| data.rows[].player.name | string | No | ||||
| data.rows[].player.page_url | string | No | ||||
| data.rows[].player.position | string | No | ||||
| data.rows[].salary | integer | No | Salary is the FanDuel DFS salary in dollars; Value is points per $1,000 of salary. | |||
| data.rows[].stats | object | No | ||||
| data.rows[].team | fanduel.ResearchProjectionTeam | No | ||||
| data.rows[].team.abbreviation | string | No | ||||
| data.rows[].team.id | integer | No | ||||
| data.rows[].team.image_url | string | No | ||||
| data.rows[].team.name | string | No | ||||
| data.rows[].value | number | No | ||||
| data.scope | string | No | ||||
| data.slate_id | string | No | ||||
| data.slate_name | string | No | ||||
| data.sport | string | No | ||||
| data.table | string | No | ||||
| data.table_name | string | No | ||||
| data.total | integer | No | ||||
| data.type | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/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/research/projections?sport=nba&type=SEASON_STATS&position=batters&scope=TOTAL&page=1&limit=10" \
-H "x-api-key: $CRAWLORA_API_KEY"