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éthodeCheminScope
POST/v1/bookings/:id/payment-plans/previewpayment-plans:read
POST/v1/bookings/:id/payment-planspayment-plans:write
GET/v1/bookings/:id/payment-planspayment-plans:read
GET/v1/payment-plans/:idpayment-plans:read
GET/v1/payment-plan-templatespayment-plans:read
GET/v1/bookings/:id/payment-plan-suggestionpayment-plans:read
PATCH/v1/payment-plans/:idpayment-plans:write
POST/v1/payment-plans/:id/pausepayment-plans:write
POST/v1/payment-plans/:id/resumepayment-plans:write
POST/v1/payment-plans/:id/cancelpayment-plans:write
POST/v1/payment-plans/:id/installments/:installmentId/mark-paidpayment-plans:write
POST/v1/payment-plans/:id/installments/:installmentId/resend-linkpayment-plans:write
GET/v1/payment-plans/:id/eventspayment-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

POST/v1/bookings/:id/payment-plans/previewScopepayment-plans:read

Mê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.

JSON
{
  "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).

CodeSignification
SUM_MISMATCHLa somme des échéances diffère de amountCents
DATES_NOT_INCREASINGDeux échéances ne se suivent pas dans le temps
FIRST_DUE_DATE_IN_PASTL'acompte tombe avant aujourd'hui (heure de Paris)
LAST_DUE_DATE_NOT_BEFORE_DEPARTURELe solde tombe le jour du départ ou après
INSTALLMENT_BELOW_MINIMUMUne échéance est sous 1,00
INSTALLMENT_COUNT_OUT_OF_RANGEMoins de 2 ou plus de 7 paiements
EXCEEDS_AVAILABLELe plan dépasse ce qui reste à encaisser sur l'alternative
DEPARTURE_DATE_REQUIREDL'alternative n'a pas de date de départ
NOTHING_TO_COLLECTIl ne reste rien à encaisser
PAYMENT_PLAN_ALREADY_ACTIVEUn plan est déjà ouvert sur l'alternative
REUSABLE_LINK_ACTIVEUn lien réutilisable est actif sur l'alternative
AUTO_CHARGE_EMAIL_REQUIREDDébit automatique sans email du client
AUTO_CHARGE_REQUIRES_CARDDé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

POST/v1/bookings/:id/payment-plansScopepayment-plans:write

Cré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.
  • rules seules : le serveur calcule les échéances. L'acompte vaut depositPercent % du montant, arrondi à l'unité, et tombe aujourd'hui. Le solde tombe balanceOffsetDays jours 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.
ChampTypeObligatoireRègles
templateIduuidl'un ou l'autreUn modèle de l'agence
rules.depositPercentintegerl'un ou l'autreDe 1 à 99
rules.paymentsAfterDepositintegeravec rulesDe 1 à 6, le solde compris
rules.balanceOffsetDaysintegeravec rulesDe 1 à 365 jours avant le départ
installmentsarraynon{ amountCents, dueDate } dans l'ordre, paymentsAfterDeposit + 1 entrées. Exige rules
amountCentsintegernonLe total à échelonner. Par défaut, ce qui reste à encaisser sur l'alternative, ou la somme de installments quand vous les envoyez
collectionModestringnonLINK ou AUTO_CHARGE. Par défaut celui du modèle, sinon LINK
remindersEnabledbooleannonRappels J-7 et J-1 avant une échéance payée par lien. Par défaut celui du modèle, sinon false
allowEarlyPaymentbooleannonPar défaut celui du modèle, sinon true
allowedMethodsarraynon"card" et/ou "sepa_debit". ["card"] par défaut. Le SEPA ne s'applique qu'en EUR et jamais en débit automatique
labelstringnonJusqu'à 255. Par défaut, la référence du dossier, ou son nom
checkoutFieldKeysarraynonComme pour un lien de paiement
alternativeId / ezusAlternativeIdstringnonAlternative 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.

Shell
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"
  }'
JSON
{
  "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"
    }
  }
}
ChampValeurs
statusPENDING (acompte pas encore payé), ACTIVE, PAUSED, COMPLETED, CANCELLED
paidCentsLes échéances réglées, hors Stripe comprises
installments[].statusSCHEDULED, PROCESSING (argent en route), PAID, FAILED, ACTION_REQUIRED, ON_HOLD, CANCELLED
installments[].collectionModePeut valoir LINK sur un plan AUTO_CHARGE : cette échéance sera payée par lien
autoCharge.activetrue quand le voyageur a consenti, que sa carte est enregistrée et que le plan est ouvert
attentionReasonPourquoi le plan demande l'agence, sinon null : PAYMENT_FAILED, INSTALLMENT_UNPAID, NOTICE_UNDELIVERABLE, ORPHAN_PAYMENT, OVERPAID, TOTAL_NOT_ABSORBED, INSTALLMENT_REFUNDED
createdViaAPP ou API
paymentLink.checkoutUrlL'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.

JSON
{
  "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 appelez POST /v1/bookings/:id/resync.
  • Carte uniquement. allowedMethods doit contenir card. Le SEPA est retiré d'office.
  • Après le consentement, autoCharge.active passe à true, avec la marque et les 4 derniers chiffres de la carte, et le webhook payment_plan.auto_charge_activated part.
  • 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.active vaut false. Pendant une suspension, il reste true : 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.

EmailPeut être coupé
Rappels J-7 et J-1 avant une échéance payée par lienOui, avec remindersEnabled: false
Lien le jour de l'échéance, relance trois jours aprèsNon
Préavis avant un débitNon : c'est la promesse faite au voyageur quand il a consenti
Refus, montant ou date changés, annulationNon : 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

GET/v1/bookings/:id/payment-plansScopepayment-plans:read

Tous 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

GET/v1/payment-plans/:idScopepayment-plans:read

Un 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

GET/v1/payment-plan-templatesScopepayment-plans:read

Les 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.

JSON
{
  "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é

GET/v1/bookings/:id/payment-plan-suggestionScopepayment-plans:read

Le 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.

JSON
{
  "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

PATCH/v1/payment-plans/:idScopepayment-plans:write

Modifie 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.

ChampTypeRègles
installmentsarray{ id, amountCents, dueDate } de chaque échéance non payée, dans l'ordre
labelstringJusqu'à 255
allowEarlyPaymentboolean
remindersEnabledboolean
Shell
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

POST/v1/payment-plans/:id/pauseScopepayment-plans:write

Plus 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.

POST/v1/payment-plans/:id/resumeScopepayment-plans:write

Chaque é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.

JSON
{
  "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

POST/v1/payment-plans/:id/cancelScopepayment-plans:write

Annule 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

POST/v1/payment-plans/:id/installments/:installmentId/mark-paidScopepayment-plans:write

Pour 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.

ChampTypeRègles
methodstringBANK_TRANSFER, CASH, CHECK ou OTHER
paidAtdateYYYY-MM-DD, aujourd'hui ou avant
notestringJusqu'à 1 000 caractères, par exemple la référence du virement

Renvoyer le lien

POST/v1/payment-plans/:id/installments/:installmentId/resend-linkScopepayment-plans:write

Envoie 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é.

JSON
{ "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

GET/v1/payment-plans/:id/eventsScopepayment-plans:read

Le 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).

JSON
{
  "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": "…" }
      }
    ]
  }
}
  • actor vaut APP (un membre de l'agence), API (une clé) ou SYSTEM (le planificateur des débits, Stripe, le voyageur).
  • webhook est l'événement que cette entrée envoie à vos endpoints, ou null.
  • email est l'email qui serait parti en production, dans la langue du voyageur.

Erreurs

En plus des erreurs communes :

ErreurQuand
404 BOOKING_NOT_FOUND, 404 ALTERNATIVE_NOT_FOUNDDossier ou alternative hors de votre agence
404 PAYMENT_PLAN_NOT_FOUNDPlan inconnu, ou d'une autre agence
404 TEMPLATE_NOT_FOUND, 404 INSTALLMENT_NOT_FOUNDModèle ou échéance inconnus
403 STRIPE_NOT_ACTIVELe compte Stripe de l'agence ne peut pas encaisser
403 TEST_MODE_ONLYLe journal se lit avec une clé de test
422 PLAN_SOURCE_AMBIGUOUS, 422 PLAN_SOURCE_REQUIREDtemplateId et rules ensemble, ou aucun
422 NOTHING_TO_COLLECTIl ne reste rien à encaisser sur l'alternative
422 DEPARTURE_DATE_REQUIREDL'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_AVAILABLELe plan dépasse ce qui reste à encaisser
422 AUTO_CHARGE_EMAIL_REQUIRED, 422 AUTO_CHARGE_REQUIRES_CARDDébit automatique impossible
422 NO_PAYMENT_METHOD_FOR_CURRENCYAucun moyen de paiement possible dans cette devise
422 RESUME_DECISIONS_REQUIREDUne échéance dépassée pendant la suspension n'a pas de nouvelle date
422 NO_TRAVELER_EMAILAucun email voyageur pour renvoyer le lien
409 PAYMENT_PLAN_ALREADY_ACTIVEUn plan est déjà ouvert (error.details.planId)
409 REUSABLE_LINK_ACTIVEUn lien réutilisable est actif sur l'alternative
409 PAYMENT_PLAN_CHANGEDLe plan a bougé depuis votre lecture : relisez-le, puis rejouez
409 INSTALLMENT_PROCESSINGUn paiement de l'échéance est en route
409 INSTALLMENT_NOT_NEXTSeule la prochaine échéance peut être réglée ou relancée
409 INSTALLMENT_NOT_PAYABLEL'échéance est déjà réglée ou annulée
409 PAYMENT_PLAN_NOT_OPENLe plan est déjà soldé ou annulé
409 PAYMENT_PLAN_ALREADY_PAUSED, 409 PAYMENT_PLAN_NOT_PAUSEDSuspension ou reprise sans effet
429 LINK_RECENTLY_SENTLe 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.