Since launch, the batch endpoint validated every item before accepting anything. That made the contract simple, all or nothing, and made real lists annoying: one number with a typo returned a 400 for the whole request, and the fix was a loop on the client side that we would rather have written ourselves.
The behaviour has changed. A batch is still rejected as a whole when the request itself is malformed. But when individual messages fail validation, an invalid number, an unsupported destination, a text over six parts, they are listed in the response with their error, and the valid ones are queued. The response reports accepted and rejected counts and the total price of what was accepted.
Nothing to change if you relied on the old behaviour
Send the header X-Batch-Mode: strict to keep the previous all-or-nothing contract. We will keep it indefinitely; it is a header, not a version.
Why it matters
Lists are dirty. The importer in the panel has always cleaned them before sending and reported what it removed; the API now does the same in one round trip, and the report groups rejected items with the campaign so you can fix the source. Rejected messages are, as always, never billed.


