This endpoint creates sales invoices in NumNum. 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://app.numnum.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) |
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 |
ℹ️ The
typefield is only required for companies (company/bedrijf), not for individuals.
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://app.numnum.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, NumNum 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 NumNum 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.