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.
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.
- Drop your
.jsonfile onto rows.page, pick it from your computer, or click Paste data and paste the JSON. - Filter, sort or hide columns if you want the link to open on a specific view.
- 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:
curl -T data.json https://rows.pagecurl 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:>20or-name:*(empty values). - Query with DuckDB SQL on the
datatable, quoting dot-path columns like"user.city". - Export the view as
CSV,Parquet,JSON,JSONLor 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.jsonorhttps://rows.page/<id>/rawfor the latest version, served withno-cache.https://rows.page/<id>/v<n>/raw.jsonfor 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:
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.
| Option | Expires | Table view | Raw URL with CORS | Private |
|---|---|---|---|---|
| rows.page, no account | After 7 days | Yes | Yes | No |
| rows.page Free ($0) | Never, up to 10 datasets | Yes | Yes | No |
| rows.page Pro ($12/mo) | Never, up to 100 datasets | Yes | Yes | Yes, through the API |
| GitHub Gist | No expiry | No | Yes | No, a secret gist is unlisted |
rows.page limits and prices
| What | Limit or price |
|---|---|
| Open a file in your browser | Files 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.