Document

Create, convert and send documents via the Peppol network.

The Document endpoints handle the full lifecycle: generate UBL XML from various input formats, validate against PEPPOL Schematron rules, and send through the Peppol network.

Looking for a worked example? Examples → BusinessDocument (UBL invoice) walks through a complete cross-border PEPPOL invoice via the standard-agnostic endpoint, in cURL, Java SDK, Python, Node.js and PHP.

List documents

GET /bizzlink/documents

Lists documents belonging to the authenticated tenant — plus its sub-tenants when the caller is a PARTNER. Two modes:

Filter by direction (direction=inbound|outbound, optional since): returns a paginated JSON:API collection with data, links (self/first/last/prev/next) and meta (page/size/totalElements/totalPages). Pagination via page[number] (1-based) and page[size] (default 20, max 100).

Sibling lookup (processId=<uuid>): returns every document rendition produced by the same create-and-send call — useful when a single business document is rendered into multiple wire formats (e.g. FatturaPA via SDI plus UBL via Peppol). Returns an unpaginated collection; direction, since and pagination parameters are ignored. Returns an empty data array if no renditions match.

Exactly one of direction or processId must be provided.

Responses

StatusDescription
200Document list
400Missing or invalid direction/processId parameter

Response Body JsonApiListDocumentDocumentAttributes

FieldTypeDescription
JsonApiResourceDocumentAttributes[]
JsonApiLinks
JsonApiPaginationMeta
cURL Request
curl -X GET https://gateway.vigasoft.lu/bizzlink/documents \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "X-Bizzlink-Signature: t=$TIMESTAMP,v1=$SIGNATURE"
Response 200 OK
{
    "data": [
    {
        "attributes": {
          "acknowledgementStatus": "SUCCESS",
          "createdAt": "2026-01-01T00:00:00Z",
          "errors": [
          {
              "flag": "fatal_error",
              "id": "BR-01",
              "location": "/Invoice/cac:AccountingSupplierParty",
              "severity": "FATAL_ERROR",
              "text": "An Invoice shall have a Specification identifier"
          }
          ],
          "format": "string",
          "processId": "00000000-0000-0000-0000-000000000000",
          "status": "VALID",
          "target": "string",
          "updatedAt": "2026-01-01T00:00:00Z"
      },
        "id": "770e8400-e29b-41d4-a716-446655440000",
        "type": "documents"
    }
    ],
    "links": {
      "first": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=1&page%5Bsize%5D=20",
      "last": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=7&page%5Bsize%5D=20",
      "next": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=4&page%5Bsize%5D=20",
      "prev": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=2&page%5Bsize%5D=20",
      "self": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=3&page%5Bsize%5D=20"
  },
    "meta": {
      "page": 1,
      "size": 20,
      "totalElements": 137,
      "totalPages": 7
  }
}

Send a document from a JSON structure

POST /bizzlink/documents/json

Accepts a BusinessDocument (the same model the on-prem connector plugins build) and generates one or more wire-format renditions depending on sender/receiver country and regulatory requirements. The polymorphic @type discriminator (InvoiceDocument / CreditNoteDocument) decides the JSON:API resource type of each response entry (invoices or credit-notes).

The routing layer — based on sender country, receiver country and SMP capabilities — decides which formats/targets the document is rendered into. Examples:

  • LU/AT/BE/NL/DK/SE/IE seller → 1× UBL via Peppol
  • IT seller (any buyer) → FatturaPA via SDI plus UBL via Peppol (when receiver is not IT)
  • FR seller (post-2026-09-01) → Factur-X/UBL via PPF/PDP plus UBL via Peppol (when receiver is not FR)

Response is a JSON:API collection: data is an array with one entry per rendition. Each entry has its own id (= per-rendition document id, pollable via GET /documents/{id}/status); all siblings share the same attributes.processId, looked up via GET /documents?processId={uuid}.

Request Body

FieldTypeDescription
requiredobjectResource envelope. 'attributes' holds the domain fields; 'meta.scope' declares whether the resource belongs to the whole tenant or to a specific legal entity (Peppol ID).

Responses

StatusDescription
200Document(s) accepted for async processing
403Sender Peppol ID does not belong to the tenant
422Synchronous XML generation failed or routing target not supported
500Internal server error

Response Body JsonApiListDocumentDocumentAcceptedAttributes

FieldTypeDescription
JsonApiResourceDocumentAcceptedAttributes[]
JsonApiLinks
JsonApiPaginationMeta
cURL Request
curl -X POST https://gateway.vigasoft.lu/bizzlink/documents/json \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "X-Bizzlink-Signature: t=$TIMESTAMP,v1=$SIGNATURE" \
  -H "Content-Type: application/json" \
  -d '{
      "data": {}
  }'
Response 200 OK
{
    "data": [
    {
        "attributes": {
          "format": "string",
          "processId": "00000000-0000-0000-0000-000000000000",
          "status": "QUEUED_FOR_VALIDATION",
          "target": "string"
      },
        "id": "770e8400-e29b-41d4-a716-446655440000",
        "type": "invoices"
    }
    ],
    "links": {
      "first": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=1&page%5Bsize%5D=20",
      "last": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=7&page%5Bsize%5D=20",
      "next": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=4&page%5Bsize%5D=20",
      "prev": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=2&page%5Bsize%5D=20",
      "self": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=3&page%5Bsize%5D=20"
  },
    "meta": {
      "page": 1,
      "size": 20,
      "totalElements": 137,
      "totalPages": 7
  }
}

Send a document from an XML file

POST /bizzlink/documents/xml

Accepts a UBL 2.1 Invoice or Credit Note XML — either Peppol BIS 3.0 or XRechnung 3.0 (German CIUS) —, validates it asynchronously against the matching Schematron rules (BIS or KoSIT XRechnung), and sends it into the Peppol network.

If the receiver’s SMP capabilities do not include the submitted profile but do include the sibling one (BIS ↔ XRechnung), the document is automatically re-profiled before validation — e.g. a BIS invoice addressed to a German B2G platform that only accepts XRechnung is sent as XRechnung, and vice versa. The rendition’s format attribute (status endpoint) reflects what was actually sent.

Request body is a JSON:API resource envelope with data.type = "ubl-xml". Response shape: JSON:API collection (data: [...]) with one rendition per entry. Each entry’s JSON:API type reflects the detected document kind (invoices or credit-notes).

Poll GET /documents/{id}/status per rendition for the validation/delivery outcome.

Request Body

FieldTypeDescription
requiredobjectResource envelope. 'attributes' holds the domain fields; 'meta.scope' declares whether the resource belongs to the whole tenant or to a specific legal entity (Peppol ID).

Responses

StatusDescription
200Document accepted for async processing
403Sender Peppol ID does not belong to the tenant
422Synchronous processing failed
500Internal server error

Response Body JsonApiListDocumentDocumentAcceptedAttributes

FieldTypeDescription
JsonApiResourceDocumentAcceptedAttributes[]
JsonApiLinks
JsonApiPaginationMeta
cURL Request
curl -X POST https://gateway.vigasoft.lu/bizzlink/documents/xml \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "X-Bizzlink-Signature: t=$TIMESTAMP,v1=$SIGNATURE" \
  -H "Content-Type: application/json" \
  -d '{
      "data": {}
  }'
Response 200 OK
{
    "data": [
    {
        "attributes": {
          "format": "string",
          "processId": "00000000-0000-0000-0000-000000000000",
          "status": "QUEUED_FOR_VALIDATION",
          "target": "string"
      },
        "id": "770e8400-e29b-41d4-a716-446655440000",
        "type": "invoices"
    }
    ],
    "links": {
      "first": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=1&page%5Bsize%5D=20",
      "last": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=7&page%5Bsize%5D=20",
      "next": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=4&page%5Bsize%5D=20",
      "prev": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=2&page%5Bsize%5D=20",
      "self": "https://gateway.vigasoft.lu/bizzlink/documents?page%5Bnumber%5D=3&page%5Bsize%5D=20"
  },
    "meta": {
      "page": 1,
      "size": 20,
      "totalElements": 137,
      "totalPages": 7
  }
}

Download document as UBL XML or PDF

GET /bizzlink/documents/{documentId}
Returns the UBL 2.1 XML content or a generated PDF/A-3b of a document. Use the Accept header to select the format: application/xml or application/pdf. The document must belong to the tenant, or to one of its sub-tenants when the caller is a PARTNER.

Responses

StatusDescription
200Document returned
403Document does not belong to the tenant or its sub-tenants
404Document not found
406Requested Accept type not supported
cURL Request
curl -X GET https://gateway.vigasoft.lu/bizzlink/documents/{documentId} \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "X-Bizzlink-Signature: t=$TIMESTAMP,v1=$SIGNATURE"

Get document processing status

GET /bizzlink/documents/{documentId}/status

Returns the current processing status of a document as a JSON:API resource. Use this endpoint to poll the status of asynchronously processed documents.

Possible attributes.status values:

  • ACCEPTED — Document received and saved
  • QUEUED_FOR_VALIDATION — Waiting for Schematron validation
  • VALID — Passed validation
  • INVALID — Failed validation (see attributes.errors)
  • QUEUED_FOR_SENDING — Waiting for Peppol transmission
  • SENT — Transmitted to Peppol network
  • DELIVERED — Delivery confirmed
  • FAILED — Processing failed

Responses

StatusDescription
200Document status retrieved
403Document belongs to a different tenant
404Document not found

Response Body JsonApiDocumentDocumentAttributes

FieldTypeDescription
JsonApiResourceDocumentAttributes
cURL Request
curl -X GET https://gateway.vigasoft.lu/bizzlink/documents/{documentId}/status \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "X-Bizzlink-Signature: t=$TIMESTAMP,v1=$SIGNATURE"
Response 200 OK
{
    "data": {
      "attributes": {
        "acknowledgementStatus": "SUCCESS",
        "createdAt": "2026-01-01T00:00:00Z",
        "errors": [
        {
            "flag": "fatal_error",
            "id": "BR-01",
            "location": "/Invoice/cac:AccountingSupplierParty",
            "severity": "FATAL_ERROR",
            "text": "An Invoice shall have a Specification identifier"
        }
        ],
        "format": "string",
        "processId": "00000000-0000-0000-0000-000000000000",
        "status": "VALID",
        "target": "string",
        "updatedAt": "2026-01-01T00:00:00Z"
    },
      "id": "770e8400-e29b-41d4-a716-446655440000",
      "type": "documents"
  }
}