Credits Cards

Transactions and charge order

Apply atomic and idempotent Credits changes through Transactions and Entries.

Every Topup or Charge creates one CreditsTransaction. Each affected Card produces an immutable CreditsTransactionEntry; Entries are also the ledger.

await bureau.credits.charge({
  user_id: "user_123",
  credits: 250_000,
  source: "model_usage",
  ref: "request_456",
  idempotency_key: "model_usage:request_456",
});

Automatic charges consume active Ephemeral Cards by earliest expiration, then the Primary Card. A selected Card charge never spills into another Card. Insufficient credits return 402 without a partial charge.