Skip to main content

pgw-api

Python API client for Philadelphia Gas Works (PGW). Fetches natural gas usage data (monthly, daily, and hourly) from the PGW customer portal.

Installation

pip install pgw-api

Usage

import asyncio
import aiohttp
from pgw_api import PGWApiClient

async def main():
    client = PGWApiClient("your-email@example.com", "your-password")

    async with aiohttp.ClientSession(cookie_jar=aiohttp.CookieJar()) as session:
        usage = await client.async_get_usage(session)

        for entry in usage:
            print(f"{entry.month:%B %Y}: {entry.ccf} CCF ({entry.cf} ft³)")
            if entry.period_start and entry.period_end:
                print(f"  Period: {entry.period_start} to {entry.period_end}")

asyncio.run(main())

API

PGWApiClient(username, password)

Creates a client instance with PGW portal credentials.

await client.async_get_usage(session)

Authenticates and returns a list of GasUsage objects sorted by month (newest first).

await client.async_get_daily_usage(session, start, end)

Authenticates and returns a list of DailyGasUsage objects for the given date range (newest first). Requires a smart meter — most residential accounts only have monthly data and will return an empty list.

from datetime import date

daily = await client.async_get_daily_usage(session, date(2024, 1, 1), date(2024, 1, 31))
for entry in daily:
    print(f"{entry.date}: {entry.ccf} CCF")

await client.async_get_hourly_usage(session, usage_date)

Authenticates and returns a list of HourlyGasUsage objects for a single day (newest first). Requires a smart meter that reports interval data. Most residential accounts only have monthly data and will return an empty list.

from datetime import date

hourly = await client.async_get_hourly_usage(session, date(2024, 1, 15))
for entry in hourly:
    print(f"{entry.timestamp}: {entry.ccf} CCF")

await client.async_validate_credentials(session)

Validates credentials without fetching usage data. Returns True or raises PGWAuthError.

GasUsage

Property Type Description
month date First of the billing month
ccf float Usage in hundreds of cubic feet
cf float Usage in cubic feet (CCF × 100)
period_start date | None Meter read start date
period_end date | None Meter read end date

DailyGasUsage

Property Type Description
date date Usage date
ccf float Usage in hundreds of cubic feet
cf float Usage in cubic feet (CCF × 100)

HourlyGasUsage

Property Type Description
timestamp datetime Usage timestamp
ccf float Usage in hundreds of cubic feet
cf float Usage in cubic feet (CCF × 100)

Exceptions

  • PGWAuthError — invalid credentials or expired session
  • PGWConnectionError — network or portal issues
  • PGWError — base exception class

Release files for pgw-api 1.2.1

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

Source distribution (sdist)

Source distribution for pgw-api 1.2.1
File Size Uploaded
pgw_api-1.2.1.tar.gz 10.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pgw-api 1.2.1
File Interpreter ABI Platform
pgw_api-1.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 18.9 kB

Release files / pgw_api-1.2.1.tar.gz

Download URL pgw_api-1.2.1.tar.gz
Size 10.9 kB
Tags Source
SHA-256 checksum
How to use checksums
fd708f2837c6e97d98977c7d9d20619d7e4538304e6fd76a01cd307feb339bc8
BLAKE2b-256 checksum
How to use checksums
2ac7991fd887ca153b8dac5f7bb1e16cd548a2461233ede75662d700721d7982
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 9, 2026.

Transparency log

Release files / pgw_api-1.2.1-py3-none-any.whl

Download URL pgw_api-1.2.1-py3-none-any.whl
Size 7.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1b93dc860d4d048a162b1cdd2ccdacc5a6d779b94194590d7a15e857139e19e9
BLAKE2b-256 checksum
How to use checksums
683a272a6e0de8e6918c46bb5f2f646f3764c8c5e522cfa4193b249839f58dbd
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 9, 2026.

Transparency log

Release history Release notifications | RSS feed

1.4.0

2 release files

1.3.1

2 release files

This release

1.2.1 This release

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

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