Designed for finance exports
The parser recognises date, description, amount, debit/credit, memo, category, and transaction id fields, including headers like Narration or Withdrawal Amt. used by many banks.
Finance file converter
Transform JSON transaction arrays into Quicken Interchange Format. Upload a file or paste its contents, check the parsed transactions, then download the QIF file.
1 · Source
3 · Result
Nothing converted yet
A sample JSON file is loaded — press “Convert to QIF” to see how the output looks.
The parser recognises date, description, amount, debit/credit, memo, category, and transaction id fields, including headers like Narration or Withdrawal Amt. used by many banks.
Each conversion shows the parsed transactions with money in, money out, and date range, plus warnings about ambiguous dates or missing account details.
PDFs and text files are read by your browser and never sent to a server. Close the tab and the data is gone.
If you pull transactions from a bank or payments API, write a small script that tracks spending, or export from a budgeting app, you end up with JSON. Quicken and the other desktop ledgers that still read QIF cannot do anything with it. This converter takes a JSON array of transaction objects and writes a QIF file, so the last step of a data pipeline can be a file Quicken actually opens instead of a CSV you then have to massage.
It is deliberately tolerant about key names. Different APIs call the same thing date, posted, or dateTime; amount, value, or trnamt; description, name, or payee. The converter checks those alternatives in order and takes the first one present, so most API payloads convert without a reshaping step. Amounts can be JSON numbers or strings; both are parsed the same way.
The JSON is parsed in your browser and never uploaded. For API responses that contain account numbers and balances alongside the transactions, that matters.
The top level must be either an array of transaction objects, or an object with a transactions property holding that array. Other wrapper keys such as data, items, or results are not unwrapped; if your API uses one, paste only the array.
Keys read from each object, in order of preference: date, dateTime, posted for the date; amount, value, trnamt for the amount; description, payee, name, memo for the payee line; memo, note, notes for the memo; category, account, ledger for the category; id, transactionId, fitId for the transaction number; type and trntype are parsed but have no QIF equivalent and are dropped.
Every transaction needs a date and an amount under one of those names; otherwise the conversion stops with an error naming the transaction and the keys it does have, rather than writing a zero. A debit and credit pair is accepted in place of amount. A missing payee is written as Transaction. Nested values such as {"amount": {"value": 12}} are rejected; flatten them to "amount": 12 first.
Each object becomes a QIF record under !Type:Bank: D date in MM/DD/YYYY, T signed amount with two decimals, P payee, then N for the id, M for the memo, and L for the category when those keys are present, terminated by a caret.
ISO 8601 timestamps such as 2026-03-14T09:30:00Z are accepted; the time part is discarded. Dates like 03/14/2026 are parsed with the Date order setting.
QIF has no escaping. Quotes, backslashes, and other punctuation in payee names pass through untouched and import fine. A line break inside a description would split a record, so newlines are replaced with spaces.
The text is parsed as JSON. A syntax error is reported with the parser's own message and position.
The transaction array is located, and each element is checked to be an object; the first element that is not stops the conversion with its index.
For each object the date, amount, description, memo, category, id, and type keys are read by their alternative names, then normalised: dates resolved to a calendar date, amounts cleaned and fixed to two decimals.
The rows are written as QIF records and offered as a .qif download.
JSON (API-style payload)
{
"transactions": [
{"posted": "2026-03-14", "name": "Coffee Collective", "value": "-4.80",
"category": "Eating out", "transactionId": "tx_7781"},
{"posted": "2026-03-15", "name": "Payroll", "value": 2250, "note": "March salary"}
]
}QIF
!Type:Bank
D03/14/2026
T-4.80
PCoffee Collective
Ntx_7781
LEating out
^
D03/15/2026
T2250.00
PPayroll
MMarch salary
^Can I paste the raw response from my bank's API?
Yes, if the response is an array or has a transactions key at the top level. Responses wrapped in data or results need that outer layer removed first.
Does the type field do anything?
It is read but not written. QIF bank records have no transaction type; the sign of the amount is all Quicken uses.
How are ids used?
The id, transactionId, or fitId value is written as the QIF N line, which Quicken shows as the check or reference number. Ids are not used for duplicate detection, so importing the same file twice creates duplicates.
Can I convert to OFX instead?
Not directly from JSON. Convert to QIF here, or if you need OFX with FITIDs, write the data as CSV and use the CSV to OFX converter.
For more background on data formats and conversion workflows, read our format guides.