Public sheets need no account
Turn a spreadsheet into an endpoint.
Paste a link and get structured JSON. Or call one REST endpoint from a script, a webhook or a cron job — no SDK, no scraping, no OAuth plumbing.
Table
| name | |
|---|---|
| Ansh | ansh@example.com |
| Rahul | rahul@example.com |
| Priya | priya@example.com |
JSON
[ { "name": "Ansh", "email": "ansh@example.com"},{ "name": "Rahul", "email": "rahul@example.com"},{ "name": "Priya", "email": "priya@example.com"}]
The header row becomes the keys. Nothing to map, nothing to maintain.
Anything that speaks HTTP
- curl
- wget
- fetch
- axios
- requests
- httpx
- net/http
- RestKit
What you get
A spreadsheet, reduced to rows
Sheets are a fine way to hold data and a poor way to read it. This is the layer in between: the same rows, as something a program can use.
Paste a link. Get rows.
The first row of the sheet is treated as the header, so every extraction comes back keyed by column name — the same shape in the browser, in the API and in your history.
An endpoint, not a client library
No dependency to install, no SDK to keep in step with. One GET, and the sheet is data in your program.
curl "https://sheet2json.app/api/v1/extract?url=$SHEET_URL" \ -H "Authorization: Bearer $S2J_KEY"
Private sheets, read-only
Connect Google and your own private sheets come back too, read with your own permission and visible to nobody else.
- spreadsheets.readonly, nothing else
- No Drive access, ever requested
- Never writes to your sheet
JSON, CSV or NDJSON
One parameter picks the shape. CSV is re-quoted where it has to be, and NDJSON pipes straight into jq.
Stable URLs for saved recipes
Preview your columns, filters and sort order, then save the recipe as a reusable endpoint protected by your API key.
Keys you can revoke
Keys are shown once, at creation, and kept only as a SHA-256 digest. Revoke one and it stops working on the next request.
Limits you can see coming
Counters are per key, per hour and held in the database rather than in one server instance's memory. Every response tells you where you stand, so a client can slow down before it is turned away — and a 429 carries Retry-After when it is.
- RateLimit-Limit
- 1000
- RateLimit-Remaining
- 984
- RateLimit-Reset
- 1756492800
The API
One request, and the sheet is yours
Anonymous callers get a smaller per-IP budget, which is enough to try the whole thing before deciding anything. A key raises the limit and unlocks your own private sheets.
- Works with no account, no key and no signup
- Errors arrive as JSON with a stable code to branch on
- Successful extractions are cached, so polling is cheap
curl "https://sheet2json.app/api/v1/extract?url=$SHEET_URL" \ -H "Authorization: Bearer $S2J_KEY"
How it works
From a link to data in three steps
There is no setup wizard, because there is nothing to set up before the first request.
01
Paste a Sheets link
Any tab, any gid. The URL is checked against a strict allow-list before a request is allowed to leave the app, so a link can only ever point at a spreadsheet.
02
Add a key, or skip it
Public sheets need no account at all. A key raises the rate limit, records history against your account and is what makes your own private sheets readable.
03
Take the rows
Download the JSON, copy it into a response body, or page through the table. The shape is identical in the browser and over the API.
Get started
Read your first sheet as JSON.
Nothing to install and no account to create. If the sheet is public, you are one paste away.
curl https://sheet2json.app/api/v1/extract?url=…