1. Transmission Level Response (AS4)
At the lowest level, the PEPPOL AS4 transport protocol sends a synchronous acknowledgement for every message it receives. This is handled automatically by the access point and requires no action from you. It confirms that the bytes were received, not that the document was understood or accepted by the business.
2. Message Level Response – MLR (BIS 36)
MLR (BIS 36) is a PEPPOL ApplicationResponse document (urn:fdc:peppol.eu:poacc:trns:mlr:3). It signals whether the received document was technically valid and could be processed by the receiving system. It does not represent a business decision such as acceptance or rejection of an invoice. Use MLR to confirm or reject a received document at the message/system level.
This API also supports MLS (Message Level Status, urn:peppol:edec:mls:1.0). The same endpoints are used. The system negotiates based on receiver capabilities: if MLS is supported it is sent (preferred), otherwise MLR is sent; if neither is supported, no message-level response is sent.
Endpoints
POST /api/documents/{documentId}/mlr/confirm — Sends MLR with code AP (Acknowledged). Marks document as confirmed.POST /api/documents/{documentId}/mlr/reject — Sends MLR with code RE (Rejected). Marks document as rejected.
curl -X POST "https://api.pepposh.eu/api/documents/{documentId}/mlr/confirm" \
-H "Authorization: Bearer <your-token>"3. Invoice Message Response – IMR (BIS 63)
IMR (BIS 63) is a PEPPOL ApplicationResponse document (urn:fdc:peppol.eu:poacc:trns:invoice_response:3). It represents a business-level response to an invoice or credit note. Unlike MLR, IMR carries business meaning – it tells the invoice sender whether their invoice is accepted, in review, under query, or rejected. PEPPOL BIS 63 specification ↗
Response Codes
| Code | Meaning |
|---|
| AB | Message acknowledgement – received but not yet processed |
| IP | In process – being processed |
| UQ | Under query – clarification needed |
| CA | Accepted with changes |
| RE | Rejected |
| AP | Accepted |
| PD | Paid |
Endpoints
POST /api/documents/{documentId}/accept — Convenience: sends IMR with code AP.POST /api/documents/{documentId}/reject — Convenience: sends IMR with code RE.POST /api/documents/{documentId}/send-response — Generic: specify any valid response code.
# Accept an invoice
curl -X POST "https://api.pepposh.eu/api/documents/{documentId}/accept" \
-H "Authorization: Bearer <your-token>" \
-H "Content-Type: application/json" \
-d '{"note": "Invoice accepted", "effectiveDate": "2025-01-15"}'
# Reject an invoice
curl -X POST "https://api.pepposh.eu/api/documents/{documentId}/reject" \
-H "Authorization: Bearer <your-token>" \
-H "Content-Type: application/json" \
-d '{"note": "Incorrect amount on line 3"}'
# Send a custom response code (e.g. Under Query)
curl -X POST "https://api.pepposh.eu/api/documents/{documentId}/send-response" \
-H "Authorization: Bearer <your-token>" \
-H "Content-Type: application/json" \
-d '{"responseCode": "UQ", "note": "Please confirm delivery address"}'4. Order Response (BIS 28)
OrderResponse (BIS 28, T76) is a PEPPOL OrderResponse document (urn:fdc:peppol.eu:poacc:trns:order_response:3). It is the business-level response to a received order. The same API endpoints are used – the system automatically selects between IMR and OrderResponse based on the document type.
Response Codes
| Code | Meaning |
|---|
| AP | Order accepted |
| RE | Order rejected |
# Accept an order
curl -X POST "https://api.pepposh.eu/api/documents/{documentId}/accept" \
-H "Authorization: Bearer <your-token>" \
-H "Content-Type: application/json" \
-d '{"note": "Order confirmed"}'Receiving responses for documents you sent
When the recipient of a document you sent responds with MLR/MLS, IMR or OrderResponse, the status of your original document is automatically updated. Accepted responses set the status to mlr-accepted; rejections set it to mlr-rejected. You can subscribe to the invoice.response and order.response webhook events to be notified.
invoice.response — Fired when an Invoice Message Response (IMR) is received.order.response — Fired when an Order Response is received.