An alternative to an Apps Script Web App
Publishing a sheet as JSON via Apps Script is the classic free hack. It works — right up until it is quietly load-bearing and nobody remembers how it was deployed.
Last updated
Key facts
- Apps Script caps a script at 6 minutes per execution (30 seconds for a custom function) and 30 simultaneous executions per user. source
-
Apps Script allows 20,000
UrlFetchcalls per day on a consumer account (100,000 on Workspace), and trigger runtime is capped at 90 minutes a day. source -
Those Apps Script limits sit on top of the Sheets API's own per-minute quotas — and a
doGet()web app has no caching layer, so every caller is a cold execution. source - A cached endpoint reads the sheet once per TTL, not once per request — so 10,000 visitors become one upstream read, and Google's quota stops being your problem.
Why replace an Apps Script Web App?
Because it becomes infrastructure without ever being treated like it. A doGet() that returns ContentService JSON is fifteen lines and free, and for a weekend project that is exactly right.
The trouble starts when it matters. Apps Script has its own execution quotas, cold starts that show up as multi-second latency, no real caching layer, no typed output, and a deployment model — versioned web-app URLs, "execute as", "who has access" — that is remarkably easy to get subtly wrong.
What tends to break
- Latency. Cold starts are unpredictable and slow, and you cannot cache in front of them without building that yourself.
- Quotas. Apps Script enforces its own daily execution limits, separate from the Sheets API quota.
- Types. You get whatever the script serialises — usually strings — so every consumer re-parses numbers and dates.
- Deployment. A new version means a new deployment, and it is easy to leave callers pointed at an old URL.
- Silent schema drift. Someone renames a column, the script keeps returning 200, and downstream code breaks quietly.
The hosted alternative
PasteSheet replaces the script with a connected endpoint: cached responses with a TTL you choose, AI-inferred column types, filtering and sorting as query parameters, and an MCP server for AI agents on the same URL. It also watches the sheet's schema and alerts you when a column changes — the failure Apps Script never tells you about.
If your script is doing something genuinely custom — bespoke transforms, writes, calling other Google services — keep it. This is for the very common case where the script exists solely to hand out rows as JSON — which is what using Google Sheets as a REST API covers end to end.
What it costs
MCP is included on the Free plan. Connect any public endpoint over MCP with no Google Cloud project and no credit card. Private endpoints and the account-wide workspace server need a paid plan (from Starter ($9/mo)) for the keys and OAuth they authenticate with.
Pro adds full-text search and aggregation (count, sum, avg, group_by) that your AI agent can call through query_rows.
Starter
For indie makers shipping a real app.
- Endpoints
- 10
- Requests / mo
- 50,000
- Row cap
- 5,000
- Custom cache TTL
- Schema-drift alerts
- MCP for AI agents
Frequently asked questions
Is Apps Script bad for serving a JSON API?
Not bad, but not built for it. It works well for small internal jobs. It struggles once the endpoint is load-bearing: cold-start latency, its own execution quotas, no caching layer, and untyped output.
Can I keep my Apps Script for writes?
Yes, and that is often the right split. Keep the script for anything that writes or does custom work, and move the read path to a cached endpoint that your app and your AI agents can hit hard.
What about Apps Script quotas?
Apps Script enforces its own daily execution limits, on top of the Sheets API's per-minute quotas. A cached endpoint sidesteps both, because the sheet is read once per cache window regardless of traffic.
Do I still need a Google Cloud project?
No. PasteSheet reads a shared sheet through its link, so there is no Cloud project, OAuth consent screen, or service account — and nothing to redeploy when the data changes.
Sources
- Quotas for Google Services (Apps Script) — Google
- Usage limits — Google Sheets API — Google
- Web Apps — Apps Script — Google
Related guides
Google Sheets API Without an API Key
Read a Google Sheet as JSON with no API key, no OAuth client, and no service account. What is possible keyless, and where the trade-offs actually are.
How to Cache a Google Sheets JSON API
Should you cache a Google Sheets JSON API? How edge caching keeps reads fast, avoids Google's rate limits, and serves your app from a CDN-like layer.
SheetDB Alternative: REST API + Free MCP
SheetDB turns a Google Sheet into a REST API. PasteSheet does that too — plus a read-only MCP server for AI agents, with MCP included on the free plan.
Turn Google Sheets Into a REST API (No Code)
Turn a public or restricted Google Sheet into a live JSON REST API with filtering, sorting, and pagination — no backend, no code.
Turn your sheet into an API in minutes
Paste a Google Sheet URL and get a live REST API and MCP server — no backend, no code, free to start.