Skip to main content

Xfina Logo

Xfina (Python Bindings)

Crates.io PyPI npm

Xfina is a blazingly fast library for parsing Indian financial statements (Bank Accounts, Credit Cards, Mutual Funds) and international brokers (IBKR), written in Rust and exposed to Python via PyO3.

It converts raw PDFs, Excel files, and CSVs into structured, ReBIT-compliant JSON dictionaries in milliseconds.

Installation

pip install xfina

Quick Start

The Python bindings expose the exact same parsing functions as the Rust core. To keep the core parsing logic as pure functions without side-effects (like file I/O), the library requires raw bytes to be passed in rather than file paths.

Parsing a Credit Card Statement

import xfina
import os

filename = "icici_cc_statement.xls"

with open(filename, "rb") as f:
    file_bytes = f.read()

result = xfina.parse_icici_cc(
    file_bytes, 
    filename=filename,
    modified_timestamp=int(os.path.getmtime(filename))
)

print(f"Validation Status: {result['validation']['overall']}")

Parsing a Bank Statement (Excel)

import xfina
import os

filename = "hdfc_statement.xls"
modified_ts = int(os.path.getmtime(filename))

# Read the file as raw bytes
with open(filename, "rb") as f:
    file_bytes = f.read()

# Parse it! Providing the filename and modified timestamp helps improve parsing accuracy
result = xfina.parse_hdfc_ba(
    file_bytes, 
    password=None, 
    filename=filename,
    modified_timestamp=modified_ts,
    format="xfina"
)

# The returned dictionary contains both the validation report and the financial data
print(f"Validation Status: {result['validation']['overall']}")
print(f"Account Name: {result['data']['profile']['holders']['holder'][0]['name']}")

Parsing a CAMS Mutual Fund Statement (PDF)

import xfina
import json

with open("cams_cas.pdf", "rb") as f:
    file_bytes = f.read()

# Pass the password to decrypt the PDF
mf_data = xfina.parse_cams(file_bytes, password="PAN1234567")

# It returns a standard Python dictionary. You can easily dump it to JSON:
with open("output.json", "w") as f:
    json.dump(mf_data, f, indent=2)

Parsing an IBKR Statement (CSV)

import xfina

# All parsers now uniformly expect raw bytes, even for CSVs
with open("ibkr_activity.csv", "rb") as f:
    file_bytes = f.read()

result = xfina.parse_ibkr(file_bytes, format="rebit")

Available Parsers

All parsers return a structured Python dictionary that mirrors the ReBIT JSON schema. Each parser accepts an optional format parameter which defaults to "xfina", but can be "rebit" for strict AA schema compliance without our extended data fields.

Category Institution Format Python Function Input Type
Bank Account HDFC .xls parse_hdfc_ba(bytes, **kwargs) bytes
Bank Account ICICI .xls parse_icici_ba(bytes, **kwargs) bytes
Bank Account SBI PDF parse_sbi_ba(bytes, **kwargs) bytes
Bank Account BOB .xls parse_bob_ba(bytes, **kwargs) bytes
Bank Account Axis .xls parse_axis_ba(bytes, **kwargs) bytes
Credit Card HDFC CSV parse_hdfc_cc(bytes, **kwargs) bytes
Credit Card ICICI .xls parse_icici_cc(bytes, **kwargs) bytes
Mutual Funds CAMS PDF parse_cams(bytes, **kwargs) bytes
Intl Stocks IBKR CSV parse_ibkr(bytes, **kwargs) bytes

Note: All Python functions accept the following optional keyword arguments: password, filename, modified_timestamp, and format.

Release files for xfina 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for xfina 0.3.0
File Interpreter ABI Platform
xfina-0.3.0-cp311-cp311-manylinux_2_34_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ x86-64 Details

Release files / xfina-0.3.0-cp311-cp311-manylinux_2_34_x86_64.whl

Download URL xfina-0.3.0-cp311-cp311-manylinux_2_34_x86_64.whl
Size 2.6 MB
Tags CPython 3.11 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
a2c37a8c267279926639f8362c3407fae2de015bdd501919ddcb827d7bf66ae8
BLAKE2b-256 checksum
How to use checksums
f21c46daf935a090208d34ef72b8c4ef01ff31b31180fe6ebe0d9e7b778dabfc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 27, 2026.

Transparency log

Release history Release notifications | RSS feed

0.7.0

6 release files

0.6.1

6 release files

0.6.0

6 release files

0.5.0

6 release files

0.4.1

6 release files

0.4.0

5 release files

This release

0.3.0 This release

1 release file

0.2.4

1 release file

0.2.3

1 release file

0.2.2

1 release file

0.2.1

1 release file

0.1.4

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page