Share a JSON file

How to share a JSON file as a link, with a table view

You can share a JSON file up to 100 MB as a link with rows.page, free and with no signup, and the link stays live for 7 days. Recipients get a table they can filter and query with SQL, plus a raw JSON URL that any web app can fetch.

.json.jsonl
Drop a file here
Stays in your browserUp to 1.5 GB

No file handy? Open Every country, as nested JSON (250 rows, 1.4 MB).

How to share a JSON file from your browser

rows.page opens .json and .jsonl files in your browser with DuckDB-WASM, so nothing leaves your machine until you press Share.

  1. Drop your .json file onto rows.page, pick it from your computer, or click Paste data and paste the JSON.
  2. Filter, sort or hide columns if you want the link to open on a specific view.
  3. Click Share (Upload and get a link). rows.page uploads the whole file and opens its https://rows.page/<10-character id> link, with your current view kept in the URL.

A link shared from the browser expires after 7 days, even when you are signed in, unless you click Keep it on the page that opens. A JSON file over 16 MB may be stored as Parquet when that makes it at least 20% smaller, and its raw URL then ends in .parquet.

How to share a JSON file from the terminal with curl

From a terminal or a script, push the file with one command:

bash
curl -T data.json https://rows.page

curl prints the public link, an owner link with a #t= token, a summary line with rows, columns, format, size and expiry date, and the command for the next version. Add -H "Accept: application/json" to get the same reply as JSON.

What recipients see when they open a shared JSON link

Recipients get a table and need no account. Nested objects become dot-path columns such as user.address.city, up to 8 levels deep and 200 child fields per object, and arrays stay list columns. A single top-level object such as {"data": [...]} is unwrapped to its biggest list, and clicking a row opens it as JSON.

  • Filter with country:NL, price:>20 or -name:* (empty values).
  • Query with DuckDB SQL on the data table, quoting dot-path columns like "user.city".
  • Export the view as CSV, Parquet, JSON, JSONL or Markdown (first 1,000 rows).
  • Click Copy link to share their exact filter, sort and visible columns.

There is no whole-file tree view and no cell editing.

How to get a raw JSON URL with CORS

Every public dataset also serves the file itself, for apps, notebooks and scripts:

  • https://rows.page/<id>/raw.json or https://rows.page/<id>/raw for the latest version, served with no-cache.
  • https://rows.page/<id>/v<n>/raw.json for a pinned version, cacheable for a year.

Responses send access-control-allow-origin: *, so browser code on any site can fetch() the JSON. The extension must match the dataset's format, and a wrong one returns a 404 that names the right URL. Raw URLs of a private dataset open only for its owner.

How long does a shared JSON link last?

Without an account, a push can be up to 100 MB, you get 50 pushes and 1 GB per IP address per UTC day, and each link holds up to 20 versions and expires after 7 days. To keep it, open the owner link, sign in with Google and click Keep on my account, and the dataset stops expiring.

  • Free ($0): 10 hosted datasets, files up to 100 MB, the last 3 versions visible.
  • Pro ($12 per month): 100 datasets, files up to 500 MB, 90 days of versions, private datasets.
  • Max ($39 per month): 1,000 datasets, files up to 2 GB, 1 year of versions, private datasets.

A single request takes up to 100 MB on every plan, so Pro and Max reach their bigger limits through multipart uploads (POST /api/v1/uploads). You make a dataset private with the visibility=private push parameter or the REST API.

How to update a shared JSON link with a new version

Push to the same <id> with the rpt_ owner token from your first push. The link keeps working while versions count up as v1, v2, v3:

bash
curl -T data.json -H "Authorization: Bearer rpt_..." https://rows.page/<id>

For scripts and CI, any signed-in account, Free included, can create up to 20 rpk_ API keys. Push with -H "Authorization: Bearer rpk_..." to https://rows.page/?key=<name> and every run updates the same dataset.

When the previous version is 64 MB or less, a banner shows "+N new, N gone, N changed vs vN". Rows are matched by a key column set with ?id_column=<column>, the X-Rows-Id-Column header or in the banner. Without a unique key, changes show as new and gone.

GitHub Gist vs rows.page for sharing JSON

GitHub Gist

A gist is public or secret, and a secret gist is unlisted, not private: anyone with the URL can open it. Raw files are served from gist.githubusercontent.com with access-control-allow-origin: *. It suits small JSON files that people read as code.

rows.page

rows.page suits data people need to filter, sort or query as a table, with row-level diffs between versions and private links on Pro and Max. If your JSON already sits in a public gist, put its raw URL after https://rows.page/ to view it as a table, and nothing is stored.

GitHub Gist vs rows.page for sharing JSON
OptionExpiresTable viewRaw URL with CORSPrivate
rows.page, no accountAfter 7 daysYesYesNo
rows.page Free ($0)Never, up to 10 datasetsYesYesNo
rows.page Pro ($12/mo)Never, up to 100 datasetsYesYesYes, through the API
GitHub GistNo expiryNoYesNo, a secret gist is unlisted

rows.page limits and prices

WhatLimit or price
Open a file in your browserFiles up to 1.5 GB, $0, no account, nothing uploaded
Share a link without an account$0, files up to 100 MB, link deleted 7 days after creation
Free account$0, 10 datasets kept, last 3 versions
Pro$12/month, 100 datasets, files up to 500 MB, private links
Max$39/month, 1,000 datasets, files up to 2 GB, private links

Questions

What is the maximum JSON file size I can open or share?

In the browser, you can open a .json file up to 1.5 GB per tab; a bigger one is refused, while a bigger JSONL file loads its first rows. A shared link takes up to 100 MB per request on every plan, and Pro and Max accept files up to 500 MB and 2 GB through multipart uploads.

How does rows.page handle deeply nested JSON or arrays?

Nested objects flatten into dot-path columns like user.address.city, up to 8 levels deep and 200 child fields per object, and arrays stay list columns that show the first 6 items and "+N". A column holding JSON text is expanded when 90% or more of its values in the first 1,000 rows are JSON objects.

Can I query a shared JSON file with SQL?

Yes. Anyone with the link can type DuckDB SQL starting with SELECT, WITH or FROM into the filter box to query the data table, with results up to 1,000,000 rows. Wrap dot-path column names in double quotes, like "user.city".

Can an AI agent push a JSON file to rows.page?

Yes, through the MCP server at https://rows.page/mcp, listed in the MCP registry as page.rows/rows. Its push tool takes inline JSON up to 16 MB or a file url, anonymous pushes work, and the server allows 60 requests per minute.

Can I convert a shared JSON file to CSV or Parquet?

Yes. The Export menu saves the current view or SQL result as CSV, Parquet (zstd), JSON, JSONL or a Markdown table of the first 1,000 rows. Filtered views export every matching row, while SQL results stop at 1,000,000 rows.