Belgium: examples

Submit a standard Belgian B2B tax invoice in sandbox and read its response. Onboard a source and confirm both Peppol participant IDs before you begin.

This GETS example is a single standard-rated tax_invoice with no modifiers. All names, numbers, addresses and amounts are illustrative; replace them with your own company, buyer and source details. The participant IDs are checksum-valid examples, not proof of a registered Peppol recipient. Use sandbox for testing.

Before you send

Onboard your Belgian company and keep its source name and version. Get the buyer’s registered Peppol participant ID and scheme. For Belgian enterprise-number IDs, scheme 0208 uses ten digits without the BE VAT prefix. See the Belgium fields for other document types or VAT treatments.

Submit the request

Save this body as invoice.json. The source is an example: replace it with your onboarded name:version.

invoice.json — Belgian tax invoicejson
{
  "country": "BE",
  "environment": "sandbox",
  "purpose": "invoicing",
  "source": "acme-erp:1.0.0",
  "documentType": { "base": "tax_invoice", "modifiers": [] },
  "payload": {
    "header": {
      "documentType": { "base": "tax_invoice" },
      "documentNumber": "INV-2026-BE-001",
      "issueDate": "2026-09-18",
      "dueDate": "2026-10-18",
      "currency": "EUR"
    },
    "parties": {
      "seller": {
        "name": "Meridian Logistics BV",
        "address": {
          "country": "BE",
          "city": "Brussels",
          "addressLine1": "12 Harbour Road",
          "postalCode": "1000"
        },
        "taxIds": [{ "type": "VAT", "value": "BE0123456749" }],
        "registrationNumbers": [{ "type": "CRN", "value": "0123456749" }],
        "peppolId": "0123456749"
      },
      "buyer": {
        "name": "Atelier Dupont BV",
        "address": {
          "country": "BE",
          "city": "Brussels",
          "addressLine1": "48 Market Street",
          "postalCode": "1000"
        },
        "taxIds": [{ "type": "VAT", "value": "BE0123456056" }],
        "registrationNumbers": [{ "type": "CRN", "value": "0123456056" }],
        "peppolId": "0123456056"
      }
    },
    "lineItems": [{
      "id": "1",
      "name": "Cloud subscription",
      "quantity": 20,
      "unitCode": "PCE",
      "price": { "amount": 100 },
      "lineTaxableValue": 2000,
      "lineTotal": 2420,
      "taxCategory": "S",
      "taxRate": 21,
      "taxAmount": 420
    }],
    "totals": {
      "totalLineTaxableAmount": 2000,
      "totalAmountExcludingTax": 2000,
      "totalTaxAmount": 420,
      "totalAmountIncludingTax": 2420,
      "amountDue": 2420
    },
    "extensions": {
      "peppol_seller_peppolIdScheme": "0208",
      "peppol_buyer_peppolIdScheme": "0208",
      "peppol_buyerAccountingReference": "PO-88213"
    }
  }
}

Send it using a sandbox API key:

Submit the Belgian invoicebash
curl --request POST 'https://prod.gets.complyance.io/api/v3/unify' \
  --header "Authorization: Bearer ${COMPLYANCE_API_KEY}" \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --header 'new-api: true' \
  --data @invoice.json

The new-api: true header selects this GETS request format. The sample has a €2,000 taxable total plus €420 VAT, for €2,420 due. Use the actual rate and tax category for your transaction.

Read the response

A 200 response confirms that validation passed and the document was stored. It includes documentId, documentNumber, message and Base64XML (the generated invoice XML encoded as Base64). The XML is not reproduced here: its value depends on your invoice. An illustrative response shape is:

Validated document — HTTP 200json
{
  "documentId": "01K5EXAMPLE00000000000142",
  "documentNumber": "INV-2026-BE-001",
  "message": "Your invoice was validated and is ready for submission.",
  "Base64XML": "PEludm9pY2U+PElEPklOVi0yMDI2LUJFLTAwMTwvSUQ+PC9JbnZvaWNlPg=="
}

The Base64XML above encodes a short illustrative XML fragment, not a complete Peppol invoice. Your actual response contains the generated document; do not send the illustrative value to a buyer. Save documentId and check delivery status: 200 is not proof of delivery.

If something goes wrong

  • 422 means validation failed. Read errors[].getsPath, errors[].payloadPath and errors[].message, correct the fields, then send again. Check the Belgium validation rules.
  • 401 means the API key is missing or invalid. Check the bearer token. 403 can mean your key does not match the requested environment; use a sandbox key for sandbox.
  • 404 for an unknown source means the name or version does not match an onboarded source. Check source against the company’s source details.

Next, follow the document to delivery.

Last updated