Schedule FA from Interactive Brokers — Step-by-Step
Updated 16 August 2026 · For ROR Indian residents · AY 2026-27
Interactive Brokers is the hardest broker to file Schedule FA from, and not because the data is missing. It is because IBKR gives you a report builder rather than a report — and the one setting that decides whether your export is usable at all is buried three levels down.
Watch: Schedule FA in 2 minutes — Interactive Brokers
1. Why IBKR is different from a stock-plan broker
If you hold RSUs through Fidelity NetBenefits or Charles Schwab, your account contains one company's shares, priced in dollars, administered by your employer. Almost every Schedule FA guide is written for that case.
An IBKR account breaks three of those assumptions at once:
- Many securities, not one. You chose them, so there is no employer record to fall back on.
- Many currencies. A euro ETF on Xetra and a US stock can sit side by side, and each converts to rupees at its own rate.
- Many asset classes. Options, futures, bonds, funds and forex live in the same account as your shares, and they do not all go in the same Schedule FA table — shares, ETFs, funds and bonds in A3, derivatives in D, and the cash balance inside A2's own figures.
There is also no employer stock-plan trust, so Table F does not apply to an IBKR account. That one is a relief rather than a complication.
2. Getting the file: Activity Statement or Flex Query
IBKR has no one-click "download my holdings" button like the stock-plan brokers. It has two reports that both carry everything, and either is fine. Pick on effort, not on correctness.
Option A — a custom Activity Flex Query (the one that carries dates)
Ten minutes of setup once, reusable every year afterwards, and it is the only report where IBKR will state each holding's purchase date.
- Log in to interactivebrokers.com
- Performance & Reports → Flex Queries → Activity Flex Query → +
- Under Sections (Select Multiple) — a long alphabetical list with no select-all — tick four: Cash Report and Cash Transactions near the top, Open Positions about two-thirds down, Trades near the bottom. Cash Report is what states your closing cash balance; the two furthest down the list are the ones people scroll past
- Click a section to open its panel. The top row is labelled Options — tick every box in it. This is the step that matters; see the next section for what it does
- Below Options is the column list — hit Select All there. Note that it covers columns only and does not touch the Options row above it
- Save the query, then click Run on it. The dates are chosen here, not while building it: Period Custom Date Range, 1 January – 31 December of the year you are filing for, Format CSV
- Download
- Sold anything between 1 January and 31 March of the following year? Run a second query for just that quarter — Trades and Cash Transactions only this time, leaving out Open Positions and Cash Report (those two must stay dated 31 December) — Period 1 January – 31 March, Format CSV, uploaded alongside the first. Schedule CG follows India's April–March year, so those sales still belong to this filing; the query above never reaches them.
Option B — the annual Activity Statement (no setup, but bring every year)
This is the statement you probably already run — four clicks, nothing to configure. What it will not give you is a purchase date: its Open Positions section is a summary, one row per symbol, and there is no lot-detail setting in the report to turn that into per-lot rows. The dates have to come from its Trades section instead, which only works if the trades reach back to when you bought.
- Performance & Reports → Statements → Activity
- Period Annual (1 January – 31 December), Cash Report Detail Totals Only — not the Securities/Futures breakdown, which adds extra per-currency rows on top of the total and would double it — then Download CSV
- Run it once for every year back to when you first bought what you still hold — and upload all of those CSVs together
Option C — let IBKR's AI build the query Beta
The Flex Queries page now carries a Configure with AI box: describe the report and it configures one for you. It gets the part people get wrong — all four sections, and both Options rows — right without you hunting through the list. Paste this and press Generate:
Activity Flex Query in CSV. Sections: Trades at Closed Lots, Open Positions at Lot, Cash Transactions, Cash Report. Include ISIN, Listing Exchange, Open Date Time and Level of Detail fields.
The box caps you at 200 characters, which is why the wording is so terse. Two phrasings to avoid: asking for all fields times the generator out, and writing "Fields: …" makes it treat your list as the only fields to include — that one strips Quantity and Cost Basis out of Open Positions and leaves you with an export that cannot fill Table A3.
- It names the query with commas, and IBKR refuses to save that name — rename it
first or Save fails with a raw
NAME_INVALID_CHARSerror. - It leaves Period on Last Business Day. Choose Custom Date Range when you run it, exactly as in Option A.
- Read the query before running it: Open Positions must show
Options: Lotand TradesOptions: Closed Lots.
This is IBKR's feature and it is new, so treat it as a shortcut rather than a guarantee. Across our own runs it picked the four sections and both Options rows correctly every time, but the extra fields it includes varied between runs — which is why the check above matters. Option A is the same query built by hand and is not going anywhere.
Either way, each CSV that comes out carries holdings, sales, dividends and cash interest together — there is nothing else to download.
3. The Options row everyone misses
Schedule FA needs a date of acquisition for every holding. IBKR will give you one — but only if you ask correctly.
Open Date Time column but leaves every value blank.Trades offers "Execution", "Closed Lots" and four more. An execution-level trade row has no acquisition date even when it closes a position; only the closed-lot rows carry one. Without it your holdings file fine and every sale is lost, so Schedule CG comes out empty.
Simplest: tick every box in both. The extra summary rows are duplicates of the lot rows and are dropped on upload, so there is nothing to weigh up — and it saves picking the right two out of eight.
The row is labelled Options, not "level of detail", and sits above the column list in each section's panel. Both default to Summary/Execution. The Activity Statement has neither — see below.
This is the single most common reason an IBKR export cannot be used. The file looks complete — the columns are all there — and every acquisition date in it is empty.
What a Summary-level Flex Query looks like (note the trailing empty field):
Symbol,ISIN,Quantity,CostBasisPrice,LevelOfDetail,OpenDateTime
VWCE,IE00BK5BQT80,1,142.78,SUMMARY,
The same query at Lot level:
Symbol,ISIN,Quantity,CostBasisPrice,LevelOfDetail,OpenDateTime
VWCE,IE00BK5BQT80,1,142.78,LOT,12/05/2024;11:17:45
Same query, same fields, one checkbox apart. If you have already downloaded a Flex Query file and the dates are blank, you do not need a different report — tick those two boxes and run the same query again.
Why the Activity Statement has no such checkbox
Running a statement offers period, date, crypto activity, multi-account format, cash report details, language and format — and nothing else. There is no level of detail to set, and its Open Positions section does not even carry a date column to leave blank:
Open Positions,Header,DataDiscriminator,Asset Category,Currency,Symbol,Quantity,Mult,Cost Price,Cost Basis,Close Price,Value,Unrealized P/L,Code
Open Positions,Data,Summary,Stocks,USD,AMZN,12,1,178.41,2140.92,231.5,2778,637.08,
So a statement's dates are reconstructed from its Trades section instead — every purchase, with its date and cost, replayed oldest-shares-sold-first, which is the order IBKR itself matches in. That only reaches as far back as the trades you upload, which is why the statement route asks for every year since you bought. The rebuild is checked against the quantity and cost basis IBKR states at each statement's own period end, and any symbol that disagrees — shares from a merger, a transfer in, a REIT's return of capital written off the cost basis — is named rather than filed on a guessed date. If it's still a current holding this isn't the end of it: the review page asks you for that one date yourself, rather than dropping the holding outright.
4. Which table each holding goes in
| Table | What goes in it | Needs peak value? |
|---|---|---|
| A2 | The IBKR account itself — one row-set, with peak and closing balance and the income credited (dividends, interest and sale proceeds each on their own row) | Yes |
| A3 | Each holding of equity or debt, one row per lot — shares, ETFs, mutual funds and bonds alike | Yes |
| D | Options, futures, warrants — capital assets that are not equity or debt | No |
| F | Not applicable to IBKR — there is no stock-plan trust | — |
Table A2 describes the account, A3 itemises the holdings inside it. Both are required; they are not alternatives. The same dividend appears in both — once in A2 as an amount credited to the account, once in A3 against the share that paid it. That is the form working as intended, not double-counting.
A3's full name in the ITR-2 schema is DtlsForeignEquityDebtInterest —
"Foreign Equity and Debt Interest". The debt half is easy to miss, and it is
why a bond does not need a table of its own.
5. Multi-currency: one rate per currency
Rule 115 converts foreign income at the SBI telegraphic transfer buying rate for the currency the income is actually in. A euro holding uses SBI's EUR rate. A Hong Kong listing uses the HKD rate.
Converting everything through the dollar is a silent error: a euro figure billed at the USD rate is wrong by the whole cross-rate difference, and nothing on the face of the return shows it. If a currency has no SBI TTBR published at all, the honest answer is to report that holding separately with your CA rather than approximate it.
One more subtlety: the peak value Schedule FA asks for is the highest rupee value the holding reached. The rupee moves independently of the share price, so for a stable-NAV holding — a short-bond ETF, say — the peak is driven almost entirely by the exchange rate, not the price. More on Rule 115 →
6. The country is the issuer's, not the exchange's
Table A3 asks for the country where the company is registered. Not where the share trades, and not the currency you paid in. Three real examples from one account:
| Holding | Country reported | Listed on | Currency |
|---|---|---|---|
| Accenture plc | Ireland | NYSE | USD |
| Endeavour Mining | Cayman Islands | Toronto | CAD |
| iShares Core MSCI World | Ireland | Xetra | EUR |
All three differ across all three columns. The ISIN is what settles
it — the first two characters are the country of registration, so
IE00B4L5Y983 is Ireland whatever exchange or currency it traded in. That
is why the Flex Query field list above includes ISIN.
Most low-cost world ETFs held by Indian investors are Irish or Luxembourgish, chosen deliberately to limit US estate-tax exposure. Reporting them as US holdings is a common and avoidable error.
7. Bonds, coupons and the cash in your account
Two things sit in an IBKR account that a stock-plan account never has, and both are routinely left out of Schedule FA.
Bonds go in Table A3, beside the shares
A Treasury bill, a Treasury note, a corporate bond — all of them are debt interest, which is half of what Table A3 is for. They are not a Table D asset and they are not out of scope. The row asks for the same things a share's row does: acquisition date, initial value, peak value, closing value, income, and proceeds if you sold or it matured.
Two details trip people up. First, a bond is quoted per 100 of face value, so 1,000 face at a price of 101.30 is worth 1,013.05 — not 101,300. Second, the entity named on the row is the issuer, because a bond has no company profile to look up: "United States Treasury", or whoever's paper it is.
A coupon is income on the bond's own A3 row
CBDT's step-by-step Schedule FA guide describes Table A3 as carrying
"gross interest paid" for debt instruments, and the ITR-2 schema makes
TotGrossAmtPaidCredited a required field on every A3 row with no
nature-of-income qualifier attached. So a bond that paid you a coupon reports it there,
exactly as a share reports its dividend.
Watch the sign on one row in particular. When you buy a bond between coupon dates you pay the seller the interest they earned before you owned it — IBKR labels it "Purchase Accrued Interest" and writes it as a negative. That is money out, not income: it is not A3 income and it is not Schedule OS income either. Schedule FA disclosure is separate from where the interest is taxed, which is still Schedule OS.
Your cash balance is part of the Table A2 closing balance
Table A2 reports the account's balance, and an account's balance includes the uninvested cash sitting in it — a dividend you never reinvested, a sale you have not redeployed. Summing your holdings alone understates the one figure the Black Money Act cares most about. It is usually a small percentage, and it is also the easiest thing in the whole schedule to get right.
A statement states cash at the start and end of the period and nowhere in between, so the closing balance can take it and the peak balance honestly cannot. If your cash balance was much higher earlier in the year, put the account's true peak in the Peak Balance override rather than leaving a figure the file cannot support. Interest credited on that cash is income: it belongs on its own Table A2 row, under nature of amount "Interest", not folded into the dividend figure.
8. Options and futures
Options and futures are foreign capital assets and carry the same disclosure obligation as shares — but they belong in Table D, not A3. An option is neither equity nor debt interest.
Table D is, helpfully, the easier table: it asks for no peak balance and no closing value, only the date of acquisition, the amount invested and the income derived. That matters, because an expired contract has no price history to compute a peak from.
9. Three files look similar — which one you have
IBKR can hand you three different CSV layouts, and they are easy to confuse. Check the first two columns of your file:
| First line looks like | What you have | Usable? |
|---|---|---|
Statement,Header,... | Annual Activity Statement | Yes — it carries no acquisition dates itself, so upload every year back to your first purchase and they are rebuilt from the trades |
HEADER,TRNT,... | Flex Query, several sections | Yes, if Open Positions had Lot ticked in its Options row — at the default Summary it carries no acquisition dates |
ClientAccountID,Currency,... | Flex Query, single section | Yes, but only covers that one section. Several of these pasted into one file work too |
All three are accepted. The thing that matters is not which layout you have, but
whether the acquisition date has values in it. In a Flex Query that is
OpenDateTime, blank unless the section was run at lot level. An Activity
Statement has no such column at all, so its dates come from the trade history in the
statements you upload together.
10. A worked example, in rupees
One euro holding, start to finish, so you can check the arithmetic against your own file. VWCE, an Ireland-domiciled world ETF, bought on Xetra:
| ISIN | IE00BK5BQT80 → country reported: Ireland (not Germany, not the US) |
| Acquired | 12 May 2024 — cost €142.78 |
| Initial value | €142.78 × SBI EUR TTBR on 12 May 2024 |
| Peak value | Highest rupee value across the year — see below |
| Closing value | Units × 31 Dec price × SBI EUR TTBR on 31 Dec |
Every rate here is the EUR TTBR. Using the USD rate — even correctly looked up — gives a figure that is wrong by the whole EUR/USD cross rate, and nothing on the return would show it.
Why the peak is a rupee number, not a price number
Schedule FA asks for the peak value, and value is measured in rupees. Since the rupee moves independently of the share price, the day your holding was worth the most in rupees is often not the day the price peaked.
This matters most for stable-NAV holdings. A short-duration bond ETF barely moves in price, so its rupee peak is driven almost entirely by the exchange rate — checking a sample of these across 2025, taking the price peak instead of the rupee peak understated the figure by up to 7%. For a volatile stock the two usually coincide; for a treasury ETF they rarely do.
11. Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| No holdings found in the file | Query has no Open Positions section, or it is at Summary | Add the section, tick every box in its Options row. From an Activity Statement instead: upload every year back to your first purchase |
| Holdings appear but sales are missing | Trades section is at Execution only | Tick Closed Lots in the Trades Options row. From an Activity Statement instead: upload the years in which you bought what you sold |
| A few symbols are named as left out | Their shares moved by something a trade list does not record — a merger, a transfer in, a return-of-capital adjustment — so a rebuilt date could not be proved against IBKR's own figures | If it's still a holding, date it yourself on the review page — that's usually the fastest fix. A sale of one has no such fallback: run a Flex Query at lot level, where IBKR states its date itself, or report it with your CA |
| A holding shows a value of zero | No price could be retrieved — usually a company delisted or acquired mid-year | Enter its share price from your statement when prompted |
| A holding is missing entirely | Its currency has no SBI TTBR, or its exchange could not be priced | Check the notes on the review page — each exclusion is named |
| Country looks wrong | ISIN field was not included in the query | Add ISIN, or correct the country on the review page |
| Dates are seven months out | Ambiguous slash dates (12/05 is 12 May or 5 Dec) | Set the Flex Query date format to yyyyMMdd |
12. Common mistakes
- Running a Flex Query at Summary level — no acquisition dates, unusable file. Tick every box in the Options row of both Open Positions and Trades.
- Uploading one year's Activity Statement for shares bought earlier — a statement states no acquisition dates, so they are rebuilt from its trades; a year that does not contain the purchase cannot date it.
- Using 31 March as the closing date — Schedule FA follows the calendar year, so it is 31 December.
- Converting everything at the USD rate — each currency has its own SBI TTBR.
- Reporting an Irish ETF as a US holding — the ISIN, not the exchange, decides the country.
- Leaving options out entirely — they are disclosable in Table D.
- Leaving bonds out, or putting them in Table D — Table A3 is equity and debt interest, and that is where a Treasury or corporate bond belongs.
- Reporting a bond's face value as its value — a bond is priced per 100 of face, so 1,000 face at 101.30 is 1,013.05.
- Forgetting the cash balance — Table A2 reports the account, and the account includes the cash in it.
- Reporting interest as dividend in Table A2 — nature of amount is a single code per row, and interest has its own.
- Skipping Table A2 — the account itself is disclosed separately from the holdings in it.
- Assuming no income means no disclosure — Schedule FA is a disclosure obligation, not an income one. A holding that paid nothing is still reported.