Home › Guides › How to get Polymarket odds in Google Sheets
Updated September 25, 2026 · facts checked against the dated sources listed below
For this site's CSV files one formula is enough: IMPORTDATA with the file's address. Live odds are published as JSON, which IMPORTDATA does not parse, so paste a short Apps Script that fetches the file and writes the rows into a sheet, then run it on a timer. The data is free under CC BY 4.0 if you credit the source with a link.
Google's IMPORTDATA function imports a CSV or TSV file from a web address, given in quotation marks or as a reference to a cell that holds it, such as =IMPORTDATA(A1). This site publishes five CSV files, listed on the data page: resolved markets with their prices 30, 7 and 1 days before the close, resolution times and disputes, Bitcoin and Ethereum daily strikes, Polymarket and Kalshi price gaps, and the 100 biggest markets of all time.
The first time a spreadsheet uses an import function, Google shows a banner saying it can send and receive data from outside parties, and an editor has to click Allow access before the import runs. Then type one formula into cell A1 of an empty sheet, so the table has room to fill the cells below and to the right:
=IMPORTDATA("https://polymarkettrader.com/api/v1/accuracy.csv")
=IMPORTDATA("https://polymarkettrader.com/api/v1/resolution-time.csv")
=IMPORTDATA("https://polymarkettrader.com/api/v1/crypto-accuracy.csv")
=IMPORTDATA("https://polymarkettrader.com/api/v1/polymarket-kalshi-gaps.csv")
=IMPORTDATA("https://polymarkettrader.com/api/v1/biggest-markets.csv")See also: Free Polymarket data
Each file starts with a header row. The accuracy file, for example, has event_slug, event, category, outcome, first_outcome, question, closed, price_30d_before_close, price_7d_before_close, price_1d_before_close, first_outcome_won (1 or 0) and volume, so a column of prices can be set against a column of results. Prices run from 0 to 1; format them as percentages to read them as probabilities.
See also: How accurate is Polymarket?
The live endpoints, such as /api/v1/odds/index.json with every tracked market, are JSON. In the spreadsheet, open Extensions, then Apps Script, and paste the function below. It fetches the file with UrlFetchApp, parses it with JSON.parse and writes one row per market into a tab named Polymarket odds, with the credit line the file asks for underneath.
Run it once from the editor. Google shows an authorization dialog the first time, because fetching an outside address needs permission to connect to an external service; after that the tab fills with each market, its leading outcome, probability, 24-hour volume, end date and link.
function refreshPolymarketOdds() {
var url = 'https://polymarkettrader.com/api/v1/odds/index.json';
var data = JSON.parse(UrlFetchApp.fetch(url).getContentText());
var rows = [['Market', 'Leading outcome', 'Probability', '24h volume', 'Ends', 'Link']];
data.markets.forEach(function (m) {
rows.push([m.title, m.leader, m.probability, m.volume_24h, m.end_date || '', m.url]);
});
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Polymarket odds') || ss.insertSheet('Polymarket odds');
sheet.clearContents();
sheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
sheet.getRange(rows.length + 2, 1).setValue(
data.attribution.text + ' ' + data.attribution.url + ' (CC BY 4.0), updated ' + data.updated);
}See also: Free odds API and endpoints
Google says IMPORTDATA checks for updates every hour while the spreadsheet is open. Reopening or refreshing the spreadsheet does not force an update, but deleting and re-entering the formula does, and import functions cannot refer to NOW or RAND, so a timestamp trick will not refresh them.
For the script, add a time-driven trigger: in the Apps Script editor click Triggers, then Add Trigger, and choose refreshPolymarketOdds with a time-driven source, or run the short function below once. Google may shift the exact run time within the hour. A custom function typed into a cell is no substitute: it only recalculates when you edit it or a cell it reads changes, and it must finish within 30 seconds.
There is no need to poll often, since our live JSON files are refreshed twice a day and the research CSVs weekly. Google's limits for consumer accounts are 20,000 URL fetch calls a day, 90 minutes of total trigger run time a day and 6 minutes per run, and heavy use of import functions across the spreadsheets you created brings a warning that data is loading slowly.
function addTrigger() {
ScriptApp.newTrigger('refreshPolymarketOdds').timeBased().everyHours(6).create();
}
Everything on our data and developer pages is under CC BY 4.0. The license asks you to give appropriate credit, link to the license and say if you changed the data, and our data page asks you to credit Polymarket View with a link to the page you used. Each JSON file carries an attribution object with ready-made text and a link, which the script above writes under the table.
Keep the date next to the numbers, because prices move, and note that Polymarket's own website and API have their own terms.
See also: Free Polymarket data · How to cite Polymarket odds
Google documents IMPORTDATA for CSV and TSV files. For this site's JSON endpoints, use a short Apps Script with UrlFetchApp, as shown above.
Google says it checks for updates every hour while the spreadsheet is open. Re-entering the formula forces a refresh; reopening the file does not.
No. The files are static and need no key or sign-up; credit Polymarket View with a link.
Google limits how much traffic import functions can create across the open spreadsheets you created, so remove imports you no longer need or move large ones to a scheduled script.
Polymarket View is independent and not affiliated with Polymarket. Educational information, not financial advice. All guides · How market types work · Glossary · Polymarket odds today