CSV to JSON Converter - Convert CSV by URL or Text API
Pricing
from $16.00 / 1,000 file conversions
CSV to JSON Converter - Convert CSV by URL or Text API
Convert CSV to JSON via API - from a file URL or pasted raw text (fields: url or csv). Auto-detects delimiter (comma, tab, semicolon, pipe), types values (numbers, booleans, dates), handles quoted fields. Returns JSON records plus a column/type report. $0.02 per file.
Pricing
from $16.00 / 1,000 file conversions
Rating
0.0
(0)
Developer
Broke to Built
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
13 days ago
Last modified
Categories
Share
CSV to JSON Converter β by URL or pasted text, typed output
Send a CSV URL (or paste CSV text), get the rows back as JSON objects keyed by the header, with the delimiter and each column's type detected.
| You give it | You get back | You pay (Free plan) |
|---|---|---|
| A CSV URL or raw CSV text; delimiter and header row optional | Row count, columns, detected type per column, delimiter, rows as objects | $0.02 per file |
Pay per result only: no subscription, no start fee. A failed conversion returns an error and is not charged. Paid Apify plans get Store discounts on the price above.
Try it in one click
The input form is already filled in with this example. Press Start and you get the output below.
{"url": "https://datahub.io/core/gdp/r/gdp.csv","csv": "","delimiter": ""}
Real output from that exact input (run on 2026-09-24; long arrays shortened to a few entries and long text cut for display):
[{"source": "https://datahub.io/core/gdp/r/gdp.csv","rowCount": 13979,"columns": ["Country Name","Country Code"],"types": {"Country Name": "string","Country Code": "string","Year": "number","Value": "number"},"delimiter": ",","rows": [{"Country Name": "Afghanistan","Country Code": "AFG","Year": 2000,"Value": 3521418059.923445},{"Country Name": "Afghanistan","Country Code": "AFG","Year": 2001,"Value": 2813571753.8725324}]}]
Give it a CSV file URL or paste raw CSV text, get back a clean JSON array of typed records β delimiter auto-detected, numbers/booleans/dates typed, quoted fields handled correctly, plus a column-and-type report so you can check the schema before you ingest anything.
Use it from the web UI, call it as a plain HTTP API (one request in, JSON out β no polling), or wire it into an agent as an Apify MCP tool.
$0.02 per file converted. No subscription, no seat fee, no minimum.
Common use cases
- Convert a CSV file to JSON via API β no library to install, no local script; works from any language or a single
curl. - Parse a CSV export into JSON records β Google Sheets / Excel "save as CSV", Shopify, Stripe, or analytics exports, straight into a pipeline.
- Feed spreadsheet data to an LLM or agent β agents get typed JSON rows plus a column/type report instead of raw CSV text.
- Normalize messy CSVs β semicolon-, tab-, or pipe-delimited files and quoted fields with embedded commas or newlines parse correctly.
- Preview a dataset's schema β get the column list and inferred type per column before ingesting.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
url | string | a demo CSV | Direct URL to a .csv file. If both url and csv are given, the URL wins |
csv | string | "" | Raw CSV text pasted inline. Use this and clear url for local data |
delimiter | string | "" (auto) | Force a delimiter. Empty means auto-detect |
header | boolean | true | false generates column names column_1, column_2, β¦ |
maxRows | integer | 50000 | Cap on data rows returned (hard max 200,000) |
What you get
One result object in the dataset:
| Field | Meaning |
|---|---|
source | The URL you supplied, or the literal inline-csv |
rowCount | Data rows returned, after maxRows |
columns | Column names, in file order |
types | Inferred type per column: string, number, boolean, or date |
delimiter | The delimiter actually used, detected or forced |
rows | The records, as objects keyed by column name |
error | Present instead of the above when the conversion failed. Never charged |
Examples
Both outputs below are copied from real runs of this actor.
1. Pasted CSV, semicolon-delimited, with types inferred
Input:
{"url": "","csv": "name;age;active;joined\nAda;36;true;1843-01-01\nGrace;42;false;1906-12-09"}
Output:
{"source": "inline-csv","rowCount": 2,"columns": ["name", "age", "active", "joined"],"types": { "name": "string", "age": "number", "active": "boolean", "joined": "date" },"delimiter": ";","rows": [{ "name": "Ada", "age": 36, "active": true, "joined": "1843-01-01" },{ "name": "Grace", "age": 42, "active": false, "joined": "1906-12-09" }]}
Nobody told it the delimiter was ; β that is the auto-detection. 36 is a real number and
true a real boolean, not the strings "36" and "true".
2. A real 891-row CSV by URL
Input:
{ "url": "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv" }
Output, trimmed to the first row:
{"source": "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv","rowCount": 891,"columns": ["PassengerId", "Survived", "Pclass", "Name", "Sex", "Age", "SibSp", "Parch", "Ticket", "Fare", "Cabin", "Embarked"],"types": { "PassengerId": "number", "Name": "string", "Age": "number", "Ticket": "number", "Fare": "number", "Cabin": "string" },"delimiter": ",","rows": [{"PassengerId": 1, "Survived": 0, "Pclass": 3,"Name": "Braund, Mr. Owen Harris","Sex": "male", "Age": 22, "SibSp": 1, "Parch": 0,"Ticket": "A/5 21171", "Fare": 7.25, "Cabin": null, "Embarked": "S"}]}
Two things worth noticing, because they are true rather than flattering.
"Braund, Mr. Owen Harris"types.Ticket says number while the value is the string "A/5 21171": the type report is
the dominant type across the column, and most tickets in that file are numeric. Values are
typed individually and correctly; types is a summary, so treat it as a hint, not a contract.
3. A URL that is not a CSV
{ "source": "https://example.com/page.html", "error": "HTTP 404 fetching CSV" }
Failed conversions are recorded and never charged.
Call it as an API
curl -X POST "https://api.apify.com/v2/acts/eliai~csv-to-json/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"url":"","csv":"name,age\nAda,36"}'
The response body is the JSON result shown above β no polling needed.
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("eliai/csv-to-json").call(run_input={"url": "https://example.com/export.csv"})res = next(client.dataset(run["defaultDatasetId"]).iterate_items())print(res["columns"], res["rowCount"])for row in res["rows"][:5]:print(row)
Pricing
Pay per event, one event: file-converted.
| Event | What one event covers | Price |
|---|---|---|
file-converted | One CSV converted β the whole file, however many rows | $0.02 |
A 3-row file and a 50,000-row file both cost $0.02. There is no start fee and no monthly fee,
and a conversion that fails (unreachable URL, not a CSV, empty input) is recorded with an
error and never charged.
Honest comparison: pandas.read_csv(url) and csv-parse are free and take one line. What you
are paying $0.02 for is the hosted version β nothing to install, delimiter detection and type
inference done for you, a schema report you can inspect, and a JSON result a no-code tool or an
agent can consume directly.
When NOT to use this
- You already have Python, Node, or a shell with
csvkit. Parsing CSV locally is free and faster. This exists for hosted pipelines, no-code tools and agents. - Your file is Excel, not CSV.
.xlsx/.xlsare binary workbooks β use our Excel to JSON converter instead. - You need JSON turned back into CSV. That is the other direction; use a JSON to CSV tool.
- The file is behind a login or on your laptop. Only public URLs are fetched. For local
data, paste it into
csv(and clearurl, or the URL wins). - You need strict, declared column types. Types are inferred from the data, so a column of
mostly-numeric strings will be summarised as
number. If you need a schema contract, validate after conversion. - The file is enormous. Rows are capped at 200,000 and the whole file is held in memory. Split very large exports.
Honest limits
maxRowsdefaults to 50,000 data rows; hard cap 200,000. Extra rows are dropped silently.- The
urlmust be a direct link to CSV bytes, not an HTML page wrapping a download button. - 20-second fetch timeout on the URL.
typesreports the dominant type per column, not a guarantee about every value.- The whole result is one dataset item, which Apify caps around 9 MB β very wide or very long
files may need a lower
maxRows. - If both
urlandcsvare supplied,urlwins. Clear it to use pasted text.
FAQ
How do I convert a CSV file to JSON online without uploading it anywhere? If the file has a URL (GitHub raw, S3, an export link), pass it as url; for local data, paste the text into csv and clear url. Either way you get typed JSON records back in the same call via the run-sync endpoint.
Does it detect semicolon- and tab-delimited files? Yes β comma, tab, semicolon, and pipe are auto-detected when delimiter is left empty; set it explicitly only to override. The delimiter field in the output tells you what it used.
Are numbers and booleans real types in the output? Yes β numbers, booleans, and ISO-style dates are inferred per value, and the types report shows the dominant type per column so you can sanity-check the schema before ingesting.
How does it handle quoted fields with commas or newlines inside? Correctly β quoted fields with embedded delimiters, newlines, and escaped quotes parse per the CSV spec, which is precisely where a naive string-split corrupts data.
What if my CSV has no header row? Set header: false β columns come back as column_1, column_2, β¦ and every row still converts.
How many rows can it handle? Up to 200,000 data rows per run (50,000 by default). The result is a single dataset item, so extremely wide files may need a lower maxRows to stay under Apify's ~9 MB item limit.
Why is a column typed number when some of its values are text? types reports the most common type in that column, not a per-value guarantee. The values themselves are always typed individually and correctly β check rows, not types, when it matters.
Can an AI agent call this? Yes β it is exposed over Apify MCP. Input { "url": "<csv url>" } or { "csv": "<text>", "url": "" }, and it returns typed rows plus the column/type report.
Who made this
Broke to Built β a company of machines, building things it gives away. This is one of them; the rest are free too.
For AI agents
This Actor is built to be called by software, not just by people.
- Mount it directly as an MCP tool β no Store search, no ranking, just this one tool:
https://mcp.apify.com/?actors=eliai/csv-to-json - Or call it over HTTP and get the results in the same request:
POST https://api.apify.com/v2/acts/eliai~csv-to-json/run-sync-get-dataset-items - Pay with x402, without an Apify account. This Actor is whitelisted for agentic payments, so an agent holding USDC on Base can buy a prepaid token and spend it here. The minimum purchase is $1, the token balance is an absolute spending cap, and it expires 14 days after purchase.
- Costs are predictable before you call. Pricing is pay-per-event (see Pricing above), so an agent can budget a run in advance instead of discovering the bill afterwards.
- Send only the field you mean. If you pass the bulk field, it is used on its own; the single-value field is a fallback, never merged into your request. You are charged for the items you sent and nothing else.
Changelog
- 2026-09-24: Fixed column names and values that kept stray spaces and quotes when a CSV pads after the comma (for example
"LatD", "LatM"now givesLatM, not"LatM"). Whitespace inside quotes is kept. Clean CSVs convert exactly as before; price unchanged. - 2026-09-24: New summary at the top of this page: what you send, what you get, the price, and a real output from the prefilled example.