Share a CSV
Share a CSV as a link, not an attachment
Free CSV hosting, no signup: curl -T data.csv https://rows.page returns a link that opens as a table. Files up to 100 MB, links live 7 days, or for good with a free account that keeps 10. CSV, TSV, JSON, JSONL or Parquet; drop a file here and press Share for the same link without a terminal.
No file handy? Open CO2 emissions by country and year (50k rows, 14 MB).
One command, one link
curl -T data.csv https://rows.page answers in plain text: the public link, an owner link with the token, and one line with rows, columns, size and the expiry date. Add -H "Accept: application/json" for JSON. No key, no account, nothing to install besides curl, and requests.put("https://rows.page/data.csv", data=open("data.csv", "rb")) does the same from Python.
Without an account you get 50 pushes and 1 GB per day per IP, 10 pushes per minute, 100 MB per file. The browser route is the same thing: open the file here, press Share.
What the other side gets
A table, not a download prompt. Whoever opens the link can sort, filter (region:EMEA amount:>1000), run SQL, see column stats, and export CSV, Parquet, JSON, JSONL or Markdown, on a phone too. Nobody needs an account to view; viewing is never paywalled on any plan.
The original bytes stay available at /<id>/raw.csv with CORS headers, so a script, a notebook or a web page can fetch the file directly.
Push again and it becomes a version
The owner link carries a token. Push the next export to the same link, curl -T data.csv -H "Authorization: Bearer rpt_..." https://rows.page/<id>, and it becomes version 2. The page shows how many rows are new, gone or changed against the previous version, matched by a key column you name with ?id_column=sku, and which columns were added or removed.
Identical bytes answer unchanged: true and add nothing. Anonymous links keep up to 20 versions; a free account opens the last 3, Pro keeps 90 days of versions, Max 365.
Private links and bigger files
Anonymous and free links are public but unguessable: 10 random characters, and the page is marked noindex so search engines leave it alone. Pro ($12/month) adds private datasets, 100 datasets, files up to 500 MB; Max ($39/month) goes to 1,000 datasets and 2 GB files. Files over 100 MB upload in 64 MB parts through the API.
Scripts on a plan use an API key (rpk_...) and can upsert by name: curl --data-binary @report.csv -H "Authorization: Bearer rpk_..." "https://rows.page/api/v1/push?key=nightly-report" updates the same dataset every night instead of minting a new link.
From CI, agents and webhooks
A GitHub Actions step is the curl line; the link lands in the job log or a PR comment. Agents use the MCP server at rows.page/mcp, which exposes push, get_dataset, list_datasets, delete_dataset and pin_finding, so a model can publish a result table and read it back with filters instead of pasting rows into chat.
The bin viewer on webhooks.sh has an Open in rows.page button that pushes captured requests as a table. Anything that can send an HTTP PUT can publish a dataset.
Limits for sharing a CSV link
| What | Limit or price |
|---|---|
| Price | $0, no account; opening a link is always free |
| File size per push | 100 MB without an account or on Free; 500 MB on Pro; 2 GB on Max |
| Link lifetime | Deleted 7 days after creation without an account; kept on any account |
| Pushes without an account | 50 per day and 1 GB per day per IP, 10 per minute |
| Versions | Up to 20 without an account; last 3 on Free; 90 days on Pro; 365 days on Max |
| Formats | CSV, TSV, JSON, JSONL, Parquet |
| 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
Do people need an account to open my link?
No. The link opens as a table for anyone, with filters, sort, SQL and export. Only keeping and private links need an account.
Is the link public?
Public but unguessable: a 10-character random id, and the page is marked noindex so search engines don't list it. Private datasets, which need the owner to sign in to view, come with Pro and Max.
How do I delete a shared file?
Open the owner link and use Delete dataset, or send DELETE /api/v1/datasets/<id> with the token. Deleted files leave storage within the hour. Anonymous links also delete themselves 7 days after creation.
Can I update the file behind the link?
Yes. Push again to the same link with the token from the owner link and it becomes the next version. Old versions stay available, and the page shows how many rows are new, gone or changed.
Can I share an Excel file?
Not as .xlsx. Save the sheet as CSV first and push that. CSV, TSV, JSON, JSONL and Parquet are accepted.
More tools
- CSV viewerOnline CSV viewer for big files
- Parquet viewerParquet viewer, no Python needed
- JSONL viewerJSONL viewer for logs, evals and traces
- JSON to tableJSON to table, nested fields included
- Past Excel's row limitExcel stops at 1,048,576 rows. Open the rest here.
- CSV to ParquetConvert CSV to Parquet in your browser
- Parquet to CSVConvert Parquet to CSV in your browser
- JSON to CSVConvert JSON to CSV, nested objects included
- CSV to JSONConvert CSV to JSON or JSON Lines
- JSONL to CSVConvert JSONL to CSV in your browser
- TSV to CSVConvert TSV to CSV in your browser
- CSV to MarkdownTurn a CSV into a Markdown table
- SQL on CSVRun SQL on a CSV file in your browser
- Version control for CSVVersion control for CSV files, without git
Pushing data from a script or agent? Read the docs.