pnclFEED Free key

Quickstart notes

List recent drops in Google Sheets without the stream

The drops endpoint answers on a plain GET, so a Sheet on a 15-minute trigger can log every recent move, no always-on process needed.

The drop stream needs a plan that pushes alerts, but the drops endpoint does not: it answers the same detection on a plain GET, which means a Google Sheet can list recent drops on a schedule with the tooling you already have. Fifteen minutes of Apps Script and the sheet reads like a moves feed.

The endpoint is a GET, nothing held open

The drops endpoint returns the moves the feed detected in the last few minutes as plain JSON, as the curl quickstart documents it, checked 2026-11-04. Three parameters shape the answer: mode picks live or prematch, min_drop_pct the size of the move, and max_age_sec the window. No stream, no reconnect loop, no always-on process.

That shape is exactly what a spreadsheet trigger can run. A function on a 15-minute timer asks for the last 15 minutes and appends what it finds.

The Apps Script version

Same UrlFetchApp call the Sheets quickstart uses, different endpoint:

function fetchDrops() {
  const PROPS = PropertiesService.getScriptProperties();
  const BASE = PROPS.getProperty('BASE');
  const KEY = PROPS.getProperty('KEY');
  const url = BASE + '/api/drops?mode=prematch&min_drop_pct=5&max_age_sec=900';
  const res = UrlFetchApp.fetch(url, {
    headers: { 'x-portal-apikey': KEY },
    muteHttpExceptions: true,
  });
  if (res.getResponseCode() !== 200) {
    console.warn(res.getContentText());
    return;
  }
  const drops = JSON.parse(res.getContentText()).drops || [];
  if (!drops.length) return;
  const sheet = SpreadsheetApp.getActive().getSheetByName('Drops')
    || SpreadsheetApp.getActive().insertSheet('Drops');
  const rows = drops.map((d) =>
    [new Date(), d.sport_name, d.market, d.side, d.from, d.to, d.drop_pct]);
  sheet.getRange(sheet.getLastRow() + 1, 1, rows.length, 7).setValues(rows);
}

Point a 15-minute time trigger at it, as the Sheets quickstart sets its own trigger, checked 2026-11-04. One call per run is 96 calls a day, inside the free key's daily budget.

Read the fields the endpoint's way

The endpoint's field names differ from the stream's: from and to instead of from_price and to_price, market and side instead of sect and outcome. The percentage comes ready as drop_pct, so the sheet needs no arithmetic. If you ever mix endpoint rows with stream alerts in one log, map the names once, deliberately, or the same move will read as two different objects.

What the sheet is good for

A Drops tab is a review tool: yesterday's moves, sorted by size, with the fair price beside them if you add nvp to the row. It is the calm version of a chat channel, better for learning what your sports actually do all day.

What it is not is fast. A 15-minute sheet sees a 15-minute-old move. When you need the move as it happens, that is the stream's job; the sheet is for the record.

The trigger, then the habit

The last step is the same discipline the other quickstarts use: the trigger runs whether you watch or not, so check the tab on a morning schedule and let the rows accumulate. A week of logged drops teaches you your sports' real move rate, which is the number every threshold decision later will lean on.