POST /document/validate — valid now means structural acceptance only
To make the result more intuitive, valid no longer
folds in whether the receiver is reachable. It now equals
structuralValid — it answers a single question:
will /send accept this document? A new
required deliverable: boolean carries the routing check
(the logical AND of receiverReachable,
receiverSupportsDocType, and
processIdAdvertised), and those three fields are now
advisory / warning only.
Previously valid was the AND of all four layers, which
misleadingly signalled "do not send" whenever the receiver's
Access Point was unreachable — even though such a document should
still be sent (and, where applicable, reported to Finančná správa).
Gate sending on valid only; treat
deliverable and the reachability fields as advisory. A
document with valid: true, deliverable: false is correct
to submit.
Lifecycle events are now delivered as HMAC-signed
webhooks — the preferred way to observe document
progress without polling. Each delivery carries an
X-Everifin-Delivery-Id and a signature over the body;
failed deliveries are retried with exponential backoff. The event
payload includes participantId, so a single endpoint
can be reused across tenants and routed internally.
There is no self-service subscription API yet.
To enable webhooks for your tenant, request a subscription by
email at
[email protected]
— Everifin operations provisions the endpoint URL and signing
secret for you. REST polling
(GET /document/inbox, GET /document/send/{id})
remains available as a fallback when no webhook is configured or a
delivery fails.
GET /document/send/{id}/events and
GET /document/receive/{id}/events are now liveThey return the ordered lifecycle event
journal for a single document — the same events that drive
webhooks — so you can reconcile a document's full history on
demand.
GET /participants/{participantId} now lets you check
whether a business partner is already registered in the Peppol
network — anywhere in it, not just on our Access Point. A
200 means the partner is reachable over Peppol; a
404 means they are not (yet) registered. The response
additionally lists which document types they advertise and
(when published) their Business Card.
POST /document/validate — new processIdAdvertised check
ValidateResponse gains a required
processIdAdvertised: boolean. valid is now
the logical AND of four layers (was three):
structuralValid, receiverReachable,
receiverSupportsDocType, and the new
processIdAdvertised. The new field is
true only when the receiver's SMP record advertises
the requested processId under the requested
documentTypeId — closes a previous gap where a
mismatched processId would pass /validate
and then fail on the actual send.
VALIDATION_FAILED
When sendingStatus = VALIDATION_FAILED, the response
now includes a violations[] array (new required field
on SentDocumentSummary, returned by
GET /document/send and
GET /document/send/{id}) with rule-level detail: rule
code, XPath, and message. Empty array on the happy path, on
non-validation terminal states, and when the verifier rejected
without enumerable rule detail (e.g. XML parse failure, unknown
document type).
Stage is wired to the Peppol test network — documents really travel through AS4 to a real receiver AP, but only test participants live there. Two pre-provisioned test firms are available for end-to-end exercises (request for access if you didn't obtain test credentials).
POST /document/send — submit a UBL document for delivery.GET /document/send — list sent documents (cursor pagination, filters, sort by submittedAt). New.GET /document/send/{id} — sent-document status (three-axis snapshot: sending / C3 delivery / C5 reporting).GET /document/send/{id}/payload — download the raw bytes of a sent document. New.GET /document/receive — list received documents (cursor pagination, filters, sort by receivedAt).GET /document/inbox — polling-friendly worklist of not-yet-acknowledged received documents, oldest first.GET /document/receive/{id} — received-document detail (with payload, controlled by payloadFormat).GET /document/receive/{id}/payload — download the raw bytes of a received document. New.POST /document/receive/{id}/acknowledge — mark a received document as processed by the downstream system.Idempotency-Key scope is now per-participant
(was per-tenant).
payloadTransferEncoding default and enum changed.
New values: raw (default) and base64 —
replacing the previous base64 (default) / none.
The default switched from base64 to raw XML; clients relying on the
default will now send/receive raw XML inline in JSON. The receive
side additionally accepts none (omit payload,
fetch bytes via the new /payload endpoint).
SendDocumentResponse fields renamed.
receivedAt → submittedAt, the
timestamp field has been removed, and a new required
payloadSize (bytes, int64) was added.
from → receivedAtFrom,
to → receivedAtTo, and the single
sort parameter has been split into
SortReceivedAt (receive endpoints) and
SortSubmittedAt (send list). The upper-bound semantics
also changed: the previous to was exclusive
(< to), receivedAtTo is now inclusive
(<= receivedAtTo).
TIMED_OUT value on both
c3DeliveryStatus and c5DeliveryStatus.
On C3, returned when the receiving Access Point did not
acknowledge the message via MLS within the expected window — the
message was received by the receiving AP, but the receiver
participant might not be reachable or the receiving AP did not
send the MLS response due to a technical error. On C5, mirrors
the same shape on the reporting side — set when the fiscal
authority does not return an acceptance or rejection within the
expected window. Treat both as "sent successfully without
read receipt": do not auto-resend or auto-resubmit.
GET /document/receive/{id} accepts a new
payloadFormat query parameter
(raw | base64 | none)
controlling how the payload is encoded in the JSON response
(or whether it is included at all).
hasMore boolean alongside
nextPageToken. Prefer checking hasMore
over relying on the absence of nextPageToken.
payloadSize (bytes, int64) added to
send and receive summary/detail schemas — the size of the stored
payload after transfer-encoding has been decoded.
ReceivedDocumentMetadata
for inbound documents: creationDateTime is now optional
and nullable, because inbound SBDH wrappers from the
Peppol network do not always carry a creation timestamp.