Records a staff add-on on the case: quantity of the SKU at its price or at unitAmountCentsOverride. With comped the item is waived at once; otherwise a SKU billed immediately is charged right away and the rest wait for the daily sweep. Sending the same requestId again returns the existing item instead of charging twice. Returns 404 for an unknown case or when its organization has no billing profile and 400 when the SKU cannot be priced. Super admin only.
Body
Required
-
Values are
collection.phone,collection.social,collection.email,collection.ai-chat,collection.financial,collection.discord,collection.reddit,collection.linkedin,collection.legal,collection.file,collection.other,case.flat,case.pro-upgrade,addon.kit-rental,addon.laptop-rental,addon.laptop-rental-setup,addon.managed-service,addon.shipping,addon.live-bank,plan.base,source.per,ai.tokens-overage,adjustment.manual, oradjustment.discount. -
Minimum value is
1. -
Client-supplied dedup token — repeating the same requestId for the same case+SKU returns the existing row untouched
-
Required audit reason — persisted on the BillingEvent
-
Create the row already COMPED (never swept/invoiced) instead of billable
-
Per-item price override — only honored for addon.shipping/adjustment.manual (negative allowed on adjustment.manual only)
curl \
--request POST 'http://api.example.com/admin/cases/{caseId}/billing-items' \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"skuKey": "collection.phone",
"quantity": 42.0,
"requestId": "string",
"reason": "string",
"comped": true,
"unitAmountCentsOverride": 42.0
}'
{
"skuKey": "collection.phone",
"quantity": 42.0,
"requestId": "string",
"reason": "string",
"comped": true,
"unitAmountCentsOverride": 42.0
}
{
"data": {
"id": "65a1b2c3d4e5f6a7b8c9d0e9",
"caseId": "65a1b2c3d4e5f6a7b8c9d0e2",
"skuKey": "addon.shipping",
"status": "PENDING",
"description": "Admin add-on: addon.shipping",
"quantity": 1,
"unitAmountCents": 2500,
"amountCents": 2500,
"informational": false,
"listAmountCents": 42.0,
"adminNote": "string"
},
"statusCode": 201,
"timestamp": "2026-01-15T10:15:00.000Z"
}