opbox

The billing.* family (2 verbs). Every verb enters through the one front door: it is capability-checked, permission-checked, scope-checked and audited before it runs (see Security & permissions). Each entry below lists its capability, risk class (which fixes the minimum autonomy level), the minimum caller permission, its availability tier, whether it is idempotent, and any outbound egress.

Getbilling.profile.get

PropertyValue
Capabilitymatter.read
Risk classRead - autonomy L0
Min. permissionMember
AvailabilityCore - always on (MCP tier 1)
IdempotentYes
EgressNone - in-box (pure Postgres, no outbound call)
Render schemaYes - drives an inline chat artefact and a GUI panel

Read the matter fee arrangement. { matterId }. A matter with no profile is FIXED_FEE by default (the absence IS the default; the panel always renders).

Input

FieldTypeRequiredDescription
matterIdstringyes

Call POST /v/billing.profile.get with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool billing.profile.get.

Setbilling.profile.set

PropertyValue
Capabilitymatter.write
Risk classWrite - autonomy L1
Min. permissionAdmin
AvailabilityVertical (MCP tier 3)
IdempotentYes
EgressNone - in-box (pure Postgres, no outbound call)

Author/replace the matter fee arrangement. { matterId, billingMode(FIXED_FEE|TIME|RETAINER), currency?, rateCardTableId?, rateCardRowId?, rateMinor?, billingIncrementMins?(=6), retainerAmountMinor?, retainerIncludedMins?, overageRateMinor?, retainerPeriod?(MONTHLY), retainerBillMode?(ALWAYS|ON_ACTIVITY) }. The STANDARD rate lives in the product library; rateCardTableId/rateCardRowId pin that row as frozen provenance, rateMinor is the per-matter OVERRIDE (subject to contract). TIME/RETAINER require a usable rate (override here, or a pinned rate-card resolved at roll-up); RETAINER requires the block terms.

Input

FieldTypeRequiredDescription
matterIdstringyes
billingModestringyes
currencystringno
rateCardTableIdstringnoPRODUCTS data_table id
rateCardRowIdstringnorate-card data_row id
rateMinorintegernoper-matter override, minor-units/hour
rateUnitstringnounit the rate is quoted in (default HOUR)
workdayMinsintegernominutes in a billable day for DAY rates (default 480)
billingIncrementMinsintegernodefault 6 (legal tenth-hour)
retainerAmountMinorintegerno
retainerIncludedMinsintegerno
overageRateMinorintegerno
retainerPeriodstringno
retainerBillModestringno

Call POST /v/billing.profile.set with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool billing.profile.set.