ConvertCSV

Finance file converter

JSON to QIF 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.

  • No signup
  • Files stay on your device
  • Transaction preview
  • Download ready

1 · Source

Add your JSON file

.json.qif
2 · Options

3 · Result

Output preview

Nothing converted yet

A sample JSON file is loaded — press “Convert to QIF” to see how the output looks.

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.

Check before you import

Each conversion shows the parsed transactions with money in, money out, and date range, plus warnings about ambiguous dates or missing account details.

Private browser workflow

PDFs and text files are read by your browser and never sent to a server. Close the tab and the data is gone.

JSON to QIF Converter

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.

Key features

  • Accepts a bare array or an object with a transactions array; keys are matched against common API names.
  • Handles numeric and string amounts, ISO timestamps, and slash dates with a Date order control.
  • Writes N, M, and L lines when id, memo, and category keys are present.
  • Reports which transaction index failed instead of a generic parse error.
  • Previews the parsed table and the QIF text before download; runs entirely in the browser.

About the JSON to QIF format

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.

How it works

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.

Common use cases

  • Pulling a month of transactions from an open-banking or aggregator API and loading them into Quicken for an account the aggregator does not sync.
  • Exporting from a budgeting app that offers JSON backups but no QIF, after deciding to move to Quicken.
  • Converting a payment processor's balance transactions endpoint into QIF so fees and payouts can be reconciled in a desktop ledger.
  • Turning a home-grown expense tracker's JSON store into Quicken categories at year end.
  • Loading crypto exchange trade history, exported as JSON, into a cash-style Quicken account for tax notes.

How to use this tool

  1. Save the API response or export as a .json file, or copy the JSON text.
  2. Upload the file or paste the text. If the top level is an object, make sure the array is under a transactions key.
  3. Set Date order if the dates are slash-formatted and ambiguous.
  4. Check the preview: row count, that debits are negative, and that payee names came from the right key.
  5. Download the .qif file and import it in Quicken via File → File Import → QIF File, choosing the destination account.

Example

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
^

Tips for best results

  • Use a stable id key. It becomes the N line in QIF and is the only thing that lets you tell two identical-looking transactions apart later.
  • Sign your amounts. QIF has no debit or credit flag, so a type field saying debit does nothing; the amount itself must be negative.
  • Put long free text in memo or note rather than description. Quicken truncates long payee names in some views but keeps the memo intact.
  • Convert one account per file. Quicken applies a QIF file to a single account chosen at import time.
  • Paste a two-object sample first. The error messages name the transaction index that failed, so a small sample tells you quickly which key is wrong.

Common errors and how to fix them

Invalid JSON, followed by a position.
The text is not well-formed JSON. Common causes are a trailing comma after the last object, single quotes instead of double quotes, or a copy that cut off the closing bracket. Validate the text in your editor and paste again.
JSON must contain an array of transactions or a transactions property.
The top level is an object without a transactions key, or the array is empty. Paste only the array, or rename the wrapper key to transactions.
Transaction N is not an object.
Element N of the array is a string, number, or null. Remove it or wrap the values in an object with date, amount, and description keys.
Every payee shows as Transaction.
None of description, payee, name, or memo is present in the objects. Rename your payee key to one of those.
Amounts are all 0.00.
The amount is nested, for example {"amount": {"value": 12, "currency": "USD"}}, or the key is not one of amount, value, trnamt. Flatten or rename it.

Best practices

  • Normalise the payload in your script before converting: one object per transaction, signed amount, ISO date, and a stable id.
  • Keep the raw JSON response alongside the QIF so a later question about a transaction can be answered from the source.
  • Back up the Quicken file before importing; there is no undo for QIF imports.

Frequently asked questions

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.