Delivery evidence
Org-scoped delivery evidence for a sent invoice via GET /v1/agent/peppol/sent/{invoiceId}/evidence. Returns the aggregated delivery status, individual layers (transport AS4, MLS, business response), and the full transmission history. A complement to send status , while /peppol/status gives one summary status, here you get a layer-by-layer breakdown for auditing and archiving.
Endpoint
| Method | Path | Scope | Headers |
|---|
| GET | /v1/agent/peppol/sent/{invoiceId}/evidence | invoice:read | X-API-Key, X-Organization-Id |
invoiceId is the id of an invoice issued via POST /v1/agent/invoices, or the invoice_idthe platform mirrored for a raw-UBL send (connector, SAPI-SK, SFTP). If no Peppol transmission exists for the invoice (it hasn't been sent yet, or it belongs to a different organization), the endpoint returns 404.
If you only hold a submission id from a raw-UBL send response (SAPI-SK providerDocumentId or connector-send document_id, both are the same value), resolve the invoice_id first via GET /v1/agent/peppol/submissions/{submissionId} (scope invoice:read). It returns invoice_id, status and error_message for the submission.
Response
GET /v1/agent/peppol/sent/b1f0d7a2-…/evidence
X-API-Key: efk_pk_test_...
X-Organization-Id: 0a2c1f3e-…
{
"data": {
"invoice_id": "b1f0d7a2-…",
"document_id": "d4f8…@phase4.phoss-ap",
"sbdh_instance_id": "5e0a1c9b-…",
"ubl_sha256": "9f2b…c41d",
"delivery_status": {
"state": "delivered",
"at": "2026-06-22T10:00:05.000Z"
},
"layers": {
"transport": { "state": "accepted", "label": "Transport (AS4)" },
"mls": { "state": "not_reported", "label": "Message Level Response (MLR)" },
"businessResponse": { "state": "not_reported", "label": "Business-Level Response (BLR)" }
},
"transactions": [
{
"state": "SENT",
"mode": "live",
"document_id": "d4f8…@phase4.phoss-ap",
"sbdh_instance_id": "5e0a1c9b-…",
"ubl_sha256": "9f2b…c41d",
"mls_status": null,
"mls_at": null,
"error_message": null,
"created_at": "2026-06-22T10:00:00.000Z",
"updated_at": "2026-06-22T10:00:05.000Z"
}
]
}
}
| Field | Type | Description |
|---|
invoice_id | UUID | Invoice ID. |
document_id | string | null | AS4 message id the Access Point assigned to the latest transmission. |
sbdh_instance_id | string | null | Immutable SBDH InstanceIdentifier of the latest transmission: the id an inbound MLS references the document by. |
ubl_sha256 | string | null | SHA-256 (hex) of the exact archived as-sent UBL bytes: cryptographic integrity proof. |
delivery_status | object | Aggregated delivery status: state (delivered | failed | pending) and at (ISO 8601 | null). |
layers | object | Status by layer: transport, mls, business_response. Each has state and label. |
transactions | array of objects | Transmission history (newest first). See the table below. |
Transaction object
| Field | Type | Description |
|---|
state | string | Transmission state (e.g. SENT, QUEUED, ERROR). |
mode | live | test | live = a real send (live key), test = sandbox AP (test key). |
document_id | string | null | AS4 message id for this transmission. |
sbdh_instance_id | string | null | SBDH InstanceIdentifier for this transmission. |
ubl_sha256 | string | null | SHA-256 (hex) of the archived as-sent UBL bytes. |
mls_status | accepted | rejected | null | Outcome of the inbound MLS matched to this transmission; null = no MLS received. |
mls_at | ISO 8601 | null | When the MLS was received. |
error_message | string | null | Failure reason, if the transmission failed. |
created_at | ISO 8601 | Time the transmission was created. |
updated_at | ISO 8601 | Time of the last status change. |
Delivery layers
| Layer | Meaning |
|---|
transport | AS4 receipt of the document by the Peppol network (transport receipt). |
mls | Message Level Status: acknowledgment/rejection at the message level. |
business_response | The recipient's business response (accepting/rejecting the document), if they send one. |
On the Slovak network, many recipients never send an MLS or a business response: the terminal successful state is then transport: accepted and delivery_status.state: delivered, while the mls / businessResponse layers stay not_reported, which isn't an error. When the receiving Access Point does send an MLS, the mls layer reflects it (accepted or failed) and each transaction carries mls_status/mls_at. The evidence JSON is the supported export of the proof; the raw AS4 receipt itself is not exposed as a standalone file: the immutable identifiers (document_id, sbdh_instance_id) plus ubl_sha256 are provided for audit trails instead. For a push notification on delivery, use the peppol.document.delivered webhook.
404 means no Peppol transmission exists for this invoice: send it first via
POST /v1/agent/peppol/send/{invoiceId} and track status via
Receiving and statuses.