Deze referentie is alleen in het Engels. Naar het Nederlandse REST API-overzicht

Diese Referenz gibt es nur auf Englisch. Zur deutschen REST-API-Übersicht

Cette référence existe uniquement en anglais. Aller à la présentation de l'API REST en français

Esta referencia solo está en inglés. Ir a la introducción de la API REST en español

DELETE/sales-invoices/{sales_invoice}

Delete a sales invoice

DELETEhttps://<your-url>/api/v2/sales-invoices/{sales_invoice}

MCP id sales-invoices.destroyAlso on this path: GET Read a sales invoice, PATCH Update a sales invoice

View as Markdown openapi.json

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

Access

Token scope
api:destroy:sales_invoices

Without it: 403 insufficient-token-scope.

Permission
sales_invoices::delete

Without it: 403 insufficient-permission.

Feature
Needs the billing feature on your organisation.

Without it: 404 endpoint-not-found.

Rate cost
1 unit, write bucket.
Also
Accepts If-Match. Never cached: private, no-store. Unknown query parameters are refused, never ignored.

Both are checked, scope first. A token never does more than its user. How access is checked

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.

Path parameters

sales_invoiceinteger or stringRequired

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.

Request headers

X-Request-Idstringpattern

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-Matchstring

The ETag a write is conditional on. A stale validator is 412 precondition-failed.

Response 204

Returns no content.

Headers

RateLimit
The IETF httpapi-ratelimit-headers form of your remaining allowance on the tightest bucket this request touched.
RateLimit-Policy
The ceiling and window of that bucket, as <limit>;w=<seconds>.
X-Request-Id
The server-generated ULID correlating this response with our logs.

Every response also carries Cache-Control, Vary, X-Content-Type-Options, X-Plnnrly-Api-Version, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Headers and versioning

Errors

7 errors every operation can return: 400, 401, 404, 406, 429, 500, 503

This path allows GET, PATCH, DELETE. Anything else answers 405.