Frequently asked questions
Short answers about the data, plans, billing, your license, DFS history and NFL projections.
Start here
What is stat-api?
A sports data API. One API key reaches NFL, NBA, MLB, NHL and PGA golf data: games, play-by-play, player and team stats, stadium weather, betting odds, and DraftKings and FanDuel daily fantasy data. The data is normalized, cleaned and connected across sports, so one request style works everywhere.
What data can I get?
Every sport has games, teams, players, box scores, play-by-play, stadium weather and betting odds history. Some sports go deeper: possession-level NBA play-by-play, pitch-by-pitch MLB Statcast, ShotLink and TrackMan golf shots, and NFL Next Gen Stats. For daily fantasy: DraftKings and FanDuel slates, player pools with salaries, contests with final standings and lineups, and our own NFL projections.
See the data coverage →How do I start?
Create a free account and an API key. A free key returns up to 5 records from each list, so you can test every table. In the docs, the shared key trial_demo runs the example request of each endpoint. Send your key as a Bearer token to https://api.stat-api.com/api/v1/{league}/{table}, or use GraphQL, the client SDKs or the MCP server.
Which plan do I need?
Starter ($49 a month, 5 million records) opens every table that is not DFS: stats, play-by-play, odds history, weather and injuries for every sport. On Starter, every record counts. Pro ($99 a month) adds the DFS tables: player pools with salaries, projections, contest standings and contest downloads. On Pro, contest lineups, slates and slate players count, 1 record per row, up to 20 million records a month. Other requests cost no records. A Free or Starter key gets the 5-lineup preview of a contest download. Each plan is for one person.
Compare the plans →Most asked
The questions that customers send us most often.
How is a contest download counted?
In CSV, one entry is one line and one record. The players of the lineup are columns on that line, not separate records. A contest with 100,000 entries of nine players each costs 100,000 records, not 900,000. An entry with no lineup still has its line and counts as 1. enrich=dfs.player_stats adds no records. The JSON format also returns the player pool, so it costs one record per entry plus one per pool row (a Showdown player has a captain row and a FLEX row).
Does Pro include the full historical archive?
Yes. Pro has no date or season limit: every DFS slate, contest download and projection we hold is open to a Pro key. Contest lineups, slates and slate players count against a monthly quota of 20 million records. Other requests cost no records. When the quota runs out, every request returns HTTP 429 until the reset. DraftKings contests with lineups start in 2021.
Is there a rate limit beyond the monthly quota?
Yes: 600 requests per minute for each API key. A request over the limit returns HTTP 429 with a Retry-After header that gives the number of seconds to wait. A rate-limited request costs no records.
If I cancel, do I keep access until the end of the period I paid for?
Yes. A cancellation takes effect at the end of the billing period you paid for. Your plan and its quota stay active until then, and your account then returns to Free. Cancel from the billing portal in your account settings.
Can I keep the data I download, including contest data?
Yes, for your own personal use. You may download and store any data that your plan opens, including all contest data, and keep it after your plan ends. It stays personal: you may not publish it in any shape or form. To distribute it, you need a commercial license, our Enterprise License.
Read the license terms →What does a projection of 0 mean?
The player has no expected role: inactive, on injured reserve, on the practice squad, or deep on the depth chart. DST and K always carry a projection. The computed block of each projections response counts the slate's eligible, projected and missing players.
Are the captain and FLEX separate rows on Showdown slates?
Yes. On Showdown and single-game slates, the captain (DraftKings CPT, FanDuel MVP) and the FLEX entry of a player are separate rows. Each row has its own salary, projection and projected ownership. The captain row's projection is 1.5 times the FLEX row's. On DraftKings, the CPT row has its own upload ID, operator_player_export_id: use it for the captain slot in your CSV upload.
Records & billing
What counts as a record?
A record is one row of data that the API returns. On Starter, every record counts, up to 5 million a month. On Pro, three kinds of data count, 1 record per row, up to 20 million records a month: contest lineups (the contest download, the contest lineups and a user's lineups), slates and slate players. Every other Pro request costs no records.
How are slates and slate players counted?
One row is one record. A page of 100 slates costs 100 records. A page of 100 slate players costs 100 records. The other routes of a slate, such as projections, odds, weather, injuries and news, cost no records. The same rows count when you read them through GraphQL or the MCP server.
How is a CSV download counted?
Each line of the CSV is one record. A line is never split into more records, even when it holds many columns. The header line is free.
How do I see how much quota I used?
Every paid response carries the headers X-Quota-Limit, X-Quota-Used and X-Quota-Remaining. Your account page shows your usage for the month.
What happens when I reach my monthly quota?
Requests return HTTP 429 with the error quota_exhausted and your reset time (resets_at). The quota resets at 00:00 UTC on the 1st of each month, or at once when you upgrade. We never bill an overage.
What can I see without a paid plan?
A free API key returns up to 5 records from each list. A capped answer carries a _metadata block with required_tier, message and total_actual_records (the number of rows that a paid plan gets). The lists of DFS slates and contests are open in full. The full standings of the flagship contests are free for everyone: each week's DraftKings Millionaire and FanDuel Sunday Million, and the biggest DraftKings pre-game Showdown of each Thursday and Monday night game. Contest lineup downloads need Pro.
Do you give refunds?
Fees already paid are non-refundable, except where the law requires a refund. Because a cancellation runs to the end of the paid period, you keep the access you paid for.
How do upgrades and downgrades work?
Change your plan at any time from the billing portal in your account settings. Stripe prorates the difference. Your new quota applies as soon as the change completes, usually within seconds.
Your license
Can I build my own models on the data?
Yes, including machine-learning models, for your own use. Free, Starter and Pro are licensed to one person for private research, sports analytics and personal modeling.
Read the terms →Can I publish the data, or charts and tables made from it?
No. Free, Starter and Pro are for personal use only. You may not publish the data in any shape or form: not as a file, a table, a chart, a screenshot, a post, a website or an app.
Can my team, my customers or the public use the data?
Not on Free, Starter or Pro. Any other person who uses the data, or anything you build on it, is a user, paid or free, teammate or stranger. To give users access or to distribute the data, you need a commercial license, our Enterprise License. Under it, users may see only your derivative work, such as projections or analysis, never the data itself. No plan permits reselling or redistributing the data as a feed, API, export or database.
Ask about Enterprise →Historical DFS data
Which DFS sites do you cover?
DraftKings and FanDuel. Slates and player pools with salaries cover NFL, NBA, MLB, NHL and golf. Contests with final standings and submitted lineups cover NFL, NBA, MLB and NHL.
How do I find the contests that have lineups?
Call GET /api/v1/dfs/contests?has_lineups=true with a slate or date filter. It lists every contest whose standings and lineups you can download. A contest's lineups_status says the same: available means the lineups are stored, pending means they are still loading.
Where do I find actual ownership?
In the contest download. Each lineup cell carries the player's ownership in that contest's field. In a Showdown or single-game contest, the captain (DraftKings CPT, FanDuel MVP) and FLEX ownership are separate values, so each cell shows the ownership for its own slot.
Can I see values as they stood before kickoff?
Yes, for NFL. Injury status, game rosters and DFS player-pool values default to mode=pre: each value as it stood at its game's kickoff. mode=full adds every change up to the end of that NFL week.
FanDuel contests
Are FanDuel contest downloads complete?
Yes. We load each FanDuel contest from FanDuel's own export of the full field: every entry with its rank, score and payout, and every submitted lineup, at any field size. A 600,000-entry field loads in full.
What is sample_weight?
The number of entries that a download row stands for. In a complete contest, every row has weight 1.
Why do some rows have no players?
The entrant never submitted a lineup. FanDuel lists those entries last with no score, and so do we.
Do the slot points add up to the entry score?
Yes. The slot points are FanDuel's own per-player scores for that contest, with the MVP multiplier (1.5x) in single-game contests. The points of a lineup's slots add up to its FanDuel score.
Which ownership numbers should I use?
The ownership in each lineup cell: the player's share of the contest's field in that slot. In a complete contest, the share comes from every lineup of the field.
When is a FanDuel contest available?
After the contest settles and FanDuel publishes its final standings. Until then, the contest's lineups_status is not available.
NFL projections
Which engine made the projections I receive?
The projections response carries a _metadata block. engine_version names the engine that made the rows, and served_source names the source. The default source, STAT_API_LATEST, always points to the newest stat-api engine. When the newest engine has no rows for a slate, the response falls back to the previous engine and says so with fallback: true. The fields do not change between engines.
When do projections change?
We publish new values when a player's injury or active status changes and when our market inputs (lines and player props) change. Each row's last_update_time gives the time of its last change.
Which endpoints give a slate's projections and player pool?
GET /api/v1/dfs/slates/{slate_id}/projections?format=flat for the projections, and GET /api/v1/dfs/slate_players?slate_id={slate_id} for the pool with salaries. Use the internal slate_id from GET /api/v1/dfs/slates, not the operator's draft group ID.
Still have a question? Send us the endpoint, the slate or contest ID, and the time (UTC). We reply by email, usually within one business day. Contact support →