Skip to content
LegacyFile
← Learn

What Is an OFX File? (And QFX — Open Financial Exchange Explained)

By LegacyFile ·

You clicked "Download transactions" in online banking and got a file called statement.ofx — or a .qfx if your bank labels it "Download to Quicken" — and opening it in a text editor shows something that looks almost like HTML, but with tags like <STMTTRN> and <TRNAMT> that never seem to close. This article explains what an OFX file is and how to read one.

What an OFX file is

OFX stands for Open Financial Exchange — a format created in 1997 by Microsoft, Intuit, and CheckFree so desktop finance software (Quicken, Microsoft Money) could pull statements from banks without screen-scraping their websites. It carries bank statements, credit-card statements, and investment data, and it's still what most banks hand you today when you ask for a machine-readable download that isn't a PDF or CSV.

An OFX file has two parts: a header that describes the file itself, and a body of nested tags holding the actual data. Here's the top of a typical OFX 1.x file:

OFXHEADER:100
DATA:OFXSGML
VERSION:102
SECURITY:NONE
ENCODING:USASCII

<OFX>
<BANKMSGSRSV1>
<STMTTRNRS>
<STMTRS>
<CURDEF>USD
<BANKACCTFROM>
<ACCTID>00123456781234
</BANKACCTFROM>

The two flavors: SGML (1.x) and XML (2.x)

That header block of KEY:VALUE lines marks an OFX 1.x file, and its body is SGML — a looser ancestor of XML in which leaf tags carrying a value don't get closing tags. <TRNAMT>-84.50 just ends when the next tag starts. Only the container ("aggregate") tags like <STMTTRN> get a matching </STMTTRN>. This is why generic XML tools choke on most OFX files: they're not malformed XML, they're not XML at all.

OFX 2.x replaced the key/value header with an <?xml ...?> declaration and made the body real XML — every tag closed. Same tag names, same structure, just stricter syntax. Banks still overwhelmingly serve the 1.x flavor, so any tool reading OFX has to handle both.

STMTTRN: where the transactions live

Inside a bank statement (STMTRS) or credit-card statement (CCSTMTRS), the transaction list (BANKTRANLIST) holds one <STMTTRN> block per transaction:

<STMTTRN>
<TRNTYPE>CHECK
<DTPOSTED>20260605
<TRNAMT>-84.50
<FITID>2026060500002
<CHECKNUM>1042
<NAME>CHECK 1042
</STMTTRN>
  • TRNTYPE — the kind of transaction: DEBIT, CREDIT, CHECK, ATM, DIRECTDEP, PAYMENT, and a dozen more the spec defines.
  • DTPOSTED — when it posted, as YYYYMMDD, often extended with a time and timezone like 20260605080000.000[-5:EST].
  • TRNAMT — the signed amount: deposits positive, withdrawals negative.
  • FITID — the bank's unique id for the transaction, meant to let software de-duplicate overlapping downloads.
  • NAME / PAYEE / MEMO / CHECKNUM — who and what: some banks send a simple NAME, others a whole PAYEE block with an address inside.

The statement also carries the account (ACCTID), currency (CURDEF), and a closing LEDGERBAL balance with its as-of date.

QFX: Quicken's branded twin

A .qfx file is an OFX file — same header, same tags, same STMTTRN blocks — plus a few Intuit-specific tags, most notably <INTU.BID>, a numeric id identifying the bank in Intuit's directory. Quicken uses that tag as a gatekeeper: it refuses to import plain OFX files that lack it, and banks pay Intuit to be issued one. Reading the file yourself, the difference is irrelevant — a parser that handles OFX handles QFX by just ignoring the extra tags.

Getting an OFX file into a spreadsheet

Renaming .ofx to .csv or .xml doesn't work — Excel can't pair each transaction's date, amount, and payee out of SGML tags. The free OFX to CSV converter here on LegacyFile reads both flavors directly in your browser: it parses the header, walks every STMTTRN block (bank and credit-card statements alike, QFX included), and flattens the transactions into one row each you can export as CSV, XLSX, or JSON. See How to convert OFX or QFX to CSV for the step-by-step version.