SheetLatch / Docs
API documentation
SheetLatch opens at launch. These docs show how the API will work. Join the early-access list and we will email you once when it opens.
One URL per tab. Row 1 holds the keys. Every request carries an API key.
Quick start
curl "https://sheetlatch-api.quietlathe.com/v1/SHEET_ID/TAB_NAME?limit=5" \
-H "x-api-key: tr_live_..."
SHEET_ID is the long id in the sheet's address, between /d/ and /edit. If you leave the tab out, a key made for one tab uses that tab, and a public key reads the first tab.
Send the key in the x-api-key header, as Authorization: Bearer, or as ?key=. Prefer a header. Keys in URLs end up in logs.
Read rows
GET /v1/{sheetId}/{tab} returns a JSON array of objects. Numbers become numbers, TRUE and FALSE become booleans, and empty rows are dropped.
| Parameter | Meaning |
|---|---|
limit | Return at most this many rows (up to 10,000). |
offset | Skip this many rows after filtering. |
max_age | Cache window in seconds. Floors: 60 Free, 30 Maker and Lifetime, 10 Pro. |
| any other name | Keep rows where that column equals the value, compared as text. A column named limit, offset, key or max_age cannot be filtered. |
Response headers: x-cache (HIT, MISS or STALE), x-total-count (rows after filtering, before paging), x-quota-remaining, and a Link header pointing here.
Private sheets
On Maker, Lifetime and Pro, create a key in the dashboard with "private" ticked. Share the sheet with the service email shown there, as Editor. Reads, appends and updates then go through the official Sheets API. No Google sign-in is involved, and we only see sheets you share with that address.
Append and update
# append: keys must match the column names in row 1
curl -X POST "https://sheetlatch-api.quietlathe.com/v1/SHEET_ID/Orders" \
-H "x-api-key: $KEY" -H "content-type: application/json" \
-d '{"customer":"Dana","total":42}'
# update every row where customer is Dana
curl -X PATCH "https://sheetlatch-api.quietlathe.com/v1/SHEET_ID/Orders?customer=Dana" \
-H "x-api-key: $KEY" -H "content-type: application/json" \
-d '{"total":45}'
POST returns 201 and the row. PATCH returns {"updated": n}. Unknown column names return 422. PATCH with no match in the URL returns 422 so you cannot overwrite every row by accident.
Caching and quotas
Reads are cached at the edge and in memory. The default window is 60 seconds. A write through the API clears the cache for that tab. Edits made by hand in Google Sheets show up when the window ends.
Every request counts toward the key's monthly quota, cached or not, including writes and MCP tool calls. Months follow UTC. At the limit the API returns 429 with an upgrade link. A global limiter caps calls to Google. If it trips, you get the last cached copy (x-cache: STALE) or a 503 if there is none.
| Plan | Requests per month | Private and writes | MCP | Refresh floor |
|---|---|---|---|---|
| Free | 1,000 | No | No | 60 s |
| Maker | 25,000 | Yes | Yes | 30 s |
| Lifetime | 25,000 | Yes | Yes | 30 s |
| Pro | 150,000 | Yes | Yes | 10 s |
Errors
| Status | Meaning |
|---|---|
| 401 | Missing, wrong or revoked key. |
| 403 | Key belongs to another sheet or tab, the sheet is private, or the plan does not include the feature. |
| 422 | Unknown column, empty header row, or no match for an update. |
| 429 | Monthly quota reached. |
| 502, 503 | Google could not be reached, or the upstream limiter tripped with nothing cached. |
Errors are JSON: {"error": "...", "code": "..."}.
MCP endpoint
Paid keys work as a hosted MCP server at https://sheetlatch-api.quietlathe.com/mcp, using JSON-RPC over HTTP POST. Send the key in x-api-key, or use https://sheetlatch-api.quietlathe.com/mcp/YOUR_KEY for clients that cannot set headers. Treat that URL like a password.
Tools: read_rows, query_rows, append_row, update_rows. Each call counts as one request. Writes need a private-mode key. The server does not stream, so clients that require streaming transport may not connect.
OpenAPI and llms.txt
GET /k/openapi.json and GET /k/llms.txt, with your key in a header, return a description of the API for that one sheet. Paste either into an AI builder so it writes correct calls.
Without SheetLatch
The plain Google address behind a public read is https://docs.google.com/spreadsheets/d/SHEET_ID/gviz/tq?tqx=out:csv&sheet=TAB. It returns CSV, it is not a documented API, and Google can change it. That is part of why paid and private modes use the official Sheets API.