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
ruff check src/ tests/
pyright src/
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bursar-2.0.3.tar.gz.
File metadata
- Download URL: bursar-2.0.3.tar.gz
- Upload date:
- Size: 503.3 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d64b2bcb056b1a37acccd7c8c6c9a018aaa3989cb5987f29f8d1ea4433bc2a3e
|
|
| MD5 |
9302ba2a2d15bdef84c4506897f0bd03
|
|
| BLAKE2b-256 |
3cf84a8f350bd7bd632690a00f54d510878b71594c26eafb5543651829490a8d
|
File details
Details for the file bursar-2.0.3-py3-none-any.whl.
File metadata
- Download URL: bursar-2.0.3-py3-none-any.whl
- Upload date:
- Size: 450.9 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4b019b51aa5ee7f52b726120240a43f2348cb4b8b4d3cda1c1a30cc647a9c64
|
|
| MD5 |
6ccf8235040bcc0e5ee4faeb612d8dbb
|
|
| BLAKE2b-256 |
6e055a77a560d93c940819388750a8b28f8bac2ce1eced2cebb619373063c897
|