Transactions
Une transaction est la source unique de vérité d'un paiement. Vous la créez ; le switch la route vers un fournisseur ; le statut final arrive sur votre webhook. Cette page documente l'appel de création et l'objet transaction complet.
Prerequisites
- Un jeton API valide (Authentification).
- Un profil marchand complété — l'identité et le pays en sont dérivés.
- Les codes de devise et de service que vous utiliserez (p. ex.
CDF,Vodacom). Listez-les avecGET /api/organization/currency/etGET /api/organization/service/.
Créer une transaction
/api/payments/transaction/Bearer · merchantVotre marchand, votre utilisateur et votre pays sont dérivés de votre jeton et de votre
profil — ne les envoyez jamais. Fournissez currency et service sous forme de codes lisibles ;
PayRouter les résout.
curl -X POST https://payrouter.io/api/payments/transaction/ \
-H "Authorization: Bearer $PAYROUTER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"merchant_reference": "INV-2026-0001",
"amount": "100.00",
"currency": "CDF",
"service": "Vodacom",
"customer_number": "0810000000",
"operation": "debit",
"callback_url": "https://your-app.com/payments/webhook"
}'
Champs de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
merchant_reference | string (≤128) | ✔ | Votre référence pour le paiement. Doit être unique par marchand — un doublon renvoie 400. |
amount | chaîne décimale | ✔ | Montant à 2 décimales, p. ex. "100.00". Doit être ≥ 0.01. |
currency | string | ✔ | Code de devise, p. ex. "CDF" ou "USD". Insensible à la casse. |
service | string | ✔ | Nom ou symbole du service, p. ex. "Vodacom", "Airtel", "Orange", "Africell". Insensible à la casse. |
customer_number | string (≤32) | ✔ | Le numéro mobile-money du payeur, p. ex. "0810000000". |
operation | enum | ✔ | "debit" (encaisser auprès du client) ou "credit" (verser au client). |
provider_code_name | string | — | Forcer un fournisseur ("freshpay", "unipesa"). Omettez pour laisser le répartiteur de charge choisir. |
callback_url | URL | — | L'adresse où PayRouter envoie en POST le statut final. Fortement recommandé. |
operation_type | string | — | Par défaut "merchant". |
transaction_type | enum | — | "regular" (par défaut) ou "super". |
Idempotence via merchant_reference
merchant_reference est unique par marchand. Réutilisez la même référence lors des relances
et PayRouter rejette le doublon avec un 400 au lieu de créer un second
paiement — une protection simple contre le double débit en cas de relances réseau.
Réponse
Un 201 renvoie la transaction complète. Le statut est contrôlé par le serveur et démarre
toujours à Received — l'argent ne circule jamais lors de cette requête.
{
"reference": "9F3A1C2D4E5B6A7C8D9E0F1A2B3C4D5E",
"merchant_reference": "INV-2026-0001",
"provider_reference": null,
"amount": "100.00",
"merchant_amount": "0.00",
"commission_amount": "0.00",
"currency_abbr": "CDF",
"service_name": "Vodacom",
"country_abbr": "DRC",
"provider_code_name": "freshpay",
"customer_number": "0810000000",
"operation": "debit",
"transaction_status": "Received",
"transaction_status_code": "200000",
"callback_url": "https://your-app.com/payments/webhook",
"created_at": "2026-06-27T10:21:00Z",
"updated_at": "2026-06-27T10:21:00Z"
}
Champs de réponse clés
| Champ | Description |
|---|---|
reference | L'identifiant permanent de PayRouter. Utilisez-le pour retrouver le paiement et faire correspondre les webhooks. |
merchant_reference | Reprise de votre référence. |
provider_reference | L'identifiant du fournisseur. Renseigné une fois la transaction sollicitée. |
transaction_status | État du cycle de vie (voir ci-dessous). |
transaction_status_code | Code numérique reflétant le statut. |
currency_abbr / service_name / country_abbr | Libellés lisibles des résolutions effectuées. |
provider_code_name | Le fournisseur sélectionné par le switch. |
amount / commission_amount / merchant_amount | Ventilation des montants ; les montants de commission/marchand se remplissent à mesure que le paiement se règle. |
created_at / updated_at | Horodatages (UTC, ISO-8601). |
Statuts
| Statut | Code | Signification |
|---|---|---|
Received | 200000 | Créé et mis en file d'attente pour sollicitation. |
Pending | 300010 | Accepté par le fournisseur ; en attente du callback final. |
Success | 200010 | Terminé avec succès. |
Failed | 400000 | Rejeté ou échoué. |
Cancelled | 400009 | Annulé. |
Le cycle de vie est protégé : Received → Pending → Success | Failed | Cancelled.
Les états terminaux (Success, Failed, Cancelled) sont immuables — une fois
atteints, ils ne changent jamais.
Lire une transaction
# One transaction (by PayRouter reference)
curl https://payrouter.io/api/payments/transaction/9F3A1C2D…5E/ \
-H "Authorization: Bearer $PAYROUTER_TOKEN"
# Its full status timeline
curl https://payrouter.io/api/payments/transaction/9F3A1C2D…5E/history/ \
-H "Authorization: Bearer $PAYROUTER_TOKEN"
# Your transactions (paginated)
curl "https://payrouter.io/api/payments/transaction/?ordering=-created_at&page=1" \
-H "Authorization: Bearer $PAYROUTER_TOKEN"
Le point de terminaison de liste est limité à vos transactions et prend en charge
?search= (reference / merchant_reference / customer_number / provider_reference),
?ordering=-created_at, et les filtres : transaction_status, operation,
provider_code_name, service. Les réponses sont paginées
(count, next, previous, results).
Paiements groupés (versements en masse)
Pour les lots de type paie, groupez les bénéficiaires et payez-les ensemble :
| Point de terminaison | Objet |
|---|---|
POST /api/payments/payment-groups/ | Créer un groupe : { "name": "June payroll" } |
POST /api/payments/payment-request-members/ | Ajouter un membre : { payment_group, name, phone_number, amount, currency } |
GET /api/payments/payment-requests/?payment_group=<id> | Requêtes d'un groupe |
GET /api/payments/payment-transactions/ | Historique de paiement par membre |