Authentification

Deux types de clés, deux pouvoirs très différents. Les confondre est la faute la plus coûteuse d'une intégration.

Deux types de clés

Chaque compte dispose de deux clés par environnement. Elles n'ouvrent pas les mêmes portes, et les confondre est la faute la plus coûteuse d'une intégration.

Clé publique pk_Clé secrète sk_
Où elle vitDans le source de votre page — visible de tousSur votre serveur uniquement
Ce qu'elle permetOuvrir une session de paiement, rien d'autreCréer, lire, rembourser
Quota20 requêtes/min par clé et par IPQuota du compte marchand
Si elle fuiteUn tiers crée des sessions à votre nomUn tiers encaisse et rembourse à votre place
La clé secrète n'est affichée qu'à sa création. NguePay n'en conserve qu'une empreinte : personne, pas même le support, ne peut vous la relire.

Envoyer la clé

Toujours en en-tête Authorization, jamais en paramètre d'URL — une clé dans une URL se retrouve dans les logs d'accès, l'historique du navigateur et le Referer envoyé aux sites tiers.

Authorization: Bearer sk_live_VOTRE_CLE_SECRETE
Content-Type: application/json

Sandbox et production

Le mode est porté par la clé elle-même. Un serveur de recette qui détient une clé sk_sandbox_ ne peut pas encaisser en vrai, même s'il vise par erreur l'URL de production.

ModePréfixesURL de base
Sandboxpk_sandbox_ · sk_sandbox_https://api.sandbox.nguepay.com/api/v1
Productionpk_live_ · sk_live_https://api.live.nguepay.com/api/v1

Déclarer le domaine d'une clé publique

Le résultat d'un paiement ouvert dans le navigateur vous est rendu par postMessage. Pour qu'aucune page tierce ne puisse l'intercepter en encadrant le checkout, NguePay n'émet que vers l'origine déclarée sur la clé publique, jamais vers '*'.

Une clé publique sans domaine déclaré est refusée avec NGP015. Renseignez-le dans votre dashboard, onglet Clés API, au format https://votre-boutique.ci — schéma et hôte, sans chemin.

Le même domaine borne l'URL de retour. Une session créée avec la clé publique n'accepte un return_url — ou un metadata.return_url — que s'il a la même origine que le domaine déclaré : même schéma, même hôte, même port. Sinon, l'appel est refusé en 422 (NGP_VALIDATION, détail sur le champ fautif). Sans cette règle, n'importe qui pourrait ouvrir une page de paiement à votre nom dont le bouton « Retour » mènerait ailleurs.

Une clé secrète envoyée depuis un navigateur (requête portant un en-tête Origin) est refusée en 401 avec NGP001. Une clé secrète qui a transité par un navigateur doit être considérée comme exposée : régénérez-la, et utilisez la clé publique côté client.

Mot de passe oublié

Deux endpoints publics, sans authentification. Ils concernent le compte dashboard d'un marchand, jamais ses clés API — une clé perdue se révoque et se remplace, elle ne se réinitialise pas.

POST/v1/auth/password/forgot

Envoie le lien de réinitialisation.

curl -X POST https://api.live.nguepay.com/api/v1/auth/password/forgot \
  -H "Content-Type: application/json" \
  -d '{"email": "marchand@boutique.ci"}'
La réponse est toujours la même, que l'adresse existe ou non. Distinguer les deux cas offrirait un moyen d'énumérer les marchands de la plateforme, une requête à la fois.
POST/v1/auth/password/reset

Applique le nouveau mot de passe.

curl -X POST https://api.live.nguepay.com/api/v1/auth/password/reset \
  -H "Content-Type: application/json" \
  -d '{
    "token": "le-jeton-recu-par-email",
    "email": "marchand@boutique.ci",
    "password": "NouveauMotDePasse2026",
    "password_confirmation": "NouveauMotDePasse2026"
  }'
RègleValeur
Durée de vie du lien60 minutes
UsageUne seule fois — le jeton meurt à la première réinitialisation
Quota5 requêtes / 10 min sur chacun des deux endpoints
Sessions ouvertesToutes fermées après un changement

Ce dernier point compte : une réinitialisation fait souvent suite à une compromission. Laisser vivre les jetons existants laisserait l'intrus en place.

Un lien expiré, déjà utilisé ou visant un autre compte répond NGP019.

Compte dashboard : mot de passe et session

Le compte dashboard est celui d'une personne ; les clés API sont celles d'un serveur. Les règles ci-dessous ne concernent que le premier.

RègleValeur
Mot de passe10 caractères minimum, avec au moins une lettre et un chiffre — à l'inscription, au changement et à la réinitialisation
Durée d'une session12 heures, puis nouvelle connexion
E-mails de sécuritéRéinitialisation, vérification, nouvelle connexion, échec de double authentification : toujours envoyés à l'adresse principale du compte

Certaines actions ne sont permises qu'avec une session dashboard, jamais avec une clé API. C'est le cas des coordonnées de notification (notification_email, notification_phone) : les modifier avec une clé répond 403 avec NGP023. Une clé secrète volée ne doit pas permettre de détourner les alertes du compte.

Double authentification

La double authentification ajoute à la connexion un code à 6 chiffres produit par une application d'authentification (TOTP : Google Authenticator, Authy, 1Password…). Elle est facultative pour un compte marchand, et fortement recommandée dès que le compte encaisse en production.

L'activer

  1. Dans le dashboard, Paramètres › Sécurité › Double authentification, saisissez votre mot de passe actuel.
  2. Scannez le QR code avec votre application, ou saisissez la clé affichée.
  3. Confirmez avec le premier code à 6 chiffres.
  4. Notez les 8 codes de secours : ils ne seront plus jamais affichés.

À l'activation, toutes vos autres sessions ouvertes sont fermées : elles avaient été obtenues sans second facteur. Votre profil (GET /v1/auth/me) expose alors two_factor_enabled: true.

Ce que ça change à la connexion

Avec la double authentification active, un mot de passe correct ne suffit plus : POST /v1/auth/login ne délivre aucun jeton et renvoie un défi.

{
  "success": true,
  "data": { "two_factor_required": true, "challenge": "3b9f…" },
  "message": "Saisissez le code de votre application d'authentification."
}
POST/v1/auth/two-factor/challenge

Échange le défi et un code contre une session complète — même réponse qu'une connexion sans double authentification.

curl -X POST https://api.live.nguepay.com/api/v1/auth/two-factor/challenge \
  -H "Content-Type: application/json" \
  -d '{"challenge": "3b9f…", "code": "482913"}'

À la place de code, vous pouvez envoyer recovery_code avec un de vos codes de secours. Chaque code de secours ne sert qu'une fois.

RègleValeur
Validité d'un défi5 minutes, 5 essais
Échecs tolérés par compte10 par heure, toutes connexions confondues — au-delà, la double authentification est verrouillée pendant une heure
AlerteLe titulaire est prévenu par e-mail dès le premier échec de l'heure, puis au verrouillage
Code invalide, expiré ou déjà utilisé401 avec NGP022
Les clés API ne sont pas concernées : la double authentification protège la connexion au dashboard et les sessions qui en découlent. Vos appels serveur avec sk_ continuent de fonctionner sans changement.

Par API

Le dashboard fait ces appels pour vous ; ils sont documentés pour qui pilote son compte autrement. Tous exigent une session dashboard.

AppelCorpsEffet
POST /v1/auth/two-factor/setupcurrent_passwordRenvoie secret et otpauth_uri à scanner.
POST /v1/auth/two-factor/confirmcode, current_passwordActive la double authentification, ferme les autres sessions, renvoie une nouvelle session et recovery_codes.
POST /v1/auth/two-factor/disablecodeDésactive la double authentification et invalide les codes de secours.

Un mot de passe actuel absent ou faux, ou un code refusé, répond 422 avec NGP022.

Perdre à la fois son téléphone et ses codes de secours, c'est perdre l'accès au dashboard. Rangez les codes hors du téléphone qui porte l'application.

Vérifier que tout est branché

curl https://api.sandbox.nguepay.com/api/v1/ping \
  -H "Authorization: Bearer sk_sandbox_VOTRE_CLE"
{
  "success": true,
  "data": { "merchant": "3f8c…", "mode": "sandbox" },
  "message": "pong"
}

Limites de débit

Au-delà de votre quota, l'API répond 429 avec NGP007 et un en-tête Retry-After. Attendez le délai indiqué plutôt que de réessayer en boucle : les tentatives refusées comptent aussi.

Règles d'hygiène

Besoin d'aide ?