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éthode | Chemin | Scope |
|---|---|---|
GET | /v1/ping | aucun |
POST | /v1/bookings | bookings:write |
POST | /v1/bookings/:id/resync | bookings:write |
GET | /v1/checkout-fields | payment-links:read |
POST | /v1/bookings/:id/payment-links | payment-links:write |
GET | /v1/bookings/:id/payment-links | payment-links:read |
GET | /v1/payment-links/:id | payment-links:read |
GET | /v1/transactions | transactions:read |
GET | /v1/bookings/:id/transactions | transactions:read |
GET | /v1/payment-links/:id/transactions | transactions:read |
GET | /v1/transactions/:id | transactions:read |
POST | /v1/transactions/:id/refunds | refunds: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
/v1/pingRenvoie 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.
curl https://api.ezuspay.app/v1/ping -H "x-api-key: $EZP_KEY"
{
"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
/v1/bookingsScopebookings:writeCré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.
| Champ | Type | Obligatoire | Règles |
|---|---|---|---|
name | string | oui | De 1 à 255 caractères |
reference | string | non | Jusqu'à 255. Générée selon vos réglages de référence si absente. Doit être unique dans l'agence |
ezusProjectId | string | non | Référence du projet Ezus. Nécessite un compte Ezus connecté. Les alternatives sont alors lues dans Ezus |
clientName | string | non | Jusqu'à 255 |
clientEmail | string | non | Email valide, ou "" |
currency | string | non | Une devise acceptée. Par défaut, la devise de l'agence |
fxRateToDefault | number | non | Supérieur à 0. Obligatoire quand currency diffère de la devise de l'agence |
alternative | object | non | Première alternative. Ignorée quand ezusProjectId est renseigné |
alternative.alternativeName | string | non | Jusqu'à 255 |
alternative.ezusAlternativeId | string | non | Jusqu'à 255 |
alternative.totalAmountCents | integer | oui, dans alternative | De 0 à 99 999 999 |
alternative.departureDate | date | non | YYYY-MM-DD |
alternative.returnDate | date | non | YYYY-MM-DD, le jour du départ ou après |
alternative.travelersCount | integer | non | 1 ou plus. 1 par défaut |
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
}
}'
{
"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.
| Erreur | Quand |
|---|---|
409 BOOKING_REFERENCE_CONFLICT | La référence est déjà utilisée dans l'agence |
409 EZUS_NOT_CONNECTED | ezusProjectId envoyé, mais l'agence n'a pas de connexion Ezus |
422 FX_RATE_REQUIRED | Devise étrangère sans fxRateToDefault |
Resynchroniser un dossier depuis Ezus
/v1/bookings/:id/resyncScopebookings:writeRelit 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.
curl -X POST https://api.ezuspay.app/v1/bookings/7c9e6679-7425-40de-944b-e07fc1f90ae7/resync \
-H "x-api-key: $EZP_KEY"
{
"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.
| Erreur | Quand |
|---|---|
404 BOOKING_NOT_FOUND | Aucun dossier de ce type dans l'agence |
422 BOOKING_NOT_FROM_EZUS | Le dossier n'a pas d'ezusProjectId |
409 EZUS_NOT_CONNECTED | L'agence n'a pas de connexion Ezus |
401 EZUS_TOKEN_REJECTED, 422 EZUS_LOGIN_FAILED | Ezus a refusé les identifiants enregistrés |
502 EZUS_PROJECT_UNREACHABLE, 502 EZUS_PROJECT_FAILED | Ezus est indisponible ou a répondu par une erreur |
Liens de paiement
Lister les champs du checkout
/v1/checkout-fieldsScopepayment-links:readRenvoie 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.
curl https://api.ezuspay.app/v1/checkout-fields -H "x-api-key: $EZP_KEY"
{
"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"] }
]
}
}
| Champ | Notes |
|---|---|
key | Identifiant stable, a-z, 0-9 et _, jusqu'à 50 caractères |
type | TEXT, TEXTAREA, EMAIL, PHONE, DATE, SELECT ou CHECKBOX |
isDefault | Appliqué quand un lien est créé sans checkoutFieldKeys |
options | SELECT uniquement |
sendConfirmation | EMAIL 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
/v1/bookings/:id/payment-linksScopepayment-links:writeCrée un lien de paiement sur une alternative du dossier et renvoie une URL de paiement prête à partager. Renvoie 201.
| Champ | Type | Obligatoire | Règles |
|---|---|---|---|
amountCents | integer | oui | De 100 à 99 999 999 |
label | string | non | Jusqu'à 255. Par défaut, la référence du dossier, ou son nom |
allowedMethods | array | non | "card" et/ou "sepa_debit". ["card"] par défaut. Le SEPA ne s'applique qu'en EUR |
expiresAt | datetime | non | ISO 8601. Absent pour un lien qui n'expire pas |
isReusable | boolean | non | false par défaut. Un lien réutilisable peut être payé plusieurs fois, par plusieurs personnes |
checkoutFieldKeys | array | non | Clés de GET /v1/checkout-fields, jusqu'à 10. Absent : champs par défaut. [] : aucun champ |
alternativeId | string | non | Identifiant Ezus Pay de l'alternative |
ezusAlternativeId | string | non | Ré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.
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"
}'
{
"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.
| Erreur | Quand |
|---|---|
404 BOOKING_NOT_FOUND | Aucun dossier de ce type dans l'agence |
404 ALTERNATIVE_NOT_FOUND | L'alternative ciblée n'existe pas |
409 REUSABLE_LINK_BESIDE_PLAN | Lien réutilisable sur une alternative qui a un plan de paiement ouvert |
422 AMOUNT_EXCEEDS_AVAILABLE | Le montant dépasse ce que le plan de paiement laisse à encaisser |
Lister les liens d'un dossier
/v1/bookings/:id/payment-linksScopepayment-links:readTous 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.
curl https://api.ezuspay.app/v1/bookings/7c9e6679-7425-40de-944b-e07fc1f90ae7/payment-links \
-H "x-api-key: $EZP_KEY"
{
"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
/v1/payment-links/:idScopepayment-links:readUn lien, avec son alternative, son dossier et ce qu'il a encaissé.
curl https://api.ezuspay.app/v1/payment-links/d290f1ee-6c54-4b01-90e6-d701748f0851 \
-H "x-api-key: $EZP_KEY"
{
"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.
{
"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" }
]
}
}
| Champ | Valeurs |
|---|---|
amountCents (sur le lien) | L'échéance à payer maintenant, pas le total du plan |
plan.status | PENDING (acompte pas encore payé), ACTIVE, PAUSED, COMPLETED, CANCELLED |
plan.collectionMode | LINK (le voyageur paie chaque échéance) ou AUTO_CHARGE (la carte enregistrée est débitée) |
installments[].sequence | 1 est l'acompte |
installments[].status | SCHEDULED, PROCESSING, 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 |
installments[].dueDate | YYYY-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
/v1/transactionsScopetransactions:readLes 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ètre | Par défaut | Valeurs |
|---|---|---|
page | 1 | 1 ou plus |
limit | 50 | De 1 à 100 |
status | PENDING, SUCCEEDED, FAILED, REFUNDED, PARTIALLY_REFUNDED | |
source | EZUS_PAY (payé par lien), MANUAL (saisi à la main), EZUS_LEGACY (importé d'Ezus) | |
sortDir | desc | asc ou desc, par date de paiement |
dateFrom | YYYY-MM-DD, inclus | |
dateTo | YYYY-MM-DD, inclus |
Les dates filtrent sur la date de paiement, ou sur la date de création pour un paiement pas encore abouti.
curl "https://api.ezuspay.app/v1/transactions?status=SUCCEEDED&dateFrom=2026-04-01&dateTo=2026-04-30" \
-H "x-api-key: $EZP_KEY"
{
"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 }
}
}
| Champ | Notes |
|---|---|
paymentMethod | card ou sepa_debit. null pour un paiement saisi à la main |
manualMethod | BANK_TRANSFER, CASH, CHECK ou OTHER, pour les paiements saisis à la main |
payerName | Nom du titulaire de la carte ou du payeur. Il peut différer du client, par exemple quand une entreprise paie |
applicationFeeAmount | Commission Ezus Pay TTC, en centimes. applicationFeeAmountHt est hors taxes. Zéro sur les paiements saisis à la main |
refundableAmountCents | Ce qu'un remboursement accepterait à cet instant |
paymentLink, booking | null 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
/v1/bookings/:id/transactionsScopetransactions:readMê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
/v1/payment-links/:id/transactionsScopetransactions:readMê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
/v1/transactions/:idScopetransactions:readUne transaction, avec deux champs en plus : les réponses du voyageur aux champs du checkout, et l'historique des remboursements.
{
"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
/v1/transactions/:id/refundsScoperefunds:writeRembourse 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.
| Champ | Type | Règles |
|---|---|---|
amountCents | integer | De 1 à 99 999 999. Absent : tout ce qui reste est remboursé |
reason | string | DUPLICATE, FRAUDULENT, REQUESTED_BY_CUSTOMER ou OTHER |
note | string | Jusqu'à 1 000 caractères, pour vos archives |
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" }'
{
"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
refundableAmountCentsavant de réessayer. - Les paiements saisis à la main ne peuvent pas être remboursés par Ezus Pay.
| Erreur | Quand |
|---|---|
404 TRANSACTION_NOT_FOUND | Aucun paiement de ce type dans l'agence |
409 TRANSACTION_NOT_REFUNDABLE | Le paiement n'a pas abouti, ou n'a pas de débit Stripe |
409 MANUAL_PAYMENT_NOT_REFUNDABLE | Paiement saisi à la main |
409 NOTHING_LEFT_TO_REFUND | Déjà entièrement remboursé |
422 REFUND_AMOUNT_TOO_HIGH | Plus que ce qui reste à rembourser |
502 REFUND_FAILED | Stripe 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.