NumNum

Rechnungen über die API erstellen

Dieser Endpunkt erstellt Verkaufsrechnungen in NumNum. Einmal erstellt, können Sie diese per E-Mail, Peppol oder Post versenden.

ℹ️ Authentifizierung (persönlicher API-Token + X-Company-Id), Limits und allgemeine Fehlercodes finden Sie im API-Überblick für Entwickler. Lesen Sie diesen zuerst.

Endpunkt

POST https://app.numnum.be/api/v1/webhooks/create-invoice

Header:

Authorization: Bearer <ihr-api-token>
X-Company-Id: <ihre-company-id>
Content-Type: application/json
Accept: application/json

Request-Body

Der Body ist ein JSON-Array von Rechnungsobjekten. Sie können eine oder mehrere Rechnungen gleichzeitig erstellen (max. 50, atomar verarbeitet).

Rechnungsfelder

Feld Typ Erforderlich Beschreibung
language string Ja Rechnungssprache (bestimmt die PDF-Sprache): nl, fr, en oder de
invoice_date string Ja Rechnungsdatum im Format JJJJ-MM-TT (z. B. 2026-02-15)
expire_days integer Ja Anzahl Tage nach dem Rechnungsdatum bis zur Fälligkeit (0365)
reference string Nein Ihre eigene Referenz (z. B. Bestellnummer), max. 255 Zeichen
intro string Nein Einleitungstext über den Rechnungszeilen, max. 255 Zeichen
remarks string Nein Bemerkung unter den Rechnungszeilen (für den Kunden sichtbar), max. 255 Zeichen
private_notes string Nein Private Notiz (nur intern, nicht auf dem PDF), max. 255 Zeichen
payment_info string Nein Zahlungsinfo anzeigen: yes (Standard), no oder paid (siehe unten)
vat_shifted integer Nein MwSt.-Verlagerungsregime (siehe Tabelle unten). Standard 0
client object Ja Kundendaten (siehe Kundenobjekt)
invoice_lines array Ja Mindestens 1 Rechnungszeile (siehe Rechnungszeilen)

payment_info

Wert Verhalten
yes Zahlungsinformationen auf der Rechnung anzeigen (Standard)
no Zahlungsinformationen ausblenden
paid Rechnung sofort als bezahlt markieren; eine Zahlung wird automatisch für den vollen Betrag erfasst

vat_shifted

MwSt.-Verlagerungsregime:

Wert Bedeutung
0 Keine Verlagerung (Standard)
1 MwSt. verlagert (allgemein)
2 Mitunternehmer (Arbeiten an unbeweglichen Gütern)
4 Innergemeinschaftliche Dienstleistung (B2B)
8 Innergemeinschaftliche Lieferung von Waren (B2B)
32 Differenzbesteuerung (MwSt.)
64 Ausfuhr von Waren (außerhalb EU)
128 Dienstleistungen außerhalb EU (B2B)

⚠️ Bei jedem Wert außer 0 müssen alle Rechnungszeilen vat_percentage: 0 haben. Der Kunde benötigt in der Regel eine gültige USt-IdNr. (z. B. für innergemeinschaftliche Lieferungen).

Kundenobjekt

Feld Typ Erforderlich Beschreibung
company_type string Ja company oder individual (Legacy: bedrijf / particulier)
type string Bei company Rechtsform (z. B. bv, nv, vzw). Siehe Abschnitt „Entitätstypen" unten
email string Ja Gültige E-Mail-Adresse, max. 255 Zeichen
first_name string Ja Vorname der Kontaktperson
last_name string Ja Nachname der Kontaktperson
address string Ja Straße + Hausnummer
address_zip string Ja Postleitzahl
address_city string Ja Stadt
address_country string Ja Ländercode, genau 2 Buchstaben (ISO 3166-1, z. B. BE)
vat_country_code string Nein USt-Ländercode, genau 2 Buchstaben (z. B. BE)
vat_id string Nein USt-IdNr. ohne Ländercode (z. B. 0123456789). Punkte/Leerzeichen werden normalisiert
title string Nein Anrede, max. 255 Zeichen
telephone string Nein Telefonnummer, max. 255 Zeichen

ℹ️ Das Feld type ist nur für Unternehmen (company / bedrijf) erforderlich, nicht für Privatpersonen.

Rechnungszeilen (invoice_lines)

Feld Typ Erforderlich Beschreibung
description string Ja Beschreibung des Produkts oder der Dienstleistung, max. 255 Zeichen
unit_price numeric Ja Einzelpreis ohne MwSt. (Punkt als Dezimaltrennzeichen, z. B. 99.99)
amount numeric Ja Anzahl der Einheiten (kann dezimal sein, z. B. 2.5)
vat_percentage numeric Ja MwSt.-Satz ohne % (z. B. 21, 6, 0)

Die Summen werden automatisch berechnet:

  • netto = unit_price × amount
  • mwst = netto × (vat_percentage / 100)
  • gesamt = netto + mwst

Beispiel: Rechnung für ein Unternehmen

curl -X POST https://app.numnum.be/api/v1/webhooks/create-invoice \
  -H "Authorization: Bearer <ihr-api-token>" \
  -H "X-Company-Id: 12345" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '[
    {
      "language": "de",
      "invoice_date": "2026-02-15",
      "expire_days": 30,
      "reference": "ORDER-2026-001",
      "intro": "Vielen Dank für Ihre Bestellung!",
      "remarks": "Bitte zahlen Sie innerhalb von 30 Tagen.",
      "payment_info": "yes",
      "vat_shifted": 0,
      "client": {
        "company_type": "company",
        "type": "bv",
        "email": "info@kunde.be",
        "vat_country_code": "BE",
        "vat_id": "0123456789",
        "first_name": "Jan",
        "last_name": "Janssen",
        "address": "Kerkstraat 1",
        "address_zip": "1000",
        "address_city": "Brüssel",
        "address_country": "BE",
        "telephone": "+32 2 123 45 67"
      },
      "invoice_lines": [
        { "description": "Website-Entwicklung", "unit_price": 1500.00, "amount": 1, "vat_percentage": 21 },
        { "description": "Hosting (12 Monate)", "unit_price": 15.00, "amount": 12, "vat_percentage": 21 }
      ]
    }
  ]'

Beispiel: Privatkunde

Für eine Privatperson sind type und vat_id nicht erforderlich:

[
  {
    "language": "de",
    "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": "Gent",
      "address_country": "BE"
    },
    "invoice_lines": [
      { "description": "Grafikdesign Logo", "unit_price": 350.00, "amount": 1, "vat_percentage": 21 }
    ]
  }
]

Beispiel: MwSt. verlagert (innergemeinschaftlich)

Bei Verlagerung verwenden Sie vat_shifted und 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 }
    ]
  }
]

Antwort

HTTP 201: Erstellt

{
  "invoices": [1234, 5678]
}

invoices ist eine Liste interner Datenbank-IDs in derselben Reihenfolge wie die Eingabe; dies sind keine Rechnungsnummern. Rechnungsnummern werden automatisch gemäß Ihren Unternehmenseinstellungen generiert.

Fehler

Siehe die Fehlertabelle im API-Überblick. Ein Validierungsfehler sieht so aus:

{
  "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."]
  }
}

Kundenabgleich (Duplikate vermeiden)

Für jede Rechnung prüft NumNum, ob der Kunde bereits existiert, andernfalls wird er angelegt:

  • Mit USt-IdNr. (vat_country_code + vat_id): Abgleich auf Ihr Unternehmen + die normalisierte USt-IdNr. Die Formatierung spielt keine Rolle: 0123456789 und 0123.456.789 treffen denselben Kunden.
  • Ohne USt-IdNr.: Rückfall auf die Kombination Unternehmen + vat_id + email. Verwenden Sie eine einheitliche E-Mail-Adresse, um Duplikate zu vermeiden.

⚠️ Existiert der Kunde bereits (USt-Abgleich)? Dann wird er nicht mit den neuen Daten (Name, Adresse, E-Mail) überschrieben. Ändern Sie Kundendaten in NumNum selbst.

Hinweise

  • Beträge: verwenden Sie einen Punkt als Dezimaltrennzeichen (1234.56), kein Komma und kein Tausendertrennzeichen.
  • Datumsangaben: Format JJJJ-MM-TT mit führenden Nullen (2026-02-05).
  • MwSt.: numerischer Wert ohne %-Zeichen (21, nicht "21%" oder 0.21).
  • Atomar: schlägt eine Rechnung im Batch fehl, wird keine erstellt.
  • Automatische Nummerierung: Sie können keine eigene Rechnungsnummer übermitteln.

Entitätstypen

Gültige Werte für client.type (nur bei Unternehmen erforderlich), u. a.: bv, nv, vzw, bvba, cvba, comm.v, comm.va, vof, eenmanszaak, sa, sarl, sas, srl, gmbh, ag, limited-ltd, limited-llc, natuurlijk-persoon, onbekend. Nicht sicher? Verwenden Sie onbekend.

Veralteter Endpunkt

Der alte Endpunkt POST /webhooks/create-invoice (ohne /api/v1) funktioniert noch für bestehende Integrationen, ist aber veraltet: er gibt eine einfache Liste ([10232, 10233]) zurück und verwendet andere Fehlercodes (406/401). Migrieren Sie zu POST /api/v1/webhooks/create-invoice.