L’arbitrage se fait depuis le tableau de bord, pas par API. Encaisser ou rembourser
engage une revue humaine : la décision n’est pas automatisable. Votre intégration
détecte le cas et réconcilie le résultat ; la décision, elle, se prend dans
Litiges.
Le piège à connaître d’abord
paymentResult précise la nature : underpaid_accepted, underpaid_rejected,
overpaid_accepted, overpaid_rejected. Les variantes _accepted sont dans la
tolérance — elles se règlent seules, sans arbitrage.
1. Détecter — webhook
Abonnez-vous àdispute.created :
amountRejected— la part brute hors tolérance.amountToRefund— ce qui serait effectivement remboursé, frais déduits.
payment_intent.expired : testez irregularStatus avant de
conclure à un abandon.
2. Consulter — API
Les champs d’irrégularité sont exposés sur le payment intent. Lister ceux en écart :irregularStatus, paymentResult, amountRejected et amountToRefund
— de quoi afficher l’état dans votre back-office et suivre ce qui reste à arbitrer.
Scope requis : payments:read.
3. Arbitrer — tableau de bord
Encaisser ou rembourser se fait dans Litiges. Pour un remboursement, l’adresse du client est reprise de celle qu’il a laissée sur la page de paiement ; elle peut être corrigée au moment de la décision.4. Réconcilier — webhook
data.object.amountEncashed, net de frais — pas
amountRejected, qui est le brut.
Pour un remboursement, payoutId permet de suivre le transfert on-chain via
payout.confirmed ou GET /v1/payouts/{id}.
Récapitulatif
- Détecter —
dispute.created, et garde surirregularStatuspour toutpayment_intent.expired. - Consulter —
GET /v1/payment-intents?status=irregular. - Arbitrer — dans le tableau de bord.
- Réconcilier — sur
dispute.encashed/dispute.refunded, jamais sur le statut de l’intent.
Voir aussi
Litiges au tableau de bord
Où se prend la décision.
Événements webhook
Le format exact de
dispute.*.