MobupayMobupay
Chargement de vos clés API…

Créer une facture

POSThttps://api.mobupay.nc/api/v1/billing/invoices

Ce que fait cet appel

Crée une facture. Par défaut un brouillon : sans numéro, modifiable, non opposable.

Avec issue: true, la facture est émise dans la foulée si elle est complète. Si des mentions obligatoires manquent, l'appel échoue en 422 avec la liste des manques : le brouillon n'est pas créé à moitié.

Le destinataire exige un nom ET une adresse. Une adresse électronique seule ne suffit jamais, quelle que soit la juridiction. Pour un client professionnel, son numéro d'identification (RID en Nouvelle-Calédonie, SIREN en France) est également obligatoire.

Les taxes se déclarent au niveau du document (`taxDetail`) ou par ligne, jamais les deux. Dès qu'une seule ligne porte un taxDetail, le taxDetail racine est ignoré pour TOUTES les lignes, et une ligne sans taxe devient non taxée. C'est la règle du moteur fiscal : la contourner ferait diverger la facture du paiement qu'elle documente.

En-tête d'authentification
Authorization: Bearer sk_test_XXXX

Le pool est déduit du préfixe de la clé

Il n'y a pas d'interrupteur test et production sur cette page. sk_test_* ne traite aucun paiement réel, sk_live_* encaisse.

Corps de la requête

application/json
objectRequis

Destinataire du document. Le nom ET l'adresse sont obligatoires : une adresse électronique seule ne suffit jamais (CGI art. 242 nonies A ann. II 1°, art. Lp. 441-3 du code de commerce NC).

linesarray[object]Requis

Au moins une ligne. Chacune exige une désignation précise et une quantité.

lines[0]
productstringRequis

Dénomination PRÉCISE du bien ou du service. Mention obligatoire : « prestation » ou « divers » ne suffit pas.

descriptionstringOptionnel

Précision libre affichée sous la désignation.

quantitynumberRequis

Quantité. Strictement positive, mention obligatoire.

unitPriceCentsintegerRequis

Prix unitaire HT, dans la plus petite unité de la devise. Le franc pacifique n'a pas de décimale.

discountCentsintegerOptionnel

Remise sur cette ligne. La taxe porte sur la base NETTE, après remise.

unitstringOptionnel

Unité de mesure.

taxDetailarray[object]Optionnel

Taxes de CETTE ligne. Dès qu'une seule ligne en porte, le `taxDetail` du document est ignoré pour toutes les lignes.

catalogItemIdstringOptionnel

Élément de catalogue d'origine (`cti_*`). Les valeurs sont COPIÉES à l'ajout : modifier le catalogue ensuite ne change pas la ligne.

typestringOptionnel

Nature. Détermine l'exigibilité de la taxe : biens à la livraison, services à l'encaissement.

lines[1]
productstringRequis

Dénomination PRÉCISE du bien ou du service. Mention obligatoire : « prestation » ou « divers » ne suffit pas.

descriptionstringOptionnel

Précision libre affichée sous la désignation.

quantitynumberRequis

Quantité. Strictement positive, mention obligatoire.

unitPriceCentsintegerRequis

Prix unitaire HT, dans la plus petite unité de la devise. Le franc pacifique n'a pas de décimale.

discountCentsintegerOptionnel

Remise sur cette ligne. La taxe porte sur la base NETTE, après remise.

unitstringOptionnel

Unité de mesure.

taxDetailarray[object]Optionnel

Taxes de CETTE ligne. Dès qu'une seule ligne en porte, le `taxDetail` du document est ignoré pour toutes les lignes.

catalogItemIdstringOptionnel

Élément de catalogue d'origine (`cti_*`). Les valeurs sont COPIÉES à l'ajout : modifier le catalogue ensuite ne change pas la ligne.

typestringOptionnel

Nature. Détermine l'exigibilité de la taxe : biens à la livraison, services à l'encaissement.

taxDetailarray[object]Optionnel

Taxes applicables à TOUTES les lignes. Ignoré dès qu'une ligne porte son propre `taxDetail`.

taxDetail[0]
idstringRequis

Identifiant unique de la taxe (ex: `TVA20`, `TGC5`).

typestringRequis

PERCENTAGE = valeur en basis-points (2000 = 20%). FIXED = montant fixe en centimes.

valueintegerRequis

Valeur (basis-points pour PERCENTAGE, centimes pour FIXED). Entier positif.

discountCentsintegerOptionnel

Remise globale, en plus des remises de ligne. Répartie au prorata du poids HT de chaque ligne.

currencystringOptionnel

Devise d'affichage du document. Défaut `XPF`.

operationTypestringOptionnel

Détermine l'exigibilité de la taxe : biens à la livraison, services à l'encaissement. Déduit des lignes s'il est absent.

operationDatestringOptionnel

Date de l'opération (AAAA-MM-JJ). Mention obligatoire, distincte de la date d'émission.

dueDatestringOptionnel

Échéance (AAAA-MM-JJ). Défaut : émission + le délai des paramètres, 30 jours à l'installation. Plafonds légaux contrôlés.

purchaseOrderRefstringOptionnel

Référence du bon de commande du client, quand il en impose une.

customFieldsarray[object]Optionnel

Champs libres affichés sur le document.

freeTextstringOptionnel

Texte libre en pied de document. Max 2000 caractères.

paymentIdstringOptionnel

Paiement Mobupay déjà encaissé à rattacher (`pay_*`). La facture sort alors soldée.

quoteIdstringOptionnel

Devis signé dont cette facture est la suite (`qot_*`).

issuebooleanOptionnel

Émettre immédiatement. La facture reçoit son numéro et devient définitive.

Codes de retour

201

Facture créée.

403

Permission billing.write absente, ou module non activé.

422

Mentions obligatoires manquantes : l'émission est refusée, avec le fondement légal de chaque manque.

Langage

Requête cURLpostExemple
1curl --request POST \
2 --url https://api.mobupay.nc/api/v1/billing/invoices \
3 --header 'authorization: Bearer sk_test_XXXX' \
4 --header 'content-type: application/json' \
5 --data '{ "recipient": { "name": "SARL Le Bon Plat", "address": { "line1": "12 rue de l'\''Alma", "postalCode": "98800", "city": "Nouméa", "country": "NC" }, "email": "compta@lebonplat.nc", "registrationId": "1234567.001", "isBusiness": true }, "lines": [ { "product": "Prestation de conseil", "quantity": 3, "unitPriceCents": 25000, "unit": "day", "type": "SERVICE" }, { "product": "Frais de déplacement", "quantity": 1, "unitPriceCents": 8000, "type": "SERVICE" } ], "taxDetail": [ { "id": "TGC11", "type": "PERCENTAGE", "value": 1100 } ], "dueDate": "2026-09-15", "issue": true }'
Réponse

Cliquez sur Essayer pour lancer la requête et voir la réponse ici. Ou choisissez un exemple :

application/json