Unofficial Desjardins AccèsD wrapper — track your balance, credit cards, transactions, and statements from Python
Project description
desjardins-py
Disclaimer: This project is not affiliated with, endorsed by, or in any way connected to Desjardins Group. It is an independent, unofficial tool that interacts with Desjardins' web interface through browser automation. Use at your own risk. Your credentials are never transmitted anywhere other than Desjardins' own servers.
Personal use only. This project is intended solely for personal, non-commercial use. You may not redistribute, sublicense, or use it as part of a product or service.
Unofficial Desjardins AccèsD wrapper for Python. Track your balance, credit cards, transactions, and statements. Pipe the data anywhere you need it.
Features
- Fetch accounts, credit cards, transactions, and statement metadata from AccèsD
- Returns typed Pydantic models — work with your data directly in Python
- Persist to SQLite, MySQL, or PostgreSQL with a single
save()call - Incremental fetching — only imports transactions newer than the last run
- Export to CSV or XLSX with
to_csv()/to_excel() - Persistent browser session — saves the session after the first OTP verification so subsequent runs are unattended
How it works
- Opens a headless Chromium browser to log into your AccèsD account and obtain a valid session token
- Intercepts the accounts API response to collect
BankAccountandCreditCardrecords - Calls the Desjardins REST API directly (reusing the session token) to fetch transactions and statement metadata for each account
- Returns a typed
FetchResultcontaining all fetched data. Use it directly in your code or persist it to a database
Usage
Once fetched, your data is plain Python objects — use them however you like:
- Budget automation — categorize transactions and trigger alerts when spending thresholds are hit
- Power BI / Tableau — load into a database and connect a live report on top of it
- Excel / Google Sheets — export with
to_excel()orto_csv()and refresh your spreadsheet on a schedule - Custom dashboards — pipe into any Python data stack (pandas, Plotly, Streamlit, etc.)
- Notifications — send a daily summary to Slack, email, or a home automation system
Installation
With pip
pip install desjardins-py
playwright install chromium
With uv
uv sync
uv run playwright install chromium
Examples
Basic fetch and inspect data
No database required. Credentials are passed directly.
from desjardins_py import DesjardinsClient
client = DesjardinsClient(
card_number="your_card_number",
password="your_password",
)
result = client.fetch()
# result.accounts → list[BankAccount]
# result.cards → list[CreditCard]
# result.transactions → list[Transaction]
# result.card_transactions → list[CardTransaction]
# result.statements → list[Statement]
for account in result.accounts:
print(account.name, account.amount, account.currency)
for tx in result.transactions:
print(tx.effective_date, tx.description, tx.amount)
On the first run you will be prompted for an OTP verification code in the terminal. Subsequent runs reuse the saved session in .session/.
Persist to SQLite
from desjardins_py import DesjardinsClient
client = DesjardinsClient(
card_number="your_card_number",
password="your_password",
)
client.connect_db("sqlite:///accesd.db")
result = client.fetch()
result.save() # inserts only transactions newer than the last fetch
Persist to PostgreSQL
pip install desjardins-py[postgres] # or: uv sync --extra postgres
from desjardins_py import DesjardinsClient
client = DesjardinsClient(
card_number="your_card_number",
password="your_password",
)
client.connect_db("postgresql+psycopg2://user:password@localhost:5432/accesd")
result = client.fetch()
result.save()
For MySQL:
pip install desjardins-py[mysql]and usemysql+pymysql://user:password@localhost:3306/accesd.
Export to XLSX
from desjardins_py import DesjardinsClient
client = DesjardinsClient(
card_number="your_card_number",
password="your_password",
)
result = client.fetch()
result.to_excel("accesd.xlsx") # one sheet per table
result.to_csv("./export") # one CSV file per table
OTP
When you log in for the first time (or after your saved session expires), Desjardins sends a one-time security code by SMS. By default, desjardins-py pauses and waits for you to type it in the terminal:
OTP code: ██████
Once entered, the session is saved to your profile_dir (default ./.session) and subsequent runs are fully unattended.
Automatic OTP with OTPCatcher
On macOS, you can have the library read the SMS code from the Messages app automatically by passing catch_otp=True:
client = DesjardinsClient(
card_number="your_card_number",
password="your_password",
catch_otp=True,
)
Requirements:
- macOS only — OTPCatcher reads from
~/Library/Messages/chat.db, which only exists on macOS. - iMessage / SMS sync enabled — your iPhone must be set up to forward SMS messages to your Mac via Settings → Messages → Text Message Forwarding.
- Full Disk Access — the process running the script (Terminal, iTerm2, your IDE, or the Python interpreter) must be granted Full Disk Access under System Settings → Privacy & Security → Full Disk Access. Without it, the database read will fail with a
PermissionError.
OTPCatcher polls the Messages database for up to 10 attempts (10-second intervals) and looks for any SMS containing "Votre code de sécurité AccèsD est" received within the last 30 seconds.
DesjardinsClient parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
card_number |
str |
— | Your AccèsD card number |
password |
str |
— | Your AccèsD password |
verbose |
bool |
True |
Print INFO-level logs to stdout |
profile_dir |
str |
'./.session' |
Directory used to persist the browser session across runs |
catch_otp |
bool |
False |
Automatically read the OTP from the macOS Messages app (see OTP) |
Database schema
| Table | Description |
|---|---|
bank_accounts |
Chequing / savings accounts |
credit_cards |
Credit cards and lines of credit |
transactions |
Bank account transaction history |
card_transactions |
Credit card transaction history |
statements |
Statement metadata (name, date, size) |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file desjardins_py-0.1.1.tar.gz.
File metadata
- Download URL: desjardins_py-0.1.1.tar.gz
- Upload date:
- Size: 87.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45b3e9eb14a49759c403b49b00fc9ffdcde1bf49f41dfafe221c040f2d504537
|
|
| MD5 |
0cd4cc418788b7059d67cebe7ea16965
|
|
| BLAKE2b-256 |
b1d723f449e832e849a54f16f7bb4bc2b6fefc22817bcfb9e69c884eb5bd38c5
|
Provenance
The following attestation bundles were made for desjardins_py-0.1.1.tar.gz:
Publisher:
release.yml on MaximBacar/desjardins-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
desjardins_py-0.1.1.tar.gz -
Subject digest:
45b3e9eb14a49759c403b49b00fc9ffdcde1bf49f41dfafe221c040f2d504537 - Sigstore transparency entry: 1888633278
- Sigstore integration time:
-
Permalink:
MaximBacar/desjardins-py@1e582d1e4e79bc10fd79cdb5b1531b8ef7f9d5c8 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/MaximBacar
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1e582d1e4e79bc10fd79cdb5b1531b8ef7f9d5c8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file desjardins_py-0.1.1-py3-none-any.whl.
File metadata
- Download URL: desjardins_py-0.1.1-py3-none-any.whl
- Upload date:
- Size: 14.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6412057493898ae6ca8a3ac297f506040f5c0f9479794665f8d40afbd8d9b0eb
|
|
| MD5 |
4ab0aa1f1c0bc95a23f26798f23c60b5
|
|
| BLAKE2b-256 |
931d8e177d3191a4640e0967cbbd0a2ea099f8eac8bf8925fdd5f6d2093e4cbd
|
Provenance
The following attestation bundles were made for desjardins_py-0.1.1-py3-none-any.whl:
Publisher:
release.yml on MaximBacar/desjardins-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
desjardins_py-0.1.1-py3-none-any.whl -
Subject digest:
6412057493898ae6ca8a3ac297f506040f5c0f9479794665f8d40afbd8d9b0eb - Sigstore transparency entry: 1888633448
- Sigstore integration time:
-
Permalink:
MaximBacar/desjardins-py@1e582d1e4e79bc10fd79cdb5b1531b8ef7f9d5c8 -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/MaximBacar
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1e582d1e4e79bc10fd79cdb5b1531b8ef7f9d5c8 -
Trigger Event:
push
-
Statement type: