MobupayMobupay
Chargement de vos clés API…

Créer un paiement direct

POSThttps://api.mobupay.nc/api/v1/payments/direct

Ce que fait cet appel

Débite directement une carte tokenisée d'un client (paiement one-click). Le client doit avoir un wallet et un paymentMethod actif. Précisez `initiator` : si vous prélevez sans que le porteur soit devant l'écran, échéance d'abonnement ou solde de fin de mois, envoyez initiator: merchant. Le débit est alors déclaré comme initié par le marchand, ce qu'attendent les réseaux, et le transfert de responsabilité s'applique si la carte a été enrôlée chez nous avec authentification.

En captureMode: "AUTO" (défaut), la capture est acquise dès cet appel : la réponse rend status: "captured" et capturedAt, sans qu'aucune scrutation ne soit nécessaire. Les webhooks payment.authorized et payment.captured sont émis dans la foulée, puis payment.settled au règlement, quand la commission devient définitive.

Pour les scénarios plateforme et le financement plateforme, voir la section Cas d'usage (/docs/usecases/distant).

Si vous exploitez plusieurs boutiques sur un même compte, storeId rattache l'encaissement à l'une d'elles : guide « Plusieurs boutiques » (/docs/guides/boutiques).

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
storeIdstringOptionnel

Boutique à laquelle rattacher cet encaissement. Accepte l'identifiant (`sto_*`) **ou le code** de la boutique, celui que vos propres systèmes connaissent déjà. **Champ de premier niveau** : à côté de `externalId`, jamais à l'intérieur de `order`. Une clé inconnue placée dans `order` est écartée en silence, et le paiement partirait alors sur le contrat par défaut sans qu'aucune erreur ne vous prévienne. Facultatif. Si votre clé API est déjà rattachée à une boutique, elle fait autorité et vous n'avez rien à transmettre : le corps peut la répéter, jamais la contredire (`STORE_KEY_MISMATCH`). Une boutique inconnue (`UNKNOWN_STORE`), désactivée (`STORE_INACTIVE`) ou déclarée point de vente physique (`STORE_KIND_MISMATCH`) fait échouer l'appel : elle n'est jamais ignorée. Vos boutiques se créent depuis votre espace marchand, Paramètres puis « Mes offres ». Voir le guide « Plusieurs boutiques » (/docs/guides/boutiques).

merchantConfigIdstringOptionnel

**Usage avancé.** Contrat d'encaissement à employer (`mcf_*`), désigné directement. Ce champ reste accepté, mais la voie normale est la boutique : `storeId`, ou une clé API rattachée à une boutique, désigne le contrat sans que vous ayez à le nommer. Facultatif : absent, le contrat actif par défaut s'applique. Si l'appel et la boutique désignent deux contrats différents, l'appel est refusé (`STORE_CONTRACT_CONFLICT`) : Mobupay n'arbitre jamais en silence entre deux contrats, puisque le choix décide du libellé porté au relevé du client et de la ventilation des fonds.

objectRequis

Détail de la commande à payer. Voir sous-objets `items`, `taxDetail`, `platformConfig`, `delivery`.

initiatorstringOptionnel

Qui déclenche ce prélèvement. `customer` (défaut) : le porteur est devant l'écran et l'a demandé. `merchant` : vous prélevez sans lui, depuis une tâche de fond — une échéance d'abonnement, un solde de fin de mois. Le débit part alors en transaction initiée par le marchand et cite la transaction qui a enrôlé la carte. Déclarer `customer` pour un débit que le porteur n'a pas demandé est une déclaration inexacte, et elle se paie sur les taux d'acceptation. **Le transfert de responsabilité s'applique** dès lors que la carte a été enrôlée chez nous avec authentification : Mobupay rejoue cette authentification sur chaque prélèvement, et la transaction porte alors `liabilityShift`. Une carte enrôlée avant septembre 2026 n'en a pas : le prélèvement aboutit, mais le risque de contestation reste chez vous.

captureModestringOptionnel

AUTO (défaut) = autorisation et capture dans le même appel : la réponse rend directement `status: "captured"` avec `capturedAt` renseigné, et vous recevez `payment.authorized` puis `payment.captured`. MANUAL = autorisation seule : `status: "authorized"`, `capturedAt` nul, capture à demander via `POST /payments/{id}/capture`. En MANUAL, l'autorisation a une durée de validité limitée (moins de 7 jours côté réseau carte) : sans capture dans ce délai, le client n'est jamais débité.

objectRequis

Identifie la carte tokenisée à débiter.

externalIdstringOptionnel

Identifiant externe du paiement côté marchand (sert d'idempotence sur les doublons). Max 255 caractères.

isInclTaxAmountbooleanOptionnel

Le montant `order.amount` inclut les taxes (TTC). Défaut `true`.

languageCodestringOptionnel

Code langue (2 a 5 caractères). Défaut `fr`.

notificationUrlstringOptionnel

URL HTTPS de votre webhook (optionnel) : Mobupay y envoie (POST signé) `payment.authorized`, puis `payment.captured` si `captureMode` valait AUTO. Livrée en complément des endpoints webhook enregistrés. Si absent et aucun endpoint enregistré, seule la réponse HTTP indique le résultat (201 succès, 402 refus).

privateDataobjectOptionnel

Données privees libres conservées côté Mobupay.

Codes de retour

201

Paiement créé et exécuté. store restitue la boutique retenue (null si l'encaissement n'en porte aucune). En environnement de test, storeContractIgnored: true signale que le contrat rattaché à la boutique n'a pas été employé : ce pool n'en compte qu'un seul.

400

Paramètres invalides. Sur la boutique : UNKNOWN_STORE (aucune boutique ne porte cet identifiant ni ce code), STORE_INACTIVE (boutique désactivée), STORE_KIND_MISMATCH (point de vente physique, il n'encaisse pas à distance), STORE_CONTRACT_INACTIVE (le contrat rattaché à la boutique n'est plus actif), STORE_CONTRACT_CONFLICT (l'appel et la boutique désignent deux contrats différents), STORE_KEY_MISMATCH (la clé API est rattachée à une autre boutique que celle demandée).

402

Paiement refusé par l'acquéreur (provision insuffisante, opposition, etc.). La ressource paiement est bien créée (traçabilité) : le corps est identique au 201 avec status: "failed". Ne vous fiez jamais au seul corps de réponse : un code HTTP 402 signifie qu'aucun fonds n'a été encaissé.

404

Customer ou paymentMethod introuvable.

Langage

Requête cURLpostExemple
1curl --request POST \
2 --url https://api.mobupay.nc/api/v1/payments/direct \
3 --header 'authorization: Bearer sk_test_XXXX' \
4 --header 'content-type: application/json' \
5 --data '{ "order": { "reference": "SUB-2026-05", "amount": 2000, "currency": "XPF" }, "paymentInstrument": { "customerId": "cus_2KmBz9aQp4nT8R", "paymentMethodRank": 1 }, "captureMode": "AUTO", "externalId": "INV-2026-05-001", "storeId": "PAITA" }'
Réponse

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

application/json