📱 HeyTelecom Python Library
"I just want my usage data" Edition 🚀
Quick Install | Getting Started | API Reference | Features | Contributing
Automate your Hey! Telecom account. Get usage, invoices, and more without lifting a finger.
⚠️ Unofficial library. Use against your own account only and respect Hey Telecom's terms of service. The portal sits behind Imperva/Incapsula; automated access may occasionally fail.
📦 Quick Install
Requires Python 3.9+.
pip install heytelecom
🏠 Home Assistant Integration
This whole project was basically an excuse to get my data into Home Assistant.
How it works now:
- The Library: Pure Python — no browser, no heavy dependencies. Just
requests+ OAuth2. - The Integration: A lightweight HA component that talks to the library and creates sensors.
🛠️ Getting Started
from heytelecom import HeyTelecomClient, APIError, AuthenticationError
with HeyTelecomClient(email="your@email.com", password="your_password") as client:
client.login()
account_data = client.get_account_data()
print(f"You have {len(account_data.products)} products.")
if account_data.latest_invoice:
print(f"Latest invoice: €{account_data.latest_invoice.amount_eur}")
Credentials can also be supplied via environment variables in example.py
(HEY_EMAIL / HEY_PASSWORD).
📖 API Reference
HeyTelecomClient(email=None, password=None)
| Method | Returns | Notes |
|---|---|---|
login() |
str (access token) |
Required before data calls unless you only construct the client after obtaining a token another way. |
get_account_data(use_cache=True) |
AccountData |
Products + latest invoice (fetched in parallel). |
get_products(use_cache=True) |
list[Product] |
Mobile usage fetched in parallel per line. |
get_latest_invoice(use_cache=True) |
Invoice | None |
None if the account has no invoices. |
get_invoices() |
list[Invoice] |
Full invoice list (not cached). |
get_benefits() |
raw JSON | Passthrough of the benefits endpoint. |
get_profile_products() |
raw JSON | Passthrough of profile products. |
invalidate_cache() |
None |
Drop TTL cache entries. |
clear_credentials() |
None |
Wipe email/password from memory. Auto re-login on token expiry will then fail until login() is called again. |
close() |
None |
Close the HTTP session (also via context manager). |
Models
AccountData:provider,products,latest_invoice—.to_dict()skipsNone/empty lists.Product:product_id,product_type(mobile/internet/ …),phone_number,easy_switch_number,tariff,contract,usage.UsageData:period,data(used/limitin GB),calls,sms_mms.Invoice:invoice_id,amount_eur,status,paid,date,due_date.Contract:price_per_month_eur.
Exceptions
| Exception | When |
|---|---|
HeyTelecomError |
Base class |
AuthenticationError |
Login failed, missing auth, 401/403, token expired without credentials |
APIError |
Network failure, non-2xx (with .status_code), non-JSON / Incapsula HTML, unexpected payload shape |
from heytelecom import HeyTelecomClient, APIError, AuthenticationError
try:
with HeyTelecomClient(email=..., password=...) as client:
client.login()
print(client.get_products())
except AuthenticationError as e:
print("Auth problem:", e)
except APIError as e:
print("API problem:", e, "status=", e.status_code)
Caching & tokens
- Product inventory and latest invoice are cached for 60 seconds (in-memory TTL).
- Access tokens expire after ~1 hour; the client renews ~5 minutes early using
expires_infrom the token response, via a full email/password re-login (the public web client does not expose a refresh-token grant). - After
clear_credentials(), expired tokens raiseAuthenticationErrorinstead of re-login.
🤖 How it Works
- The Setup: We use requests (plain HTTP) — no browser needed. Just OAuth2 with PKCE, exactly like the web app does.
- The Login: Authenticates via the same OIDC flow the browser uses — email/password → BFF auth endpoint → authorization code → access token.
- The Grab: Calls the same BFF JSON APIs the web app uses to get products, usage, and invoices.
- The Result: You get nice, clean Python objects to play with. No more parsing HTML yourself!
See the research folder for sanitized reverse-engineering notes.
✨ Features
- Auto Login: Handles the OAuth2/PKCE auth flow automatically.
- Token Refresh: Re-authenticates transparently when the access token expires (while credentials remain available).
- Product Info: Mobile, Internet, whatever you got.
- Usage Stats: Data (GB), Calls, SMS.
- Invoices: Latest + full list.
- Typed errors:
APIError/AuthenticationErrorwith optional HTTP status.
📖 The Story (or "Why?")
So, here's the tea. I wanted to integrate my mobile usage into my dashboard. I checked for an API. Crickets.
The official API is not public, but I reverse-engineered the web app's traffic using a HAR capture (see the research folder). The e-care portal uses standard OAuth2/PKCE + a set of BFF JSON endpoints, so I rebuilt the whole flow with plain HTTP requests — no browser required.
Now I can graph my data usage and feel guilty about it in real-time.
🤝 Contributing
Found a bug? Want to add a feature? PRs are welcome.
pip install -e ".[dev]"
ruff check src/ tests/
ruff format src/ tests/
pytest
See CHANGELOG.md for release notes.
Made with ❤️ and a lot of debugging.
Metadata
Release files for heytelecom 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| heytelecom-0.2.2.tar.gz | 26.0 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| heytelecom-0.2.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 44.4 kB
Release files / heytelecom-0.2.2.tar.gz
| Download URL | heytelecom-0.2.2.tar.gz |
|---|---|
| Size | 26.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6ad1a09c9af50c309a77947ec71666ae2a42e788735b1722ef40f4cfc85bc5f7
|
|
BLAKE2b-256 checksum How to use checksums |
662117c8d8de3cba5ac579701adf625c986949b62cbc23efafba7fa746025c37
|
| 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 Jul 31, 2026.
Transparency logRelease files / heytelecom-0.2.2-py3-none-any.whl
| Download URL | heytelecom-0.2.2-py3-none-any.whl |
|---|---|
| Size | 18.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a9468aa847515370fc86ec0a7fa92271633f2618601246465ca66e9e0a59f54a
|
|
BLAKE2b-256 checksum How to use checksums |
5efdd9481df16db0570b8c15e062062aa306d8bbcbcd94680a59754b2e482b61
|
| 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 Jul 31, 2026.
Transparency logSecurity for heytelecom 0.2.2
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for heytelecom-0.2.2.tar.gz
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 Jul 31, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.