aiodukeenergy-co
Source Code: https://github.com/crash0verride11/aiodukeenergy
Asyncio Duke Energy
Installation
Install this via pip (or your favourite package manager):
pip install aiodukeenergy-co
Usage
Duke Energy uses Auth0 with CAPTCHA protection which blocks automated logins. Authentication requires a browser-based OAuth flow using a Chrome extension to capture the mobile app's custom redirect URL.
Setup
-
Add the appropriate extension for your browser:
chrome-extension
- Download the latest chrome-extension.zip from releases (or use
./chrome-extension/from source) - Extract the zip file
- Open Chrome and navigate to
chrome://extensions/ - Enable "Developer mode"
- Click "Load unpacked" and select the extracted folder
safari-extension
Requires XCode and a free developer account
- Download the latest safari-extension.zip from releases (or use
./safari-extension/from source) - Extract the zip file
- Open the Xcode project
- Go to project settings and set your free developer account as the 'Team' for both Targets (
com.local.duke-energy-oauth-helperandcom.local.duke-energy-oauth-helper.Extension). Also ensure 'Signing Certificate' is set to 'Development' - Quit Safari if open and build the extension
- Open Safai and enable the extension in Safari settings
- Build the extension again
- Enable access to all URLs or a specific URL (https://login.duke-energy.com) in the extension settings
- Download the latest chrome-extension.zip from releases (or use
-
Run the browser authentication script:
cd examples python browser_auth.py
-
The script will:
- Open your browser to Duke Energy's login page
- After you log in, the extension captures the authorization code
- Exchange the code for API tokens
- Save tokens to
duke_tokens.json
Using Tokens
Once you have tokens, use them with the library:
import asyncio
import aiohttp
from aiodukeenergy_co import Auth0Client, DukeEnergy, DukeEnergyAuth
async def main():
# Option 1: Load from token file
import json
with open("duke_tokens.json") as f:
tokens = json.load(f)
async with aiohttp.ClientSession() as session:
auth0_client = Auth0Client(session)
auth = DukeEnergyAuth(
session,
auth0_client,
access_token=tokens["access_token"],
refresh_token=tokens.get("refresh_token"),
id_token=tokens.get("id_token"),
)
client = DukeEnergy(auth)
accounts = await client.get_accounts()
print(accounts)
meters = await client.get_meters()
for serial, meter in meters.items():
print(f"Meter: {serial} ({meter['serviceType']})")
asyncio.run(main())
Browser OAuth Flow (Programmatic)
You can also integrate the OAuth flow into your own application:
import asyncio
import webbrowser
import aiohttp
from aiodukeenergy_co import Auth0Client, DukeEnergy, DukeEnergyAuth
async def main():
async with aiohttp.ClientSession() as session:
auth0_client = Auth0Client(session)
auth = DukeEnergyAuth(session, auth0_client)
# Step 1: Get authorization URL with PKCE
auth_url, state, code_verifier = auth0_client.get_authorization_url()
# Step 2: Open browser for user login
webbrowser.open(auth_url)
# Step 3: Get the authorization code (captured by Chrome extension)
code = input("Enter the authorization code: ")
# Step 4: Exchange code for tokens
await auth.authenticate_with_code(code, code_verifier)
# Now you can make API calls
client = DukeEnergy(auth)
accounts = await client.get_accounts()
print(accounts)
asyncio.run(main())
Available Classes
Auth0Client- OAuth2/OIDC client for Duke Energy's Auth0get_authorization_url()- Generate browser OAuth URL with PKCE (returns url, state, code_verifier)exchange_code(code, code_verifier)- Exchange authorization code for tokensrefresh_token(refresh_token)- Refresh expired tokens
AbstractDukeEnergyAuth- Abstract base class for auth providersasync_get_id_token()- Get a valid ID token (abstract)async_get_access_token()- Get a valid access tokenrequest(method, url, **kwargs)- Make authenticated requests
DukeEnergyAuth- Concrete auth implementation using Auth0Clientauthenticate_with_code(code, code_verifier)- Complete OAuth flowtoken- Property to get current token dictionary
DukeEnergy- API client for Duke Energyget_accounts()- Get all accountsget_meters()- Get all metersget_energy_usage(meter_serial, interval, view, start_date, end_date)- Get usage dataget_invoices(account_number)- Get the account's invoice list (most recent first)get_billing_payment_info(include_closed=True)- Get billing/payment info per account (balance, dueDate, abbreviatedBillStatus, ...)get_monthly_usage(meter_serial, period, start_date)- Get summarized usage/bill comparison (this period, last period, same period last year). ForBILLINGCYCLE, passstart_date= latest invoicebillEndDate+ 1 day (derive once viaget_invoicesand reuse across meters on the account)
Contributors ✨
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!
Credits
This package was created with Copier and the browniebroke/pypackage-template project template.
Release files for aiodukeenergy-co 1.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aiodukeenergy_co-1.2.1.tar.gz | 17.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aiodukeenergy_co-1.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 35.4 kB
Release files / aiodukeenergy_co-1.2.1.tar.gz
| Download URL | aiodukeenergy_co-1.2.1.tar.gz |
|---|---|
| Size | 17.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
42c90d109888d93f2c155fe3a9f9bf3fc100f629b7bb7417d60b43072fa9c5f6
|
|
BLAKE2b-256 checksum How to use checksums |
9ba70dbeb050d4eead07e76370348355b766678b325a274b9ef071e55aa52a6b
|
| 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 Sep 17, 2026.
Transparency logRelease files / aiodukeenergy_co-1.2.1-py3-none-any.whl
| Download URL | aiodukeenergy_co-1.2.1-py3-none-any.whl |
|---|---|
| Size | 17.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6f094fa0285379e4c91f21f254394106f8483159dd1196eca14157c3a99d114c
|
|
BLAKE2b-256 checksum How to use checksums |
9dec15beec8bbc44abff4914414217bc989cbfcf05816a82245aca81f45c3879
|
| 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 Sep 17, 2026.
Transparency log