Skip to content
Sheet2JSON

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.

GET/api/v1/extract200 · 214ms

Table

Extracted rows, keyed by the sheet header row
nameemail
Anshansh@example.com
Rahulrahul@example.com
Priyapriya@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.

docs.google.com/spreadsheets/d/1Bxi…/edit[{ "name": "Ansh" }]

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.

bash
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.

jsoncsvndjson

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.

GET /api/v1/endpoints/...

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.

s2j_9f3c…a71d

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
Read the full reference
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.

  1. 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.

  2. 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.

  3. 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=…