Excel & CSV to JSON Rows: XLSX from URL, every sheet
Pricing
from $0.20 / 1,000 row delivereds
Excel & CSV to JSON Rows: XLSX from URL, every sheet
Rows of any Excel (XLSX) or CSV file by URL, up to 200 files a run and 5,000 rows each: one JSON object per row keyed by the header row, with sheet name, row number and counts, from every sheet or one you name. Dates as ISO, numbers as numbers, formulas as cached values. Pay per row.
Pricing
from $0.20 / 1,000 row delivereds
Rating
0.0
(0)
Developer
Steadydata Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Spreadsheet to JSON Rows: XLSX & CSV from URL, every sheet
Rows of any XLSX or CSV file by URL, up to 200 files a run and 5,000 rows each: one JSON object per row keyed by the header row, with sheet name, row number, columns and counts, from every sheet or one you name. Dates as ISO, numbers as numbers, formulas as cached values. Robots-aware. Pay per row.
Why this scraper
- Only delivered results are charged. Inputs that fail come back as clear error records at no cost.
- One fetch per file, parsed in memory with openpyxl and the standard CSV reader, no browser and no start fee. Measured on the platform: 59 rows from three XLSX workbooks (six sheets) and a CSV in 9 seconds for a hundredth of a cent; a 17,000-row CSV parses in under a second.
- Rows you can use directly: one JSON object per row keyed by the header row (or by column letter when there is no header), with the sheet name and index, the row number as it is in the sheet, the column list and the row count of the sheet. Numbers stay numbers, also in CSV (except codes with leading zeros), dates become ISO dates, timestamps ISO date-times, booleans stay booleans, formulas give their cached value, empty rows are skipped and not charged.
- Every sheet or one: leave
sheetempty for all sheets in order, or name a sheet or give its number. CSV delimiters (comma, semicolon, tab, pipe) are detected; UTF-8 with or without BOM and Latin-1 are read. - Robots-aware: each host's robots.txt is read once per run and a closed path comes back as a free
ROBOTS_DISALLOWEDrow (measured: github.com's/rawpath; use raw.githubusercontent.com instead).
Who this is for
Paste direct file links in urls (up to 200 per run), optionally name a sheet, keep headerRow on when the first row holds the column names and set maxRowsPerFile (default 1,000, ceiling 5,000, top to bottom across sheets). Built for pulling published spreadsheets (open data, price lists, exports, reports) into automations, databases and dashboards without a desktop tool in the loop.
Who this is not for
The URL must point at the file itself; a share page, a login-protected link or a Google Sheets web page is not a spreadsheet and comes back as a free NOT_SPREADSHEET row (export it as xlsx or csv first). Old binary .xls files are not read; save them as .xlsx. The header is the first non-empty row of a sheet, so a sheet with a title row above the real header keys its rows by that title row (measured on a test workbook). Formulas without a cached value, as written by some libraries, come back as null. Merged cells give their value in the top-left cell only. Files above 50 MB are refused.
Input example
{"urls": ["https://raw.githubusercontent.com/datasets/population/main/data/population.csv"],"headerRow": true,"maxRowsPerFile": 1000}
Output example
urlfileNamefileTypesheetNamesheetIndexrowNumberrowcolumnscolumnCountsheetRowCountsheetCountfileBytes
Error codes: INVALID_URL, ROBOTS_DISALLOWED, NOT_SPREADSHEET, NO_ROWS, SHEET_NOT_FOUND, FETCH_FAILED, BLOCKED.
One delivered row looks like this:
{"url": "https://raw.githubusercontent.com/apache/poi/trunk/test-data/spreadsheet/SampleSS.xlsx","fileName": "SampleSS.xlsx","fileType": "xlsx","sheetName": "First Sheet","sheetIndex": 1,"rowNumber": 2,"row": {"Test spreadsheet": "2nd row","B": "2nd row 2nd column"},"columns": ["Test spreadsheet","B"],"columnCount": 2,"sheetRowCount": 2,"sheetCount": 3,"fileBytes": 9112,"status": "ok"}
Related actors from steadydata
- pdf-text-extractor: the same idea for PDF files
- url-status-redirect-checker: check the URLs you find in a sheet
- webpage-to-markdown: a web page as clean text instead of a file
Pricing
Pay per event: one row-delivered event per delivered result. No charge for inputs
that fail, no separate platform-usage surcharge.
Free Apify plan: this actor delivers up to 25 rows per run for accounts on the Apify free plan, and then stops with a message. That limit is set by us, not by Apify. It exists so the actor keeps paying for itself for the people who do pay. Any paid Apify plan runs it at full size, billed per delivered row, with failed rows never charged.
Reviews: if this actor saves you time, a short review on this page is the one thing that helps most. Ratings are what other buyers look at first, and we have no other way to ask.
FAQ
Is personal data collected? Nothing beyond what is in your file. The actor reads only the URLs you give it and keeps nothing after the run.
How are duplicate or empty column names handled?
An empty header cell gets its column letter as key; a repeated name gets a counter (Amount, Amount (2)), so every key is unique and no column is lost.
Why does rowNumber skip numbers?
It is the row's number in the sheet, and empty rows are skipped; a row after an empty row keeps its own number, so you can find it back in the file.
Can I read one sheet of a large workbook?
Yes: set sheet to its name or number. The whole file is still downloaded, but only that sheet's rows are delivered and charged.
What does a run cost when a file fails?
Nothing. ROBOTS_DISALLOWED, NOT_SPREADSHEET, SHEET_NOT_FOUND, NO_ROWS, FETCH_FAILED, INVALID_URL and BLOCKED rows are free; only delivered rows are charged.
What happens when the source changes? Sources change from time to time; that is the nature of this work. The actor is monitored daily and fixed fast, and while it is broken you are not charged, because only delivered results cost anything.