NumNum

Autofacturation (bordereau d’achat) via l’API

Ces endpoints créent des bordereaux d’achat émis, en jargon TVA belge des factures d’autofacturation (self-billing). Il s’agit d’un document que votre entreprise établit au nom d’un fournisseur (p. ex. un décompte de « prix du lait » qu’une laiterie établit pour un éleveur laitier).

Utilisateurs typiques : producteurs et coopératives qui établissent périodiquement des décomptes pour leurs fournisseurs, ou systèmes externes qui génèrent des décomptes et souhaitent les transmettre à NumNum tout en conservant leur propre mise en page PDF.

ℹ️ L’authentification (jeton API personnel + X-Company-Id), les limites et les codes d’erreur généraux figurent dans l’Aperçu de l’API pour développeurs. Les en-têtes et la correspondance client sont identiques à l’API Factures.

Endpoints

POST https://app.numnum.be/api/v1/webhooks/create-purchase-borderelle
POST https://app.numnum.be/api/v1/webhooks/create-purchase-borderelle-creditnote

Corps de la requête : bordereau d’achat

Un tableau JSON de bordereaux (traités de façon atomique). La structure ressemble à l’API Factures, avec quelques différences.

Champ Type Requis Description
language string Oui nl, fr, en ou de
purchase_borderelle_date string Oui Date du document AAAA-MM-JJ
expire_days integer Oui Jours d’échéance après la date du document (0365)
reference string Non Votre référence (p. ex. période), max 255
intro string Non Texte au-dessus des lignes, max 255
remarks string Non Texte sous les lignes, max 255
private_notes string Non Note interne (non visible par le fournisseur), max 255
payment_info string Non yes (défaut), no ou paid
vat_shifted integer Non Voir le tableau vat_shifted
attachment_pdf string Non PDF encodé en base64 (votre propre mise en page, voir ci-dessous)
attachment_pdf_filename string Non Nom du fichier joint ; défaut <n°-bordereau>.pdf
client object Oui Le fournisseur pour lequel vous établissez le document (même structure que le client dans l’API Factures)
lines array Oui Au moins 1 ligne (attention : lines, pas invoice_lines)

Lignes (lines)

"lines": [
  { "description": "Livraison de lait 1–15 mai (litre)", "unit_price": 0.45, "amount": 12500, "vat_percentage": 6 }
]

Mêmes champs qu’une ligne de facture : description, unit_price, amount, vat_percentage. amount peut être décimal (p. ex. litre/kg). Les totaux sont calculés côté serveur.

Joindre votre propre PDF (attachment_pdf)

Vous voulez conserver votre propre mise en page PDF ? Envoyez un PDF encodé en base64. Il est stocké comme pièce jointe sur le document et inclus lors de l’envoi Peppol. NumNum génère malgré tout un PDF standard à partir des données du document.

  • Taille max ± 15 Mo (base64). Restez bien en dessous.
  • Si attachment_pdf_filename est absent, <n°-bordereau>.pdf est utilisé.
  • N’envoyez que de vrais PDF ; le type de contenu est forcé à application/pdf.
// Node.js
const fs = require('fs')
const pdfBase64 = fs.readFileSync('./prix-du-lait-mai-2026.pdf').toString('base64')

Corps de la requête : note de crédit

Presque identique à un bordereau, avec ces différences :

Champ Description
purchase_borderelle_creditnote_date Date du document (au lieu de purchase_borderelle_date)
purchase_borderelle_uuid Facultatif. UUID d’un bordereau d’achat existant dans la même entreprise ; lié comme source. Un UUID d’une autre entreprise renvoie 404
expire_days, payment_info Non applicables aux notes de crédit

Tous les autres champs se comportent de manière identique. Utilisez des montants négatifs ou correctifs selon votre correction.

Exemple : décompte « prix du lait »

curl -X POST https://app.numnum.be/api/v1/webhooks/create-purchase-borderelle \
  -H "Authorization: Bearer <votre-jeton-api>" \
  -H "X-Company-Id: 12345" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '[
    {
      "language": "fr",
      "purchase_borderelle_date": "2026-05-20",
      "expire_days": 30,
      "reference": "Prix du lait mai 2026",
      "payment_info": "no",
      "client": {
        "company_type": "company",
        "type": "onbekend",
        "email": "eleveur@example.be",
        "first_name": "Jan",
        "last_name": "De Boer",
        "vat_country_code": "BE",
        "vat_id": "0123456789",
        "address": "Boerderijstraat 1",
        "address_zip": "9800",
        "address_city": "Deinze",
        "address_country": "BE"
      },
      "lines": [
        { "description": "Livraison de lait 1–15 mai (litre)", "unit_price": 0.45, "amount": 12500, "vat_percentage": 6 },
        { "description": "Livraison de lait 16–31 mai (litre)", "unit_price": 0.46, "amount": 13200, "vat_percentage": 6 }
      ]
    }
  ]'

Exemple : note de crédit sur un bordereau

curl -X POST https://app.numnum.be/api/v1/webhooks/create-purchase-borderelle-creditnote \
  -H "Authorization: Bearer <votre-jeton-api>" \
  -H "X-Company-Id: 12345" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "language": "fr",
      "purchase_borderelle_creditnote_date": "2026-05-21",
      "purchase_borderelle_uuid": "9c1a2b3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d",
      "reference": "Correction prix du lait mai",
      "client": { "company_type": "company", "type": "onbekend", "email": "eleveur@example.be", "first_name": "Jan", "last_name": "De Boer", "vat_country_code": "BE", "vat_id": "0123456789", "address": "Boerderijstraat 1", "address_zip": "9800", "address_city": "Deinze", "address_country": "BE" },
      "lines": [
        { "description": "Correction prime de qualité", "unit_price": -50.00, "amount": 1, "vat_percentage": 6 }
      ]
    }
  ]'

Réponse

HTTP 201 : Créé

Bordereau d’achat :

{ "purchase_borderelles": [1234, 1235] }

Note de crédit :

{ "purchase_borderelle_creditnotes": [987] }

Le tableau contient les identifiants internes de base de données dans le même ordre que l’entrée.

Erreurs

Voir le tableau des erreurs dans l’aperçu de l’API. Les erreurs de validation suivent le même format invalid_body que l’API Factures, indexées par position (0.client.email, 1.lines.0.unit_price, …). Un purchase_borderelle_uuid d’une autre entreprise renvoie 404.

Différence avec l’API Factures

Sujet API Factures API Bordereau d’achat
Type de document Facture de vente (sortante) Bordereau d’achat émis (au nom d’un fournisseur)
Client dans la charge utile Le client que vous facturez Le fournisseur pour lequel vous établissez
Champ date invoice_date purchase_borderelle_date
Champ lignes invoice_lines lines
Pièce jointe PDF propre ✅ via attachment_pdf
Peppol InvoiceTypeCode 380 (facture) 389 (autofacturation)

Points d’attention

  • Numérotation : le numéro de bordereau est généré automatiquement (généralement avec un préfixe AB). Vous ne pouvez pas fournir votre propre numéro.
  • Non idempotent : envoyer deux fois la même charge utile crée deux documents.
  • Les bordereaux d’achat reçus (d’un fournisseur) arrivent via Peppol ; ce n’est pas un cas d’usage de cette API.