Free JSON to CSV converter and API
Paste JSON records, choose the columns and the separator, and get a CSV file. The form calls the same free API your code can call: one POST, no API key and no account. The CSV waits in Storage for 24 hours.
curl -s -X POST https://aisenseapi.com/services/v1/json_to_csv \
-H "Content-Type: application/json" \
-d '{"columns":["customer_id","name","active"],"rows":[{"customer_id":"00123","name":"Nordlys AS","active":true},{"customer_id":"00456","name":"Fjord & Fjell","active":false}],"delimiter":";"}'
{
"storage_id": "cc2b58e7-04b8-48ac-b82d-0bff6536d69c",
"storage_url": "https://aisenseapi.com/services/v1/storage/cc2b58e7-04b8-48ac-b82d-0bff6536d69c",
"sha256_hash": "3dd8148bc8c7ae4c21c39f7f7bf20dd794c3a3a4ce9084230d690b4e450c4253",
"bytes": 93,
"expire_timestamp": 1790760064,
"expire_datetime": "2026-09-30T09:21:04+00:00",
"content_type": "text/csv; charset=utf-8",
"filename": "result.csv",
"operation": "json_to_csv"
}Try it in the browser
This form posts to the same endpoint and shows the stored result. What you enter is sent to aisenseapi.com, and the result is kept for 24 hours at a link that anyone with the link can open.
How the conversion works
The CSV stored for the example at the top of the page. Every line ends with CRLF:
"customer_id";"name";"active"
"00123";"Nordlys AS";"true"
"00456";"Fjord & Fjell";"false"
- You choose the columns.
columnssets which fields become columns and in what order. A record with a field that is not incolumnsis refused, so no data is dropped without you knowing. - Every cell is quoted, quotes inside a cell are doubled, lines end with CRLF, and the first line is the header.
- Text stays text.
"00123"stays 00123.trueandfalsebecome the words true and false. A missing field andnullbecome an empty cell. - Numbers are written as JSON numbers.
1.50is written as 1.5, so send IDs and amounts that must keep their exact spelling as strings. An integer too large for 64 bits is refused rather than rounded. - Nested objects and lists are refused. Flatten them first. A CSV cell cannot hold a structure without guessing how.
Opening the CSV in a spreadsheet
A cell that starts with =, +, - or @ can be run as a formula when the file is opened in a spreadsheet program. With "spreadsheet_safe": true the service puts an apostrophe in front of such cells, the header included. That changes the cell text, a negative number such as -1 included, so it is off by default. Use the semicolon separator for spreadsheets set to a comma as the decimal mark.
The API
POST https://aisenseapi.com/services/v1/json_to_csv with Content-Type: application/json.
| Field | Required | Meaning |
|---|---|---|
columns | yes | List of column names, unique and not empty. |
rows | yes | List of objects with text, number, true, false or null values. |
delimiter | no | "," (default), ";" or "\t". |
spreadsheet_safe | no | true or false (default). |
The result is stored as result.csv. Read it with a GET on storage_url; Storage serves it as application/octet-stream, so a browser saves it as a file.
The answer is a Storage link
The endpoint never sends the converted file in its answer. It stores the result for 24 hours and answers with the same fields the Temporary Storage API answers with, plus what the result is:
| Field | Meaning |
|---|---|
storage_id, storage_url | Where the result is. A GET on the URL returns the bytes. |
sha256_hash, bytes | The digest and size of the stored bytes. |
expire_timestamp, expire_datetime | When the result is removed, 24 hours after it was stored. |
content_type, filename | What the result is and the name to save it under. |
operation | The endpoint that made it. |
The id and the expiry in the examples on this page come from a test run and are different on every call. The hash and the size are what the example request gives every time.
Anyone with the link can read the result until it expires, so do not send personal or confidential data. Stored results count against the Storage budget of 80 MB per IP address per day.
Limits
- The request body is at most 256 KB.
- At most 5000 rows and 100 columns.
- The CSV is at most 2 MB.
Errors
A refused request stores nothing and answers with error. The endpoint's own refusals also carry fix, a sentence saying what to send instead.
| Status | When |
|---|---|
400 | The body is not a JSON object, a field is missing, unknown or has the wrong type, or the input breaks the rules above. |
405 | The method is not POST. |
413 | The request, the rows or the result is over a limit. |
415 | The Content-Type is not application/json. |
429 | More than 5000 requests from one IP address in 24 hours, or the day's Storage budget is used up. |
503 | The result could not be stored. Try again later. |
Questions
Is the JSON to CSV API free?
Yes. No API key, no account and no sign up. The limit is 5000 requests per IP address per 24 hours, and stored results count against the Storage budget of 80 MB per IP address per day.
Does it keep leading zeros such as 00123?
Yes, when the value is sent as a JSON string. Every cell is written as text inside quotes, and nothing is converted to a number.
What happens to nested objects?
They are refused with HTTP 400. A CSV cell cannot hold a structure, so flatten the records first.
Where is the CSV file?
In Storage for 24 hours. The answer carries storage_url, and a GET on it returns the file. Anyone with the link can read it until it expires.
Related tools
- JSON to CSV converter and CSV to JSON converter
- Table matching: compare two tables on key columns
- JSON formatter and JSON validator
- Image converter and image compression for JPEG, PNG and WebP
- Temporary Storage API, where every result is kept for 24 hours