Replace a draft invoice
The body is the whole draft. A line that states its id stays the line it was, with the work registered on it; a line that states none is new; a line of the invoice the body leaves out is removed. external_id left out stays as it is, and null clears it; auto_send left out stays as it is. Refused with INVOICE_ALREADY_ISSUED (409) once the invoice is issued, with ISSUE_IN_PROGRESS (409) while an issue attempt holds it, and with INVOICE_IS_OCCURRENCE (409) for an occurrence of a recurring series, which is changed through its series.
Authorization
bearerAuth An API key minted by an admin under Settings → Developers. It is bound to one company and has a scope: read, or read_write. A request without one, or with one that is not ours, is answered 401 and metered by its client address (x-rate-limits).
In: header
Path Parameters
The record's id, or ext:<external_id> for the record that carries your own key.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X PUT "https://example.com/invoices/string" \ -H "Content-Type: application/json" \ -d '{ "customer": "string", "currency": "str", "lines": [ { "product": "string", "recognition_method": "value", "assignees": [ { "user": "string" } ] } ] }'{ "object": "invoice", "id": "string", "external_id": "string", "customer_id": "string", "customer_name": "string", "currency": "string", "issue_date": "string", "title": "string", "auto_send": true, "layout_ref": "string", "status": "draft", "issued_at": "string", "platform_ref": "string", "platform_number": -9007199254740991, "send_error": { "reason": "string", "platform_reason": "string" }, "series_id": "string", "period_from": "string", "period_to": "string", "created_at": "string", "updated_at": "string", "lines": [ { "id": "string", "product_id": "string", "product_number": "string", "product_name": "string", "recognition_method": "value", "agreed_value": 0, "hourly_rate": 0, "discount": 0, "description_override": "string", "position": -9007199254740991, "assignees": [ { "user_id": "string", "distribution_percentage": 0, "hourly_rate_override": 0, "removed": true } ], "series_line_id": "string" } ]}Issue an invoice now POST
The accounting platform books and sends the invoice inside the request, and the answer is the issued invoice. It is the explicit "bill this one now": an invoice set not to send is issued all the same, and one with no date, or a date ahead, is dated today. **Sending it again is safe**: an invoice that is issued already is answered as it stands, 200, and nothing is booked twice. **A document that booked and could not be delivered is a 200** whose `send_error` says why: the invoice is in the books, so do not issue it again. Only a refusal to book is an error: `ISSUE_REFUSED` (422) carries the platform’s reason under `refusal`; `HOURLY_INCOMPLETE` and `NOTHING_TO_BILL` (409) say an hourly line is not ready; `CUSTOMER_GONE` and `PRODUCT_GONE` (409) that the platform no longer holds what the invoice names; `ISSUE_IN_PROGRESS` (409, with `Retry-After`) that another attempt holds the invoice. Metered against the `platform_write` bucket as well as `default`.
Delete a product DELETE
Refused with `DELETE_BLOCKED_BY_REFERENCES` (409) while a line of an invoice, a recurring series or a credit note of the company names the product: the platform is then not asked. Refused with `DELETE_BLOCKED_BY_BOOKINGS` (409) when the accounting platform holds bookings against the product. Either way nothing is deleted.