One shape for lists, one rule for deletes, Location on every create
Every list now answers data.<plural> (+ data.pagination where the server paginates), deletes answer 204 unless the body genuinely informs, DELETE products/bulk takes ?ids= instead of a body, and every single-resource 201 carries a Location header to its canonical GET.
Every list now answers data.<plural> (+ data.pagination where the server paginates), deletes answer 204 unless the body genuinely informs, DELETE products/bulk takes ?ids= instead of a body, and every single-resource 201 carries a Location header to its canonical GET.
Endpoints
- DELETE/v1/companies/{company_id}/customers/{customer_id}Now answers 204 with no body
- DELETE/v1/companies/{company_id}/representationNow answers 204 with no body
- DELETE/v1/companies/{company_id}/products/bulkIDs move from the request body to ?ids= (max 100)
- PUT/v1/configuration/series/{series_id}Deprecated; use PATCH /v1/companies/{company_id}/series/{series_id}
Tell a voided invoice from a totally rectified one, without a second call
Every voided invoice now carries `void_cause`, `void_reason` and `voided_at`. `VOIDED` was reachable two ways — a direct void, or a TOTAL corrective issued over the invoice — and until now telling them apart meant looking for a corrective invoice yourself. The fields come back on the invoice object, both on the single read and on every row of the list.
Filter invoices by several statuses at once
The `status` filter on `GET /v1/invoices` now accepts a comma-separated list, so a single paginated request can return invoices in any of several statuses.