Plans de paiement
Créez et pilotez un échéancier depuis votre code : acompte, échéances et solde, payés par lien ou débités sur la carte du voyageur. Aperçu, création, modification, suspension, débit automatique et mode test.
Vérifié sur le code de l'API le 30 octobre 2026
Vue d'ensemble
Un plan de paiement répartit le montant d'une alternative en un acompte, des échéances intermédiaires et un solde. Il a une seule URL de paiement : le voyageur y règle chaque échéance à son tour, ou la carte qu'il a enregistrée est débitée automatiquement à chaque date.
Côté API, un plan est un lien de paiement de kind: "PLAN". Sur ce lien, amountCents vaut l'échéance à payer maintenant, jamais le total. Le total et chaque échéance se lisent sur le plan.
| Méthode | Chemin | Scope |
|---|---|---|
POST | /v1/bookings/:id/payment-plans/preview | payment-plans:read |
POST | /v1/bookings/:id/payment-plans | payment-plans:write |
GET | /v1/bookings/:id/payment-plans | payment-plans:read |
GET | /v1/payment-plans/:id | payment-plans:read |
GET | /v1/payment-plan-templates | payment-plans:read |
GET | /v1/bookings/:id/payment-plan-suggestion | payment-plans:read |
PATCH | /v1/payment-plans/:id | payment-plans:write |
POST | /v1/payment-plans/:id/pause | payment-plans:write |
POST | /v1/payment-plans/:id/resume | payment-plans:write |
POST | /v1/payment-plans/:id/cancel | payment-plans:write |
POST | /v1/payment-plans/:id/installments/:installmentId/mark-paid | payment-plans:write |
POST | /v1/payment-plans/:id/installments/:installmentId/resend-link | payment-plans:write |
GET | /v1/payment-plans/:id/events | payment-plans:read, clé de test |
Un plan s'ouvre sur une alternative. Il ne peut y en avoir qu'un d'ouvert à la fois, et pas à côté d'un lien réutilisable actif. Un plan compte de 2 à 7 paiements : l'acompte, puis 1 à 6 paiements, dont le solde.
Créer un plan
Calculer un aperçu
/v1/bookings/:id/payment-plans/previewScopepayment-plans:readMême corps que la création. Rien n'est écrit. La réponse dit le plan que la création ferait, et tout ce qui la refuserait : valid vaut true quand la création passerait, à un changement concurrent près. C'est un POST, il compte dans la limite des écritures.
{
"success": true,
"data": {
"preview": {
"alternative": { "id": "b3a1f0e2-6d4c-4e8a-9b7f-1c2d3e4f5a6b", "ezusAlternativeId": "ALT-1" },
"template": { "id": "4d2c1b0a-9e8f-4a7b-8c6d-5e4f3a2b1c0d", "name": "Standard" },
"amountCents": 480000,
"currency": "EUR",
"availableCents": 480000,
"collectionMode": "AUTO_CHARGE",
"rules": { "depositPercent": 30, "paymentsAfterDeposit": 2, "balanceOffsetDays": 45 },
"installments": [
{ "amountCents": 144000, "dueDate": "2026-04-21" },
{ "amountCents": 168000, "dueDate": "2026-05-09" },
{ "amountCents": 168000, "dueDate": "2026-05-26" }
],
"valid": true,
"errors": [],
"warnings": []
}
}
}
errors mêle les codes de l'échéancier et l'état de l'alternative. sequence, quand il est présent, désigne l'échéance en cause (1 est l'acompte).
| Code | Signification |
|---|---|
SUM_MISMATCH | La somme des échéances diffère de amountCents |
DATES_NOT_INCREASING | Deux échéances ne se suivent pas dans le temps |
FIRST_DUE_DATE_IN_PAST | L'acompte tombe avant aujourd'hui (heure de Paris) |
LAST_DUE_DATE_NOT_BEFORE_DEPARTURE | Le solde tombe le jour du départ ou après |
INSTALLMENT_BELOW_MINIMUM | Une échéance est sous 1,00 |
INSTALLMENT_COUNT_OUT_OF_RANGE | Moins de 2 ou plus de 7 paiements |
EXCEEDS_AVAILABLE | Le plan dépasse ce qui reste à encaisser sur l'alternative |
DEPARTURE_DATE_REQUIRED | L'alternative n'a pas de date de départ |
NOTHING_TO_COLLECT | Il ne reste rien à encaisser |
PAYMENT_PLAN_ALREADY_ACTIVE | Un plan est déjà ouvert sur l'alternative |
REUSABLE_LINK_ACTIVE | Un lien réutilisable est actif sur l'alternative |
AUTO_CHARGE_EMAIL_REQUIRED | Débit automatique sans email du client |
AUTO_CHARGE_REQUIRES_CARD | Débit automatique sans la carte dans allowedMethods |
warnings peut contenir INSTALLMENTS_TOO_CLOSE : accepté, mais deux paiements sont à moins de 14 jours d'écart.
Créer le plan
/v1/bookings/:id/payment-plansScopepayment-plans:writeCrée le plan et son lien sur une alternative du dossier. Renvoie 201 avec le plan. L'agence doit avoir un compte Stripe actif (403 STRIPE_NOT_ACTIVE sinon).
L'échéancier vient d'une seule source :
templateId: un modèle de l'agence (voir Lister les modèles). Ses règles, son mode d'encaissement et ses options s'appliquent au dossier.rulesseules : le serveur calcule les échéances. L'acompte vautdepositPercent% du montant, arrondi à l'unité, et tombe aujourd'hui. Le solde tombebalanceOffsetDaysjours avant le départ. Les échéances intermédiaires se répartissent entre les deux, et le solde absorbe les arrondis.rules+installments: vos propres dates et montants, revalidés par les mêmes règles.
| Champ | Type | Obligatoire | Règles |
|---|---|---|---|
templateId | uuid | l'un ou l'autre | Un modèle de l'agence |
rules.depositPercent | integer | l'un ou l'autre | De 1 à 99 |
rules.paymentsAfterDeposit | integer | avec rules | De 1 à 6, le solde compris |
rules.balanceOffsetDays | integer | avec rules | De 1 à 365 jours avant le départ |
installments | array | non | { amountCents, dueDate } dans l'ordre, paymentsAfterDeposit + 1 entrées. Exige rules |
amountCents | integer | non | Le total à échelonner. Par défaut, ce qui reste à encaisser sur l'alternative, ou la somme de installments quand vous les envoyez |
collectionMode | string | non | LINK ou AUTO_CHARGE. Par défaut celui du modèle, sinon LINK |
remindersEnabled | boolean | non | Rappels J-7 et J-1 avant une échéance payée par lien. Par défaut celui du modèle, sinon false |
allowEarlyPayment | boolean | non | Par défaut celui du modèle, sinon true |
allowedMethods | array | non | "card" et/ou "sepa_debit". ["card"] par défaut. Le SEPA ne s'applique qu'en EUR et jamais en débit automatique |
label | string | non | Jusqu'à 255. Par défaut, la référence du dossier, ou son nom |
checkoutFieldKeys | array | non | Comme pour un lien de paiement |
alternativeId / ezusAlternativeId | string | non | Alternative ciblée, comme pour un lien. Par défaut, l'alternative principale |
Le corps est strict : un champ inconnu renvoie 422 VALIDATION_ERROR au lieu d'être ignoré. templateId et rules ensemble renvoient 422 PLAN_SOURCE_AMBIGUOUS, aucun des deux 422 PLAN_SOURCE_REQUIRED.
curl -X POST https://api.ezuspay.app/v1/bookings/7c9e6679-7425-40de-944b-e07fc1f90ae7/payment-plans \
-H "x-api-key: $EZP_KEY" -H "Content-Type: application/json" \
-d '{
"ezusAlternativeId": "ALT-1",
"templateId": "4d2c1b0a-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
"collectionMode": "AUTO_CHARGE"
}'
{
"success": true,
"data": {
"paymentPlan": {
"id": "9b2e4c1a-3f5d-4e6a-8b7c-0d1e2f3a4b5c",
"status": "PENDING",
"collectionMode": "AUTO_CHARGE",
"totalAmountCents": 480000,
"paidCents": 0,
"installments": [
{ "id": "1a2b3c4d-0000-4000-8000-000000000001", "sequence": 1, "amountCents": 144000, "dueDate": "2026-04-21", "status": "SCHEDULED", "paidAt": null, "collectionMode": "AUTO_CHARGE" },
{ "id": "1a2b3c4d-0000-4000-8000-000000000002", "sequence": 2, "amountCents": 168000, "dueDate": "2026-05-09", "status": "SCHEDULED", "paidAt": null, "collectionMode": "AUTO_CHARGE" },
{ "id": "1a2b3c4d-0000-4000-8000-000000000003", "sequence": 3, "amountCents": 168000, "dueDate": "2026-05-26", "status": "SCHEDULED", "paidAt": null, "collectionMode": "AUTO_CHARGE" }
],
"label": "2026-0042",
"currency": "EUR",
"allowedMethods": ["card"],
"allowEarlyPayment": true,
"remindersEnabled": true,
"rules": { "name": "Standard", "depositPercent": 30, "paymentsAfterDeposit": 2, "balanceOffsetDays": 45 },
"templateId": "4d2c1b0a-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
"attentionReason": null,
"autoCharge": { "active": false, "cardBrand": null, "cardLast4": null },
"createdVia": "API",
"paymentLink": { "id": "d290f1ee-6c54-4b01-90e6-d701748f0851", "checkoutUrl": "https://app.ezuspay.io/lnk/voyages-horizon/8K3QZ7M2XR4T" },
"booking": { "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "reference": "2026-0042", "ezusProjectId": "PRJ-1029" },
"alternative": { "id": "b3a1f0e2-6d4c-4e8a-9b7f-1c2d3e4f5a6b", "ezusAlternativeId": "ALT-1" },
"createdAt": "2026-04-21T09:15:00.000Z",
"updatedAt": "2026-04-21T09:15:00.000Z"
}
}
}
| Champ | Valeurs |
|---|---|
status | PENDING (acompte pas encore payé), ACTIVE, PAUSED, COMPLETED, CANCELLED |
paidCents | Les échéances réglées, hors Stripe comprises |
installments[].status | SCHEDULED, PROCESSING (argent en route), PAID, FAILED, ACTION_REQUIRED, ON_HOLD, CANCELLED |
installments[].collectionMode | Peut valoir LINK sur un plan AUTO_CHARGE : cette échéance sera payée par lien |
autoCharge.active | true quand le voyageur a consenti, que sa carte est enregistrée et que le plan est ouvert |
attentionReason | Pourquoi le plan demande l'agence, sinon null : PAYMENT_FAILED, INSTALLMENT_UNPAID, NOTICE_UNDELIVERABLE, ORPHAN_PAYMENT, OVERPAID, TOTAL_NOT_ABSORBED, INSTALLMENT_REFUNDED |
createdVia | APP ou API |
paymentLink.checkoutUrl | L'URL à transmettre au voyageur, ou à ouvrir dans le checkout intégré |
Rejouer après un délai dépassé
Il n'existe pas d'en-tête Idempotency-Key, mais la création est sûre à rejouer : une seconde tentative sur la même alternative renvoie 409 PAYMENT_PLAN_ALREADY_ACTIVE, avec l'identifiant du plan déjà ouvert.
{
"success": false,
"error": {
"code": "PAYMENT_PLAN_ALREADY_ACTIVE",
"message": "This alternative already has an open payment plan",
"details": { "planId": "9b2e4c1a-3f5d-4e6a-8b7c-0d1e2f3a4b5c" }
}
}
Lisez ce plan avec GET /v1/payment-plans/:id plutôt que d'en créer un autre.
Débit automatique
Avec collectionMode: "AUTO_CHARGE", la carte du voyageur est débitée à chaque date, après un préavis. Seul le voyageur peut l'activer : en payant l'acompte sur la page du plan, il clique sur un bouton qui nomme l'autorisation, par exemple « Payer 1 440,00 € et activer l'échéancier ». L'API ne peut ni donner ce consentement ni enregistrer une carte.
- L'email du client est obligatoire, pour le prévenir avant chaque débit (
422 AUTO_CHARGE_EMAIL_REQUIRED). Pour un dossier Ezus, corrigez-le dans Ezus puis appelezPOST /v1/bookings/:id/resync. - Carte uniquement.
allowedMethodsdoit contenircard. Le SEPA est retiré d'office. - Après le consentement,
autoCharge.activepasse àtrue, avec la marque et les 4 derniers chiffres de la carte, et le webhookpayment_plan.auto_charge_activatedpart. - Le voyageur peut refuser en choisissant « Payer uniquement l'acompte » (« Payer uniquement cette échéance » après l'acompte). Les échéances suivantes passent alors au lien.
- Modifier le montant ou la date d'une échéance d'un plan consenti la sort du débit : elle sera payée par lien, et le voyageur est prévenu. Les autres échéances restent débitées.
- Un débit refusé donne au plus un nouvel essai trois jours plus tard, annoncé au voyageur. Une carte inutilisable, ou une banque qui demande au voyageur de s'authentifier, fait passer l'échéance au lien.
- Le voyageur peut désactiver le débit depuis la page du plan, avec « Désactiver le débit automatique ». L'agence peut aussi annuler le plan.
- Sur un plan soldé ou annulé,
autoCharge.activevautfalse. Pendant une suspension, il restetrue: le débit reprendra.
Emails au voyageur
Ezus Pay écrit au voyageur, quel que soit l'auteur du plan : préavis avant chaque débit, lien le jour de l'échéance, relance trois jours après une échéance impayée, refus de débit, montant ou date changés, annulation. Si votre système envoie aussi ses propres relances, le voyageur recevra les deux.
| Peut être coupé | |
|---|---|
| Rappels J-7 et J-1 avant une échéance payée par lien | Oui, avec remindersEnabled: false |
| Lien le jour de l'échéance, relance trois jours après | Non |
| Préavis avant un débit | Non : c'est la promesse faite au voyageur quand il a consenti |
| Refus, montant ou date changés, annulation | Non : ils annoncent un changement d'argent |
En mode test, aucun email ne part au voyageur. Voir Mode test.
Lire les plans
Lister les plans d'un dossier
/v1/bookings/:id/payment-plansScopepayment-plans:readTous les plans du dossier, toutes alternatives et tous statuts confondus, du plus récent au plus ancien, dans la forme ci-dessus. Renvoie 404 BOOKING_NOT_FOUND pour un dossier hors de votre agence.
Lire un plan
/v1/payment-plans/:idScopepayment-plans:readUn plan, dans la forme ci-dessus. Renvoie 404 PAYMENT_PLAN_NOT_FOUND quand le plan n'est pas celui de l'agence de la clé.
Les liens de plan apparaissent aussi dans GET /v1/bookings/:id/payment-links et GET /v1/payment-links/:id, avec un résumé plan. Voir la référence.
Lister les modèles
/v1/payment-plan-templatesScopepayment-plans:readLes modèles de plan de l'agence, le modèle par défaut en tête. Ils se gèrent dans Paramètres → Plans de paiement. L'API ne les modifie pas.
{
"success": true,
"data": {
"templates": [
{
"id": "4d2c1b0a-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
"name": "Standard",
"isDefault": true,
"depositPercent": 30,
"paymentsAfterDeposit": 2,
"balanceOffsetDays": 45,
"collectionMode": "LINK",
"remindersEnabled": true,
"allowEarlyPayment": true,
"suggestMinAmountCents": null,
"suggestMinDaysBeforeDeparture": null
}
]
}
}
suggestMinAmountCents (dans la devise de l'agence) et suggestMinDaysBeforeDeparture sont les conditions de suggestion du modèle, null quand il n'y en a pas.
Lire le plan suggéré
/v1/bookings/:id/payment-plan-suggestionScopepayment-plans:readLe plan que les modèles de l'agence suggèrent sur une alternative, calculé sur ce qui reste à encaisser. L'alternative principale par défaut, ou ?alternativeId= ou ?ezusAlternativeId= pour une autre, jamais les deux. Le modèle retenu est le plus spécifique dont les conditions tiennent, sinon le modèle par défaut si son échéancier est valide.
{
"success": true,
"data": {
"suggestion": {
"template": { "id": "4d2c1b0a-9e8f-4a7b-8c6d-5e4f3a2b1c0d", "name": "Standard" },
"alternative": { "id": "b3a1f0e2-6d4c-4e8a-9b7f-1c2d3e4f5a6b", "ezusAlternativeId": "ALT-1" },
"amountCents": 480000,
"currency": "EUR",
"installments": [
{ "amountCents": 144000, "dueDate": "2026-04-21" },
{ "amountCents": 168000, "dueDate": "2026-05-09" },
{ "amountCents": 168000, "dueDate": "2026-05-26" }
],
"matched": true
}
}
}
suggestion vaut null quand aucun plan ne peut être créé ou n'aiderait : plan déjà ouvert, lien réutilisable actif, rien à encaisser, pas de date de départ, dossier annulé. matched vaut false quand aucune condition de modèle ne tient et que le modèle par défaut est proposé. Pour créer ce plan, envoyez son templateId.
Faire vivre un plan
Chaque action renvoie le plan tel qu'il est après elle. Un plan qui a bougé entre votre lecture et votre action (un paiement vient d'arriver) renvoie 409 PAYMENT_PLAN_CHANGED : relisez-le, puis rejouez. Tant qu'un paiement d'une échéance est en route, la modification et l'annulation renvoient 409 INSTALLMENT_PROCESSING.
Modifier les échéances
/v1/payment-plans/:idScopepayment-plans:writeModifie les dates et les montants des échéances non payées. Envoyez-les toutes, dans l'ordre, par id. Leur nombre ne change pas : pour en changer, annulez le plan et créez-en un autre. Le total suit.
| Champ | Type | Règles |
|---|---|---|
installments | array | { id, amountCents, dueDate } de chaque échéance non payée, dans l'ordre |
label | string | Jusqu'à 255 |
allowEarlyPayment | boolean | |
remindersEnabled | boolean |
curl -X PATCH https://api.ezuspay.app/v1/payment-plans/9b2e4c1a-3f5d-4e6a-8b7c-0d1e2f3a4b5c \
-H "x-api-key: $EZP_KEY" -H "Content-Type: application/json" \
-d '{
"installments": [
{ "id": "1a2b3c4d-0000-4000-8000-000000000002", "amountCents": 158000, "dueDate": "2026-05-12" },
{ "id": "1a2b3c4d-0000-4000-8000-000000000003", "amountCents": 178000, "dueDate": "2026-05-26" }
]
}'
Sur un plan dont le voyageur a consenti au débit automatique, une échéance dont le montant ou la date change passe au lien. Voir Débit automatique.
Suspendre et reprendre
/v1/payment-plans/:id/pauseScopepayment-plans:writePlus aucun préavis, débit ni lien automatique ne part. Le lien reste payable, et le voyageur n'est pas prévenu. Pas de corps.
/v1/payment-plans/:id/resumeScopepayment-plans:writeChaque échéance dont la date est passée pendant la suspension demande une nouvelle date, sinon 422 RESUME_DECISIONS_REQUIRED. Sans échéance dépassée, le corps peut être vide. Le voyageur reçoit les dates en vigueur.
{
"decisions": [
{ "installmentId": "1a2b3c4d-0000-4000-8000-000000000002", "action": "reschedule", "dueDate": "2026-06-01" }
]
}
Sur un plan consenti, une échéance replanifiée passe au lien.
Annuler
/v1/payment-plans/:id/cancelScopepayment-plans:writeAnnule les échéances non payées et le lien, détache la carte du débit automatique et prévient le voyageur. Ce qui est payé le reste : un remboursement passe par POST /v1/transactions/:id/refunds. Pas de corps.
Marquer une échéance réglée
/v1/payment-plans/:id/installments/:installmentId/mark-paidScopepayment-plans:writePour un paiement reçu hors Stripe : un paiement manuel du montant exact de l'échéance est enregistré, et le plan avance. Seulement la prochaine échéance (409 INSTALLMENT_NOT_NEXT sinon). Pas de commission, pas d'email au voyageur.
| Champ | Type | Règles |
|---|---|---|
method | string | BANK_TRANSFER, CASH, CHECK ou OTHER |
paidAt | date | YYYY-MM-DD, aujourd'hui ou avant |
note | string | Jusqu'à 1 000 caractères, par exemple la référence du virement |
Renvoyer le lien
/v1/payment-plans/:id/installments/:installmentId/resend-linkScopepayment-plans:writeEnvoie au voyageur le lien de la prochaine échéance. Pas deux fois en 10 minutes (429 LINK_RECENTLY_SENT). La réponse ajoute emailSent, qui vaut false en mode test. Dans l'exemple ci-dessous, le plan est abrégé.
{ "success": true, "data": { "paymentPlan": { "id": "9b2e4c1a-3f5d-4e6a-8b7c-0d1e2f3a4b5c" }, "emailSent": true } }
Mode test
Avec une clé ezpay_test_, les plans fonctionnent comme en production, débit automatique compris, sur le compte Stripe de test. Aucun email ne part au voyageur : chaque email est gardé dans le journal du plan.
Lire le journal
/v1/payment-plans/:id/eventsScopepayment-plans:readLe journal du plan, du plus ancien au plus récent. Disponible avec une clé de test uniquement (403 TEST_MODE_ONLY avec une clé de production).
{
"success": true,
"data": {
"events": [
{ "id": "…", "kind": "CREATED", "occurredAt": "2026-04-21T09:15:00.000Z", "installmentId": null, "actor": "API", "webhook": "payment_plan.created", "email": null },
{
"id": "…",
"kind": "NOTICE_SENT",
"occurredAt": "2026-05-06T06:00:00.000Z",
"installmentId": "1a2b3c4d-0000-4000-8000-000000000002",
"actor": "SYSTEM",
"webhook": null,
"email": { "to": "jean@example.com", "subject": "Prélèvement de 1 680,00 € le 9 mai 2026 — Voyages Horizon", "text": "…" }
}
]
}
}
actorvautAPP(un membre de l'agence),API(une clé) ouSYSTEM(le planificateur des débits, Stripe, le voyageur).webhookest l'événement que cette entrée envoie à vos endpoints, ounull.emailest l'email qui serait parti en production, dans la langue du voyageur.
Erreurs
En plus des erreurs communes :
| Erreur | Quand |
|---|---|
404 BOOKING_NOT_FOUND, 404 ALTERNATIVE_NOT_FOUND | Dossier ou alternative hors de votre agence |
404 PAYMENT_PLAN_NOT_FOUND | Plan inconnu, ou d'une autre agence |
404 TEMPLATE_NOT_FOUND, 404 INSTALLMENT_NOT_FOUND | Modèle ou échéance inconnus |
403 STRIPE_NOT_ACTIVE | Le compte Stripe de l'agence ne peut pas encaisser |
403 TEST_MODE_ONLY | Le journal se lit avec une clé de test |
422 PLAN_SOURCE_AMBIGUOUS, 422 PLAN_SOURCE_REQUIRED | templateId et rules ensemble, ou aucun |
422 NOTHING_TO_COLLECT | Il ne reste rien à encaisser sur l'alternative |
422 DEPARTURE_DATE_REQUIRED | L'alternative n'a pas de date de départ |
422 INVALID_PAYMENT_PLAN_SCHEDULE | Échéancier invalide (somme, dates, nombre d'échéances) |
422 AMOUNT_EXCEEDS_AVAILABLE | Le plan dépasse ce qui reste à encaisser |
422 AUTO_CHARGE_EMAIL_REQUIRED, 422 AUTO_CHARGE_REQUIRES_CARD | Débit automatique impossible |
422 NO_PAYMENT_METHOD_FOR_CURRENCY | Aucun moyen de paiement possible dans cette devise |
422 RESUME_DECISIONS_REQUIRED | Une échéance dépassée pendant la suspension n'a pas de nouvelle date |
422 NO_TRAVELER_EMAIL | Aucun email voyageur pour renvoyer le lien |
409 PAYMENT_PLAN_ALREADY_ACTIVE | Un plan est déjà ouvert (error.details.planId) |
409 REUSABLE_LINK_ACTIVE | Un lien réutilisable est actif sur l'alternative |
409 PAYMENT_PLAN_CHANGED | Le plan a bougé depuis votre lecture : relisez-le, puis rejouez |
409 INSTALLMENT_PROCESSING | Un paiement de l'échéance est en route |
409 INSTALLMENT_NOT_NEXT | Seule la prochaine échéance peut être réglée ou relancée |
409 INSTALLMENT_NOT_PAYABLE | L'échéance est déjà réglée ou annulée |
409 PAYMENT_PLAN_NOT_OPEN | Le plan est déjà soldé ou annulé |
409 PAYMENT_PLAN_ALREADY_PAUSED, 409 PAYMENT_PLAN_NOT_PAUSED | Suspension ou reprise sans effet |
429 LINK_RECENTLY_SENT | Le lien est parti il y a moins de 10 minutes |
Pour suivre un plan sans le relire, abonnez vos endpoints aux événements payment_plan.* et installment.*. Voir Webhooks.