Invoice ingestion is asynchronous. A successful upload creates an invoice resource; processing and agreement checks continue after the response.
Upload an invoice
Send one primary file and optional attachments as multipart/form-data.
The primary document may be PDF, Peppol BIS Billing 3.0 XML, or Finvoice 3.0 XML. The generated endpoint reference contains the current size, count, and media-type limits.
A successful response returns 201 Created, an invoice_id, and a Location header such as /v1/invoices/{invoice_id}.
Poll the resource
The response contains two independent lifecycles:
processing.status describes document and invoice processing.
alerts.processing.status describes the aggregate assessment across applicable agreements.
Continue polling while either status is pending or processing. When the response includes Retry-After, wait for that number of seconds before the next request.
alerts.result, alerts.count, or alerts.resolution is not an approval signal by itself. Always interpret it together with alerts.processing.status. A failed assessment is incomplete even when some alerts were already found.
Handle duplicates
A repeated primary document returns 409 Conflict. The error includes existing_invoice_id; fetch that resource instead of creating another invoice.
If the original invoice was soft-deleted, the response uses primary_md5_locked_by_deleted_invoice. An administrator must permanently remove the original before the same primary document can be accepted again.
Treat terminal responses as snapshots
Even a completed response represents the current state, not an immutable event. Agreement edits, rechecks, alert review, replacements, or credit-note matching can change it later. Integrations that need later changes should fetch the resource on their own reconciliation cadence.