// google sheets → rest api
Your spreadsheet,
now an endpoint.
Connect a Google Sheet, get a REST endpoint. Read and write rows over HTTP — no OAuth, no Google client library, no cell-range parsing.
Free plan included · no credit card · 1,000 rows per sheet
~/ sheetson · zsh$ curl https://api.sheetson.com/v2/sheets/users \ -H "Authorization: Bearer $SHEETSON_KEY" \ -H "X-Spreadsheet-Id: 1AbCdEfGhIjKlMnOpQrStUvWxYz"
source · users
| id | name | role |
|---|---|---|
| 1 | Ada Lovelace | Engineer |
| 2 | Grace Hopper | Admiral |
| 3 | Linus Torvalds | Maintainer |
response
ready// press Run to fetch// used in production by
From sheet to endpoint in three steps.
The whole product is the path from a spreadsheet to a working API. Here it is, end to end.
prepare
Get the spreadsheet ID and sheet name.
Grab the spreadsheet ID from the Google Sheets URL — the long string between /d/ and /edit. Note the tab name at the bottom; it's case-sensitive. Share the sheet with google@sheetson.com as an editor. Your sheet stays private — public sharing is never required.
docs.google.com/spreadsheets/d/1AbCdEfGhIjKlMnOpQrStUvWxYzspreadsheet ID/editSheetson Demo— Google SheetsA B C 1 id name role 2 1 Ada Engineer 3 2 Grace Admiral userssheet name → API pathSheet2(case-sensitive)call
Hit the endpoint.
Sheet name goes in the path. Spreadsheet ID goes in the X-Spreadsheet-Id header. Bearer token for auth. No OAuth in your app, no Google client library, no cell-range parsing. The header row becomes JSON keys.
GET /v2/sheets/users X-Spreadsheet-Id: 1AbCdEfGhIjKlMnOpQrStUvWxYz Authorization: Bearer $SHEETSON_KEY
ship
Go to production.
Unmetered requests on every plan. Rotate or revoke keys from the dashboard. Your editor updates the sheet; your app reads the API. No deploy to change a value.
[{ "id": "1", "name": "Ada", … }] 200 OK · 142ms
Everything the Sheets API should have been.
One endpoint per sheet. Standard HTTP verbs. Rows come back as JSON objects, not cell ranges.
GET /Read rows as objects — no Google Sheets auth in your code.POST /Append rows. PATCH to update. DELETE to remove. Standard REST verbs.AUTHBearer token per sheet. Rotate or revoke from the dashboard.QUOTAUnmetered requests on every plan. Google's own quotas still apply.PRIVATEYour sheet stays private. Public sharing is never required.
// read & write
Rows as objects, over HTTP.
Your sheet's header row becomes JSON keys. Each row below becomes an object. Read with GET, write with POST, update with PATCH — no Google auth in your app, no cell-range parsing.
rows
| A | B | C | |
|---|---|---|---|
| 1 | id | name | role |
| 2 | 1 | Ada | Engineer |
| 3 | 2 | Grace | Admiral |
objects
[
{
"id": "1",
"name": "Ada",
"role": "Engineer"
},
{
"id": "2",
"name": "Grace",
"role": "Admiral"
}
]GET /v2/sheets/{id}/users
// cms
A CMS your client already knows.
Editors edit a Google Sheet. Your site reads the API. Fixing a typo doesn't need a deploy or a ticket.
| A | B | C | |
|---|---|---|---|
| 1 | title | slug | published |
| 2 | Hello world | /hello | TRUE |
| 3 | Shipping fast | /shipping | TRUE |
| 4 | Draft post | /draft | FALSE |
// your client edits here. your app reads the API.
Built for the jobs a sheet already does.
If your data fits in a grid, it fits behind an endpoint.
01
Headless CMS
Editors update a sheet. Your site reads the API. No CMS to install, no admin panel to learn.
02
Feature flags
Toggle rollout from a sheet your whole team can see. No deploy.
03
Directory & listings
Job boards, menus, product catalogs — any listing site backed by a sheet anyone can maintain.
04
Config & i18n
Environment config and copy strings in a sheet. Change a value, your app picks it up. No redeploy.
Simple pricing. Flat per plan.
Free forever. Pay a flat price when you outgrow it.
Free
Free
For small projects and getting started.
- 1,000 rows per sheet
- Unlimited spreadsheets
- Unmetered requests
- Basic queries (pagination)
- Email support
Professional
$99/yr
For production apps that need filtering, pagination, and higher rate limits.
- Unlimited rows per sheet
- Unlimited spreadsheets
- Unmetered requests
- Advanced queries (filter + paginate)
- Dedicated rate limit (60 req/min)
- Priority support
Frequently asked questions.
The short version of the docs. Anything else, email us.