py-ibkr
A modern, Pydantic-based parser for Interactive Brokers (IBKR) Flex Query reports.
This version replaces the legacy ibflex library with strict type checking and improved support for newer IBKR XML fields.
Features
- Pydantic Models: All data is parsed into typed Pydantic models with validation.
- Robust Parsing: Handles "messy" IBKR data (e.g., legacy enums like
Deposits/Withdrawals, inconsistent date formats). - Forward Compatible: Designed to handle new fields gracefully.
Installation
uv pip install py-ibkr
# or
pip install py-ibkr
Command Line Interface
py-ibkr includes a CLI for downloading Flex Queries, built on
treaty so scripts and AI agents get a stable contract.
export PY_IBKR_TOKEN=your_token # or --token-from-file PATH / --token-from-env VAR
export PY_IBKR_QUERY_ID=your_query_id # or -q / --query-id, or query_id in .py-ibkr.toml
# Download the query's default period
py-ibkr download -o report.xml
# Download a date range (YYYY-MM-DD or YYYYMMDD)
py-ibkr download -o jan.xml --from-date 2026-01-01 --to-date 2026-01-31
- Output: the report is written to
-o/--output; stdout carries a JSON envelope (plain text at a terminal) with the path, size, and the date range actually requested.--format idprints only the path - Dates: IBKR accepts weekdays only and has no data for today, so weekend ends move inward and a to-date of today or later is capped at yesterday, each with a warning in the envelope
- Secrets: the token is never accepted on the command line and is redacted from all output
- Exit codes:
2invalid arguments (nothing was sent),4missing query ID or output directory,10IBKR stopped responding (--request-timeout),11rate limited,79token or query rejected,80locked out after failed attempts,81report still generating after--max-retries,82other IBKR errors - Discovery:
py-ibkr manifestandpy-ibkr download --schemadescribe every flag, output field, and exit code;-v/--verbosebecomes--verbose,-vvbecomes--debug
Setup: Obtaining your Token and Query ID
To use the automated downloader, you must enable the Flex Web Service in your Interactive Brokers account:
- Log in to the IBKR Client Portal.
- Navigate to Performance & Reports > Flex Queries.
- Obtain Token: Click the gear icon or Flex Web Service Configuration. Enable the service and copy the Current Token.
- Obtain Query ID: Create a new Flex Query (e.g., Activity). After saving it, the Query ID will be visible in the list of your Flex Queries.
Usage
Downloading a Flex Query Report
You can automatically download reports using the FlexClient. This requires a Token and Query ID from the IBKR Client Portal.
from py_ibkr import FlexClient, parse
# 1. Initialize the client
client = FlexClient()
# 2. Download the report (handles the request-poll-fetch protocol)
xml_data = client.download(
token="YOUR_IBKR_TOKEN",
query_id="YOUR_QUERY_ID"
)
# 3. Parse the downloaded data
response = parse(xml_data)
print(f"Query Name: {response.queryName}")
Parsing a Flex Query File
for statement in response.FlexStatements: print(f"Account: {statement.accountId}")
# Access Trades
for trade in statement.Trades:
print(f"Symbol: {trade.symbol}, Quantity: {trade.quantity}, Price: {trade.tradePrice}")
# Access Cash Transactions
for cash_tx in statement.CashTransactions:
print(f"Type: {cash_tx.type}, Amount: {cash_tx.amount}")
### Models
You can import models directly for type hinting:
```python
from py_ibkr import Trade, CashTransaction
def process_trade(trade: Trade):
print(trade.symbol)
Metadata
Release files for py-ibkr 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| py_ibkr-0.2.0.tar.gz | 28.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| py_ibkr-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 48.8 kB
Release files / py_ibkr-0.2.0.tar.gz
| Download URL | py_ibkr-0.2.0.tar.gz |
|---|---|
| Size | 28.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1f750f1fe0f0fa8c4ae78146b765f2edaee71bbf6acca2e173a3169a3795590c
|
|
BLAKE2b-256 checksum How to use checksums |
d72eea0c7f22a1da8fcac00981af06b68e21086c3e57bf1344e270773c8dbff4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.20 {"installer":{"name":"uv","version":"0.12.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / py_ibkr-0.2.0-py3-none-any.whl
| Download URL | py_ibkr-0.2.0-py3-none-any.whl |
|---|---|
| Size | 20.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
78dd5b460d62c002f31981ab04abb338d77a4a88318b8d85b46192bbe5e09add
|
|
BLAKE2b-256 checksum How to use checksums |
451303a6636ea06c8004b9eb5fad54fff615b35869f374c14024c7f11fb882b3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.20 {"installer":{"name":"uv","version":"0.12.20","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|