{
"id": "evt_9f1c2b7e4a5d4c8fb0a1e2d3c4b5a697",
"type": "cashin.succeeded",
"createdAt": "2026-10-01T10:13:47.512Z",
"merchantReference": "PRT-4F7K2M9Q",
"data": {
"operation": {
"reference": "GUI-CI-20261001-7K2M9QX4",
"type": "CASHIN",
"status": "SUCCEEDED",
"amount": 5000,
"fees": 100,
"netAmount": 4900,
"currency": "XOF",
"country": "CI",
"operator": "ORANGE",
"counterparty": {
"phoneNumber": "+2250701020304",
"name": "Aya Koné"
},
"externalReference": "CMD-2026-00184",
"description": "Commande 184",
"payerActionUrl": null,
"requiresPayerAction": false,
"failure": null,
"metadata": {
"cartId": "c_8891"
},
"createdAt": "2026-10-01T10:12:04.000Z",
"updatedAt": "2026-10-01T10:13:47.000Z",
"completedAt": "2026-10-01T10:13:47.000Z",
"expiresAt": "2026-10-01T10:42:04.000Z"
}
}
}Notification d'opération
Requête que Djonanko envoie à votre serveur dès qu’une opération atteint un état définitif, ou qu’un encaissement attend une action du payeur.
L’URL est celle configurée sur votre compte (webhookUrl), ou celle fournie
dans callbackUrl à la création de l’opération.
Vérifier la signature
Deux en-têtes accompagnent chaque notification :
Djonanko-Signature: t=1759226027,v1=3a7f…
Djonanko-Event: cashin.succeeded
v1 est un HMAC-SHA256 de la chaîne <t>.<corps brut>, calculé avec votre
secret de signature. Vérifiez-le sur le corps brut, avant toute
désérialisation : recalculer après avoir reparsé le JSON produit une chaîne
différente et la vérification échouerait systématiquement.
Comparez aussi t à l’heure courante et refusez au-delà de 5 minutes : c’est
ce qui rend une notification capturée inexploitable.
Ce que votre endpoint doit faire
- Répondre 2xx en moins de 15 secondes. Accusez réception, traitez ensuite en tâche de fond.
- Être idempotent. La livraison est garantie « au moins une fois » :
dédupliquez sur
id. - Être joignable en HTTPS.
En cas d’indisponibilité
3 tentatives immédiates (2 s, 4 s, 8 s), puis des rejeux à 5 min, 15 min, 1 h, 6 h et 24 h — un rattrapage sur environ 31 heures.
Les codes 400, 401, 404, 410 et 422 font abandonner immédiatement :
ils ne se résoudront pas d’eux-mêmes. Un 403 est au contraire réessayé,
parce que c’est typiquement un pare-feu applicatif devant votre serveur, que
vous pouvez débloquer.
Les notifications ne sont pas la source de vérité. Si l’une vous échappe,
GET /operations/{reference} donne toujours l’état réel. N’attendez jamais
une notification indéfiniment : interrogez.
{
"id": "evt_9f1c2b7e4a5d4c8fb0a1e2d3c4b5a697",
"type": "cashin.succeeded",
"createdAt": "2026-10-01T10:13:47.512Z",
"merchantReference": "PRT-4F7K2M9Q",
"data": {
"operation": {
"reference": "GUI-CI-20261001-7K2M9QX4",
"type": "CASHIN",
"status": "SUCCEEDED",
"amount": 5000,
"fees": 100,
"netAmount": 4900,
"currency": "XOF",
"country": "CI",
"operator": "ORANGE",
"counterparty": {
"phoneNumber": "+2250701020304",
"name": "Aya Koné"
},
"externalReference": "CMD-2026-00184",
"description": "Commande 184",
"payerActionUrl": null,
"requiresPayerAction": false,
"failure": null,
"metadata": {
"cartId": "c_8891"
},
"createdAt": "2026-10-01T10:12:04.000Z",
"updatedAt": "2026-10-01T10:13:47.000Z",
"completedAt": "2026-10-01T10:13:47.000Z",
"expiresAt": "2026-10-01T10:42:04.000Z"
}
}
}Djonanko-Signature sur le corps brut, avant toute désérialisation : si vous reparsez le JSON puis le ré-sérialisez pour calculer le HMAC, la vérification échouera systématiquement.Code de vérification en JavaScript, Python et PHP : Webhooks.Headers
t=<horodatage unix>,v1=<hmac-sha256 hexadécimal>
"t=1759226027,v1=3a7f9c1e8b2d4f6a0c5e7b9d1f3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a"
Type de l'événement, pour router sans lire le corps.
"cashin.succeeded"
Body
Identifiant de l'événement. Utilisez-le pour dédupliquer.
"evt_9f1c2b7e4a5d4c8fb0a1e2d3c4b5a697"
cashin.awaiting_payer— le payeur doit agircashin.succeeded— encaissement confirmé, portefeuille créditécashin.failed— encaissement refusécashin.expired— aucune issue dans le délaicashout.succeeded— bénéficiaire créditécashout.failed— transfert refusé, immobilisation levéecashout.expired— aucune issue, immobilisation levéeoperation.reversed— opération contre-passéewallet.adjusted— régularisation de portefeuilleping— notification de test
cashin.awaiting_payer, cashin.succeeded, cashin.failed, cashin.expired, cashout.succeeded, cashout.failed, cashout.expired, operation.reversed, wallet.adjusted, ping "PRT-4F7K2M9Q"
Contenu de l'événement. Pour tous les types liés à une opération, contient operation, dans la même forme que les réponses d'API.
Show child attributes
Show child attributes
Response
Notification acceptée. Tout code 2xx convient.
