# DELETE /api/v2/sales-invoices/{sales_invoice}

Delete a sales invoice

- MCP id: sales-invoices.destroy
- Scope: api:destroy:sales_invoices
- Permission: sales_invoices::delete
- Needs the billing feature on your organisation
- Rate cost: 1 unit, write bucket.
- Cache-Control: private, no-store

Soft-deletes an invoice: it is only marked deleted, and POST `sales-invoices/{sales_invoice}/actions/restore` reverses that.

There is no permanent delete. A legacy invoice answers `409` `state-conflict` with reason `locked_by_legacy`, and an invoice that has already synced to the accounting system answers `409` with reason `locked_by_sync`: deleting it locally would leave the two systems silently out of step. Deleting an invoice releases its hours: every worklog settled against one of its rows is unlinked and returns to the uninvoiced pool, and restoring the invoice brings back its rows but not those links, so an integrator treating restore as an undo will invoice those hours twice. Deleting an already-deleted invoice answers `204`, so a retry is safe.

## Parameters
- sales_invoice (integer or string, path): The SalesInvoice's numeric id. Or its invoice_number, matching `[A-Z]+-[0-9]{2}-[0-9]{5}|L-[0-9]+`. Accepts a soft-deleted record.
- X-Request-Id (header, optional): A correlation id of your own. It is recorded in our logs next to the server's request id but never returned: the response header always carries the server's id. A value that does not match the pattern is discarded silently, never rejected.
- If-Match (header, optional): The ETag a write is conditional on. A stale validator is 412 precondition-failed.

## Response 204

## Errors
- 403 forbidden-by-policy | insufficient-permission | insufficient-token-scope: Forbidden.
- 409 state-conflict: Conflict.
- 412 precondition-failed: Precondition failed.
- 400 idempotency-key-required | invalid-cursor | invalid-query-parameter | malformed-request | unsupported-parameter: Bad request.
- 401 token-expired | unauthenticated: Unauthenticated.
- 404 endpoint-not-found | resource-not-found: Not found.
- 406 not-acceptable: Not acceptable.
- 429 rate-limit-exceeded: Too many requests.
- 500 internal-error: Server error.
- 503 tenant-unavailable: Service unavailable.

## Example
```bash
curl -X DELETE \
  'https://<your-url>/api/v2/sales-invoices/1' \
  -H 'Authorization: Bearer <token>' \
  -H 'Accept: application/json'
```
