Google Sheet Monitor API - Track Row Changes on a Schedule avatar

Google Sheet Monitor API - Track Row Changes on a Schedule

Pricing

from $5.00 / 1,000 sheet rows

Go to Apify Store
Google Sheet Monitor API - Track Row Changes on a Schedule

Google Sheet Monitor API - Track Row Changes on a Schedule

Watch a Google Sheet and get told what moved. Every row comes back stamped added, updated, removed or unchanged against the previous run, so a schedule becomes a change feed for Slack, a webhook or another Actor. Unchanged rows are never billed, so an hourly cron stays affordable.

Pricing

from $5.00 / 1,000 sheet rows

Rating

0.0

(0)

Developer

Blackcube

Blackcube

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 days ago

Last modified

Share

Google Sheet Monitor API

Google Sheets Suite  •  5 Actors, one codebase, one row billed once
Google Sheets Scraper API
Sheet to JSON, No OAuth
Google Spreadsheet Scraper API
Spreadsheet to JSON
Google Sheets to JSON API
Sheet as a JSON Endpoint
Google Sheet Monitor API
➤ You are here
Private Google Sheets Reader API
Service Account Access

More from this account: YouTube Transcript Suite · Website Contact & Email Suite · Career Site & ATS Jobs Suite · Google News Suite · Keyword Research Suite · Shopify Store Intelligence Suite · eBay Data Suite · Amazon Reviews Suite · Reddit · Meta Ad Library · Vinted · Trustpilot Review Intelligence Suite · App Store & Google Play Reviews Suite · Etsy Research Suite · YouTube Comments Intelligence Suite · Telegram Channel Intelligence Suite · Business Reviews Suite · Google Trends Suite · Amazon Product Data Suite · Polymarket Order Book · Nordic Marketplaces Suite · TikTok Suite · Snapchat Suite · LinkedIn Public Data Suite · Instagram Suite · Contact Validation Suite · Google Maps Suite · X / Twitter

The Google Sheets suite

Watch a Google Sheet and get told what moved. Every row comes back stamped against the previous run, so a schedule turns a living spreadsheet into a change feed.

Quick start

  1. Open the sheet → Share → General access → Anyone with the link → Viewer.

  2. Click Copy link.

  3. Paste it into the Sheet URL input and press Start.

  4. Leave Monitor for changes on and attach a Schedule (hourly, daily — whatever suits).

The first run delivers the sheet as added and remembers exactly the rows it delivered. Every run after that reports only what actually moved.

What you get back

changeStatusMeaningBilled
addeda row not delivered beforeyes
updateda row whose cells changedyes
removeda row (or a whole tab) that is gone — the notice carries its last known contentsno
unchangednothing movedno

Turn Return only changes on to receive nothing but the movements — the unchanged rows are still counted for you in the free coverage row.

A sheet bigger than Maximum rows

A first run stops at Maximum rows (1,000 by default) and remembers only the rows it delivered. The rest are not marked as seen: each later run delivers the next rows as added, each billed once, until the whole sheet has arrived; from then on only real changes are billed. To get a large sheet in one go, raise Maximum rows for that first run (one budget, shared by all the sheets in the run) and keep Cost ceiling (USD) above what those rows cost on your plan, or the ceiling stops the run first. The same holds when more rows change than one run may deliver: the rest arrive on the next run, never lost and never billed twice. When the row budget runs out before a sheet's first change, that sheet is not charged its sheet sync for the run; its changes wait for a later one.

Each tab is remembered on its own, up to 50,000 rows, so a sheet you stop monitoring never crowds out the ones you still do. In a longer tab every row is still delivered once; after that its top rows are let go first and are no longer watched for edits, while new rows keep arriving; a row that was let go is never delivered, or billed, again. A filtered (query) result is remembered up to 50,000 rows too: a new result row past that is not delivered or billed, and a sheet that delivers nothing because of it is not charged its sheet sync. The free coverage row says what was held back.

A run that reaches its timeout stops in time to remember what it delivered, and so does a graceful abort, so the next run carries on from there without billing anything twice.

What people use it for

  • Alerting. Wire the dataset to Slack, e-mail or a webhook and hear about it when someone edits the sheet.
  • Approval and intake queues. A new row in a request sheet starts the rest of the workflow.
  • Price and inventory sheets a supplier keeps updating.
  • Audit trails. Keep the record of what changed and when, which the spreadsheet itself does not give you in a usable form.
  • Watching several sheets at once — put the extra links in More sheet URLs.

Why an hourly schedule is affordable here

Rows that did not change are never billed. A 500-row sheet checked every hour, with ten edited rows a day, costs $0.41 a day on the Gold plan (24 sheet syncs and ten rows) instead of $60.00 for re-reading 12,000 rows. That is the difference between a schedule you keep and a bill you cancel.

What a row looks like

{
"type": "row",
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"spreadsheetTitle": "Example Spreadsheet",
"sheetName": "Class Data",
"gid": 0,
"rowNumber": 2,
"changeStatus": null,
"cells": {
"Student Name": "Alexandra",
"Gender": "Female",
"Class Level": "4. Senior",
"Home State": "CA",
"Major": "English",
"Extracurricular Activity": "Drama Club"
},
"scrapedAt": "2026-09-01T00:00:00.000Z"
}

Every cell is keyed by its column header. With Typed values on (the default) numbers arrive as numbers, booleans as booleans and date cells as ISO-8601 strings, so the data is ready for a database load, a JSON pipeline or an LLM prompt without a cleaning pass. Turn it off and every value is exactly the text the sheet displays. Duplicate headers are de-duplicated (Tags, Tags_2), a headerless sheet names its columns with the sheet's own letters (A, B, …), and the invisible trailing columns Google pads every sheet with are dropped.

Alongside the data rows every run returns free rows you are never billed for: a coverage row per sheet (tabs requested, read and errored; rows read, delivered, unchanged and removed; whether the run was complete) and one summary row with the exact spend.

What it costs

You pay forFree planGold plan
Each row delivered$10.00 per 1,000 rows$5.00 per 1,000 rows
Each row from a private sheet (service account)$20.00 per 1,000 rows$10.00 per 1,000 rows
Each spreadsheet successfully read$0.03$0.015

Bronze and Silver plans pay between the two columns, Platinum and Diamond the Gold price or less.

Free, always: a sheet that could not be read, a tab that failed, error rows, coverage rows, removed-row notices, the metadata row, the run summary — and on a monitoring schedule, every row that did not change. A run that reads nothing costs nothing.

Set Cost ceiling (USD) to stop any run before it passes a number you choose; the free summary row reports what the run actually spent.

Use it from n8n, MCP, the API or a schedule

Built to be called by a workflow, not only from the Store form. The Actor is vonsensey/google-sheet-monitor-change-tracker-scraper-api; every snippet below sends {}, which runs the defaults shown on the form — replace it with your own input.

n8n

Install the Apify community node (@apify/n8n-nodes-apify under Settings → Community Nodes, or search "Apify" on n8n Cloud). Add Apify → Run Actor with Actor vonsensey/google-sheet-monitor-change-tracker-scraper-api and your input JSON, then Apify → Get Dataset Items on the run's defaultDatasetId and pipe the rows anywhere. For scheduled runs, the On new Apify Event trigger fires when a run of this Actor finishes.

MCP (Claude, Cursor, VS Code, any MCP client)

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=vonsensey/google-sheet-monitor-change-tracker-scraper-api",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}

Your agent then calls vonsensey/google-sheet-monitor-change-tracker-scraper-api as a tool with the same input the form takes and reads the dataset back.

REST API (one call, rows in the response)

curl -X POST "https://api.apify.com/v2/acts/vonsensey~google-sheet-monitor-change-tracker-scraper-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" -d '{}'

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vonsensey/google-sheet-monitor-change-tracker-scraper-api").call(run_input={})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('vonsensey/google-sheet-monitor-change-tracker-scraper-api').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Make, Zapier, LangChain, CrewAI

The Apify app in Make and Zapier has a Run an Actor module: pick vonsensey/google-sheet-monitor-change-tracker-scraper-api. In LangChain and CrewAI the Apify tool wrappers take the same Actor id. A daily schedule needs nothing but the Console: Schedules → Create → this Actor → cron, and the dataset fills on its own.

Run it without configuring anything — Watch a Google Sheet and return only the rows that changed, a ready-made example you can start as-is or copy.

Use cases

  • Feed a pipeline from a spreadsheet. Keyword lists, URL lists, ASINs, account lists — the team maintains them in Sheets, and this turns that sheet into typed input for the rest of the run.
  • Sheets as an API. Point an app or an agent at a dataset that is always the current contents of a spreadsheet somebody in operations keeps up to date — numbers as numbers, booleans as booleans, dates as ISO-8601, every cell keyed by its column header.
  • Watch a living sheet. Put it on a schedule with monitor on and get a change feed: every row stamped added, updated, removed or unchanged against the previous run.
  • Consolidate client sheets. Twelve customers each with their own spreadsheet, one run, one schema, and every row stamped with the spreadsheet id, tab name and gid it came from.
  • Read the sheets that are not link-shared. Internal sheets, client data and finance tabs come through your own Google service account — share the sheet with its address once, paste the JSON key, and you get the same typed rows and the same monitoring.

Run it on a schedule

A one-off pull answers a question; a schedule answers it every day without you. Open Schedules in the Apify Console, point a cron at this Actor, and the dataset keeps filling on its own — no server, no cron box, no babysitting. Everything here is built to be re-run: you are billed per row delivered, and the FAQ below says exactly what a scheduled run that finds nothing new costs.

FAQ

Do I need a Google account, OAuth or a Drive prompt?

No. A link-shared sheet is read from its URL alone — no sign-in, no OAuth screen, no Drive authorization. A sheet that is not link-shared needs your own service-account key, which you paste into the run as a secret input.

Copying a share link does not share the sheet. While sharing is Restricted, Google answers every public request with a sign-in page. Fix it with Share → General access → Anyone with the link → Viewer, or use the service-account route instead. There is no third option — Google enforces this.

Can I filter before I pay for rows?

Yes. Put a SQL-like statement in query — select A, C where C contains 'traffic' order by A limit 50 — and Google applies it before anything is sent, so filtered-out rows are never delivered and never billed. Column letters are the sheet's own. In query mode rowNumber comes back null, because a filtered result's true position in the sheet is unknowable and this Actor returns null rather than inventing a number.

Will a schedule re-charge me for data I already have?

No. With monitor on, only rows that are new or whose cells actually changed are billed; unchanged and removed rows are delivered free. A quiet sheet still costs its one sheet sync — that is the charge for the sheet being watched, and it is what keeps an hourly cron affordable rather than free.

Can I read every tab, and several spreadsheets, in one run?

Yes to both. Leave Tabs empty and every tab comes back in one schema, each row carrying its sheetName and gid; name tabs or gid numbers to narrow it. Put extra spreadsheets in urls and one run covers all of them — one sheet reached twice in the same run is still one sync.

Do I need a proxy?

No. Everything is handled for you and there is nothing to buy on top.


Something wrong, or a field you need that is missing? Open an issue on the Issues tab — it is read and it gets fixed. If this saved you time, a rating on the Store page helps the next person find it.