Référence de l'API

Tous les endpoints publics de l'API REST Ezus Pay : dossiers, liens de paiement, transactions et remboursements, avec leurs paramètres, des réponses complètes et les erreurs.

Vérifié sur le code de l'API le 13 octobre 2026

Vue d'ensemble

URL de base : https://api.ezuspay.app. Chaque requête a besoin de l'en-tête x-api-key. Voir Authentification pour les clés, les scopes, les limites et le format des erreurs.

MéthodeCheminScope
GET/v1/pingaucun
POST/v1/bookingsbookings:write
POST/v1/bookings/:id/resyncbookings:write
GET/v1/checkout-fieldspayment-links:read
POST/v1/bookings/:id/payment-linkspayment-links:write
GET/v1/bookings/:id/payment-linkspayment-links:read
GET/v1/payment-links/:idpayment-links:read
GET/v1/transactionstransactions:read
GET/v1/bookings/:id/transactionstransactions:read
GET/v1/payment-links/:id/transactionstransactions:read
GET/v1/transactions/:idtransactions:read
POST/v1/transactions/:id/refundsrefunds:write

Le modèle de données en un paragraphe. Un dossier (booking) est un voyage. Il contient une ou plusieurs alternatives, qui sont des options chiffrées du voyage (l'une est l'alternative principale). Les liens de paiement appartiennent à une alternative. Chaque paiement fait par un lien est une transaction, et une transaction peut avoir des remboursements. Les paiements reçus hors Stripe (virement, espèces, chèque) sont aussi des transactions, avec source: "MANUAL".

Vérifier une clé

Ping

GET/v1/ping

Renvoie l'agence derrière la clé, l'environnement qu'elle atteint et les informations de la clé. Utilisez-le pour valider une clé avant toute autre chose.

Shell
curl https://api.ezuspay.app/v1/ping -H "x-api-key: $EZP_KEY"
JSON
{
  "success": true,
  "data": {
    "status": "ok",
    "agency": { "id": "3f1c2a9e-8b7d-4c21-9a0e-5d6f7a8b9c0d", "name": "Voyages Horizon", "slug": "voyages-horizon" },
    "mode": "LIVE",
    "apiKey": {
      "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
      "prefix": "ezpay_li",
      "label": "CRM sync",
      "scopes": ["bookings:write", "payment-links:read", "payment-links:write", "transactions:read"],
      "expiresAt": "2027-01-11T09:00:00.000Z"
    }
  }
}

Dossiers

Créer un dossier

POST/v1/bookingsScopebookings:write

Crée un dossier, avec sa première alternative si vous l'envoyez. Renvoie 201. Si vous envoyez un ezusProjectId qui a déjà un dossier, ce dossier est renvoyé avec 200 au lieu d'un doublon.

ChampTypeObligatoireRègles
namestringouiDe 1 à 255 caractères
referencestringnonJusqu'à 255. Générée selon vos réglages de référence si absente. Doit être unique dans l'agence
ezusProjectIdstringnonRéférence du projet Ezus. Nécessite un compte Ezus connecté. Les alternatives sont alors lues dans Ezus
clientNamestringnonJusqu'à 255
clientEmailstringnonEmail valide, ou ""
currencystringnonUne devise acceptée. Par défaut, la devise de l'agence
fxRateToDefaultnumbernonSupérieur à 0. Obligatoire quand currency diffère de la devise de l'agence
alternativeobjectnonPremière alternative. Ignorée quand ezusProjectId est renseigné
alternative.alternativeNamestringnonJusqu'à 255
alternative.ezusAlternativeIdstringnonJusqu'à 255
alternative.totalAmountCentsintegeroui, dans alternativeDe 0 à 99 999 999
alternative.departureDatedatenonYYYY-MM-DD
alternative.returnDatedatenonYYYY-MM-DD, le jour du départ ou après
alternative.travelersCountintegernon1 ou plus. 1 par défaut
Shell
curl -X POST https://api.ezuspay.app/v1/bookings \
  -H "x-api-key: $EZP_KEY" -H "Content-Type: application/json" \
  -d '{
    "name": "Voyage de noces Bali 2026",
    "clientName": "Jean Dupont",
    "clientEmail": "jean@example.com",
    "alternative": {
      "alternativeName": "14 jours",
      "totalAmountCents": 480000,
      "departureDate": "2026-07-10",
      "returnDate": "2026-07-24",
      "travelersCount": 2
    }
  }'
JSON
{
  "success": true,
  "data": {
    "booking": {
      "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
      "name": "Voyage de noces Bali 2026",
      "reference": "2026-0042",
      "ezusProjectId": null,
      "ezusDeletedAt": null,
      "lastEzusSyncAt": null,
      "clientName": "Jean Dupont",
      "clientEmail": "jean@example.com",
      "currency": "EUR",
      "fxRateToDefault": null,
      "status": "DRAFT",
      "createdAt": "2026-04-21T09:12:00.000Z",
      "updatedAt": "2026-04-21T09:12:00.000Z",
      "mainAlternative": { "totalAmountCents": 480000, "amountAlreadyCollected": 0 },
      "hasPaymentLinks": false
    },
    "alternative": {
      "id": "b3a1f0e2-6d4c-4e8a-9b7f-1c2d3e4f5a6b",
      "bookingId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
      "alternativeName": "14 jours",
      "ezusAlternativeId": null,
      "clientName": null,
      "clientEmail": null,
      "notes": null,
      "totalAmountCents": 480000,
      "amountAlreadyCollected": 0,
      "departureDate": "2026-07-10T00:00:00.000Z",
      "returnDate": "2026-07-24T00:00:00.000Z",
      "travelersCount": 2,
      "syncStatus": "PENDING",
      "createdAt": "2026-04-21T09:12:00.000Z",
      "updatedAt": "2026-04-21T09:12:00.000Z"
    }
  }
}

Le statut du dossier vaut DRAFT, PENDING, DEPOSIT_RECEIVED, FULLY_PAID, OVERDUE ou CANCELLED. Un nouveau dossier commence en DRAFT et passe en PENDING à la création de son premier lien. amountAlreadyCollected est en centimes.

ErreurQuand
409 BOOKING_REFERENCE_CONFLICTLa référence est déjà utilisée dans l'agence
409 EZUS_NOT_CONNECTEDezusProjectId envoyé, mais l'agence n'a pas de connexion Ezus
422 FX_RATE_REQUIREDDevise étrangère sans fxRateToDefault

Resynchroniser un dossier depuis Ezus

POST/v1/bookings/:id/resyncScopebookings:write

Relit le projet Ezus et met à jour le dossier et ses alternatives : nom, client, montants, dates, voyageurs et alternative principale. Les alternatives supprimées dans Ezus sont marquées ORPHAN, jamais effacées. Si un plan de paiement est ouvert, ses échéances non payées absorbent un changement de total. L'appel est synchrone et renvoie le dossier avec toutes ses alternatives.

Uniquement pour les dossiers créés avec un ezusProjectId. Pas de corps.

Shell
curl -X POST https://api.ezuspay.app/v1/bookings/7c9e6679-7425-40de-944b-e07fc1f90ae7/resync \
  -H "x-api-key: $EZP_KEY"
JSON
{
  "success": true,
  "data": {
    "booking": {
      "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
      "reference": "2026-0042",
      "name": "Voyage de noces Bali 2026",
      "ezusProjectId": "PRJ-1029",
      "clientName": "Jean Dupont",
      "clientEmail": "jean@example.com",
      "currency": "EUR",
      "status": "PENDING",
      "createdAt": "2026-04-21T09:12:00.000Z",
      "updatedAt": "2026-04-22T14:30:00.000Z",
      "alternatives": [
        {
          "id": "b3a1f0e2-6d4c-4e8a-9b7f-1c2d3e4f5a6b",
          "ezusAlternativeId": "ALT-1",
          "alternativeName": "14 jours",
          "clientName": "Jean Dupont",
          "clientEmail": "jean@example.com",
          "isMainAlternative": true,
          "syncStatus": "SYNCED",
          "totalAmountCents": 480000,
          "amountAlreadyCollected": 144000,
          "travelersCount": 2,
          "departureDate": "2026-07-10T00:00:00.000Z",
          "returnDate": "2026-07-24T00:00:00.000Z",
          "createdAt": "2026-04-21T09:12:00.000Z",
          "updatedAt": "2026-04-22T14:30:00.000Z"
        }
      ]
    }
  }
}

Si le projet a été supprimé dans Ezus, l'appel réussit quand même : le dossier reçoit une date ezusDeletedAt et ses alternatives passent en ORPHAN.

ErreurQuand
404 BOOKING_NOT_FOUNDAucun dossier de ce type dans l'agence
422 BOOKING_NOT_FROM_EZUSLe dossier n'a pas d'ezusProjectId
409 EZUS_NOT_CONNECTEDL'agence n'a pas de connexion Ezus
401 EZUS_TOKEN_REJECTED, 422 EZUS_LOGIN_FAILEDEzus a refusé les identifiants enregistrés
502 EZUS_PROJECT_UNREACHABLE, 502 EZUS_PROJECT_FAILEDEzus est indisponible ou a répondu par une erreur

Liens de paiement

Lister les champs du checkout

GET/v1/checkout-fieldsScopepayment-links:read

Renvoie les questions que votre agence peut poser aux voyageurs au checkout : numéro de passeport, régime alimentaire, etc. Envoyez les key choisies dans checkoutFieldKeys à la création d'un lien.

Shell
curl https://api.ezuspay.app/v1/checkout-fields -H "x-api-key: $EZP_KEY"
JSON
{
  "success": true,
  "data": {
    "checkoutFields": [
      { "key": "phone", "label": "Phone", "type": "PHONE", "required": true, "isDefault": true },
      { "key": "passport_number", "label": "Passport number", "type": "TEXT", "required": false, "isDefault": false },
      { "key": "room_type", "label": "Room type", "type": "SELECT", "required": false, "isDefault": false, "options": ["Double", "Twin"] }
    ]
  }
}
ChampNotes
keyIdentifiant stable, a-z, 0-9 et _, jusqu'à 50 caractères
typeTEXT, TEXTAREA, EMAIL, PHONE, DATE, SELECT ou CHECKBOX
isDefaultAppliqué quand un lien est créé sans checkoutFieldKeys
optionsSELECT uniquement
sendConfirmationEMAIL uniquement. La confirmation de paiement part aussi à l'adresse saisie dans ce champ

Une agence a au plus 10 champs. La liste est vide quand aucun n'est configuré.

Créer un lien de paiement

POST/v1/bookings/:id/payment-linksScopepayment-links:write

Crée un lien de paiement sur une alternative du dossier et renvoie une URL de paiement prête à partager. Renvoie 201.

ChampTypeObligatoireRègles
amountCentsintegerouiDe 100 à 99 999 999
labelstringnonJusqu'à 255. Par défaut, la référence du dossier, ou son nom
allowedMethodsarraynon"card" et/ou "sepa_debit". ["card"] par défaut. Le SEPA ne s'applique qu'en EUR
expiresAtdatetimenonISO 8601. Absent pour un lien qui n'expire pas
isReusablebooleannonfalse par défaut. Un lien réutilisable peut être payé plusieurs fois, par plusieurs personnes
checkoutFieldKeysarraynonClés de GET /v1/checkout-fields, jusqu'à 10. Absent : champs par défaut. [] : aucun champ
alternativeIdstringnonIdentifiant Ezus Pay de l'alternative
ezusAlternativeIdstringnonRéférence de l'alternative dans Ezus

Quelle alternative reçoit le lien. Avec alternativeId, cette alternative. Avec ezusAlternativeId, l'alternative correspondante ; si elle est inconnue, Ezus Pay resynchronise le dossier une fois et réessaie. Sans l'un ni l'autre, l'alternative principale. N'envoyez jamais les deux (422).

La devise est toujours celle du dossier. Pour un dossier Ezus, le dossier est d'abord relu dans Ezus si sa dernière synchronisation date de plus d'une minute.

Shell
curl -X POST https://api.ezuspay.app/v1/bookings/7c9e6679-7425-40de-944b-e07fc1f90ae7/payment-links \
  -H "x-api-key: $EZP_KEY" -H "Content-Type: application/json" \
  -d '{
    "amountCents": 144000,
    "label": "Acompte 30 %",
    "allowedMethods": ["card", "sepa_debit"],
    "expiresAt": "2026-05-23T00:00:00Z",
    "checkoutFieldKeys": ["phone"],
    "ezusAlternativeId": "ALT-1"
  }'
JSON
{
  "success": true,
  "data": {
    "paymentLink": {
      "id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
      "alternativeId": "b3a1f0e2-6d4c-4e8a-9b7f-1c2d3e4f5a6b",
      "label": "Acompte 30 %",
      "amountCents": 144000,
      "currency": "EUR",
      "allowedMethods": ["card", "sepa_debit"],
      "status": "ACTIVE",
      "isReusable": false,
      "checkoutFields": [
        { "key": "phone", "label": "Phone", "type": "PHONE", "required": true, "isDefault": true }
      ],
      "kind": "SINGLE",
      "checkoutUrl": "https://app.ezuspay.io/lnk/voyages-horizon/8K3QZ7M2XR4T",
      "shortToken": "8K3QZ7M2XR4T",
      "expiresAt": "2026-05-23T00:00:00.000Z",
      "createdAt": "2026-04-21T09:15:00.000Z",
      "updatedAt": "2026-04-21T09:15:00.000Z"
    }
  }
}

checkoutFields est une copie prise à la création du lien. Les modifications ultérieures de votre bibliothèque de champs ne changent pas les liens déjà partagés.

ErreurQuand
404 BOOKING_NOT_FOUNDAucun dossier de ce type dans l'agence
404 ALTERNATIVE_NOT_FOUNDL'alternative ciblée n'existe pas
409 REUSABLE_LINK_BESIDE_PLANLien réutilisable sur une alternative qui a un plan de paiement ouvert
422 AMOUNT_EXCEEDS_AVAILABLELe montant dépasse ce que le plan de paiement laisse à encaisser

Lister les liens d'un dossier

GET/v1/bookings/:id/payment-linksScopepayment-links:read

Tous les liens du dossier, toutes alternatives confondues, du plus récent au plus ancien. Les liens de plans de paiement sont inclus. Pas de pagination.

Shell
curl https://api.ezuspay.app/v1/bookings/7c9e6679-7425-40de-944b-e07fc1f90ae7/payment-links \
  -H "x-api-key: $EZP_KEY"
JSON
{
  "success": true,
  "data": {
    "paymentLinks": [
      {
        "id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
        "label": "Excursion supplémentaire",
        "amountCents": 20000,
        "currency": "EUR",
        "allowedMethods": ["card", "sepa_debit"],
        "status": "ACTIVE",
        "kind": "SINGLE",
        "plan": null,
        "expiresAt": "2026-05-23T00:00:00.000Z",
        "createdAt": "2026-04-21T09:15:00.000Z",
        "updatedAt": "2026-04-21T09:15:00.000Z",
        "checkoutUrl": "https://app.ezuspay.io/lnk/voyages-horizon/8K3QZ7M2XR4T",
        "alternative": { "id": "b3a1f0e2-6d4c-4e8a-9b7f-1c2d3e4f5a6b", "alternativeName": "14 jours", "ezusAlternativeId": "ALT-1" }
      }
    ]
  }
}

Le statut du lien vaut DRAFT, ACTIVE, EXPIRED, PAID ou CANCELLED. Un lien à usage unique passe en PAID après son paiement. Un lien réutilisable reste ACTIVE.

Lire un lien de paiement

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

Un lien, avec son alternative, son dossier et ce qu'il a encaissé.

Shell
curl https://api.ezuspay.app/v1/payment-links/d290f1ee-6c54-4b01-90e6-d701748f0851 \
  -H "x-api-key: $EZP_KEY"
JSON
{
  "success": true,
  "data": {
    "paymentLink": {
      "id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
      "label": "Acompte 30 %",
      "amountCents": 144000,
      "currency": "EUR",
      "allowedMethods": ["card", "sepa_debit"],
      "status": "PAID",
      "isReusable": false,
      "kind": "SINGLE",
      "plan": null,
      "checkoutUrl": "https://app.ezuspay.io/lnk/voyages-horizon/8K3QZ7M2XR4T",
      "shortToken": "8K3QZ7M2XR4T",
      "expiresAt": "2026-05-23T00:00:00.000Z",
      "createdAt": "2026-04-21T09:15:00.000Z",
      "updatedAt": "2026-04-22T14:30:00.000Z",
      "amountPaidCents": 144000,
      "paymentCount": 1,
      "alternative": {
        "id": "b3a1f0e2-6d4c-4e8a-9b7f-1c2d3e4f5a6b",
        "alternativeName": "14 jours",
        "ezusAlternativeId": "ALT-1",
        "clientName": "Jean Dupont",
        "clientEmail": "jean@example.com"
      },
      "booking": {
        "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
        "reference": "2026-0042",
        "name": "Voyage de noces Bali 2026",
        "clientName": "Jean Dupont",
        "ezusProjectId": "PRJ-1029"
      }
    }
  }
}

amountPaidCents et paymentCount comptent les paiements dont le statut est SUCCEEDED. Un paiement remboursé ensuite, même en partie, sort de ces totaux. Pour des chiffres exacts, utilisez les transactions du lien.

Erreur : 404 PAYMENT_LINK_NOT_FOUND.

Les plans de paiement dans les réponses

Les plans de paiement (acompte, échéances et solde, payés par lien ou débités sur une carte enregistrée) se créent dans l'app. L'API ne les crée pas, et un lien créé par l'API est toujours kind: "SINGLE". Les liens de plan apparaissent en revanche dans les deux endpoints de lecture ci-dessus, avec kind: "PLAN" et un objet plan.

JSON
{
  "kind": "PLAN",
  "amountCents": 168000,
  "plan": {
    "id": "9b2e4c1a-3f5d-4e6a-8b7c-0d1e2f3a4b5c",
    "status": "ACTIVE",
    "collectionMode": "AUTO_CHARGE",
    "totalAmountCents": 480000,
    "paidCents": 144000,
    "installments": [
      { "id": "1a2b3c4d-0000-4000-8000-000000000001", "sequence": 1, "amountCents": 144000, "dueDate": "2026-04-21", "status": "PAID", "paidAt": "2026-04-21T10:02:00.000Z", "collectionMode": "AUTO_CHARGE" },
      { "id": "1a2b3c4d-0000-4000-8000-000000000002", "sequence": 2, "amountCents": 168000, "dueDate": "2026-06-15", "status": "SCHEDULED", "paidAt": null, "collectionMode": "AUTO_CHARGE" },
      { "id": "1a2b3c4d-0000-4000-8000-000000000003", "sequence": 3, "amountCents": 168000, "dueDate": "2026-08-01", "status": "SCHEDULED", "paidAt": null, "collectionMode": "AUTO_CHARGE" }
    ]
  }
}
ChampValeurs
amountCents (sur le lien)L'échéance à payer maintenant, pas le total du plan
plan.statusPENDING (acompte pas encore payé), ACTIVE, PAUSED, COMPLETED, CANCELLED
plan.collectionModeLINK (le voyageur paie chaque échéance) ou AUTO_CHARGE (la carte enregistrée est débitée)
installments[].sequence1 est l'acompte
installments[].statusSCHEDULED, PROCESSING, PAID, FAILED, ACTION_REQUIRED, ON_HOLD, CANCELLED
installments[].collectionModePeut valoir LINK sur un plan AUTO_CHARGE : cette échéance sera payée par lien
installments[].dueDateYYYY-MM-DD

Sur une alternative qui a un plan ouvert, vous ne pouvez pas ajouter de lien réutilisable, et un nouveau lien ne peut pas dépasser ce que le plan laisse à encaisser.

Transactions

Lister les transactions

GET/v1/transactionsScopetransactions:read

Les paiements de l'agence, paginés. Les paiements par lien, les paiements saisis à la main et les paiements importés d'Ezus sont tous inclus.

ParamètrePar défautValeurs
page11 ou plus
limit50De 1 à 100
statusPENDING, SUCCEEDED, FAILED, REFUNDED, PARTIALLY_REFUNDED
sourceEZUS_PAY (payé par lien), MANUAL (saisi à la main), EZUS_LEGACY (importé d'Ezus)
sortDirdescasc ou desc, par date de paiement
dateFromYYYY-MM-DD, inclus
dateToYYYY-MM-DD, inclus

Les dates filtrent sur la date de paiement, ou sur la date de création pour un paiement pas encore abouti.

Shell
curl "https://api.ezuspay.app/v1/transactions?status=SUCCEEDED&dateFrom=2026-04-01&dateTo=2026-04-30" \
  -H "x-api-key: $EZP_KEY"
JSON
{
  "success": true,
  "data": {
    "transactions": [
      {
        "id": "5f8d0d55-b4a1-4c7e-9a3f-2e1d0c9b8a7f",
        "status": "SUCCEEDED",
        "source": "EZUS_PAY",
        "amountCents": 144000,
        "currency": "EUR",
        "paymentMethod": "card",
        "manualMethod": null,
        "note": null,
        "payerName": "Marie Martin",
        "cardBrand": "visa",
        "cardFunding": "credit",
        "cardCountry": "FR",
        "applicationFeeAmount": 4320,
        "applicationFeeAmountHt": 3600,
        "applicationFeeVatRate": 20,
        "refundedAmountCents": 0,
        "refundableAmountCents": 144000,
        "stripePaymentIntentId": "pi_3PqR8sLkdIwHu7ix0abc1234",
        "paidAt": "2026-04-22T14:30:00.000Z",
        "createdAt": "2026-04-22T14:29:58.000Z",
        "paymentLink": { "id": "d290f1ee-6c54-4b01-90e6-d701748f0851", "label": "Acompte 30 %" },
        "alternative": {
          "id": "b3a1f0e2-6d4c-4e8a-9b7f-1c2d3e4f5a6b",
          "alternativeName": "14 jours",
          "ezusAlternativeId": "ALT-1",
          "clientName": "Jean Dupont",
          "clientEmail": "jean@example.com"
        },
        "booking": { "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "reference": "2026-0042", "name": "Voyage de noces Bali 2026", "ezusProjectId": "PRJ-1029" }
      }
    ],
    "pagination": { "page": 1, "limit": 50, "total": 1, "totalPages": 1 }
  }
}
ChampNotes
paymentMethodcard ou sepa_debit. null pour un paiement saisi à la main
manualMethodBANK_TRANSFER, CASH, CHECK ou OTHER, pour les paiements saisis à la main
payerNameNom du titulaire de la carte ou du payeur. Il peut différer du client, par exemple quand une entreprise paie
applicationFeeAmountCommission Ezus Pay TTC, en centimes. applicationFeeAmountHt est hors taxes. Zéro sur les paiements saisis à la main
refundableAmountCentsCe qu'un remboursement accepterait à cet instant
paymentLink, bookingnull quand le paiement n'a pas de lien ou pas de dossier (saisi à la main ou importé)

Les transactions ne portent pas d'information de plan de paiement.

Lister les transactions d'un dossier

GET/v1/bookings/:id/transactionsScopetransactions:read

Mêmes paramètres et même réponse que GET /v1/transactions, pour un seul dossier. Les paiements par lien et les paiements saisis à la main sont tous les deux inclus. Renvoie 404 BOOKING_NOT_FOUND, plutôt qu'une liste vide, pour un dossier hors de votre agence.

Lister les transactions d'un lien

GET/v1/payment-links/:id/transactionsScopetransactions:read

Mêmes paramètres et même réponse, pour un seul lien. C'est le détail paiement par paiement derrière un lien réutilisable. Renvoie 404 PAYMENT_LINK_NOT_FOUND pour un lien inconnu.

Lire une transaction

GET/v1/transactions/:idScopetransactions:read

Une transaction, avec deux champs en plus : les réponses du voyageur aux champs du checkout, et l'historique des remboursements.

JSON
{
  "success": true,
  "data": {
    "transaction": {
      "id": "5f8d0d55-b4a1-4c7e-9a3f-2e1d0c9b8a7f",
      "status": "PARTIALLY_REFUNDED",
      "amountCents": 144000,
      "refundedAmountCents": 30000,
      "refundableAmountCents": 114000,
      "checkoutFields": [
        { "key": "phone", "label": "Phone", "type": "PHONE", "value": "+33612345678" }
      ],
      "refunds": [
        {
          "id": "0e4c7b2a-9d1f-4a3b-8c6e-5f7a9b1c3d5e",
          "amountCents": 30000,
          "currency": "EUR",
          "status": "SUCCEEDED",
          "reason": "REQUESTED_BY_CUSTOMER",
          "note": null,
          "policy": "KEEP_FEE",
          "failureReason": null,
          "succeededAt": "2026-05-02T10:00:00.000Z",
          "createdAt": "2026-05-01T10:00:00.000Z"
        }
      ]
    }
  }
}

Les autres champs sont les mêmes que dans la liste (raccourcis ici). checkoutFields garde le libellé et le type tels qu'ils étaient au moment du paiement, et chaque value est une chaîne. Le status d'un remboursement vaut PENDING, SUCCEEDED, FAILED ou CANCELED.

Erreur : 404 TRANSACTION_NOT_FOUND.

Remboursements

Rembourser un paiement

POST/v1/transactions/:id/refundsScoperefunds:write

Rembourse tout ou partie d'un paiement par carte ou par prélèvement SEPA. Renvoie 202 Accepted : Stripe a accepté le remboursement, mais l'argent n'a pas encore bougé. L'état final arrive ensuite, par le webhook payment.refunded et sur la transaction. Un remboursement SEPA peut prendre plusieurs jours.

ChampTypeRègles
amountCentsintegerDe 1 à 99 999 999. Absent : tout ce qui reste est remboursé
reasonstringDUPLICATE, FRAUDULENT, REQUESTED_BY_CUSTOMER ou OTHER
notestringJusqu'à 1 000 caractères, pour vos archives
Shell
curl -X POST https://api.ezuspay.app/v1/transactions/5f8d0d55-b4a1-4c7e-9a3f-2e1d0c9b8a7f/refunds \
  -H "x-api-key: $EZP_KEY" -H "Content-Type: application/json" \
  -d '{ "amountCents": 48000, "reason": "REQUESTED_BY_CUSTOMER", "note": "Annulation partielle du voyage" }'
JSON
{
  "success": true,
  "data": {
    "refund": {
      "id": "0e4c7b2a-9d1f-4a3b-8c6e-5f7a9b1c3d5e",
      "amountCents": 48000,
      "status": "PENDING",
      "remainingCents": 96000
    }
  }
}
  • La commission Ezus Pay n'est pas remboursée.
  • Un remboursement en cours compte dans ce qui reste. Deux appels ne peuvent donc jamais rembourser plus que le paiement.
  • Relancer l'appel crée un second remboursement. Vérifiez refundableAmountCents avant de réessayer.
  • Les paiements saisis à la main ne peuvent pas être remboursés par Ezus Pay.
ErreurQuand
404 TRANSACTION_NOT_FOUNDAucun paiement de ce type dans l'agence
409 TRANSACTION_NOT_REFUNDABLELe paiement n'a pas abouti, ou n'a pas de débit Stripe
409 MANUAL_PAYMENT_NOT_REFUNDABLEPaiement saisi à la main
409 NOTHING_LEFT_TO_REFUNDDéjà entièrement remboursé
422 REFUND_AMOUNT_TOO_HIGHPlus que ce qui reste à rembourser
502 REFUND_FAILEDStripe a refusé le remboursement

Devises acceptées

EUR, USD, GBP, CHF, CAD, AUD, NZD, SGD, HKD, SEK, NOK, DKK, PLN, CZK, HUF, RON, BGN, MXN, BRL, ARS, CLP, COP, AED, SAR, QAR, BHD, KWD, ZAR, KES, GHS, INR, THB, MYR, IDR, PHP.