This endpoint creates sales invoices in Sage Cloud Demat Invoicing. Once created, you can send them by email, Peppol or post.
ℹ️ Authentication (personal API token +
X-Company-Id), limits and general error codes are in the Developer API overview. Read that first.
POST https://www.clouddematinvoicing.be/api/v1/webhooks/create-invoice
Headers:
Authorization: Bearer <your-api-token>
X-Company-Id: <your-company-id>
Content-Type: application/json
Accept: application/json
The body is a JSON array of invoice objects. You can create one or more invoices at once (max 50, processed atomically).
| Field | Type | Required | Description |
|---|---|---|---|
language |
string | Yes | Invoice language (sets the PDF language): nl, fr, en or de |
invoice_date |
string | Yes | Invoice date in YYYY-MM-DD format (e.g. 2026-02-15) |
expire_days |
integer | Yes | Number of days after the invoice date until the due date (0–365) |
reference |
string | No | Your own reference (e.g. order number), max 255 chars |
intro |
string | No | Intro text above the invoice lines, max 255 chars |
remarks |
string | No | Remark below the invoice lines (visible to the customer), max 255 chars |
private_notes |
string | No | Private note (internal only, not on the PDF), max 255 chars |
payment_info |
string | No | Payment info display: yes (default), no or paid (see below) |
vat_shifted |
integer | No | VAT reverse-charge regime (see table below). Default 0 |
client |
object | Yes | Customer details (see Client object) |
invoice_lines |
array | Yes | At least 1 invoice line (see Invoice lines) |
payment_info| Value | Behaviour |
|---|---|
yes |
Show payment information on the invoice (default) |
no |
Hide payment information |
paid |
Mark the invoice as paid immediately; a payment is automatically registered for the full amount |
vat_shiftedVAT reverse-charge regime:
| Value | Meaning |
|---|---|
0 |
No VAT shift (default) |
1 |
VAT shifted (general) |
2 |
Co-contractor (works on immovable property) |
4 |
Intra-Community supply of services (B2B) |
8 |
Intra-Community supply of goods (B2B) |
16 |
Service related to immovable property located abroad (VAT reverse-charged to the co-contractor) |
32 |
VAT margin scheme |
64 |
Export of goods (outside EU) |
128 |
Services rendered outside EU (B2B) |
⚠️ For any value other than
0, all invoice lines must havevat_percentage: 0. The customer usually needs a valid VAT number (e.g. for intra-Community supplies).
| Field | Type | Required | Description |
|---|---|---|---|
company_type |
string | Yes | company or individual (legacy: bedrijf / particulier) |
type |
string | If company |
Legal form (e.g. bv, nv, vzw). See Entity types |
email |
string | Yes | Valid email address, max 255 chars |
first_name |
string | Yes | Contact first name |
last_name |
string | Yes | Contact last name |
address |
string | Yes | Street + number |
address_zip |
string | Yes | Postal code |
address_city |
string | Yes | City |
address_country |
string | Yes | Country code, exactly 2 letters (ISO 3166-1, e.g. BE) |
vat_country_code |
string | No | VAT country code, exactly 2 letters (e.g. BE) |
vat_id |
string | No | VAT number without country code (e.g. 0123456789). Dots/spaces are normalized |
title |
string | No | Salutation, max 255 chars |
telephone |
string | No | Phone number, max 255 chars |
iban_country_code |
string | No | Country code of the IBAN, exactly 2 letters (e.g. BE) |
iban |
string | No | IBAN, with or without country code (BE82103021737768 or 82103021737768); spaces, dots and dashes allowed |
bic |
string | No | BIC/SWIFT code, 8 or 11 characters (e.g. GKCCBEBB) |
ℹ️ The
typefield is only required for companies (company/bedrijf), not for individuals.
ℹ️ Bank details are optional. If you send both
iban_country_codeand anibanthat already starts with a country code, the two must match; otherwise you get400 invalid_body. If the client already exists and already has an IBAN, it is never overwritten; empty fields are filled in.
invoice_lines)| Field | Type | Required | Description |
|---|---|---|---|
description |
string | Yes | Product or service description, max 255 chars |
unit_price |
numeric | Yes | Unit price excluding VAT (dot as decimal separator, e.g. 99.99) |
amount |
numeric | Yes | Number of units (may be decimal, e.g. 2.5) |
vat_percentage |
numeric | Yes | VAT percentage without % (e.g. 21, 6, 0) |
Totals are calculated automatically:
net = unit_price × amountvat = net × (vat_percentage / 100)total = net + vatcurl -X POST https://www.clouddematinvoicing.be/api/v1/webhooks/create-invoice \
-H "Authorization: Bearer <your-api-token>" \
-H "X-Company-Id: 12345" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '[
{
"language": "en",
"invoice_date": "2026-02-15",
"expire_days": 30,
"reference": "ORDER-2026-001",
"intro": "Thank you for your order!",
"remarks": "Please pay within 30 days.",
"payment_info": "yes",
"vat_shifted": 0,
"client": {
"company_type": "company",
"type": "bv",
"email": "info@customer.be",
"vat_country_code": "BE",
"vat_id": "0123456789",
"first_name": "Jan",
"last_name": "Janssen",
"address": "Kerkstraat 1",
"address_zip": "1000",
"address_city": "Brussels",
"address_country": "BE",
"telephone": "+32 2 123 45 67"
},
"invoice_lines": [
{ "description": "Website development", "unit_price": 1500.00, "amount": 1, "vat_percentage": 21 },
{ "description": "Hosting (12 months)", "unit_price": 15.00, "amount": 12, "vat_percentage": 21 }
]
}
]'
For an individual, type and vat_id are not required:
[
{
"language": "en",
"invoice_date": "2026-02-20",
"expire_days": 14,
"client": {
"company_type": "individual",
"email": "john.doe@gmail.com",
"first_name": "John",
"last_name": "Doe",
"address": "Dorpstraat 45",
"address_zip": "9000",
"address_city": "Ghent",
"address_country": "BE"
},
"invoice_lines": [
{ "description": "Logo graphic design", "unit_price": 350.00, "amount": 1, "vat_percentage": 21 }
]
}
]
For reverse charge, use vat_shifted and vat_percentage: 0:
[
{
"language": "en",
"invoice_date": "2026-02-25",
"expire_days": 30,
"vat_shifted": 4,
"remarks": "Reverse charge - VAT to be accounted for by the customer",
"client": {
"company_type": "company",
"type": "gmbh",
"email": "info@deutschefirma.de",
"vat_country_code": "DE",
"vat_id": "123456789",
"first_name": "Hans",
"last_name": "Müller",
"address": "Hauptstraße 10",
"address_zip": "10115",
"address_city": "Berlin",
"address_country": "DE"
},
"invoice_lines": [
{ "description": "Consulting services", "unit_price": 2500.00, "amount": 1, "vat_percentage": 0 }
]
}
]
{
"invoices": [1234, 5678]
}
invoices is a list of internal database IDs in the same order as the input; these are not invoice numbers. Invoice numbers are generated automatically according to your company settings.
See the error table in the API overview. A validation error looks like this:
{
"error": "invalid_body",
"errors": {
"0.language": ["The language must be one of: nl, fr, en, de."],
"0.client.email": ["The client email must be a valid email address."],
"0.invoice_lines.0.unit_price": ["The unit price must be a number."]
}
}
For each invoice, Sage Cloud Demat Invoicing checks whether the client already exists, otherwise it creates one:
vat_country_code + vat_id): match on your company + the normalized VAT number. Formatting doesn’t matter: 0123456789 and 0123.456.789 match the same client.vat_id + email. Use a consistent email address to avoid duplicates.⚠️ If the client already exists (VAT match), it is not overwritten with the new details (name, address, email). Change client details in Sage Cloud Demat Invoicing itself.
1234.56), no comma and no thousands separator.YYYY-MM-DD format with leading zeros (2026-02-05).% sign (21, not "21%" or 0.21).Valid values for client.type (only required for companies), among others: bv, nv, vzw, bvba, cvba, comm.v, comm.va, vof, eenmanszaak, sa, sarl, sas, srl, gmbh, ag, limited-ltd, limited-llc, natuurlijk-persoon, onbekend. Not sure? Use onbekend.
The old endpoint POST /webhooks/create-invoice (without /api/v1) still works for existing integrations but is deprecated: it returns a bare list ([10232, 10233]) and uses different error codes (406/401). Migrate to POST /api/v1/webhooks/create-invoice.