API breaking changes
This page lists the v1 API changes that break an integration already in place: a renamed key, a removed key, a call now refused. Entries are dated and ordered from the most recent to the oldest.
If your integration stopped working without anything changing on your side, start here, then go back to the page of the resource concerned.
30 September 2026: a handover Scribee refuses before anything is sent answers 422, no longer 202
What changes
On POST /api/v1/payment_batches/{id}/submit, when Scribee cannot build the request to the payment provider on its side, the call used to answer a 202 carrying a failed batch. It now answers a 422 validation_failed, exactly like the refusal of a batch the channel cannot express as it stands: details.instructions carries the refusal message, nothing was sent to the provider, and the Idempotency-Key is not consumed. The batch still moves to failed, with submission_refused_by at local.
Two additions come with this change, removing nothing:
- the batch publishes
submission_refused_by:provider,localornull; - an instruction of a
failedbatch that carries no status from the bank publishessubmission_failed, no longersubmitted, andpayment_instruction.updatedannounces that move.
The resources concerned
POST /api/v1/payment_batches/{id}/submitandGET /api/v1/payment_batches/{id}(Payment batches).GET /api/v1/payment_batches/{id}/instructions, itsstatusfilter, andGET /api/v1/payment_instructions/{id}(The status of an instruction).- The
payment_instruction.updatedevent (Webhooks).
What you have to do
- Treat a
422onsubmitas a refusal that may have changed the batch: re-read it, and readsubmission_refused_bywhen it isfailed. - Accept
submission_failedin the instructions'statusand in the events. It is not a bank outcome: it neither confirms nor rules out a rejection or an execution at the bank, and the refusal reason is read in the batch'serror_message.
How to recognise the symptom
- A
submitthat answered202with afailedbatch now answers422validation_failed. - Instructions of a
failedbatch that you read assubmittednow readsubmission_failed.
22 September 2026: amount_with_taxes becomes amount_without_taxes
What changes
In every tax_subtotals entry, the breakdown by VAT rate, the amount_with_taxes key is now called amount_without_taxes. The change covers reads as well as writes, with no alias and no compatibility period: the old name is no longer accepted on input and no longer appears in any response.
{
"tax_subtotals": [
{
"tax_category_id": "S",
"vat_rate": 20.0,
"amount_without_taxes": 1000.0,
"vat_amount": 200.0,
"currency_code": "EUR"
}
]
}
The value itself does not change: it is still the taxable base excluding tax for the rate concerned, BT-116 in EN 16931. Only its name changes.
The resources concerned
- Invoices, on write as well as on read:
POST /api/v1/workspaces/{workspace_id}/invoices,PATCH /api/v1/invoices/{id}, andGET /api/v1/invoices/{id}(Issue a sales invoice). - Quotes, read-only:
GET /api/v1/quotes/{id}withinclude=tax_subtotals. The quote endpoints have never accepted a breakdown on write (Quotes). - E-reporting invoices, on write as well as on read:
POST /api/v1/e_reportings/{e_reporting_id}/invoices,PATCH /api/v1/e_reportings/invoices/{id}, andGET /api/v1/e_reportings/invoices/{id}. - E-reporting transactions, on write as well as on read:
POST /api/v1/e_reportings/{e_reporting_id}/transactions,PATCH /api/v1/e_reportings/transactions/{id}, andGET /api/v1/e_reportings/transactions/{id}(Declare transactions). - E-reporting collections, read-only:
GET /api/v1/e_reportings/payments/{id}. The field is returned there under its new name, and stays always null - a collection carries the collected amount alone (Declare collections).
Why this rename
The old name asserted the opposite of what the field carries. amount_with_taxes reads as a tax-inclusive amount, whereas the expected value is the taxable base excluding tax for the rate. Integrations filled the field with the tax-inclusive amount, in good faith, and their invoices were refused much later, at deposit. The name is therefore corrected rather than kept.
What you have to do
- Rename the key in the payloads you send:
amount_with_taxesbecomesamount_without_taxes. - Rename it in the code that reads our responses. The old key is absent from the JSON, not present as
null: an access that does not test for presence will return an empty value rather than an error. - Check the value you put in it. It must be the taxable base excluding tax for the rate, never the tax-inclusive amount.
How to recognise the symptom
- An invoice creation or modification that worked yesterday now answers
422: the payload still sendsamount_with_taxes, that unknown key is ignored, and the subtotal ends up without the taxable base excluding tax that Scribee requires. - Your response readers find the breakdown empty or at zero: they are still looking for
amount_with_taxesin an object that exposesamount_without_taxes.