Skip to main content

Bursar Python SDK for AI credits and usage billing

PyPI PyPI downloads

Bursar logo

The Python SDK for Bursar. It meters usage, prices operations, and manages balances against the shared canonical PostgreSQL schema and the same versioned configuration document as the JavaScript SDK. Python 3.12 and 3.13 are supported.

Installation

python -m pip install "bursar[postgres]"

Extras: postgres (default recommended), stripe or dodo for that payment provider, s3 (optional billing archive), google-adk (model-call admission and settlement plugin), and test (dev/test tooling).

Apply the SQL baseline before starting an application:

export BURSAR_MIGRATION_DATABASE_URL=postgresql://bursar_migrator@db.example.com/bursar
bursar migrate

bursar migrate applies the ordered SQL files, records checksums, and is safe to re-run. Use a dedicated migration principal; applications connect with a separate least-privilege runtime principal. See the CLI guide for the separate migration, operator, and application credentials.

Usage

from decimal import Decimal

from bursar import Bursar, PostgresStore

store = PostgresStore(
    database_url,
    tenant_id=tenant_id,
    provider_environment="test",
)
bursar = Bursar(credit_store=store)

grant = bursar.credits.add_credits(
    user_id,
    Decimal("500"),
    entry_type="purchase",
    idempotency_key="checkout:42",
)
charge = bursar.credits.deduct_credits(
    user_id,
    Decimal("20"),
    idempotency_key="job:42",
)
refund = bursar.credits.refund_credits(charge.entry_id, idempotency_key="refund:job:42")

page = bursar.credits.list_ledger_entries(user_id, limit=25)
while page.next_cursor is not None:
    page = bursar.credits.list_ledger_entries(user_id, limit=25, cursor=page.next_cursor)

LedgerEntry, LedgerCursor, and LedgerPage are available from bursar.credits.types; pagination is cursor-only. PostgresStore is the production, tenant-scoped store; CreditStore is the abstract base for custom implementations.

Publish one versioned configuration document through the facade — billing and auto-recharge read the same active document:

bursar.catalog.publish_and_activate(config)

Optional S3 and ClickHouse storage

PostgreSQL remains authoritative. S3 and ClickHouse are optional delivery targets, managed by create_bursar_runtime from bursar.storage:

from bursar.storage import BursarRuntimeOptions, create_bursar_runtime

runtime = create_bursar_runtime(
    BursarRuntimeOptions(
        postgres=os.environ["DATABASE_URL"],
        operator_postgres=os.environ["BURSAR_OPERATOR_DATABASE_URL"],
        tenant_id=os.environ["BURSAR_TENANT_ID"],
        provider_environment="test",
    )
)
runtime.start()
bursar = runtime.bursar

With no S3/ClickHouse configuration the runtime creates no background worker and analytics query PostgreSQL directly. See the storage guide for the full S3 and ClickHouse setup.

Development

cd python
uv sync --group dev        # runtime + dev/test deps
uv run pytest              # full suite; integration tests need Postgres
uv run ruff check src/ tests/ scripts/
uv run pyright src/ --warnings

Real-Postgres tests resolve DATABASE_URL when BURSAR_ALLOW_DATABASE_RESET=1, else spin up a disposable PostgreSQL 17 + pg_partman 5 + pg_jsonschema 0.3 testcontainer. See CONTRIBUTING.md.

License

AGPL-3.0.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bursar-2.0.4.tar.gz (538.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bursar-2.0.4-py3-none-any.whl (454.7 kB view details)

Uploaded Python 3

File details

Details for the file bursar-2.0.4.tar.gz.

File metadata

  • Download URL: bursar-2.0.4.tar.gz
  • Upload date:
  • Size: 538.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for bursar-2.0.4.tar.gz
Algorithm Hash digest
SHA256 07e2776e027656688d6e38fb93a4c7d76c603720fc60c1cfd0f3218ac2581cd4
MD5 567c9ded699d1a993f9abdc3e55af501
BLAKE2b-256 571ac2e1f3d6fd2988945ce73d337f633c316c30f9760080fe48249cf37a94ae

See more details on using hashes here.

File details

Details for the file bursar-2.0.4-py3-none-any.whl.

File metadata

  • Download URL: bursar-2.0.4-py3-none-any.whl
  • Upload date:
  • Size: 454.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for bursar-2.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 d0479de4a95f6d3ff7d923e6b78a6adb623a3517fb77472ae9f2f69f344baf80
MD5 2c304358969931e0bbd86ea2a384a4b0
BLAKE2b-256 e38bcb8f3be086e99728cffa3ee41cc7e8aa5d50a8019572be34cffb13174552

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

2.0.4 This release

2 files

2.0.3

2 files

2.0.2

2 files

2.0.1

2 files

2.0.0

2 files

1.0.1

2 files

1.0.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page