Paste JSON or open a file, and download a CSV with one header row and one line per record. Nested objects become columns of their own. Your JSON never leaves this page.
Valid JSON.
Parsed and rendered on this page7 rows from $.data.orders[*], with 7 columns.
Drag to reorder, or Alt and an arrow key. Select a column to rename it, change its type or hide it.
| ID | Date | Customer name | Customer country | Status | Total | Items |
|---|---|---|---|---|---|---|
| A-1001 | 2026-09-02 | Folio & Sons | IE | paid | 1440 | 3 |
| A-1002 | 2026-09-03 | Atelier Vink | NL | paid | 320.5 | 1 |
| A-1003 | 2026-09-07 | Marlborough Books | IE | refunded | 89.99 | 2 |
| A-1004 | 2026-09-11 | Atelier Vink | NL | paid | 1600 | 1 |
| A-1005 | 2026-09-15 | Papierfabriek Deckle | NL | pending | 275 | 2 |
| A-1006 | 2026-09-21 | Folio & Sons | IE | paid | 48 | 1 |
| A-1007 | 2026-09-28 | Ledger & Co | GB | paid | 712.4 | 2 |
The CSV opens with this header row, then one line per row. Numbers are plain digits, with no currency sign or thousands separator.
Every CSV on this page comes from a quario definition: the report.json in the panel. It names the rows and the columns, in order. Store it with your code and render it with your data through @quario/csv. You get the same records from a server, a worker, or the browser.
{
"data": "$.data.orders[*]",
"style": {
"family": "sans",
"size": 9
},
"detail": {
"columns": [
{
"header": "ID",
"value": "{{ @.id }}"
},
{
"header": "Date",
"value": "{{ @.date }}"
},
{
"header": "Customer name",
"value": "{{ @.customer.name }}"
},
{
"header": "Customer country",
"value": "{{ @.customer.country }}"
},
{
"header": "Status",
"value": "{{ @.status }}"
},
{
"header": {
"value": "Total",
"style": {
"align": "right"
}
},
"value": "{{ round(@.total, 2) }}",
"style": {
"align": "right"
}
},
{
"header": {
"value": "Items",
"style": {
"align": "right"
}
},
"value": "{{ count(@.items) }}",
"style": {
"align": "right"
}
}
],
"header": {
"style": {
"family": "mono",
"size": 7,
"uppercase": true,
"color": "#6b7a82",
"paddingBottom": 3,
"borderBottomWidth": 0.5,
"borderBottomStyle": "solid",
"borderBottomColor": "#cfd8dd"
}
},
"row": {
"style": {
"paddingTop": 2,
"paddingBottom": 2,
"borderBottomWidth": 0.25,
"borderBottomStyle": "solid",
"borderBottomColor": "#e6ecef"
}
}
}
}data list of an API response. When there are several lists, you choose which one becomes the rows. The rows don't need the same keys: every key in the first 500 rows becomes a column.customer object gives a Customer name column, a Customer country column, and so on. That goes one level down: the converter leaves out an object inside that one. A list inside a row, such as an order's items, becomes a column holding how many there are. You can rename, reorder, or hide any column before you download.320.5 or -5. There's no currency sign or thousands separator, so a spreadsheet or a script reads it back as a number. The converter rounds money columns to two decimal places and leaves every other number as it is. Dates and true or false values arrive as your JSON has them.=, +, -, or @ gets an apostrophe in front of it. A spreadsheet opening the file then shows it as text rather than running it. A number such as -5 isn't text, and stays as it is.