MethodPathSummaryAuth
GET/v1/admin/billing/accountsList tenant balances for manual administrationSession
GET/v1/admin/billing/accounts/{id}/ledgerList immutable entries for a selected tenant balanceSession
GET/v1/admin/billing/adjustmentsList manual billing adjustment approval requestsSession
POST/v1/admin/billing/adjustmentsPropose an MFA-bound manual tenant balance adjustmentSession
GET/v1/admin/billing/adjustments/{id}Read one billing adjustment approval requestSession
POST/v1/admin/billing/adjustments/{id}/approveApprove and atomically post another operator's adjustmentSession
POST/v1/admin/billing/adjustments/{id}/cancelCancel a pending adjustment from the original proposal sessionSession
POST/v1/admin/billing/adjustments/{id}/rejectReject another operator's adjustmentSession

Contract file:api/openapi/v1/control.yaml

Operation details

GET /v1/admin/billing/accounts

List tenant balances for manual administration

operationId
listBillingAccounts
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Requires billing.adjustments.manage in a platform scope. Accounts without entries are returned with a zero balance and revision one.

Parameters

listBillingAccounts Parameters
NameInTypeRequiredDescription
pagequeryintegerNo—
limitqueryintegerNo—
searchquerystringNo—
scope_idsqueryarray<string(uuid)>NoOptional comma-separated set of 1–100 distinct canonical, nonzero tenant scope UUIDs. Intersects the existing search and active-tenant filters before pagination. Unknown, platform and inactive scopes produce no rows; omission preserves the unfiltered behavior. Requires the same billing.adjustments.manage permission as the account list. Reading never creates accounts or postings.

Responses

listBillingAccounts Responses
StatusDescription
200Tenant balance page ordered by tenant name.

Fields:items: array<BillingAccount> total: integer(int64) page: integer limit: integer

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
500The request could not be completed because of an internal failure.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/billing/accounts/{id}/ledger

List immutable entries for a selected tenant balance

operationId
listBillingAccountLedger
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Requires billing.adjustments.manage in a platform scope. The identifier must resolve to a tenant billing account; a valid tenant account with no postings returns an empty page.

Parameters

listBillingAccountLedger Parameters
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
pagequeryintegerNo—
limitqueryintegerNo—

Responses

listBillingAccountLedger Responses
StatusDescription
200Newest-first ledger page for the selected tenant account.

Fields:items: array<BillingLedgerEntry> total: integer(int64) page: integer limit: integer

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
404The requested resource was not found.
500The request could not be completed because of an internal failure.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/billing/adjustments

List manual billing adjustment approval requests

operationId
listBillingAdjustments
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Requires billing.adjustments.propose or billing.adjustments.approve in a platform scope. Pending and expired are derived from the immutable proposal expiry when no terminal decision exists.

Parameters

listBillingAdjustments Parameters
NameInTypeRequiredDescription
pagequeryintegerNo—
limitqueryintegerNo—
statequerystring: pending / approved / rejected / cancelled / expiredNo—

Responses

listBillingAdjustments Responses
StatusDescription
200Newest-first immutable adjustment request page.

Fields:items: array<BillingAdjustment> total: integer(int64) page: integer limit: integer

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/admin/billing/adjustments

Propose an MFA-bound manual tenant balance adjustment

operationId
proposeBillingAdjustment
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Requires billing.adjustments.propose in a platform scope and a max_uses=1 MFA proof bound to the proposal. This operation never changes a balance; a different operator must approve it.

Parameters

proposeBillingAdjustment Parameters
NameInTypeRequiredDescription
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

proposeBillingAdjustment Request body
NameTypeRequiredDescription
account_idstring(uuid)Yes—
directionstring: credit / debitYes—
amount_minorinteger(int64)Yes—
reasonstringYes—
expected_account_revisioninteger(int64)Yes—
step_up_tokenstringYes—

Responses

proposeBillingAdjustment Responses
StatusDescription
201Immutable pending proposal created, or the exact stored response replayed.

Fields:id: string(uuid) target_scope_id: string(uuid) target_tenant_id: string(uuid) target_account_id: string(uuid) direction: string: credit / debit amount_minor: integer(int64) currency: string reason: string expected_account_revision: integer(int64) state: string: pending / approved / rejected / cancelled / expired revision: integer(int64) proposed_by_scope_id: string(uuid) proposed_by_user_id: string(uuid) proposed_at: string(date-time) expires_at: string(date-time) decision?: BillingAdjustmentDecision

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
404The requested resource was not found.
409The requested state conflicts with an existing resource or idempotency fact.
415Content-Type must be exactly application/json without parameters.
503A required dependency is unavailable.
500The request could not be completed because of an internal failure.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.
  • 500 Outcome unknown: read back by ID or list first, then decide whether to retry with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/billing/adjustments/{id}

Read one billing adjustment approval request

operationId
getBillingAdjustment
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

getBillingAdjustment Parameters
NameInTypeRequiredDescription
idpathstring(uuid)Yes—

Responses

getBillingAdjustment Responses
StatusDescription
200Current immutable proposal and optional terminal decision.

Fields:id: string(uuid) target_scope_id: string(uuid) target_tenant_id: string(uuid) target_account_id: string(uuid) direction: string: credit / debit amount_minor: integer(int64) currency: string reason: string expected_account_revision: integer(int64) state: string: pending / approved / rejected / cancelled / expired revision: integer(int64) proposed_by_scope_id: string(uuid) proposed_by_user_id: string(uuid) proposed_at: string(date-time) expires_at: string(date-time) decision?: BillingAdjustmentDecision

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
404The requested resource was not found.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/admin/billing/adjustments/{id}/approve

Approve and atomically post another operator's adjustment

operationId
approveBillingAdjustment
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Description (from the contract)

Requires billing.adjustments.approve, If-Match revision one, and a separate max_uses=1 MFA proof. Proposal, decision, double-entry postings, balance, audit, and replay receipt commit atomically.

Parameters

approveBillingAdjustment Parameters
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
If-MatchheaderstringYes—
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

approveBillingAdjustment Request body
NameTypeRequiredDescription
expected_revisioninteger(int64)Yes—
step_up_tokenstringYes—

Responses

approveBillingAdjustment Responses
StatusDescription
200Approved terminal request or exact stored replay.

Fields:id: string(uuid) target_scope_id: string(uuid) target_tenant_id: string(uuid) target_account_id: string(uuid) direction: string: credit / debit amount_minor: integer(int64) currency: string reason: string expected_account_revision: integer(int64) state: string: pending / approved / rejected / cancelled / expired revision: integer(int64) proposed_by_scope_id: string(uuid) proposed_by_user_id: string(uuid) proposed_at: string(date-time) expires_at: string(date-time) decision?: BillingAdjustmentDecision

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
404The requested resource was not found.
409The requested state conflicts with an existing resource or idempotency fact.
415Content-Type must be exactly application/json without parameters.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/admin/billing/adjustments/{id}/cancel

Cancel a pending adjustment from the original proposal session

operationId
cancelBillingAdjustment
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

cancelBillingAdjustment Parameters
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
If-MatchheaderstringYes—
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

cancelBillingAdjustment Request body
NameTypeRequiredDescription
expected_revisioninteger(int64)Yes—

Responses

cancelBillingAdjustment Responses
StatusDescription
200Cancelled terminal request or exact stored replay.

Fields:id: string(uuid) target_scope_id: string(uuid) target_tenant_id: string(uuid) target_account_id: string(uuid) direction: string: credit / debit amount_minor: integer(int64) currency: string reason: string expected_account_revision: integer(int64) state: string: pending / approved / rejected / cancelled / expired revision: integer(int64) proposed_by_scope_id: string(uuid) proposed_by_user_id: string(uuid) proposed_at: string(date-time) expires_at: string(date-time) decision?: BillingAdjustmentDecision

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
404The requested resource was not found.
409The requested state conflicts with an existing resource or idempotency fact.
415Content-Type must be exactly application/json without parameters.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/admin/billing/adjustments/{id}/reject

Reject another operator's adjustment

operationId
rejectBillingAdjustment
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

The contract has no separate permission annotation; see the description below and the 403 response.

Parameters

rejectBillingAdjustment Parameters
NameInTypeRequiredDescription
idpathstring(uuid)Yes—
If-MatchheaderstringYes—
Idempotency-KeyheaderstringYes—

Request body

application/json · Required:Yes

rejectBillingAdjustment Request body
NameTypeRequiredDescription
expected_revisioninteger(int64)Yes—
step_up_tokenstringYes—

Responses

rejectBillingAdjustment Responses
StatusDescription
200Rejected terminal request or exact stored replay.

Fields:id: string(uuid) target_scope_id: string(uuid) target_tenant_id: string(uuid) target_account_id: string(uuid) direction: string: credit / debit amount_minor: integer(int64) currency: string reason: string expected_account_revision: integer(int64) state: string: pending / approved / rejected / cancelled / expired revision: integer(int64) proposed_by_scope_id: string(uuid) proposed_by_user_id: string(uuid) proposed_at: string(date-time) expires_at: string(date-time) decision?: BillingAdjustmentDecision

400The request body or parameters are invalid.
401Authentication failed or the session is invalid.
403The authenticated principal is not allowed to perform the action.
404The requested resource was not found.
409The requested state conflicts with an existing resource or idempotency fact.
415Content-Type must be exactly application/json without parameters.
503A required dependency is unavailable.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list