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.

ParameterMeaning
limitReturn at most this many rows (up to 10,000).
offsetSkip this many rows after filtering.
max_ageCache window in seconds. Floors: 60 Free, 30 Maker and Lifetime, 10 Pro.
any other nameKeep 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.

PlanRequests per monthPrivate and writesMCPRefresh floor
Free1,000NoNo60 s
Maker25,000YesYes30 s
Lifetime25,000YesYes30 s
Pro150,000YesYes10 s

Errors

StatusMeaning
401Missing, wrong or revoked key.
403Key belongs to another sheet or tab, the sheet is private, or the plan does not include the feature.
422Unknown column, empty header row, or no match for an update.
429Monthly quota reached.
502, 503Google 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.