Démarrage rapide
Émettre une facture, ouvrir sa page de paiement et savoir quand elle a été payée.
Quatre appels suffisent pour passer de rien à de l'argent sur votre solde : créez le document, ouvrez sa page, transmettez l'URL au client, puis attendez le paiement. Rien ne se passe automatiquement entre ces étapes. C'est l'erreur la plus fréquente lors d'une première facture.
Uniquement en live, et votre première facture est réelle
Les factures n'existent pas dans la sandbox. Toutes les routes /invoices, y compris GET,
répondent 403 avec This feature is only available in live mode. à une clé sk_test.. Vous ne
pouvez donc rien essayer au préalable. Émettez votre première facture à votre propre nom, pour un
petit montant. La fonctionnalité est invoicing : 10 factures au total avec Pay as you go, et
un nombre illimité à partir de Growth.
1. Créer le document
Une facture est créée comme brouillon et le reste jusqu'à ce que vous la fassiez avancer. Sa création enregistre un document numéroté, rien de plus : aucun argent ne circule, aucun e-mail n'est envoyé et le client n'est informé de rien.
Quatre champs sont obligatoires, mais la fiche d'un client n'en fait pas partie. Une facture est adressée à un nom. Vous pouvez donc facturer une personne qui ne vous a encore jamais payé.
https://api.wajub.com/invoicescustomer_namestringobligatoireitemsarrayobligatoirename, quantity et unit_price.invoice_datestring (date)obligatoirecurrencystringobligatoirecustomer_emailstringfacultatifdue_datestring (date)facultatifinvoice_date. Détermine quand la facture devient en retard.customer_idstring (uuid)facultatifLa liste complète des champs, les taxes, les remises et le reste se trouvent sur la page Factures. Envoyez cette requête avec une clé secrète live.
curl https://api.wajub.com/invoices \
-H "Authorization: sk.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: invoice-amina-september" \
-d '{
"customer_name": "Amina Traoré",
"customer_email": "amina@example.com",
"invoice_date": "2026-09-11",
"due_date": "2026-09-25",
"currency": "XAF",
"items": [
{ "name": "Consulting, September", "quantity": 3, "unit_price": 150000 }
]
}'La réponse est 201 Created. Les totaux sont calculés à partir des lignes. subtotal, total et
amount_due sont donc renseignés dans la réponse, même si vous ne les avez pas envoyés.
Conservez l'id : tous les appels suivants en ont besoin. invoice_number est la référence lisible
imprimée sur le document. Elle se compose de INV-, de l'année et du mois, puis d'un compteur qui
repart à 0001 chaque mois.
2. Ouvrir sa page de paiement
Une facture au statut draft ne peut pas être payée. Sa page publique répond 403 This invoice is not available for payment. à toute personne qui l'ouvre. Seuls quatre statuts permettent le
paiement : sent, viewed, overdue et partial.
Un appel suffit pour la sortir du statut draft.
https://api.wajub.com/invoices/{id}/sendcurl -X POST https://api.wajub.com/invoices/inv_LRQqYvlhrgUOE225KMKU/send \
-H "Authorization: sk.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…"La réponse est 200, avec status: "sent" et sent_at horodaté.
L'appel Send n'envoie rien
L'appel définit le statut et l'horodatage. C'est tout. Il ne génère aucun PDF et n'envoie aucun e-mail. L'e-mail avec le PDF en pièce jointe est envoyé par le bouton Send du Dashboard. L'API n'emprunte pas ce chemin. Considérez cette étape comme l'ouverture de la page, pas comme son envoi.
3. Transmettre l'URL
L'envoi vous revient : WhatsApp, SMS, votre propre e-mail ou tout autre moyen déjà utilisé avec ce client. L'adresse correspond à l'identifiant de la facture sur son propre domaine.
https://invoice.wajub.com/inv_LRQqYvlhrgUOE225KMKUCette URL ne figure pas dans la réponse de l'API. Construisez-la à partir de l'id conservé. Seul
le domaine peut varier : un marchand qui distribue ses factures depuis un domaine personnalisé et
vérifié utilise ce domaine. Le Dashboard affiche l'adresse réelle sur la facture.
La page qui s'ouvre est un checkout classique. Elle reprend votre identité visuelle, les lignes de
la facture et les opérateurs disponibles pour sa devise. La première fois que le client l'ouvre, la
facture passe automatiquement de sent à viewed.
4. Savoir quand elle a été payée
Une facture payée produit deux événements qui ne sont pas interchangeables.
payment.succeeded représente l'argent. Il contient le montant, le canal et la référence du
prestataire. C'est cet événement qui doit déclencher la livraison, car lui seul prouve que les fonds
ont circulé.
invoice.updated représente le document. Il est émis à chaque modification de la facture. Le
paiement n'est qu'une de ces modifications.
invoice.updatedévénementIl n'existe aucun événement invoice.paid, invoice.sent ou invoice.overdue. Une facture ne peut
émettre que invoice.created, invoice.updated et invoice.deleted. Le statut du payload vous
indique donc la transition concernée.
Livrez à partir du paiement, rapprochez à partir de la facture
Livrez l'achat du client à la réception de payment.succeeded. Utilisez invoice.updated pour
maintenir votre copie du document à jour. Faire l'inverse revient à agir selon un statut que le
marquage manuel comme payé peut également produire.
Quand l'argent a été reçu ailleurs
Espèces, virement bancaire ou paiement qui n'est jamais passé par Wajub : enregistrez-le sur le document au lieu de laisser la facture ouverte.
https://api.wajub.com/invoices/{id}/mark-paidN'envoyez aucun amount pour régler entièrement la facture. Si vous en envoyez un, il est ajouté à
amount_paid. La facture reste alors au statut partial jusqu'à ce que le total soit couvert. Une
facture annulée ou remboursée refuse l'appel avec 400.
Les statuts et qui les attribue
Vous ne pouvez définir que trois des huit statuts. Les autres résultent des actions du client ou d'une tâche nocturne. Il est utile de le savoir avant de construire votre propre machine à états.
| Statut | Signification | Défini par |
|---|---|---|
draft | Créée, non payable | Création |
sent | Payable, en attente | Votre appel /send |
viewed | Le client a ouvert la page | Le client, à la première ouverture |
partial | Une partie du total a été reçue | Un paiement ou votre appel /mark-paid |
paid | Entièrement réglée | Un paiement ou votre appel /mark-paid |
overdue | Échéance dépassée, toujours impayée | Une tâche, chaque nuit à 01 h 00 |
cancelled | Clôturée, plus payable | Votre appel /cancel |
refunded | Payée, puis remboursée | Un remboursement du paiement |
Pages associées
- FacturesTous les champs, le calcul des totaux et les huit appels.
- Factures récurrentesCe que fait aujourd'hui l'indicateur de récurrence, et ce qu'il ne fait pas.
- Relances et suiviRelancer une facture qui n'a plus donné signe de vie.
- ClientsFacturer la fiche d'un client plutôt qu'un simple nom.
- Référence API des facturesTous les champs et les huit endpoints.