Live PrizePicks lines in a spreadsheet.
The export endpoint returns the board as CSV, one page at a time, with the opening line and move count beside each line. Two short scripts bring it into Google Sheets or Excel, and refresh it when you ask.

What a refresh costs today
Live| League | Current rows | Requests per refresh |
|---|---|---|
| CFB | 4,621 | 24 |
| NHL | 4,063 | 21 |
| NFL | 3,898 | 20 |
| NBA | 3,043 | 16 |
| UCL | 2,766 | 14 |
| SOCCER | 831 | 5 |
| NHL1P | 814 | 5 |
| TENNIS | 469 | 3 |
At 200 rows per request. The Free plan includes 100–500 credits a month. Board observed Nov 3, 23:24 UTC.
Google Sheets with Apps Script
Open Extensions, then Apps Script, and paste this in. Save your key under Project settings, Script properties, as PRIZEPICKS_API_KEY, so it never sits in the sheet. Run loadBoard once and approve the permission prompt.
function loadBoard() {
var league = "NBA";
var key = PropertiesService.getScriptProperties().getProperty("PRIZEPICKS_API_KEY");
var rows = [], cursor = "";
do {
var url = "https://prizepicksapi.com/api/v1/export?limit=200&league=" + encodeURIComponent(league) +
(cursor ? "&cursor=" + encodeURIComponent(cursor) : "");
var res = UrlFetchApp.fetch(url, { headers: { Authorization: "Bearer " + key } });
var page = Utilities.parseCsv(res.getContentText());
rows = rows.concat(rows.length ? page.slice(1) : page);
cursor = res.getHeaders()["x-next-cursor"] || res.getHeaders()["X-Next-Cursor"] || "";
if (cursor) Utilities.sleep(1100);
} while (cursor);
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName(league) || ss.insertSheet(league);
sheet.clearContents();
sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
}To refresh on a schedule, open Triggers in Apps Script and add a time-driven trigger for loadBoard. Refresh before the games you care about, rather than every few minutes, to keep your request count down.
Excel with Power Query
Open Data, Get Data, From Other Sources, Blank Query, then Advanced Editor, and paste this. It reads the first page, up to 200 rows. Choose Anonymous when Excel asks about credentials, since the query sends the key in its own header. Keep the workbook private, because the key is stored in it.
let
Key = "YOUR_API_KEY",
Source = Csv.Document(
Web.Contents("https://prizepicksapi.com/api/v1/export",
[Query = [league = "NBA", limit = "200"],
Headers = [Authorization = "Bearer " & Key]]),
[Delimiter = ",", Encoding = 65001, QuoteStyle = QuoteStyle.Csv]),
Headers = Table.PromoteHeaders(Source, [PromoteAllScalars = true])
in
HeadersFormulas worth adding
| Question | Columns | Formula idea |
|---|---|---|
| How far has this line moved? | line, opening_line | =line - opening_line |
| How active is it? | line_moves | Sort descending |
| Goblins only | more_tier | FILTER on "goblin" |
| Starting soon | event_starts_at | Sort ascending, times are UTC |
Empty cells mean a value is unknown, not zero or false. Keep that in mind when a formula treats blanks as 0. Lines change often, so show observed_at beside any number you act on.
Try it without a key
The demo export needs no key and returns fictional players with the same columns, so you can build a layout first. In Google Sheets, this formula works as is:
=IMPORTDATA("https://prizepicksapi.com/api/v1/demo/export?league=NBA&limit=5")Try it
Endpoint docs:GET /api/v1/exportDemo endpointsPlans and limits
Frequently asked questions
Can I get PrizePicks lines in Google Sheets?
Yes. The Apps Script on this page reads the export endpoint with your key and writes the rows to a tab. Add a time-driven trigger to refresh it on a schedule.
Can I use IMPORTDATA for PrizePicks lines?
Not with the live board. IMPORTDATA cannot send an Authorization header, so it only works on the keyless demo export, which holds fictional players. Use the Apps Script for real lines.
How many requests does a PrizePicks spreadsheet use?
One request per 200 rows per refresh. The table on this page shows the current page count for each league, which you can multiply by how often you refresh.