Write off an invoice
POST/billing/invoices/:id/write-off
Marks an unpaid invoice as written_off with a reason. Paid or cancelled invoices cannot be written off. Emits invoice.write_off. Requires the invoice:write-off permission.
Request
Responses
- 200
- 201
- 400
- 401
- 403
- 404
- 409
- 429
- 500
Updated Invoice in written_off status.
Resource created. Body follows the shared { data, meta } envelope; data is the newly-created resource.
Invoice is paid, cancelled, or reason missing.
Missing or invalid access token.
Caller lacks the required permission.
Invoice not found.
The request conflicts with the current state of the target resource — a duplicate unique field on registration, an idempotency-key replay with a different payload, or a webhook eventId that has already been processed. error.code may be CONFLICT or IDEMPOTENCY_CONFLICT depending on the cause.
Rate limit exceeded. Global default is 120 requests/minute per IP; auth-flow, OTP, self-registration, WebAuthn, IRA lookup, and public-lead endpoints carry tighter per-endpoint limits. Retry after the delay indicated by the Retry-After header.
Response Headers
Seconds to wait before retrying.
Unhandled server error. The response carries a meta.requestId correlator you can hand to platform operations to trace the failure through structured logs and the hash-chained audit trail. Retry with the same Idempotency-Key header if the endpoint accepts idempotency.