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.

Pixel-art basketball centered on a court diagram.

What a refresh costs today

Live
LeagueCurrent rowsRequests per refresh
CFB4,62124
NHL4,06321
NFL3,89820
NBA3,04316
UCL2,76614
SOCCER8315
NHL1P8145
TENNIS4693

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
  Headers

Formulas worth adding

QuestionColumnsFormula idea
How far has this line moved?line, opening_line=line - opening_line
How active is it?line_movesSort descending
Goblins onlymore_tierFILTER on "goblin"
Starting soonevent_starts_atSort 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.

Continue building

References