Bursar Python SDK for AI credits and usage billing
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.
Metadata
Release files for bursar 2.0.4
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 | Actions |
|---|---|---|---|---|
| bursar-2.0.4.tar.gz | 538.2 kB | Without provenance | Details for bursar-2.0.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| bursar-2.0.4-py3-none-any.whl | Python 3 | none | any | Details for bursar-2.0.4-py3-none-any.whl |
Total release size: 992.8 kB
Release files / bursar-2.0.4.tar.gz
| Download URL | bursar-2.0.4.tar.gz |
|---|---|
| Size | 538.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
07e2776e027656688d6e38fb93a4c7d76c603720fc60c1cfd0f3218ac2581cd4
|
|
BLAKE2b-256 checksum How to use checksums |
571ac2e1f3d6fd2988945ce73d337f633c316c30f9760080fe48249cf37a94ae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Release files / bursar-2.0.4-py3-none-any.whl
| Download URL | bursar-2.0.4-py3-none-any.whl |
|---|---|
| Size | 454.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d0479de4a95f6d3ff7d923e6b78a6adb623a3517fb77472ae9f2f69f344baf80
|
|
BLAKE2b-256 checksum How to use checksums |
e38bcb8f3be086e99728cffa3ee41cc7e8aa5d50a8019572be34cffb13174552
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is 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}
|
Security for bursar 2.0.4
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A 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.