IBKR options trade CSV checker
Check an Interactive Brokers options trade export before you import it into a journal or a spreadsheet. The checker lists missing fields, invalid values, duplicate fills, and rows that it cannot read.
The check runs in your browser. Your file does not leave your device, and TradeRecount does not store it.
Your file
Result
11 errors
Synthetic example. The checker read 12 trade rows. 8 rows have at least one error.
- Warnings
- 1
- Unreadable rows
- 2
- Skipped rows
- 1
Problems
- Error Line 3 has the same IB Execution ID as line 2. The same fill appears twice.
- Error Line 5: Trade Date "20261345" is not a real date in the format yyyyMMdd.
- Error Line 5: Date/Time "20261345;102000" is not a real date and time in the format yyyyMMdd with HHmmss or HH:mm:ss.
- Error Line 6: Trade Price "0,60" is not a number. Use a decimal point, such as 1.05.
- Error Line 7: Quantity "1.5" is not a whole number of contracts.
- Error Line 8 has no Strike value.
- Error Line 9: Symbol "SYNTH 261120C00050000" shows a strike of 50, but Strike is 55.
- Error Line 10: Put/Call "X" is not C, P, Call, or Put.
- Error Line 11: Expiry 2026-10-16 is before the trade date 2026-10-21. An option cannot trade after it expires.
- Warning Line 14 has the same symbol, date, time, quantity, and price as line 13. Check that it is not a duplicate fill.
- Error Line 15 has 7 values, but the header has 15. The checker cannot match its values to columns.
- Error Line 16 opens a quotation mark that does not close. The checker cannot read the file from this line.
- Note 1 row is not an option trade (Asset Class STK). The checker did not check it.
Preview
| Line | Status | Asset Class | Symbol | Underlying Symbol | Currency | Trade Date | Date/Time | Quantity | Trade Price | Multiplier | IB Commission | Strike | Expiry | Put/Call | Buy/Sell | IB Execution ID |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | OK | OPT | SYNTH 261120C00050000 | SYNTH | USD | 20261019 | 20261019;093512 | 2 | 1.25 | 100 | -1.30 | 50 | 20261120 | C | BUY | SYN.0001 |
| 3 | 1 error | OPT | SYNTH 261120C00050000 | SYNTH | USD | 20261019 | 20261019;093512 | 2 | 1.25 | 100 | -1.30 | 50 | 20261120 | C | BUY | SYN.0001 (error) |
| 4 | OK | OPT | SYNTH 261120P00045000 | SYNTH | USD | 20261019 | 20261019;101500 | -1 | 0.80 | 100 | -0.65 | 45 | 20261120 | P | SELL | SYN.0003 |
| 5 | 2 errors | OPT | SYNTH 261120C00055000 | SYNTH | USD | 20261345 (error) | 20261345;102000 (error) | 1 | 0.60 | 100 | -0.65 | 55 | 20261120 | C | BUY | SYN.0004 |
| 6 | 1 error | OPT | SYNTH 261120C00055000 | SYNTH | USD | 20261020 | 20261020;110241 | 1 | 0,60 (error) | 100 | -0.65 | 55 | 20261120 | C | BUY | SYN.0005 |
| 7 | 1 error | OPT | SYNTH 261120C00055000 | SYNTH | USD | 20261020 | 20261020;110509 | 1.5 (error) | 0.62 | 100 | -0.65 | 55 | 20261120 | C | BUY | SYN.0006 |
| 8 | 1 error | OPT | SYNTH 261120P00040000 | SYNTH | USD | 20261020 | 20261020;123000 | 1 | 0.35 | 100 | -0.65 | — (error) | 20261120 | P | BUY | SYN.0007 |
| 9 | 1 error | OPT | SYNTH 261120C00050000 (error) | SYNTH | USD | 20261021 | 20261021;094530 | 1 | 1.40 | 100 | -0.65 | 55 | 20261120 | C | BUY | SYN.0008 |
| 10 | 1 error | OPT | SYNTH 261120C00060000 | SYNTH | USD | 20261021 | 20261021;131000 | 1 | 0.20 | 100 | -0.65 | 60 | 20261120 | X (error) | BUY | SYN.0009 |
| 11 | 1 error | OPT | SYNTH 261016C00050000 | SYNTH | USD | 20261021 | 20261021;140000 | -2 | 0.05 | 100 | -1.30 | 50 | 20261016 (error) | C | SELL | SYN.0010 |
| 13 | OK | OPT | SYNTH 261120C00050000 | SYNTH | USD | 20261022 | 20261022;100000 | 3 | 1.10 | 100 | -1.95 | 50 | 20261120 | C | BUY | — |
| 14 | 1 warning | OPT | SYNTH 261120C00050000 | SYNTH | USD | 20261022 | 20261022;100000 | 3 | 1.10 | 100 | -1.95 | 50 | 20261120 | C | BUY | — |
Rows that the checker cannot read are in the problem list, not in this table.
What the checker reads
The checker reads the Trades section of an Interactive Brokers (IBKR) Flex Query in CSV format. A Flex Query is a report that you configure in your IBKR account. You select its sections, its fields, and its output format.
The file must have one header row with the field names. The checker finds each column by its
name. It ignores capital letters, spaces, and punctuation in the name. So Trade Date and TradeDate are the same column. The order of the columns has no effect.
IBKR's field list shows names with spaces, such as Trade Date. Public Flex Query
CSV files write the names without spaces, such as TradeDate. Two fields have a
different name in the CSV file. The table shows those names.
| Field | Use |
|---|---|
Symbol | Required |
Trade Date | Required, or Date/Time in its place |
Quantity | Required |
Trade Price | Required |
Strike | Required |
Expiry | Required |
Put/Call | Required |
Underlying Symbol | Checked when present |
Asset Class | Checked when present |
Currency or CurrencyPrimary | Checked when present |
Trade Time | Checked when present |
Date/Time | Checked when present |
Multiplier | Checked when present |
IB Commission | Checked when present |
Buy/Sell | Checked when present |
Open/Close Indicator | Checked when present |
IB Execution ID or IBExecID | Checked when present |
The checker ignores other columns. It also reads text output with a tab or pipe delimiter. It
skips the BOF, EOF, BOS, and EOS rows that IBKR
adds when the query includes header and trailer records.
A Flex Query can contain stock, cash, and option trades. When the file has an Asset Class column, the checker reads only the rows with the value OPT. It counts the other rows as skipped. When the query has more than one section,
each section starts with its own header row. The checker reads only the first trade section.
Settings in the Flex Query
- Select CSV as the output format.
- Turn on column headers. Without them, the checker cannot find the fields.
- Add the required fields to the Trades section.
- Add
IB Execution ID. The CSV file calls itIBExecID. With it, the checker can find exact duplicate fills. - Note the date format in the general settings. IBKR uses
yyyyMMddif you do not change it. Select the same format in the checker.
IBKR states that queries created after June 2019 have a Date/Time field and no Trade Time field. The checker accepts either form.
Worked example Synthetic example
The example file has 14 trade lines for an invented
underlying, SYNTH. It has no real account data. Its header row uses the field names
of a public Flex Query CSV file. It also has one stock trade. Most lines contain one deliberate
error. You can load it in the checker or download it above.
The checker reads 12 rows and reports 11 errors and 1 warning. 2 lines cannot be read.
| Line | Type | Message |
|---|---|---|
| 3 | Duplicate fill | Line 3 has the same IB Execution ID as line 2. The same fill appears twice. |
| 5 | Invalid value | Line 5: Trade Date "20261345" is not a real date in the format yyyyMMdd. |
| 5 | Invalid value | Line 5: Date/Time "20261345;102000" is not a real date and time in the format yyyyMMdd with HHmmss or HH:mm:ss. |
| 6 | Invalid value | Line 6: Trade Price "0,60" is not a number. Use a decimal point, such as 1.05. |
| 7 | Invalid value | Line 7: Quantity "1.5" is not a whole number of contracts. |
| 8 | Missing value | Line 8 has no Strike value. |
| 9 | Invalid value | Line 9: Symbol "SYNTH 261120C00050000" shows a strike of 50, but Strike is 55. |
| 10 | Invalid value | Line 10: Put/Call "X" is not C, P, Call, or Put. |
| 11 | Invalid value | Line 11: Expiry 2026-10-16 is before the trade date 2026-10-21. An option cannot trade after it expires. |
| 14 | Duplicate fill | Line 14 has the same symbol, date, time, quantity, and price as line 13. Check that it is not a duplicate fill. |
| 15 | Unreadable row | Line 15 has 7 values, but the header has 15. The checker cannot match its values to columns. |
| 16 | Unreadable row | Line 16 opens a quotation mark that does not close. The checker cannot read the file from this line. |
| — | Skipped row | 1 row is not an option trade (Asset Class STK). The checker did not check it. |
A missing column
Remove the Trade Price column from the first two trade rows of the example. The
checker then reports 2 errors. The first one is for the whole file:
The file has no "Trade Price" column. Add this field to the Trades section of the Flex Query.
The other errors are in the rows:
- Line 3 has the same IB Execution ID as line 2. The same fill appears twice.
What each problem means
- Missing field
- A required column is not in the header row. Add the field to the query and export again.
- Missing value
- A required column has an empty cell in a trade row.
- Invalid value
- A value has the wrong form. Examples are a date that does not exist, a price with a decimal
comma, a quantity that is not a whole number, and a
Put/Callvalue other than C or P. An OCC symbol that does not agree withStrike,Expiry, orPut/Callis also invalid. - Duplicate fill
- Two rows with the same
IB Execution IDare the same fill. That is an error. Two rows without an ID can have the same symbol, time, quantity, and price. That is a warning, because separate fills can have the same details. - Unreadable row
- The row has a different number of values than the header, or a quotation mark that does not close. The checker cannot match its values to columns.
- Skipped row
- The row is not an option trade. Examples are a repeated header, a trailer record, a stock trade, and a row in another section of the query.
- Unsupported layout
- The file is an IBKR Activity Statement. The checker cannot read that layout.
An OCC symbol uses the option symbol format of the Options Clearing Corporation. It contains the underlying, the expiry date, C or P, and the strike. The checker compares it with the other columns only when the symbol has that format.
Common questions
Does TradeRecount store my file?
No. The page reads the file in your browser. It does not send the file or its rows to a server. When you close the page, the data is gone.
Can I check an Activity Statement CSV?
Not yet. The checker finds this layout and stops with an error. Each Activity Statement row
starts with the section name, as in Trades,Data,Order. The columns have other
names, such as T. Price and Comm/Fee. Export a Flex Query with the
Trades section instead.
Why does every date show an error?
The date format in the checker is probably different from the format in your query. If one other format reads every trade date, the result tells you which one.
Why is a partial fill marked as a possible duplicate?
Without an execution ID, two fills at the same second, quantity, and price look the same. Add IB Execution ID to the query to remove this doubt.
Does the checker convert time zones?
No. It checks that each time is a real time. The IBKR pages that we read do not state the time zone of the trade time.
Does it work with other brokers?
No. It reads the IBKR field names only.
Limits of this check
- It checks the form of each value. It does not compare the trades with your IBKR account.
- It assumes that
Expiryuses the same date format asTrade Date. - It does not check that the quantity sign matches a buy or a sale.
- It does not read the Activity Statement layout or XML output.
- We compared the field names with public test files, not with an export from every account type. A header with a different word will not match.
- It reads at most 20,000 trade rows and files up to 5 MB.
Sources
The field names and settings come from these IBKR pages, read on 26 October 2026:
- Trades Flex Query fields
- Flex Query delivery and general configuration
- Statements and reports release notes archive
The CSV header names and value formats come from these public test files: