# eldo wallet Developers
> eldo wallet API v2: create, send and update Apple Wallet and Google Wallet passes (loyalty cards, coupons, event, transit and hotel passes).
## Guides
### Guides de l’API Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/docs/
# Guides de l’API Apple Wallet et Google Wallet
L'API eldo wallet crée des passes **Apple Wallet** et **Google Wallet** et les tient à jour. Le cas le plus courant : votre **carte de fidélité**, conçue une fois puis envoyée à chacun de vos clients, avec ses points à jour. La même logique sert aux coupons, billets d'événement, titres de transport et réservations d'hôtel : vous concevez un **modèle** (template) une fois, puis vous émettez un **pass** par client.
## L'essentiel en un coup d'œil
| | |
|---|---|
| URL de base | `https://api-v2.test.eldowallet.fr` (test, par défaut) — [environnements](/docs/environments) |
| Authentification | `Authorization: Bearer ` — [détails](/docs/authentication) |
| Format | JSON ; `multipart/form-data` pour les endpoints qui reçoivent des images — [détails](/docs/files-and-images) |
| Langue des réponses | `x-lang: fr` ou `en` — [détails](/docs/localization) |
| Erreurs | Enveloppe unique `{message, errorCode, path, date}` — [liste des codes](/docs/errors) |
| Pagination | `?page=1&limit=10` — [détails](/docs/pagination) |
| Limite de débit | 1 000 requêtes par minute |
| Spécification OpenAPI | [`openapi.fr.yaml`](pathname:///openapi.fr.yaml) · [`openapi.en.yaml`](pathname:///openapi.en.yaml) |
## Les objets de l'API
```mermaid
flowchart LR
W[Wallet
votre espace] --> T[Modèles
coupon, événement,
transport, hôtel, carte]
T --> P[Passes
un par client]
W --> C[Clients]
C --> P
P --> D[📱 Apple Wallet
Google Wallet]
W --> N[Communications
& notifications push]
N --> D
```
- **Wallet** : votre espace eldo wallet. Il porte votre marque, vos réglages d'envoi et vos jetons d'accès.
- **Modèle** : le design et les règles d'un type de pass (couleurs, image, code-barres, sécurité). Exemple : la carte de fidélité « Café Lumière », ou un modèle de billet « Traversée Marseille – Ajaccio ».
- **Pass** : l'exemplaire émis pour une personne, avec ses données (nom, siège, date…). Il s'installe dans le téléphone et se met à jour à distance.
- **Client** : un porteur de la carte de fidélité du wallet.
:::note[API v1]
L'API v1 (`api.eldowallet.fr/api/v1`) ne sera plus supportée après le **31 décembre 2026**. Voir le [guide de migration](/docs/migration-v1).
:::
### Authentification
Source: https://developers.eldowallet.fr/docs/authentication
# Authentification
Chaque appel (sauf la connexion) doit porter un jeton. Il existe deux sortes de jetons, qui s'utilisent de la même façon.
| | Jeton de connexion (JWT) | Jeton de wallet |
|---|---|---|
| Obtenu avec | | |
| Lié à | un utilisateur (et son rôle) | votre wallet |
| Expiration | oui (voir ci-dessous) | jamais, sauf si vous fixez `expiresAt` |
| Révocation | changer le mot de passe | |
| À utiliser pour | tester, scripts ponctuels | **intégrations serveur** |
Les jetons sont propres à chaque [environnement](/docs/environments) : un jeton de test ne fonctionne pas en production.
## Envoyer le jeton
```http
Authorization: Bearer
```
L'API accepte aussi l'en-tête `x-access-token: ` et le paramètre de requête `?access_token=`. Si plusieurs sont présents, l'ordre de priorité est : `access_token`, puis `x-access-token`, puis `Authorization`.
:::warning[Évitez `?access_token=`]
Un jeton dans l'URL finit dans les journaux des proxys et des serveurs. Utilisez l'en-tête `Authorization`.
:::
## Jeton de connexion
La réponse contient le jeton : `{"token": "eyJhbGciOi..."}`.
- Le jeton de connexion **expire**. Il n'existe **pas de jeton de rafraîchissement** : une fois le jeton expiré, l'API répond `401:UNAUTHORIZED` et vous vous reconnectez.
- Le jeton contient votre rôle et les types de passes autorisés pour votre wallet. Un appel vers un type non activé (par exemple `/transits` sans l'option Transport) renvoie `403:FORBIDDEN`.
Pour une intégration serveur, ne dépendez pas de l'expiration du jeton de connexion : utilisez un jeton de wallet.
## Jetons de wallet
Pour une intégration serveur, créez un jeton dédié, stockez-le dans votre coffre de secrets, et faites-le tourner régulièrement.
```json
{
"_id": "6650f1c2a9e4b5d1c3a7e921",
"token": "3f9c…e1a7",
"tokenable": "6650a0b1c2d3e4f5a6b7c8d9",
"tokenableType": "WALLET",
"expiresAt": "2027-06-30T00:00:00.000Z"
}
```
- Sans `expiresAt`, le jeton n'expire jamais.
- Listez vos jetons avec et révoquez-en un avec .
## Erreurs d'authentification
| Code | Quand |
|---|---|
| `401:UNAUTHORIZED` | Jeton absent, invalide, expiré, ou mauvais mot de passe |
| `403:FORBIDDEN` | Jeton valide, mais rôle insuffisant ou type de pass non activé |
Voir toutes les [erreurs](/docs/errors).
### Opérations en masse
Source: https://developers.eldowallet.fr/docs/bulk-operations
# Opérations en masse
Pour importer toute une base clients, émettre des centaines de billets ou mettre à jour des milliers de cartes, utilisez les endpoints `/bulk` plutôt qu'une boucle d'appels unitaires.
| Ressource | Créer | Modifier | Supprimer |
|---|---|---|---|
| Clients | | | |
| Passes de transport | | | |
| Passes d'événement | | | |
| Passes d'hôtel | | | |
| Coupons envoyés | | | |
## Le corps de la requête
| Champ | Type | Description |
|---|---|---|
| `items` | array | De 1 à 5 000 éléments, chacun au format de l'endpoint unitaire. Les suppressions prennent `ids` (tableau d'identifiants). |
| `webhookUrl` | string | Facultatif. URL appelée une fois l'opération terminée. |
| `forceSync` | boolean | Facultatif, `false` par défaut. `true` traite la requête immédiatement et renvoie les résultats. Réservé aux lots de **moins de 1 000** éléments (sinon `400:SYNC_EXECUTION_NOT_ALLOWED`). |
## Mode asynchrone (par défaut)
La réponse arrive immédiatement, avant le traitement :
```json
{
"operationId": "6651a7e0c4b2f19d8e3a0c55",
"totalItems": 2,
"successCount": 0,
"failureCount": 0,
"status": "pending",
"createdAt": "2026-11-20T10:00:00.000Z"
}
```
Suivez l'avancement avec : `status` passe de `pending` à `processing`, puis `completed` ou `failed`. À la fin, chaque élément en échec est listé dans `operationErrors`.
```mermaid
sequenceDiagram
participant S as Votre serveur
participant E as API eldo wallet
S->>E: POST /clients/bulk
E-->>S: 201 {operationId, status: "pending"}
loop Toutes les 5 à 10 s, ou attendre le webhook
S->>E: GET /bulk-operations/{operationId}
E-->>S: {status: "processing", successCount: 1200}
end
E->>S: POST webhookUrl (opération terminée)
```
:::warning[Le webhook de fin n'est pas garanti]
L'URL `webhookUrl` est appelée **une seule fois**, sans nouvelle tentative, et seulement si l'opération se termine en `completed`. Gardez le suivi par comme filet de sécurité.
:::
## Bonnes pratiques
- Découpez au-delà de 5 000 éléments, et envoyez les lots les uns après les autres.
- Fournissez votre propre `barcode` par élément si vous devez relier le pass à votre système (billetterie, CRM).
- Une erreur sur un élément n'annule pas les autres : relancez uniquement les éléments de `operationErrors`.
Des centaines de milliers de porteurs, des envois massifs ou une reprise depuis un autre fournisseur : notre équipe dimensionne l'offre avec vous et vous accompagne.
### Changelog
Source: https://developers.eldowallet.fr/docs/changelog
# Changelog
Les changements **cassants** sont signalés par 🔴.
## Octobre 2026
- **Nouvel espace développeurs.** Référence API générée depuis la spécification OpenAPI, exemples dans huit langages, bouton « Essayer », format d'erreur unique documenté, cas d'usage et base de connaissances, en français et en anglais.
- Spécification OpenAPI publiée : [`openapi.en.yaml`](pathname:///openapi.en.yaml), [`openapi.fr.yaml`](pathname:///openapi.fr.yaml).
- 🔴 **Fin du support de l'API v1 le 31 décembre 2026.** Voir le [guide de migration](/docs/migration-v1).
### Environnements
Source: https://developers.eldowallet.fr/docs/environments
# Environnements
| Environnement | Usage | URL de base |
|---|---|---|
| **Test** | Par défaut, pour développer et tester votre intégration | `https://api-v2.test.eldowallet.fr` |
| Production | Mise en ligne, vrais clients | `https://api-v2.eldowallet.fr` |
Les deux environnements exposent la même API. Tous les exemples de cette documentation, le bouton « Essayer » de la [référence API](/api) et le SDK ciblent l'environnement de test.
L'API n'a ni préfixe ni segment de version : `https://api-v2.test.eldowallet.fr/clients`, et non `/api/v2/clients`.
**Les jetons sont propres à chaque environnement** : un jeton de test est refusé en production, et inversement.
## Prêt pour la production ?
Votre intégration fonctionne en test ? L'étape suivante se fait avec notre équipe : elle ouvre votre wallet de production, vous présente l'offre adaptée à vos volumes et à vos usages, et vous accompagne jusqu'au lancement.
Accès complet à l'API de production, tarifs selon vos volumes, accompagnement au lancement : décrivez-nous votre projet, nous revenons vers vous.
## Avant la mise en production
Votre checklist de lancement, à passer en revue avec notre équipe à l'ouverture de votre accès :
- **Utilisez des données fictives** en test (`@example.com`, numéros factices). Les passes envoyés par e-mail ou SMS partent réellement.
- **Respectez la limite de débit** : 1 000 requêtes par minute. Au-delà de quelques centaines d'envois, passez par les [opérations en masse](/docs/bulk-operations).
- **Vérifiez la disponibilité** de l'API depuis votre supervision.
- **Branchez les [webhooks](/docs/webhooks)** pour suivre les installations.
## Basculer vers la production
Une fois votre accès production ouvert :
1. Remplacez l'URL de base par `https://api-v2.eldowallet.fr`.
2. Utilisez un jeton de votre wallet de production, créé avec et stocké hors du code.
Gardez l'URL de base et le jeton dans la configuration (variables d'environnement), jamais en dur dans le code.
### Erreurs
Source: https://developers.eldowallet.fr/docs/errors
# Erreurs
Toutes les erreurs suivent la **même enveloppe JSON**, quel que soit l'endpoint.
```json
{
"message": "Le code promo existe déjà",
"errorCode": "400:PROMO_CODE_ALREADY_EXISTS",
"path": "/coupons",
"date": "2026-01-15T09:30:00.000Z"
}
```
| Champ | Type | Description |
|---|---|---|
| `message` | string | Message lisible, traduit selon [`x-lang`](/docs/localization). À afficher, **pas à tester**. |
| `errorCode` | string | `:`. **Stable** : c'est ce champ que votre code doit tester. |
| `path` | string | URL appelée, avec la query string. |
| `date` | string | Horodatage ISO 8601. |
| `details` | object | Facultatif. Valeurs utiles au diagnostic (ex. crédits restants). |
| `validationErrors` | array | Présent seulement pour `400:VALIDATION_ERROR` : `[{field, message}]`. |
## Erreurs de validation
```json
{
"message": "email doit être un e-mail valide",
"errorCode": "400:VALIDATION_ERROR",
"path": "/clients",
"date": "2026-01-15T09:30:00.000Z",
"validationErrors": [
{"field": "email", "message": "email doit être un e-mail valide"},
{"field": "lastName", "message": "lastName doit contenir au moins 2 caractères"}
]
}
```
`message` reprend la première erreur. Pour les objets imbriqués, `field` contient le nom du champ final (`backgroundColor`), sans le chemin complet.
## Bien gérer les erreurs
```js
const res = await fetch(url, options);
if (!res.ok) {
const err = await res.json();
const [, code] = err.errorCode.split(':');
switch (code) {
case 'UNAUTHORIZED':
// jeton expiré : reconnectez-vous
break;
case 'VALIDATION_ERROR':
// corrigez les champs listés dans err.validationErrors
break;
case 'PASS_BUILDER_ERROR':
// erreur temporaire de génération du pass : réessayez plus tard
break;
default:
throw new Error(`${err.errorCode}: ${err.message}`);
}
}
```
- **4xx** : la requête est en cause. Ne la renvoyez pas telle quelle.
- **5xx** : erreur côté eldo wallet. Réessayez avec un délai croissant (1 s, 2 s, 4 s…).
- Chaque page de la [référence API](/api) liste les erreurs propres à l'endpoint, avec un exemple de réponse.
## Tous les codes
### Images et multipart
Source: https://developers.eldowallet.fr/docs/files-and-images
# Images et `multipart/form-data`
Les endpoints qui reçoivent une image (création d'un modèle de coupon, d'événement, de transport, d'hôtel, de communication, mise à jour du wallet…) attendent un corps **`multipart/form-data`**. La référence de chaque endpoint indique le type attendu.
:::danger[Un fichier ne voyage pas dans du JSON]
Envoyer `{"strip": ""}` en `application/json` ne fonctionne pas. Utilisez `multipart/form-data`, et laissez votre client HTTP générer l'en-tête `Content-Type` (il contient la *boundary*).
:::
## Les trois règles du multipart
1. **Les fichiers** sont des champs fichier : `-F "strip=@bandeau.png;type=image/png"`.
2. **Les objets et tableaux** (`colors`, `security`, `locations`, `displayOptions`, `iosHeader`, `date`…) s'envoient en **chaîne JSON** :
`-F 'colors={"backgroundColor":"#131313","labelColor":"#9EE00D","foregroundColor":"#FFFFFF"}'`
3. **Les booléens** s'envoient en texte `"true"` ou `"false"`. Toute autre valeur vaut `false`.
## Contraintes sur les fichiers
| | |
|---|---|
| Formats d'image | PNG ou JPEG |
| Taille d'une image | de 1 Ko à 5 Mo |
| Import CSV | `text/csv`, 10 Mo et 100 000 lignes maximum |
| Par requête | 10 fichiers et 50 Mo par fichier au maximum |
Une image hors limites renvoie `400:VALIDATION_ERROR`. Un corps multipart mal formé renvoie `400:INVALID_MULTIPART`, et un `Content-Type` non pris en charge `415:UNSUPPORTED_MEDIA_TYPE`.
## Mises à jour
La plupart des endpoints `PATCH` acceptent **multipart ou JSON**. Utilisez JSON quand vous ne changez pas d'image : c'est plus simple.
Pour les dimensions recommandées des images de pass, voir la [base de connaissances](/kb).
### Langue des réponses
Source: https://developers.eldowallet.fr/docs/localization
# Langue des réponses
L'API répond en **anglais** par défaut, ou en **français**. La langue s'applique aux messages d'erreur et aux contenus générés par eldo wallet.
La langue est lue dans cet ordre :
1. le paramètre de requête `?lang=fr`
2. l'en-tête `x-lang: fr`
3. l'en-tête `Accept-Language`
```json
{"message": "Modèle introuvable !", "errorCode": "404:MODEL_NOT_FOUND", "path": "/clients/inconnu?lang=fr", "date": "…"}
```
:::note
Quelques messages de validation sont encore toujours en anglais (par exemple `departureDate must be a valid ISO date`). Testez toujours `errorCode`, jamais `message`.
:::
## Le contenu de vos passes
La langue de l'API ne traduit pas vos passes : les textes que vous envoyez (`details`, `terms`, nom de l'événement…) s'affichent tels quels. Pour une clientèle multilingue, créez un modèle par langue, ou adaptez les champs du pass à chaque client.
### Migration depuis l'API v1
Source: https://developers.eldowallet.fr/docs/migration-v1
# Migration depuis l'API v1
:::danger[Fin du support de l'API v1 : 31 décembre 2026]
L'API v1 (`https://api.eldowallet.fr/api/v1`) ne sera plus supportée après le **31 décembre 2026**. Les nouvelles fonctionnalités ne sont disponibles qu'en v2.
**Notre équipe support vous accompagne dans la migration** : [contactez-nous](#support) pour planifier votre passage en v2.
:::
## Qui est concerné ?
Toute intégration qui appelle une URL commençant par `https://api.eldowallet.fr/api/v1/`. Si vous utilisez uniquement le back-office eldo wallet, vous n'avez rien à faire.
## Ce qui change
| | v1 | v2 |
|---|---|---|
| URL de base | `https://api.eldowallet.fr/api/v1` | `https://api-v2.eldowallet.fr` (production) ; pour tester : `https://api-v2.test.eldowallet.fr` — [environnements](/docs/environments) |
| Identifiant du wallet | dans l'URL (`/wallets/{wallet}/transits`) | déduit du jeton (`/transits`) |
| Connexion | `POST /users/login` | |
| Jetons serveur | — | [jetons de wallet](/docs/authentication#jetons-de-wallet) révocables |
| Format d'erreur | `{statusCode, status, messageCode, message}` | `{message, errorCode, path, date}` — [détails](/docs/errors) |
| Pagination | variable selon l'endpoint | uniforme `?page=&limit=` — [détails](/docs/pagination) |
| Envois en masse | — | jusqu'à 5 000 éléments, suivi d'avancement — [détails](/docs/bulk-operations) |
| Webhooks | URL simple | événements typés, nouvelles tentatives — [détails](/docs/webhooks) |
## Correspondance des principaux endpoints
| Besoin | v1 | v2 |
|---|---|---|
| Créer un modèle de transport | `POST /wallets/{wallet}/transits` | |
| Envoyer un billet de transport | `POST /wallets/{wallet}/transits/{transit}/send` | |
| Mettre à jour un trajet | `PATCH /wallets/{wallet}/transits/{transit}/trip/{tripNumber}` | |
| Notifier un trajet | `POST /wallets/{wallet}/transits/{transit}/trip/{tripNumber}` | |
| Créer un coupon | `POST /wallets/{wallet}/coupons` | |
| Envoyer un coupon | `POST /wallets/{wallet}/coupons/{coupon}/send` | |
| Créer un événement | `POST /wallets/{wallet}/events` | |
| Créer un client | `POST /customers` | |
| Valider un pass | `PUT /wallets/{wallet}/redeem` | |
| Créer un pass d'hôtel | `POST /wallets/{wallet}/hotels` | |
En v2, les cartes d'embarquement s'émettent comme des titres de transport (`type: "Air"`, voir [Compagnies aériennes](/use-cases/airlines)) et les billets de cinéma comme des événements (voir [Cinéma](/use-cases/cinema)).
## Étapes de migration
Connectez-vous à la v2 et créez un jeton de wallet dédié à votre intégration.
Listez vos modèles en v2 pour récupérer leurs identifiants, et créez ceux dont votre intégration a besoin.
Changez l'URL de base, retirez l'identifiant du wallet des chemins, et adaptez les corps de requête en suivant la [référence API](/api).
Testez `errorCode` (ex. `400:VALIDATION_ERROR`) au lieu de `statusCode` / `messageCode`.
Basculez progressivement, surveillez les erreurs, puis coupez les appels v1 avant le 31 décembre 2026.
La documentation v1 historique reste consultable sur [api.eldowallet.fr/api-docs](https://api.eldowallet.fr/api-docs) jusqu'à la fin du support.
### Pagination
Source: https://developers.eldowallet.fr/docs/pagination
# Pagination
Les endpoints de liste (`GET /clients`, `GET /transits`, `GET /events/{id}/passes`…) sont paginés.
| Paramètre | Défaut | Contraintes |
|---|---|---|
| `page` | `1` | entier ≥ 1 |
| `limit` | `10` | entier de 1 à 1 000 |
```json
{
"docs": [{"_id": "…", "firstName": "Camille", "lastName": "Martin"}],
"totalDocs": 1342,
"limit": 100,
"page": 2,
"totalPages": 14,
"pagingCounter": 101,
"hasPrevPage": true,
"hasNextPage": true,
"prevPage": 1,
"nextPage": 3
}
```
## Parcourir toute une liste
```js title="Parcourir toutes les pages" pattern
async function* allClients(token) {
let page = 1;
while (page) {
const res = await fetch(`https://api-v2.test.eldowallet.fr/clients?page=${page}&limit=500`, {
headers: {Authorization: `Bearer ${token}`},
});
const body = await res.json();
yield* body.docs;
page = body.nextPage; // null sur la dernière page
}
}
```
:::tip[Pour un export complet]
Pour exporter tous vos clients, préférez l'export CSV en arrière-plan : .
:::
### Créer une carte de fidélité Apple Wallet et Google Wallet en 10 minutes
Source: https://developers.eldowallet.fr/docs/quickstart
# Créer une carte de fidélité Apple Wallet et Google Wallet en 10 minutes
La carte de fidélité est le pass le plus utilisé d'eldo wallet. En trois appels, vous allez la concevoir, créer un client et lui envoyer sa carte par e-mail. Comptez 10 minutes.
**Prérequis** : un compte eldo wallet sur l'[environnement de test](/docs/environments) (`https://api-v2.test.eldowallet.fr`), utilisé par tous les exemples ci-dessous.
Chaque exemple existe en cURL, Node.js, PHP, Python, Java, C#, Go, Ruby et avec le SDK Node.js : choisissez votre langage une fois, il est retenu sur tout le site. Le bouton **Essayer** ouvre la page de l'endpoint, où vous pouvez l'appeler avec votre jeton.
## 0. (Facultatif) Installer le SDK Node.js
Vous codez en Node.js ? Générez un client typé, avec autocomplétion sur chaque endpoint et chaque champ, puis utilisez l'onglet **SDK Node.js** des exemples ci-dessous.
Les noms de méthodes sont les identifiants d'opération de la [référence API](/api). Autres langages : [SDK et outils](/docs/sdks).
## 1. Obtenir un jeton
Réponse :
```json
{"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}
```
Gardez ce jeton : il remplace `` dans les exemples suivants.
```bash
export ELDO_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
```
:::tip[Pour un serveur, préférez un jeton de wallet]
Un jeton de connexion est lié à un utilisateur. Pour une intégration serveur, créez un [jeton de wallet](/docs/authentication#jetons-de-wallet) dédié.
:::
## 2. Concevoir votre carte de fidélité
La carte de fidélité est unique par wallet : vous réglez son design une fois, et chaque client reçoit son propre exemplaire. Choisissez le type (`STORE_CARD` pour une carte de magasin avec cagnotte, `MEMBER_CARD` pour une carte de membre), le nom du programme, les couleurs, l'unité des gains et les champs affichés.
Cet endpoint reçoit une image (`strip`, le bandeau de la carte) : le corps est en **`multipart/form-data`**, et les objets (`colors`, `descriptions`) s'envoient en chaîne JSON.
Le logo, l'icône et les coordonnées affichés sur la carte se règlent sur le wallet (). Conseils de design : [bonnes pratiques](/kb/concepts/design-guidelines).
## 3. Créer un client et lui envoyer sa carte
Cette fois, le corps est en JSON. eldo wallet génère la carte du client ; avec `sendCard: true`, il lui envoie le lien d'installation par e-mail.
La réponse contient le client (`_id`, `barcode`) et le lien d'installation de sa carte (`shortLink`), à diffuser aussi dans vos propres canaux. Camille ouvre le lien, et la carte s'ajoute à Apple Wallet ou Google Wallet.
```bash
export CLIENT_ID="6650f1c2a9e4b5d1c3a7e921"
```
## 4. (Facultatif) Mettre à jour ses points
Après un achat, envoyez le **nouveau solde** de points du client : la valeur remplace le solde précédent (ce n'est pas un ajout), et chaque valeur est conservée dans l'historique. La carte se met à jour sur son téléphone.
Depuis une caisse qui scanne la carte, utilisez plutôt le code-barres : .
## Et ensuite ?
- Le parcours complet (coupons, paliers, magasins) : [cas d'usage Commerce](/use-cases/retail).
- Segmentez vos membres (Silver, Gold) : [types de clients](/kb/concepts/customer-types).
- Importez votre base existante : [import CSV](/kb/guides/import-customers-csv) ou [opérations en masse](/docs/bulk-operations).
- Faites remonter la carte près de vos magasins : [localisations](/kb/concepts/locations).
- Soyez prévenu quand une carte est installée : [webhooks](/docs/webhooks).
- Prêt pour la mise en ligne : [environnements](/docs/environments).
Notre équipe vous ouvre l'accès production, vous présente les offres et vous aide à lancer votre programme auprès de vos clients.
### SDK et outils
Source: https://developers.eldowallet.fr/docs/sdks
# SDK et outils
Tout part de la **spécification OpenAPI**, publiée avec cette documentation et mise à jour à chaque évolution de l'API :
- [`https://developers.eldowallet.fr/openapi.en.yaml`](pathname:///openapi.en.yaml) (descriptions en anglais)
- [`https://developers.eldowallet.fr/openapi.fr.yaml`](pathname:///openapi.fr.yaml) (descriptions en français)
## Node.js : client prêt à l'emploi avec `api`
```bash
npx api install https://developers.eldowallet.fr/openapi.en.yaml --identifier eldowallet
```
L'outil génère un SDK typé dans votre projet et affiche le nom du paquet à importer :
```js
import eldowallet from '@api/eldowallet';
eldowallet.auth(process.env.ELDO_TOKEN);
const {data} = await eldowallet.getClients({page: 1, limit: 20});
```
Les noms de méthodes sont les identifiants d'opération affichés sur chaque page de la [référence API](/api).
## TypeScript : types seuls
```bash
npx openapi-typescript https://developers.eldowallet.fr/openapi.en.yaml -o src/eldowallet.d.ts
```
## Autres langages (PHP, Python, Java, C#…)
[OpenAPI Generator](https://openapi-generator.tech) produit un client dans plus de 50 langages :
```bash
npx @openapitools/openapi-generator-cli generate \
-i https://developers.eldowallet.fr/openapi.en.yaml \
-g php -o ./eldowallet-php --additional-properties=invokerPackage=EldoWallet
```
```bash
npx @openapitools/openapi-generator-cli generate \
-i https://developers.eldowallet.fr/openapi.en.yaml \
-g python -o ./eldowallet-python --additional-properties=packageName=eldowallet
```
```bash
npx @openapitools/openapi-generator-cli generate \
-i https://developers.eldowallet.fr/openapi.en.yaml \
-g java -o ./eldowallet-java
```
```bash
npx @openapitools/openapi-generator-cli generate \
-i https://developers.eldowallet.fr/openapi.en.yaml \
-g csharp -o ./EldoWallet
```
## Postman et Insomnia
Une collection prête à l'emploi : les 129 requêtes de l'API, rangées par domaine, déjà configurées sur l'environnement de test et l'authentification.
Télécharger la collection Postman
1. Dans Postman, cliquez sur **Import** et déposez le fichier téléchargé.
2. Ouvrez la collection **eldo wallet API v2 (test)**, onglet **Variables**, et collez votre jeton d'API dans `token`. Pas encore de jeton ? [Demandez un accès de test](/docs), il arrive par e-mail.
3. Envoyez n'importe quelle requête : l'URL de test et l'en-tête `Authorization: Bearer` sont déjà en place.
**Insomnia, Bruno ou un autre outil :** importez la spécification OpenAPI par son URL.
```text title="URL de la spécification"
https://developers.eldowallet.fr/openapi.fr.yaml
```
## Assistants IA
- [`/llms.txt`](pathname:///llms.txt) : index de toute la documentation, au format [llmstxt.org](https://llmstxt.org).
- [`/llms-full.txt`](pathname:///llms-full.txt) : toute la documentation en un seul fichier texte.
- Toutes les pages sont en HTML statique : un assistant peut lire n'importe quelle URL de ce site.
Donnez l'une de ces URL à votre assistant de code (Claude, Copilot, Cursor…) pour qu'il écrive l'intégration à partir de la vraie spécification.
### Webhooks
Source: https://developers.eldowallet.fr/docs/webhooks
# Webhooks
eldo wallet peut appeler votre serveur quand un événement se produit dans votre wallet.
## Événements
| Événement | Déclencheur |
|---|---|
| `client.created` | Client créé (API, opération en masse, formulaire d'inscription public, import CSV) |
| `client.updated` | Client modifié, y compris ses points (`gain`) |
| `client.deleted` | Client supprimé |
| `pass.installed` | Un téléphone a ajouté le pass à Apple Wallet ou Google Wallet |
| `pass.uninstalled` | Un téléphone a retiré le pass |
## Configurer l'URL
Renseignez `webHookUrl` sur votre wallet avec . Plusieurs URL peuvent être séparées par des virgules.
### Authentifier les appels
Les webhooks **ne sont pas signés**. Pour vérifier qu'un appel vient d'eldo wallet, ajoutez vos propres en-têtes avec le fragment `#headers=` : `Nom:Valeur`, séparés par des virgules, valeurs encodées pour URL. eldo wallet les envoie à chaque appel, et ne les réaffiche jamais quand vous relisez le wallet.
Vérifiez cet en-tête côté serveur et refusez les appels qui ne le portent pas.
## Format
`POST`, `Content-Type: application/json` :
```json
{
"event": "pass.installed",
"walletId": "6650a0b1c2d3e4f5a6b7c8d9",
"timestamp": "2026-11-20T10:02:13.408Z",
"data": {
"pass": {"_id": "6651b2…", "kind": "TRANSIT", "status": "active", "barcode": "MRS-AJA-000123", "activeIOSDeviceCount": 1, "activeAndroidDeviceCount": 0},
"barcode": "MRS-AJA-000123",
"deviceType": "IOS"
}
}
```
Pour `client.*`, `data.client` contient le client complet (`_id`, `firstName`, `lastName`, `email`, `phoneNumber`, `barcode`, `source`, `gain`…).
## Livraison et nouvelles tentatives
- Répondez par un **2xx en moins de 10 secondes**. Faites le traitement lourd après avoir répondu.
- En cas d'échec, eldo wallet réessaie **3 fois** avec un délai croissant (à partir de 2 s).
- Un même événement peut arriver plusieurs fois, et l'ordre n'est pas garanti : rendez votre traitement **idempotent** (par exemple sur `event` + `data.pass._id` + `timestamp`).
```js
// Express
app.post('/hooks/eldo', express.json(), (req, res) => {
if (req.get('Authorization') !== `Bearer ${process.env.ELDO_WEBHOOK_SECRET}`) return res.sendStatus(401);
res.sendStatus(204); // répondre tout de suite
queue.push(req.body); // traiter ensuite
});
```
## Webhook de fin d'opération en masse
Les endpoints `/bulk` acceptent un `webhookUrl` propre à la requête, appelé une seule fois à la fin. Voir [opérations en masse](/docs/bulk-operations).
## Use cases
### Cas d'usage Apple Wallet et Google Wallet par secteur
Source: https://developers.eldowallet.fr/use-cases/
# Cas d'usage Apple Wallet et Google Wallet
Une carte de fidélité, un billet de train, une carte d’embarquement ou une réservation d’hôtel : le mécanisme est toujours le même. Vous créez un **modèle** une fois, vous **envoyez** un pass à chaque client, puis vous le **faites vivre** (mise à jour, notification, validation).
Chaque page ci-dessous part d'un métier réel. Elle montre le parcours client, les appels API dans l'ordre et les pièges à éviter. Choisissez le vôtre, ou le plus proche.
## Comment lire un cas d'usage
Chaque page suit la même structure :
1. **Le pitch** : le problème métier et ce que fait le pass dans le téléphone du client.
2. **Le parcours client** : un diagramme qui montre qui appelle qui, de votre système jusqu'au Wallet du client.
3. **Le workflow d'intégration** : les étapes numérotées. Chaque étape indique qui agit et les endpoints appelés.
| Badge | Qui agit |
| --- | --- |
| **Back-office** | Vous, dans le back-office eldo wallet. Sans code. |
| **Votre serveur** | Votre CRM, caisse, billetterie ou SI appelle l'API. |
| **eldo wallet** | La plateforme génère, envoie ou met à jour les passes. |
| **Client final** | Votre client ajoute, présente ou reçoit son pass. |
4. **Les bonnes pratiques** : ce qui marche en production, et ce qui casse.
5. **Pour aller plus loin** : les articles de la base de connaissances et les endpoints liés.
:::tip[Nouveau sur eldo wallet ?]
Commencez par le [démarrage rapide](/docs/quickstart) et [l'authentification](/docs/authentication). Puis lisez [modèles et passes](/kb/concepts/templates-vs-passes) : c'est la notion qui structure toute l'API.
:::
Chaque projet est différent : décrivez-nous le vôtre, nous vous montrons comment les cartes wallet peuvent y répondre.
### Cartes d'embarquement Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/airlines
À l'aéroport, le passager cherche trois informations : **sa porte, son heure d'embarquement, son siège.** Une carte d'embarquement dans Apple Wallet ou Google Wallet les affiche d'un coup d'œil, depuis l'écran de verrouillage, sans application et sans réseau. Vous émettez la carte à l'enregistrement, vous la mettez à jour si la porte ou l'horaire change, le passager la présente au contrôle et à la porte.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor P as Passager
participant D as Système de réservation
participant E as eldo wallet
participant W as Apple / Google Wallet
D->>E: Crée la ligne CDG - JFK, type Air
P->>D: S'enregistre en ligne
D->>E: Émet la carte avec vol, siège et porte
E-->>P: Email avec le lien d'ajout
P->>W: Ajoute la carte d'embarquement
Note over D,E: Retard de 40 min
D->>E: Nouvel horaire pour le vol du jour
E->>W: Cartes mises à jour
P->>D: Scan au contrôle et à la porte
D->>E: Valide le pass
```
## Workflow d'intégration
Les cartes d'embarquement utilisent les transits, avec le type `Air`. Un modèle par ligne : aéroports d'origine et de destination (codes IATA et noms), horaires de référence, conditions, numéro du service client, couleurs, strip. Le format `PDF_417` est le standard des cartes d'embarquement.
Sur votre site, votre application ou au comptoir.
Un appel par passager : identité, email, date du vol, `flightNumber`, `gate`, `seat`, code-barres. Utilisez un `tripNumber` par vol et par date (par exemple `EW204-20261112`) : c'est lui qui permet de mettre à jour tous les passagers d'un coup.
Elle s'affiche hors ligne et remonte sur l'écran de verrouillage le jour du vol.
Retard : mettez à jour les horaires de tout le vol par son `tripNumber`. Changement de porte : la porte est portée par chaque carte, mettez à jour les cartes en lot. Ajoutez un message pour expliquer : « Porte K42 remplacée par L12 ».
Le lecteur scanne le code-barres. Retrouvez la carte, puis validez-la pour tracer l'embarquement.
## Bonnes pratiques
- **Un `tripNumber` par vol et par date.** Le EW 204 du 12 et celui du 13 sont deux vols distincts.
- **Utilisez les codes IATA.** Les codes de gare s'affichent en grand sur la carte. Les noms complets vont dans les champs secondaires.
- **Vérifiez la lisibilité du code-barres.** Testez vos lecteurs de porte avec un téléphone en luminosité automatique avant le lancement.
- **Correspondances.** Émettez une carte par segment, chacune avec son propre `tripNumber`.
## Pour aller plus loin
- [Transport & mobilité](/use-cases/transport)
- [Mettre à jour un trajet](/kb/guides/update-a-trip)
- [Codes-barres](/kb/concepts/barcodes)
- [Apple Wallet ou Google Wallet](/kb/concepts/apple-vs-google-wallet)
- Endpoints :
## Pour vous inspirer
La carte d’embarquement peut faire bien plus qu’ouvrir la porte de l’avion. Voici des idées pour enrichir le parcours de vos passagers.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Carte d'adhérent d'association dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/associations
Une association vit de ses adhérents. Chaque année, il faut les relancer, imprimer les cartes, les poster, prévenir de l'assemblée générale. **La carte d'adhérent dans Apple Wallet ou Google Wallet fait tout ça à la fois :** preuve d'adhésion, canal d'information direct et billet pour vos événements. Vous importez votre liste d'adhérents une fois, puis vous la tenez à jour.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor A as Adhérent
participant G as Outil de gestion
participant E as eldo wallet
participant W as Apple / Google Wallet
G->>E: Importe la liste des adhérents
E-->>A: Email avec la carte
A->>W: Ajoute la carte d'adhérent
Note over G,E: Assemblée générale
G->>E: Message à tous les adhérents
W-->>A: AG le 14 mars à 18 h, salle des fêtes
G->>E: Émet le billet de la soirée annuelle
A->>W: Ajoute le billet
Note over G,E: Fin de l'année d'adhésion
G->>E: Rappel de renouvellement
A->>G: Renouvelle sa cotisation
G->>E: Met à jour la date de renouvellement
```
## Workflow d'intégration
Choisissez `MEMBER_CARD`, affichez l'association (`ASSOCIATION`) et le numéro d'adhérent (`N_ADHERENT`). Sur iPhone, affichez la catégorie dans l'en-tête (`iosHeader` à `TYPE`). Gardez la même carte d'une année sur l'autre : seules la catégorie et la date de renouvellement changent. Ajoutez vos contacts et votre site sur le wallet.
Membre actif, bienfaiteur, jeune, bénévole, membre d'honneur : chaque catégorie devient un type de client. Vous ciblez ensuite vos messages par catégorie. Voir [Types de clients](/kb/concepts/customer-types).
Vous avez déjà un tableur ou un export de votre outil de gestion : importez-le en CSV. L'import tourne en arrière-plan. Avec `sendNotificationsToCustomers: true`, chaque adhérent reçoit sa carte. Pour une synchronisation régulière, utilisez la création en masse en JSON (jusqu'à 5 000 lignes par appel). Voir [Importer une base clients](/kb/guides/import-customers-csv).
À la réception de la cotisation, votre outil crée l'adhérent avec son numéro comme code-barres, sa catégorie, sa date d'adhésion et sa date de renouvellement.
Il la présente à l'entrée d'une activité ou chez un partenaire, même sans réseau.
Une semaine après l'import, relancez les adhérents dont la carte n'est pas installée : tous, ou une liste précise.
Convocation à l'assemblée générale, appel aux bénévoles, changement de lieu d'une activité : une notification à tous les adhérents, ou à une catégorie (`target: SPECIFIC`). Pour une campagne (collecte, journée portes ouvertes), créez une communication : le strip de la carte change pendant la période. Voir [Notifications push](/kb/push-notifications).
Soirée annuelle, sortie, tournoi, conférence : créez un événement, puis émettez un billet à chaque inscrit. Passez le `clientId` de l'adhérent pour relier le billet à sa fiche. Les invités extérieurs reçoivent un billet sans être adhérents. Voir [Événements & salons](/use-cases/events).
À l'entrée, scannez le billet et validez-le. Un second scan renvoie `PASS_ALREADY_REDEEMED`.
Un mois avant la fin de l'année d'adhésion, programmez un rappel aux adhérents concernés. À réception de la cotisation, mettez à jour la date de renouvellement et, si besoin, la catégorie. La carte installée se met à jour.
## Bonnes pratiques
- **Le numéro d'adhérent comme code-barres.** C'est le numéro de votre registre : pas de table de correspondance.
- **Une carte, plusieurs années.** Au renouvellement, mettez à jour la carte existante plutôt que d'en créer une seconde.
- **Le strict nécessaire sur la carte.** Nom, numéro, catégorie. Le reste reste dans votre outil de gestion.
- **Des messages utiles.** AG, activités, bénévolat : `INFORMATIVE`. Une offre d'un partenaire est `COMMERCIAL`. Respectez les préférences de communication de chaque adhérent.
- **Nettoyez le fichier avant l'import.** Un email et un numéro d'adhérent uniques par ligne : les doublons sont refusés.
## Pour aller plus loin
- [Événements & salons](/use-cases/events) pour les billets
- [Mutuelles & santé](/use-cases/health-insurance) pour une autre carte d'adhérent
- [Importer une base clients](/kb/guides/import-customers-csv)
- [Types de clients](/kb/concepts/customer-types)
- [Notifications push](/kb/push-notifications)
- Endpoints :
## Pour vous inspirer
La carte d’adhérent peut faire vivre votre association toute l’année. Voici des idées pour fidéliser vos membres.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Carte de fidélité garage dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/automotive
Dans l'auto, vous animez deux populations. **Le pro** (garagiste, carrossier) veut son programme de points sur ses commandes de pièces. **Le particulier** veut qu'on lui rappelle quand faire sa révision ou changer ses pneus. eldo wallet gère les deux depuis le même wallet, avec une carte Apple Wallet ou Google Wallet qui affiche l'immatriculation et la prochaine échéance.
## Le parcours client
```mermaid
flowchart LR
subgraph Pro["Réseau pro"]
A[Commercial ou extranet] -->|crée la carte pro| E((eldo wallet))
P[Commande de pièces] -->|points crédités| E
E -->|palier atteint| R[Coupon récompense]
end
subgraph Part["Client particulier"]
G[Atelier du garage] -->|carte avec immatriculation| E
CRM[CRM atelier] -->|révision dans 30 jours| E
E -->|notification| T[Téléphone du client]
end
```
## Workflow d'intégration
Choisissez `MEMBER_CARD`, l'unité de gain `POINTS` et les champs affichés : le champ de droite peut afficher l'immatriculation (`N_IMMATRICULATION`), celui de gauche le gain.
Créez un type de client par population : « Garagiste pro », « Particulier ». Vous ciblez ensuite chaque population séparément. Voir [Types de clients](/kb/concepts/customer-types).
Le commercial visite un garage. Un bouton dans votre CRM crée le client avec le type « Garagiste pro » et `sendCard: true`. Le gérant reçoit sa carte en 30 secondes. Même mécanique depuis votre extranet pro.
Ajoutez au verso de la carte le modèle du véhicule, la date de la prochaine révision et un lien de prise de rendez-vous (`additionalInformations`). Un strip personnalisé par client est possible.
Votre système de commande envoie le gain après chaque facture validée. La cagnotte se met à jour sur la carte du pro.
Opération freinage, nouvel injecteur, pneus hiver : créez une communication avec son visuel et sa période. Le strip des cartes change pendant l'opération. Ciblez par tranche de points (`minPoints`, `maxPoints`) pour réserver une offre aux meilleurs pros. Puis notifiez le réseau.
Votre CRM atelier détecte les véhicules à entretenir et envoie une notification `SPECIFIC` avec un message personnalisé par client : « Votre révision arrive, prenez rendez-vous. »
Palier de 2 000 points : coupon récompense. Aucun achat depuis 60 jours : coupon de réactivation. Le coupon est validé au comptoir.
Comparez commandes et panier moyen des pros cartés et non cartés dans votre ERP.
## Bonnes pratiques
- **Un wallet, deux types de clients.** Ne mélangez pas les messages B2B et B2C : les types de clients séparent les deux populations.
- **Le rappel d'entretien est votre meilleur message.** Il est utile, personnel et attendu : classez-le `INFORMATIVE`. Gardez les promotions (`COMMERCIAL`) pour les pros.
- **Une communication à la fois.** Deux communications qui se chevauchent sur la même période sont refusées (`OVERLAPPING_COMMUNICATIONS`).
- **QR sur les catalogues.** Imprimez le QR d'inscription du back-office sur vos catalogues et PLV. Aucun développement.
## Pour aller plus loin
- [Types de clients](/kb/concepts/customer-types)
- [Importer une base clients](/kb/guides/import-customers-csv)
- [Notifications push](/kb/push-notifications)
- Endpoints :
## Pour vous inspirer
Pros comme particuliers, la carte Wallet peut rythmer toute la vie du véhicule. Voici des idées pour aller plus loin.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Billets de cinéma dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/cinema
Le spectateur achète sa place dans le métro, arrive cinq minutes avant la séance et cherche son email. **Avec un billet dans Apple Wallet ou Google Wallet, il ouvre son écran de verrouillage et passe.** Salle, rang et place sont affichés en grand. Après le film, un coupon confiserie ou une invitation à la prochaine avant-première le fait revenir.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor S as Spectateur
participant T as Billetterie cinéma
participant E as eldo wallet
participant W as Apple / Google Wallet
T->>E: Crée la séance 20:45
S->>T: Achète une place en ligne
T->>E: Émet le billet salle 7, rang H, place 12
E-->>S: Email avec le lien
S->>W: Ajoute le billet
S->>T: Scan à l'entrée de la salle
T->>E: Valide le billet
T->>E: Envoie un coupon confiserie
```
## Workflow d'intégration
Une séance est un événement : film en `name`, synopsis en `description`, horaires de début et de fin, prix, conditions, adresse du cinéma et affiche en strip. Les trois libellés de placement deviennent Salle (`ZONE` à gauche), Rang (`ROW` au centre) et Place (`SEAT` à droite). Créez-la automatiquement depuis votre programmation.
Un appel par place vendue, avec la salle, le rang et la place. Une réservation de groupe ? Émettez en lot.
Le billet est hors ligne et prêt à scanner.
Le contrôleur scanne le billet, le pass est validé. Un scan par erreur se corrige en annulant la validation.
Créez un coupon « -2 € sur le menu popcorn » ou « place à 6 € le mardi » et envoyez-le après la séance, même à un spectateur qui n'est pas encore client (prénom, nom, email).
## Bonnes pratiques
- **Une séance, un événement.** Le même film à 18:00 et à 20:45 donne deux événements, chacun avec son horaire. Réutilisez l'affiche.
- **Utilisez l'affiche comme strip.** Le spectateur reconnaît son film d'un coup d'œil. Voir [Recommandations visuelles](/kb/concepts/design-guidelines).
- **Activez l'usage unique** pour bloquer la seconde entrée avec une capture d'écran.
- **Déclarez la localisation du cinéma** pour que le billet remonte à l'arrivée. Voir [Localisations](/kb/concepts/locations).
## Pour aller plus loin
- [Événements & salons](/use-cases/events)
- [Retail & mode](/use-cases/retail) pour la mécanique des coupons
- [Cycle de vie d'un pass](/kb/concepts/pass-lifecycle)
- Endpoints :
## Pour vous inspirer
Le billet de cinéma peut faire revenir le spectateur bien plus souvent. Voici des idées pour y parvenir.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Billets d'événement dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/events
Un billet PDF se perd dans la boîte mail. Un billet Apple Wallet ou Google Wallet **remonte tout seul sur l'écran de verrouillage le jour J**, à l'approche de la salle. Vous émettez le billet à l'achat, vous le mettez à jour si la date ou la salle change, et vous le validez à l'entrée. Le spectateur n'a rien à chercher.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor S as Spectateur
participant T as Billetterie
participant E as eldo wallet
participant W as Apple / Google Wallet
T->>E: Crée l'événement avec lieu et horaires
S->>T: Achète un billet
T->>E: Émet le billet avec le placement
E-->>S: Email avec le lien d'ajout
S->>W: Ajoute le billet
Note over T,E: Changement de salle
T->>E: Met à jour l'événement
E->>W: Tous les billets mis à jour
S->>T: Scan à l'entrée
T->>E: Valide le billet
E-->>T: Second scan refusé
```
## Workflow d'intégration
L'événement est le modèle commun à tous les billets : nom, description, dates de début et de fin, ouverture des portes, prix, conditions, contact, site web, couleurs et strip officiel. Ajoutez la localisation de la salle pour que le billet remonte à l'approche. Choisissez enfin les trois libellés de placement : gauche (`ZONE`, `ACCESS`…), centre (`ROW`), droite (`SEAT`, `PLACE`…).
Votre billetterie appelle eldo wallet pour chaque billet, avec l'identité du spectateur et les trois valeurs de placement. Si le spectateur est déjà client de votre wallet, passez aussi son `clientId`.
Presse, invités sponsors, comités d'entreprise : jusqu'à 5 000 billets en une requête, traités en asynchrone. Voir [Envoyer à des non-clients](/kb/guides/send-to-non-clients).
Le billet est disponible hors ligne et survit au changement de téléphone.
Un appel sur l'événement met à jour tous les billets émis : nouvelle date, nouvelle adresse, nouveau visuel. Un seul spectateur change de place ? Mettez à jour son billet.
La douchette scanne le QR. Retrouvez le billet par son code-barres, affichez le placement, puis validez. Un second scan renvoie `PASS_ALREADY_REDEEMED`. Erreur de scan ? Annulez la validation.
Listez les billets de l'événement et leur statut pour suivre les entrées en temps réel.
## Bonnes pratiques
- **Un événement par séance.** Une tournée de dix dates, c'est dix événements. Réutilisez le même visuel.
- **Activez l'usage unique et le code-barres rotatif** sur les événements à forte valeur. Les options de sécurité limitent la revente et les captures d'écran.
- **Déclarez l'emplacement de la salle.** C'est ce qui fait apparaître le billet sur l'écran de verrouillage. Voir [Localisations](/kb/concepts/locations).
- **Multipart : objets en chaîne JSON.** `date`, `locations`, `colors` et `security` partent en chaîne JSON dans le formulaire. C'est l'erreur la plus fréquente.
- **Testez le flux de scan en conditions réelles** avant l'ouverture des portes : débit, luminosité, réseau dans la salle.
## Pour aller plus loin
- [Sport & clubs](/use-cases/sport) pour les billets de match
- [Cinéma](/use-cases/cinema)
- [Cycle de vie d'un pass](/kb/concepts/pass-lifecycle)
- Endpoints :
## Pour vous inspirer
Un billet Wallet peut accompagner le spectateur avant, pendant et après l’événement. Voici des idées pour aller plus loin.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Billets de ferry dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/ferry
Une traversée se prépare la veille et se vit dans les 30 minutes avant l'embarquement. eldo wallet entre dans ces deux moments. **Le billet est dans Apple Wallet ou Google Wallet dès la réservation**, le rappel arrive au bon moment, le changement de quai aussi. Le passager attend chez lui en cas de retard, pas sur le quai.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor P as Passager
participant R as Réservation
participant E as eldo wallet
participant W as Apple / Google Wallet
P->>R: Réserve Marseille - Ajaccio, 4 passagers, cabine
R->>E: Émet le billet avec tripNumber et cabine
E-->>P: Email avec le bouton Ajouter
P->>W: Ajoute le billet
Note over R,E: Jour J, 30 min avant le départ
R->>E: Message aux porteurs du trajet
W-->>P: Embarquement quai B6
R->>E: Retard de 1 h, nouvel horaire
E->>W: Billets mis à jour
P->>R: Scan à l'embarquement
```
## Workflow d'intégration
Utilisez le type `Boat`. Renseignez les ports et leurs codes, l'horaire de référence, le tarif, les conditions de transport et le numéro du service client. Choisissez `seatName=N_CABINE` pour afficher le champ siège comme numéro de cabine. Un modèle par liaison suffit.
Votre système de réservation appelle eldo wallet pour chaque billet, avec le `tripNumber` de la rotation et la cabine dans `seat`. Ajoutez la liste des passagers et le véhicule embarqué dans les champs personnalisés du verso (`customBackFields`). Pour un groupe, émettez en lot.
Il l'ouvre depuis l'email de confirmation. Plus de PDF à imprimer.
30 minutes avant le départ, votre système d'horaires envoie un message à tous les porteurs de la rotation : « Embarquement dans 30 min, quai B6. Pensez à votre pièce d'identité. »
Mauvais temps, retard d'une heure : mettez à jour l'horaire de tous les billets du trajet, puis expliquez la raison par un message. Le quai change ? Un message suffit.
Changement de cabine, ajout d'un enfant, report sur une autre rotation : mettez à jour le billet concerné, y compris son `tripNumber`.
Le personnel scanne le code-barres. Le billet est retrouvé, puis validé.
Comptez les traversées sur la carte de fidélité (« 8/10 traversées »). Au palier, envoyez un coupon de surclassement cabine. Avant l'été, relancez les passagers de l'an dernier avec un coupon ciblé.
## Bonnes pratiques
- **Un `tripNumber` par rotation, pas par liaison.** Le 17:30 du lundi et celui du mardi sont deux trajets distincts.
- **Une famille, combien de billets ?** Un billet par réservation avec la liste des passagers au verso suffit pour l'embarquement groupé. Un billet par passager devient nécessaire si chacun est contrôlé séparément.
- **Prévenez tôt.** Un retard annoncé à la maison évite une foule sur le quai. Déclenchez la mise à jour dès que votre système de pilotage le détecte.
- **Renseignez la date d'expiration.** Le billet passe en expiré après la traversée.
## Pour aller plus loin
- [Transport & mobilité](/use-cases/transport), le même modèle pour bus et trains
- [Mettre à jour un trajet](/kb/guides/update-a-trip)
- [Notifications push](/kb/push-notifications)
- Endpoints :
## Pour vous inspirer
Une traversée, c’est aussi des vacances qui commencent. Voici des idées pour enrichir l’expérience de vos passagers.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Carte de membre de salle de sport dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/fitness-clubs
Un membre oublie son badge plastique une fois sur deux. Son téléphone, jamais. **La carte de membre dans Apple Wallet ou Google Wallet sert à entrer dans le club**, affiche la formule et reçoit vos rappels de cours. Vous l'émettez à l'inscription, vous la mettez à jour au changement de formule, et vous l'animez toute l'année : cours, promotions, parrainage, boutique.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor M as Membre
participant L as Logiciel du club
participant E as eldo wallet
participant W as Apple / Google Wallet
M->>L: S'inscrit en formule Premium
L->>E: Crée le membre avec son type
E-->>M: Email avec la carte
M->>W: Ajoute la carte de membre
M->>L: Scan à l'accueil
L->>E: Recherche le membre par code-barres
E-->>L: Formule, statut du pass, renouvellement
L-->>M: Accès autorisé
Note over L,E: Veille du cours
L->>E: Notification de rappel
W-->>M: Votre cours de yoga demain à 18 h
```
## Workflow d'intégration
Choisissez `MEMBER_CARD`, affichez le club (`CLUB`) et le numéro de membre (`N_MEMBER`). Sur iPhone, affichez la formule dans l'en-tête (`iosHeader` à `TYPE`). L'adhésion se renouvelle chez vous : gardez une carte sans expiration et suivez l'échéance avec la date de renouvellement du membre. Désactivez le partage.
Essentiel, Premium, Étudiant, Heures creuses : chaque formule devient un type de client. Votre logiciel d'accès s'en sert pour appliquer vos règles (horaires, clubs accessibles). Voir [Types de clients](/kb/concepts/customer-types).
Votre logiciel de gestion crée le membre dès le paiement, avec son numéro de membre comme code-barres, sa formule, sa date d'inscription et sa date de renouvellement. Pour passer vos membres actuels au Wallet, importez-les en masse. Voir [Importer une base clients](/kb/guides/import-customers-csv).
Il la présente à l'accueil, même sans réseau.
Quelques jours après l'inscription, relancez les membres dont la carte n'est pas installée.
Le lecteur de l'accueil lit le code-barres. Votre logiciel d'accès retrouve le membre et lit sa formule (`clientTypeName`), le statut de son pass (`passStatus`) et sa date de renouvellement (`renewalDate`). Il décide ensuite d'ouvrir ou non. Un code-barres inconnu renvoie `MODEL_NOT_FOUND`.
Passage en Premium, renouvellement payé : mettez à jour le type et la date de renouvellement. La carte installée se met à jour.
30 jours avant l'échéance, programmez une notification (`type: SCHEDULED`, `category: INFORMATIVE`) pour les membres concernés (`target: SPECIFIC`).
Rappel la veille du cours réservé, cours annulé, nouveau planning : message personnalisé par membre. Offre de rentrée ou semaine portes ouvertes : créez une communication, le strip de la carte change pendant la période. Voir [Notifications push](/kb/push-notifications).
Un filleul s'inscrit : envoyez un coupon au parrain et au filleul (mois offert, séance de coaching). Shaker, protéines, serviette : un coupon boutique aux membres Premium. À l'accueil, scannez le coupon et validez-le.
:::info[Le contrôle d'accès reste le vôtre]
eldo wallet émet la carte, la met à jour et répond à la recherche par code-barres. Le lecteur, le tourniquet et la décision d'ouvrir restent dans votre logiciel de contrôle d'accès.
:::
## Bonnes pratiques
- **Le numéro de membre comme code-barres.** C'est le numéro que votre logiciel connaît déjà : pas de table de correspondance.
- **Une carte pour toute la durée d'adhésion.** Au renouvellement, mettez à jour la carte existante plutôt que d'en créer une seconde.
- **Désactivez le partage.** La carte est nominative.
- **Un lecteur 2D à l'accueil.** Les lecteurs laser 1D ne lisent pas un QR code affiché sur un écran. Testez avec des cartes Apple et Google, luminosité au minimum.
- **Cours et planning : `INFORMATIVE`. Promotions et boutique : `COMMERCIAL`.** La catégorie détermine qui reçoit la notification selon son consentement.
## Pour aller plus loin
- [Sport & clubs](/use-cases/sport) pour les abonnements de stade et les billets de match
- [Types de clients](/kb/concepts/customer-types)
- [Notifications push](/kb/push-notifications)
- [Codes-barres](/kb/concepts/barcodes)
- [Importer une base clients](/kb/guides/import-customers-csv)
- Endpoints :
## Pour vous inspirer
La carte de membre peut motiver vos adhérents à chaque séance. Voici des idées pour les garder longtemps.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Carte d'adhérent mutuelle dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/health-insurance
Un adhérent, vous l'accompagnez sur des années. La carte papier, elle, est périmée dès que la formule change. **Une carte d'adhérent dans Apple Wallet ou Google Wallet est toujours à jour :** numéro, formule, garanties, contact. Elle sert de preuve d'adhésion et vous donne un canal direct pour les rappels de renouvellement et les nouveaux documents.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor A as Adhérent
participant SI as SI mutualiste
participant E as eldo wallet
participant W as Apple / Google Wallet
A->>SI: Souscrit la formule Confort
SI->>E: Crée l'adhérent
E-->>A: Email avec la carte
A->>W: Ajoute la carte d'adhérent
E->>SI: Webhook pass.installed
Note over SI,E: Changement de formule
SI->>E: Met à jour le type et les garanties
E->>W: Carte mise à jour
Note over SI,E: 60 jours avant l'échéance
SI->>E: Notification programmée
W-->>A: Votre adhésion se renouvelle le 15/09
```
## Workflow d'intégration
Choisissez `MEMBER_CARD`, affichez le numéro d'adhérent (`N_ADHERENT`) et l'organisation (`ORGANISATION`). Réglez la validité : date fixe, après une période ou aucune. Ajoutez les contacts utiles (téléphone, espace adhérent) sur le wallet. Désactivez le partage.
Essentiel, Confort, Premium : chaque formule devient un type de client. Voir [Types de clients](/kb/concepts/customer-types).
Votre SI crée l'adhérent à la validation de l'adhésion, avec son numéro comme code-barres, son type, sa date d'adhésion et sa date de renouvellement. Pour digitaliser une base existante, importez-la en masse (JSON jusqu'à 5 000 lignes par appel, ou fichier CSV). Voir [Importer une base clients](/kb/guides/import-customers-csv).
Il la présente quand on la lui demande, même sans réseau.
Une semaine après l'envoi, relancez les adhérents dont la carte n'est pas installée : tous, ou une liste précise.
Changement de formule, de date de renouvellement : mettez à jour l'adhérent. Plafonds restants, lien vers l'espace adhérent, numéro d'assistance : ajoutez-les en informations additionnelles au verso.
60 jours avant l'échéance, programmez une notification (`type: SCHEDULED`, `category: INFORMATIVE`) pour les adhérents concernés.
Attestation disponible, garanties dentaires non utilisées en fin d'année, nouvelle téléconsultation : un message personnalisé par adhérent (`target: SPECIFIC`).
Déclarez l'URL de webhook du wallet pour recevoir `pass.installed`, `pass.uninstalled` et les changements de clients. Votre conseiller voit « carte numérique active ». Voir [Webhooks](/docs/webhooks).
Le code parrain est validé : envoyez un coupon au parrain et au filleul.
## Bonnes pratiques
- **Ne mettez pas de données de santé sur la carte.** Formule, numéro d'adhérent et plafonds suffisent. Les détails médicaux restent dans votre espace adhérent sécurisé.
- **Le numéro d'adhérent comme code-barres.** C'est ce que lira votre conseiller ou votre partenaire.
- **Désactivez le partage.** La carte est nominative.
- **Des messages utiles, pas commerciaux.** Rappels, documents et garanties restantes sont `INFORMATIVE`. Respectez les préférences de communication de chaque adhérent.
:::note[Carte Vitale]
La carte Wallet ne remplace pas la carte Vitale. Son acceptation comme justificatif par les professionnels de santé et pour le tiers payant dépend de vos accords avec eux.
:::
## Pour aller plus loin
- [Associations](/use-cases/associations) pour une autre carte d'adhérent
- [Types de clients](/kb/concepts/customer-types)
- [Notifications push](/kb/push-notifications)
- [Webhooks](/docs/webhooks)
- Endpoints :
## Pour vous inspirer
La carte d’adhérent peut devenir un vrai lien au quotidien. Voici des idées pour accompagner vos adhérents.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Réservations d'hôtel dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/hotels
Le client a réservé il y a trois mois. Le jour J, il fouille ses emails pour retrouver l'adresse et le numéro de réservation. **Avec un pass de réservation dans Apple Wallet ou Google Wallet, tout est au même endroit :** dates, chambre, avantages, adresse. Le pass remonte à l'approche de l'hôtel, reçoit le numéro de chambre au check-in et devient le support de vos offres pendant le séjour.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor G as Client
participant P as PMS / moteur de réservation
participant E as eldo wallet
participant W as Apple / Google Wallet
G->>P: Réserve 3 nuits
P->>E: Émet la réservation avec arrivée et départ
E-->>G: Email avec le lien
G->>W: Ajoute la réservation
W-->>G: Pass proposé à l'approche de l'hôtel
G->>P: Check-in
P->>E: Ajoute la chambre 204
E->>W: Pass mis à jour
P->>E: Envoie l'offre spa du séjour
```
## Workflow d'intégration
Un modèle par établissement : titre, nom de l'hôtel, description, avantages inclus, couleurs, strip, format de code-barres et localisation de l'établissement. La localisation fait remonter le pass sur l'écran de verrouillage à l'arrivée.
À la confirmation, votre moteur de réservation émet le pass avec les dates d'arrivée et de départ, les avantages et un champ libre au verso (numéro de réservation, conditions d'annulation). Pour un groupe ou un séminaire, émettez en lot.
Il retrouve d'un geste l'adresse, les dates et le contact de l'hôtel.
À l'arrivée, votre PMS met à jour le pass avec `roomNumber`. Le client voit sa chambre dans le Wallet. Une annulation ? Passez le pass en `canceled`.
Petit-déjeuner, spa, late check-out : envoyez un coupon au client pendant son séjour.
Proposez la carte de fidélité de l'enseigne et créditez les nuits passées.
## Bonnes pratiques
- **Envoyez le pass dès la confirmation.** Le client le garde jusqu'au séjour, même si la réservation date de plusieurs mois.
- **Attention aux dates qui se chevauchent.** Deux réservations qui se chevauchent pour le même client sont refusées (`OVERLAPPING_DATES`). Voir [Erreurs API courantes](/kb/troubleshooting/common-api-errors).
- **Le numéro de chambre au check-in, pas avant.** Il change souvent entre la réservation et l'arrivée.
- **Un strip par établissement.** Une photo de la façade aide le client à reconnaître l'hôtel à son arrivée.
## Pour aller plus loin
- [Localisations](/kb/concepts/locations)
- [Types de passes](/kb/concepts/pass-types)
- [Retail & mode](/use-cases/retail) pour la carte de fidélité
- Endpoints :
## Pour vous inspirer
Le pass de réservation accompagne le client avant, pendant et après son séjour. Voici des idées pour enchanter vos hôtes.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Badge salarié dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/hr-employees
Un badge plastique s'imprime, se perd, se réimprime, et revient rarement le jour du départ. **Le badge salarié dans Apple Wallet ou Google Wallet est émis dès l'arrivée, mis à jour à chaque changement et supprimé au départ.** Son code-barres porte le matricule : vos systèmes le lisent comme un badge classique. Le même canal sert à la communication interne, aux avantages salariés et aux badges de vos événements d'entreprise.
:::info[Ce que fait eldo wallet, ce que fait votre système]
eldo wallet émet le badge, le met à jour et répond à la recherche par code-barres. Le lecteur, le logiciel de contrôle d'accès et l'outil de gestion des temps restent les vôtres : ils lisent le code-barres du badge, puis interrogent eldo wallet ou leur propre base. eldo wallet ne fournit ni matériel d'accès, ni outil de pointage.
:::
## Le parcours salarié
```mermaid
sequenceDiagram
autonumber
actor S as Salarié
participant RH as SIRH
participant E as eldo wallet
participant W as Apple / Google Wallet
participant A as Votre contrôle d'accès
RH->>E: Crée le salarié, matricule en code-barres
E-->>S: Email avec le badge
S->>W: Ajoute le badge
S->>A: Présente le badge au lecteur
A->>E: Recherche le salarié par code-barres
E-->>A: Salarié, type, statut du pass
A-->>S: Accès ou pointage enregistré par votre système
Note over RH,E: Départ du salarié
RH->>E: Supprime le salarié
RH->>A: Désactive le matricule
```
## Workflow d'intégration
Choisissez `MEMBER_CARD`, affichez l'entreprise (`ENTREPRISE`) et la date d'entrée (`ADMISSION_DATE`). Sur iPhone, affichez le nom du salarié dans l'en-tête (`iosHeader` à `FULLNAME`). Choisissez le format de code-barres que vos lecteurs savent lire : `QR_CODE`, `CODE_128`, `PDF_417` ou `AZTEC`. Désactivez le partage.
Salarié, intérimaire, stagiaire, prestataire : chaque statut devient un type de client. Votre contrôle d'accès s'en sert pour appliquer ses règles (zones, horaires). Voir [Types de clients](/kb/concepts/customer-types).
Votre SIRH crée le salarié à son arrivée, avec son email professionnel, son matricule comme code-barres, son statut, son entité (`companyName`) et sa date d'entrée. Au lancement, importez tous les salariés en masse. Voir [Importer une base clients](/kb/guides/import-customers-csv).
Il le présente au lecteur, même sans réseau sur son téléphone.
Votre lecteur lit le code-barres. Votre logiciel de contrôle d'accès ou de gestion des temps retrouve le salarié par son matricule, vérifie son type (`clientTypeName`) et le statut de son pass (`passStatus`), puis ouvre la porte ou enregistre le pointage dans son propre outil. Un matricule inconnu renvoie `MODEL_NOT_FOUND`.
Séminaire, convention annuelle, journée portes ouvertes, visite d'un client : créez un événement, puis émettez un badge à chaque participant. Salariés : passez leur `clientId`. Visiteurs : nom, prénom et email suffisent. À l'accueil, scannez le badge et validez-le. Voir [Événements & salons](/use-cases/events).
Fermeture exceptionnelle du site, exercice d'évacuation, ouverture des inscriptions à la mutuelle : une notification `INFORMATIVE` à tous les porteurs du badge, ou à une liste (`target: SPECIFIC`). Pour une campagne interne (semaine de la sécurité, collecte solidaire), créez une communication : le strip du badge change pendant la période. Voir [Notifications push](/kb/push-notifications).
Offres du CSE, remise chez un partenaire, repas offert au restaurant d'entreprise : envoyez un coupon aux salariés concernés. Le partenaire ou la caisse le scanne et le valide.
Changement de statut ou de site : mettez à jour le type et l'entité. Service, contact RH, numéro d'urgence : ajoutez-les en informations additionnelles au verso. Le badge installé se met à jour.
Le jour du départ, votre SIRH supprime le salarié dans eldo wallet, par son identifiant ou par son matricule. Le même jour, désactivez le matricule dans votre contrôle d'accès : c'est lui qui décide d'ouvrir la porte.
## Bonnes pratiques
- **Le matricule comme code-barres.** C'est l'identifiant que vos systèmes connaissent déjà.
- **Aucune donnée sensible sur le badge.** Nom, entité, date d'entrée suffisent. Rémunération, évaluation et données de santé restent dans votre SIRH.
- **Un départ se traite des deux côtés.** Suppression dans eldo wallet et désactivation dans votre contrôle d'accès, le même jour.
- **Prévoyez un mode dégradé.** Le badge s'affiche hors ligne, mais la recherche par code-barres demande du réseau côté lecteur. Gardez une liste locale des matricules actifs dans votre système d'accès.
- **Testez vos lecteurs.** Un lecteur laser 1D ne lit pas un QR code sur écran. Testez avec des badges Apple et Google avant le déploiement.
- **Désactivez le partage.** Le badge est nominatif.
## Pour aller plus loin
- [Événements & salons](/use-cases/events) pour les billets d'événement
- [Codes-barres](/kb/concepts/barcodes)
- [Types de clients](/kb/concepts/customer-types)
- [Importer une base clients](/kb/guides/import-customers-csv)
- [Webhooks](/docs/webhooks)
- Endpoints :
## Pour vous inspirer
Le badge dans le Wallet peut accompagner toute l’expérience salarié. Voici des idées pour aller plus loin.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Carte de fidélité Apple Wallet et Google Wallet pour le retail
Source: https://developers.eldowallet.fr/use-cases/retail
Vêtements, chaussures ou cosmétiques : le parcours est toujours le même. **Embaser, animer, récompenser.** eldo wallet remplace la carte plastique par une carte de fidélité dématérialisée qui vit dans le téléphone, dans Apple Wallet ou Google Wallet. Le client la retrouve sur son écran de verrouillage, voit sa cagnotte monter à chaque passage en caisse et reçoit ses coupons sans ouvrir un email.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor C as Client
participant POS as Caisse / CRM
participant E as eldo wallet
participant W as Apple / Google Wallet
C->>POS: S'inscrit en caisse ou scanne le QR
POS->>E: Crée le client
E-->>C: Email ou SMS avec le lien d'ajout
C->>W: Ajoute la carte de fidélité
C->>POS: Paye 87 euros
POS->>E: Met à jour la cagnotte
E->>W: Pousse le nouveau solde
W-->>C: Notification de la nouvelle cagnotte
POS->>E: Palier atteint, envoie le coupon
E->>W: Coupon ajouté
C->>POS: Présente le coupon en caisse
POS->>E: Valide le coupon
```
## Workflow d'intégration
La carte de fidélité (store card) est unique par wallet. Réglez une fois le type (`STORE_CARD` ou `MEMBER_CARD`), le nom du programme, les couleurs, le strip, le libellé et l'unité de gain (`POINTS`, `EURO`…) et les trois champs affichés sur la carte. Le logo, l'icône et les contacts se règlent sur le wallet. Faites-le dans le back-office ou par l'API.
Créez un type de client par niveau : Membre, Silver, Gold. Voir [Types de clients](/kb/concepts/customer-types).
Ajoutez les coordonnées GPS de vos points de vente et un texte court par zone, éventuellement par plage horaire. Quand le client passe à proximité, la carte remonte sur son écran de verrouillage. Voir [Localisations](/kb/concepts/locations).
Créez un coupon par mécanique : bienvenue (`isWelcomeCoupon`), anniversaire, palier, win-back. Chaque coupon est un **modèle** réutilisable : nom, description, valeur, code promo, expiration, strip et format de code-barres. Le corps est en `multipart/form-data` : les objets (`colors`, `security`) partent en chaîne JSON.
À chaque inscription (caisse, site, application), votre CRM crée le client. eldo wallet génère sa carte. Avec `sendCard: true`, eldo wallet envoie le lien d'ajout. Sinon, récupérez le lien dans la réponse et diffusez-le dans vos propres canaux. Pour une base existante, importez en masse (JSON ou CSV).
Il ouvre le lien sur son téléphone. iPhone : Apple Wallet. Android : Google Wallet. Un tap, la carte est installée.
Déclarez une URL de webhook sur le wallet : vous recevez `pass.installed` et `pass.uninstalled`. Ou interrogez la liste des clients filtrée par statut. Vos vendeurs voient qui est « carté ». Voir [Webhooks](/docs/webhooks).
Votre caisse scanne la carte et envoie le gain du client, par code-barres ou par identifiant. eldo wallet met la carte à jour dans le Wallet.
Anniversaire du jour, palier de 500 points atteint, client inactif depuis 60 jours : votre CRM détecte l'événement et envoie le coupon. Pour un client connu, passez son `clientId`. L'envoi est asynchrone : suivez l'opération par son identifiant, ou passez un `webhookUrl`.
La caisse scanne le code-barres et valide le pass. Un second scan est refusé (`PASS_ALREADY_REDEEMED`). Une erreur de scan ? Annulez la validation. Voir [Cycle de vie d'un pass](/kb/concepts/pass-lifecycle).
Ventes privées à tous les porteurs, ou message personnalisé par client depuis votre CRM (« Votre commande Click & Collect est prête »). Pour une opération, créez une communication : le strip de la carte change pendant la période choisie. Voir [Notifications push](/kb/push-notifications).
Rapatriez les statistiques clients, coupons et notifications dans votre tableau de bord. Croisez-les avec votre panier moyen et votre fréquence de visite.
## Scénarios prêts à l'emploi
| Scénario | Déclencheur | Appels |
| --- | --- | --- |
| QR sur la caisse | Le client scanne un QR imprimé depuis le back-office | Aucun, sans code |
| Bouton « Carte Wallet » dans le CRM | Le vendeur clique sur la fiche client | |
| Coupon de bienvenue | Inscription d'un client | Coupon créé avec `isWelcomeCoupon` |
| Joyeux anniversaire | Cron quotidien à 9 h | |
| Cagnotte en direct | Ticket encaissé | |
| Ventes privées | Lancement de l'opération | |
| Click & Collect prêt | Commande passée en « prête » | |
| On vous a perdu ? | Aucun achat depuis 60 jours | |
## Bonnes pratiques
- **Un coupon modèle par mécanique.** Ne recréez pas un coupon à chaque envoi. Créez « Anniversaire » une fois, envoyez-le chaque jour.
- **Gardez la main sur le lien quand c'est utile.** Avec `sendCard: false`, intégrez le lien d'ajout dans votre propre email de bienvenue, votre ticket de caisse ou votre application.
- **Brûlez côté serveur, pas côté vendeur.** La validation doit venir de la caisse, au moment du scan. C'est ce qui empêche la double utilisation.
- **Respectez le consentement.** Chaque notification est classée `INFORMATIVE` ou `COMMERCIAL`. Une promotion est commerciale : elle ne part qu'aux clients qui l'acceptent.
- **Espacez vos notifications.** Une notification utile par semaine vaut mieux que trois promotions. Le client peut désactiver les notifications du pass, voire le supprimer.
- **Testez sur les deux plateformes.** Le rendu diffère entre Apple Wallet et Google Wallet. Voir [Apple Wallet ou Google Wallet](/kb/concepts/apple-vs-google-wallet).
## Pour aller plus loin
- [Modèles et passes](/kb/concepts/templates-vs-passes)
- [Importer une base clients](/kb/guides/import-customers-csv)
- [Envoyer un coupon à des non-clients](/kb/guides/send-to-non-clients)
- [Types de clients](/kb/concepts/customer-types) pour des cartes Silver, Gold, VIP
- [Un pass ne se met pas à jour](/kb/troubleshooting/pass-not-updating)
- Endpoints :
## Pour vous inspirer
Au-delà de la cagnotte et des coupons, voici des idées que nos clients du retail adorent. De quoi surprendre vos clients et les faire revenir.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Carte d'abonné et billets de match dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/sport
Un supporter veut trois choses : **être au stade, savoir la compo avant tout le monde, porter le maillot.** eldo wallet remplace la carte d'abonné plastique par une carte dans Apple Wallet ou Google Wallet. Elle ouvre le tourniquet, reçoit la compo la veille du match et les offres de la boutique.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor S as Supporter
participant C as Billetterie club
participant E as eldo wallet
participant W as Apple / Google Wallet
S->>C: Renouvelle son abonnement
C->>E: Crée le client avec le type Abonné saison
E-->>S: Email avec la carte
S->>W: Ajoute la carte d'abonné
Note over C,E: Veille du match
C->>E: Notification compo du XI
W-->>S: Demain 17 h vs Reims
S->>C: Scan au tourniquet
C->>E: Vérifie la carte et compte la présence
C->>E: 10e match, envoie le coupon boutique
```
## Workflow d'intégration
La carte d'abonné est la carte membre du wallet : type `MEMBER_CARD`, nom du programme, couleurs du club, numéro de membre (`N_MEMBER`) et club (`CLUB`) dans les champs affichés. Réglez la validité sur la fin de saison.
Abonné saison, abonné premium, supporter gratuit : chaque formule devient un type de client. Voir [Types de clients](/kb/concepts/customer-types).
À la confirmation de l'abonnement, votre billetterie crée le supporter avec son type et sa date de renouvellement. Le code-barres de la carte sert de titre d'accès. Au lancement de la saison, créez tous les abonnés en lot.
Coupe, match amical : créez un événement par match et émettez le billet. Passez le `clientId` du supporter pour le relier à sa fiche. Voir [Événements & salons](/use-cases/events).
Compo J-1, rappel H-2 avec l'entrée à utiliser, nouveau maillot en boutique : notification à tous les abonnés ou message personnalisé. Pour une offre boutique, créez une communication : le strip de la carte change pendant la période.
Le tourniquet lit le code-barres de la carte. Votre système retrouve l'abonné et vérifie son type et sa validité.
Votre compteur club incrémente à chaque scan. Au 10ᵉ match, envoyez le coupon boutique.
30 jours avant la fin de l'abonnement, programmez une notification (`type: SCHEDULED`) pour les abonnés concernés. Au renouvellement, mettez à jour la date et le type de l'abonné.
## Bonnes pratiques
- **Une carte, plusieurs saisons.** Au renouvellement, mettez à jour la carte existante plutôt que d'en créer une seconde.
- **Désactivez le partage** sur la carte d'abonné pour éviter qu'elle circule entre plusieurs téléphones.
- **Ciblez les notifications.** Les abonnés premium et les supporters gratuits n'attendent pas les mêmes messages.
- **Compo et horaires : `INFORMATIVE`. Boutique : `COMMERCIAL`.** La catégorie détermine qui reçoit la notification selon son consentement.
- **Préparez le jour de match.** Testez les tourniquets avec des cartes Apple et Google avant le premier match.
## Pour aller plus loin
- [Clubs de sport & salles de fitness](/use-cases/fitness-clubs) pour la carte de membre d'une salle de sport
- [Types de clients](/kb/concepts/customer-types)
- [Notifications push](/kb/push-notifications)
- [Cycle de vie d'un pass](/kb/concepts/pass-lifecycle)
- Endpoints :
## Pour vous inspirer
Une carte d’abonné vit toute la saison. Voici des idées pour la rendre indispensable à vos supporters.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
### Titres de transport dans Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/use-cases/transport
Quand vous vendez du voyage, votre client a besoin d'une seule chose : **le bon billet, au bon moment, sans stress.** eldo wallet pose le titre de transport dans son téléphone, dans Apple Wallet ou Google Wallet, dès la réservation. Il est disponible hors ligne, remonte sur l'écran de verrouillage le jour du départ et se met à jour tout seul quand l'horaire change.
## Le parcours client
```mermaid
sequenceDiagram
autonumber
actor V as Voyageur
participant B as Billettique
participant E as eldo wallet
participant W as Apple / Google Wallet
V->>B: Réserve Mulhouse - Genève
B->>E: Émet le billet avec le tripNumber
E-->>V: Email ou SMS avec le lien
V->>W: Ajoute le billet
Note over B,E: La veille du départ
B->>E: Horaire avancé pour ce tripNumber
E->>W: Met à jour tous les billets du trajet
W-->>V: Départ 09:00 au lieu de 09:30
V->>B: Présente le billet au contrôle
B->>E: Valide le code-barres
```
## Workflow d'intégration
Un modèle de transit regroupe ce qui est commun à tous les billets d'une liaison : type (`Bus`, `Train`, `Tram`, `Boat`, `Air`, `Generic`), gares et codes, horaires de référence, tarif, conditions, numéro du service client, couleurs, strip et format de code-barres. Créez-le une fois, dans le back-office ou par l'API. Le wallet doit avoir le type de pass **TRANSIT** activé.
Sur votre site, votre application, au guichet ou chez un revendeur. Votre billettique enregistre la vente, puis appelle eldo wallet.
Un appel par voyageur, avec ses coordonnées, les dates, le code-barres et surtout le **`tripNumber`**. Ce numéro regroupe tous les billets d'un même service : c'est lui qui rend possibles les mises à jour groupées.
Deux options de distribution :
- `enableSendEmailOrSms: true` : eldo wallet envoie l'email ou le SMS avec le bouton « Ajouter au Wallet ».
- `enableSendEmailOrSms: false` : vous récupérez le lien dans la réponse et le diffusez vous-même (email de confirmation, application, QR sur un ticket d'agence ou une borne).
Groupes scolaires, comités d'entreprise, affrètements : envoyez jusqu'à 5 000 billets en une requête. L'opération est asynchrone. Suivez son statut par son identifiant, ou passez un `webhookUrl` pour être prévenu à la fin.
Un appel met à jour **tous les billets du trajet** (horaires, gares, dates). Pour expliquer le contexte (« Retard 30 min, météo »), envoyez en plus un message aux porteurs du `tripNumber`. Guide complet : [Mettre à jour un trajet](/kb/guides/update-a-trip).
Changement de date pour un seul voyageur, nouveau siège, faute dans le nom : mettez à jour son billet sans toucher aux autres. Plusieurs corrections d'un coup : utilisez la mise à jour en lot.
Le contrôleur scanne le code-barres. Votre terminal retrouve le billet, puis le valide. Un second scan est refusé. Activez l'usage unique sur le modèle pour bloquer un second passage.
Listez les billets émis par liaison (pagination `page` et `limit`) et suivez les statistiques par liaison, type et période.
Ajoutez une carte voyageur : un compteur de trajets sur la carte de fidélité, et un coupon « trajet offert » au 5ᵉ voyage.
## Bonnes pratiques
- **Le `tripNumber` est indispensable dans les faits.** Sans lui, vous devrez mettre à jour chaque billet un par un lors d'un retard.
- **Renseignez une date d'expiration.** Le billet passe en expiré après le trajet et reste consultable dans l'historique du Wallet comme justificatif.
- **Séparez donnée et message.** Mettez à jour l'horaire avec un appel, expliquez la raison avec un autre. Le voyageur comprend ce qui change et pourquoi.
- **Dates au format `YYYY-MM-DD`, heures au format `HH:mm`.** Si vous changez la date de départ d'un trajet, envoyez aussi la date d'arrivée.
- **Protégez contre le partage.** Les options de sécurité du modèle (usage unique, partage iOS désactivé, code-barres rotatif) limitent la revente et les captures d'écran.
## Pour aller plus loin
- [Mettre à jour un trajet](/kb/guides/update-a-trip)
- [Ferry & maritime](/use-cases/ferry), même mécanique avec cabines et quais
- [Compagnies aériennes](/use-cases/airlines), même mécanique avec le type `Air`
- [Codes-barres](/kb/concepts/barcodes)
- [Cycle de vie d'un pass](/kb/concepts/pass-lifecycle)
- Endpoints :
## Pour vous inspirer
Le billet n’est que le début du voyage. Voici des idées pour accompagner vos voyageurs et les faire revenir.
Une de ces idées vous parle ? [Contactez notre équipe](https://www.eldowallet.fr/contact/) : nous vous montrons comment la mettre en place.
## Knowledge base
### Base de connaissances Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/kb/
# Base de connaissances Apple Wallet et Google Wallet
Vous intégrez eldo wallet ou vous gérez un programme au quotidien ? Commencez ici.
Les **concepts** posent le vocabulaire. Les **guides** déroulent une tâche de bout en bout.
La **FAQ** et le **dépannage** répondent aux questions qui reviennent.
## Concepts
## Guides pratiques
## FAQ et dépannage
:::tip[Vous débutez ?]
Suivez d’abord le [démarrage rapide](/docs/quickstart), puis parcourez les [cas d’usage](/use-cases/retail) de votre secteur.
:::
### Apple Wallet vs Google Wallet : les différences
Source: https://developers.eldowallet.fr/kb/concepts/apple-vs-google-wallet
# Apple Wallet vs Google Wallet : les différences
Vous faites **un seul appel** à eldo wallet. eldo wallet génère la version Apple Wallet et la version Google Wallet du pass.
Le client ouvre son lien, son téléphone choisit la bonne plateforme. Vous n’avez rien à brancher de chaque côté.
Les deux plateformes ne se comportent pas pareil pour autant. Voici ce qu’il faut savoir.
## En bref
| | Apple Wallet | Google Wallet |
|---|---|---|
| Appareils | iPhone, Apple Watch | Téléphones Android |
| Format | Fichier `.pkpass` signé | Objet hébergé chez Google (une *classe* + un *objet* par porteur) |
| Mise à jour | Le serveur prévient l’appareil (APNs), l’appareil télécharge la nouvelle version | Google met à jour l’objet et le pousse sur l’appareil |
| Notification | Affichée quand un champ configuré pour notifier change de valeur | Message attaché au pass, ou notification de mise à jour |
| Écran de verrouillage | Pass proposé selon la localisation ou la date pertinente | Pass proposé selon la localisation et la date de l’événement |
| Logo | `logo` | `androidLogo` (logo dédié, affiché dans un cercle) |
## Ce que eldo wallet gère pour vous
- La **signature** des `.pkpass` et la publication des classes et objets Google Wallet.
- L’**enregistrement des appareils** : quand le client ajoute le pass, son appareil s’abonne aux mises à jour.
- La **diffusion des mises à jour** : vous modifiez un client, un trajet ou un template, eldo wallet relaie aux deux plateformes.
- Le **lien d’ajout unique** : un même lien ouvre Apple Wallet sur iPhone et Google Wallet sur Android.
## Les différences qui vous concernent
### Le rendu n’est pas identique
Apple et Google n’ont pas la même grille de champs. Un champ visible au recto sur iPhone peut apparaître au verso, ou dans les détails, sur Android.
L’en-tête iOS se règle à part (`iosHeader` sur la carte de fidélité, les coupons et les transports). Testez toujours sur les deux plateformes avant un lancement.
### Le partage se règle par plateforme
La carte de fidélité distingue `sharingProhibited` (iOS) et `sharingProhibitedAndroid`. Voir .
### Les notifications ne partent pas de la même façon
Sur Apple Wallet, une notification apparaît quand une valeur affichée change et que ce champ est configuré pour notifier.
Sur Google Wallet, la notification passe par un message attaché au pass.
eldo wallet uniformise l’appel : vous envoyez une notification, eldo wallet choisit le bon mécanisme. Voir [Notifications push](/kb/push-notifications).
### Les erreurs Google Wallet ont leurs propres codes
Certaines erreurs viennent de Google Wallet lui-même : `CLASS_NOT_FOUND`, `OBJECT_CREATION_FAILED`, `OBJECT_UPDATE_FAILED`. Voir la [référence des erreurs](/docs/errors).
## Pour aller plus loin
- [Templates et passes](/kb/concepts/templates-vs-passes)
- [Design des passes](/kb/concepts/design-guidelines)
- [Le pass ne se met pas à jour](/kb/troubleshooting/pass-not-updating)
### Codes-barres des passes Wallet : QR, Aztec, PDF417
Source: https://developers.eldowallet.fr/kb/concepts/barcodes
# Codes-barres des passes Wallet
Le code-barres relie le pass à vos systèmes : caisse, douchette, portique. Deux décisions à prendre :
1. **Le format**, fixé sur le template : champ `barcodeFormat` (coupon, transport) ou `barcodeType` (carte de fidélité, événement).
2. **La valeur**, propre à chaque pass : champ `barcode`.
## Les formats disponibles
| Format | Forme | Quand le choisir |
|---|---|---|
| `QR_CODE` | Carré 2D | Le choix par défaut. Lu par presque tous les scanners et les smartphones. |
| `AZTEC` | Carré 2D, compact | Billetterie transport et aérien. Se lit bien sur un écran, même petit. |
| `PDF_417` | Rectangle 2D empilé | Cartes d’embarquement, systèmes de contrôle qui l’exigent. |
| `CODE_128` | Code 1D linéaire | Caisses équipées de douchettes 1D, cartes de fidélité. |
| `NONE` | Pas de code-barres | Pass purement informatif (confirmation, carte d’adhérent sans contrôle). |
:::tip[Faites tester vos scanners]
Avant de lancer, scannez un vrai pass sur un vrai téléphone avec **vos** équipements. Une vieille douchette 1D ne lit pas un QR.
:::
:::note[Bon à savoir côté Apple]
Apple Wallet n’affiche pas les codes 1D (`CODE_128`) sur Apple Watch. Préférez un format 2D si vos clients scannent depuis leur montre.
:::
## La valeur du code-barres
- Par défaut, eldo wallet génère une valeur.
- Vous pouvez imposer la vôtre (numéro client CRM, numéro de billet de votre billetterie) : champ `barcode` à la création du client ou du pass.
- Le code-barres sert ensuite de **clé** : retrouver un client (), créditer des points en caisse (), retrouver un billet (, ), valider un pass ().
:::warning[Unicité]
Un même code-barres ne peut pas être attribué à deux clients du même wallet. L’API renvoie alors `BARCODE_ALREADY_EXISTS` (409).
:::
## Options de sécurité
Les templates exposent un bloc `security` :
| Option | Effet |
|---|---|
| `enableOneTimeUse` | Le pass ne sert qu’une fois. |
| `disableIOSPassSharing` | Le porteur ne peut pas partager le pass depuis Apple Wallet. |
| `disablePassLinkSharing` | Désactive le partage du lien d’ajout du pass. |
| `disableMultipleHolders` | Un seul porteur pour ce pass. |
| `enableSecurityAnimation` | Animation visuelle sur le pass, plus difficile à copier en capture d’écran. |
| `enableRotatingBarcode` | Code-barres qui change régulièrement : une capture d’écran devient inutile. |
En `multipart/form-data`, le bloc s’envoie en chaîne JSON : `security={"disableIOSPassSharing":true}`.
Testez chaque option sur Apple Wallet et sur Google Wallet avant un lancement.
## Pour aller plus loin
- [Cycle de vie d’un pass](/kb/concepts/pass-lifecycle)
- [Cas d’usage Événements](/use-cases/events)
### Types de clients
Source: https://developers.eldowallet.fr/kb/concepts/customer-types
# Types de clients
Tous vos porteurs ne se valent pas : un client VIP, un professionnel, un salarié, un client standard.
Les **types de clients** rangent vos porteurs dans des segments que vous définissez.
## À quoi ça sert
- **Afficher un statut** sur la carte : « Gold », « Pro », « Abonné ». L’en-tête iOS peut afficher le type (`iosHeader` à `TYPE`, voir ).
- **Cibler** un segment : envoyez coupons et notifications à ses clients (liste de destinataires, `target: SPECIFIC` pour les notifications).
- **Faire évoluer** un client : il passe Silver → Gold, vous changez son type, sa carte se met à jour.
## Les endpoints
| Besoin | Endpoint |
|---|---|
| Lister les types | |
| Créer un type (et en faire le type par défaut avec `isDefault`) | |
| Lire, modifier, supprimer un type | , , |
| Affecter un type à un client | champ `clientType` de ou |
## Le type par défaut
Un wallet qui utilise les types a **toujours un type par défaut**. Un client créé sans type le reçoit.
Vous ne pouvez pas retirer le seul type par défaut : l’API renvoie `DEFAULT_CLIENT_TYPE_REQUIRED`. Désignez d’abord un autre type par défaut.
:::warning[Erreur d’affectation]
Un type inconnu ou mal formé à la création d’un client renvoie `ERROR_CUSTOMER_TYPE_ASSIGNMENT`. Récupérez les identifiants avec .
:::
## Pour aller plus loin
- [Importer une base clients](/kb/guides/import-customers-csv)
- [Cas d’usage Auto & garages](/use-cases/automotive) : particuliers et professionnels sur le même programme
### Design d’un pass Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/kb/concepts/design-guidelines
# Design d’un pass Apple Wallet et Google Wallet
Un pass se regarde en deux secondes, au soleil, devant une caisse. Il doit être **lisible avant d’être beau**.
## Les éléments visuels
| Élément | Rôle | Où le régler |
|---|---|---|
| **Logo** | Votre marque, en haut du pass (iOS) | (`logo`) |
| **Logo Android** | Logo affiché dans un cercle sur Google Wallet | (`androidLogo`) |
| **Icône** | Affichée dans les notifications et l’écran de verrouillage | (`icon`) |
| **Strip** | Bandeau image sous l’en-tête : l’offre, la saison, l’événement | `strip` sur chaque template, `overrideStrip` pour un client () |
| **Couleurs** | `backgroundColor` (fond), `foregroundColor` (valeurs), `labelColor` (libellés) | bloc `colors` de chaque template |
## Contraintes de l’API
- Images en **PNG ou JPEG**, de **1 Ko à 5 Mo**.
- Envoi en `multipart/form-data`. Le bloc `colors` passe en chaîne JSON : `colors={"backgroundColor":"#131313","foregroundColor":"#FFFFFF","labelColor":"#9EE00D"}`.
Voir [Fichiers et images](/docs/files-and-images).
## Recommandations des plateformes
:::note[Source : Apple Human Interface Guidelines et documentation Google Wallet]
Les dimensions ci-dessous sont les recommandations **publiques** d’Apple et de Google, pas des contraintes de l’API eldo wallet.
:::
**Apple Wallet** (en points, prévoyez une résolution @2x ou @3x) :
| Image | Taille recommandée (@1x) |
|---|---|
| Icône | 29 × 29 pt |
| Logo | 160 × 50 pt maximum |
| Strip (carte de fidélité, coupon, billet d’événement) | 375 × 123 pt environ |
**Google Wallet** :
| Image | Recommandation |
|---|---|
| Logo | Carré, au moins 660 × 660 px, affiché dans un cercle |
| Image « hero » (équivalent du strip) | 1032 × 336 px |
## Les règles qui évitent les mauvaises surprises
- **Contraste.** Texte clair sur fond foncé, ou l’inverse. Testez en plein soleil.
- **Rien d’essentiel dans le strip.** Le strip est recadré différemment selon la plateforme. Un prix ou une date écrits dans l’image peuvent disparaître : mettez-les dans les champs.
- **Logo sur fond transparent.** Un logo avec un fond blanc détonne sur un pass de couleur.
- **Logo Android centré.** Il est découpé en cercle : gardez une marge autour.
- **Pas de texte minuscule.** Le pass s’affiche en petit, parfois sur une montre.
- **Un strip par opération, pas par jour.** Changer le visuel met à jour toutes les cartes.
- **Testez sur les deux plateformes.** Voir [Apple Wallet vs Google Wallet](/kb/concepts/apple-vs-google-wallet).
## Pour aller plus loin
- [Fichiers et images](/docs/files-and-images)
- [Templates et passes](/kb/concepts/templates-vs-passes)
### Localisations et notifications de proximité
Source: https://developers.eldowallet.fr/kb/concepts/locations
# Localisations et notifications de proximité
Le client passe devant votre magasin, sa carte apparaît sur son écran de verrouillage avec un message : « -10 % aujourd’hui chez nous ».
Pas d’envoi de votre part. C’est le téléphone qui déclenche, à partir des localisations enregistrées sur le pass.
## Comment ça marche
1. Vous déclarez des **localisations** : latitude, longitude, et un **texte pertinent** (le message affiché).
2. eldo wallet les inscrit dans les passes.
3. Quand le client entre dans la zone, Apple Wallet ou Google Wallet propose le pass sur l’écran de verrouillage avec ce texte.
## Les endpoints
| Besoin | Endpoint |
|---|---|
| Lister les localisations de la carte de fidélité | |
| Ajouter une localisation | |
| Modifier, supprimer | , |
| Localisations d’un événement, d’un transport, d’un hôtel | champ `locations` (ou `location`) du template : , , |
## Messages selon l’heure
Une localisation peut porter **plusieurs textes**, chacun avec sa plage horaire : `relevantTextList`, avec `relevantText`, `startTime` et `endTime`.
Exemple : « Café offert avant 10 h » le matin, « Happy hour jusqu’à 19 h » l’après-midi, au même endroit.
## Limites à connaître
- **Un nombre maximal de localisations par wallet.** Au-delà, l’API renvoie `MAX_WALLET_LOCATIONS_REACHED`. Apple Wallet, de son côté, ne prend en compte que **10 localisations par pass**.
- **Ce n’est pas un push.** Le système décide d’afficher ou non le pass selon la distance, l’usage du téléphone et les réglages du client. Ne comptez pas dessus pour une information critique.
- **Le client garde la main.** Il peut couper les suggestions de passes sur l’écran de verrouillage dans ses réglages.
:::tip[Réseau de plus de 10 points de vente]
Choisissez les 10 emplacements qui comptent le plus : magasins phares, gares, centres commerciaux. Les suivants ne s’afficheront pas sur iPhone.
:::
## Pour aller plus loin
- [Notifications push](/kb/push-notifications)
- [Cas d’usage Retail](/use-cases/retail)
- [Cas d’usage Hôtels](/use-cases/hotels)
### Cycle de vie d’un pass Wallet
Source: https://developers.eldowallet.fr/kb/concepts/pass-lifecycle
# Cycle de vie d’un pass Wallet
Un pass passe par quelques états simples. Les connaître vous évite deux erreurs classiques : relancer un client qui a déjà sa carte, et accepter deux fois le même coupon.
```mermaid
stateDiagram-v2
[*] --> Envoye: création du client ou du pass
Envoye --> Installe: le client ajoute le pass à son Wallet
Installe --> Desinstalle: le client retire le pass
Desinstalle --> Installe: le client le rajoute
Installe --> Utilise: redeem (scan en caisse ou à l'entrée)
Utilise --> Installe: unredeem (scan annulé)
Installe --> Expire: date d'expiration atteinte
Utilise --> Expire
Expire --> [*]
```
## Les états
| État | Ce qui s’est passé | Comment le savoir |
|---|---|---|
| **Envoyé** | eldo wallet a créé le pass et son lien. L’email ou le SMS est parti si vous l’avez demandé. | Réponse de l’appel de création |
| **Installé** | Le client a ajouté le pass à Apple Wallet ou Google Wallet. Son appareil reçoit les mises à jour. | Webhook `pass.installed`, filtre `status` de |
| **Désinstallé** | Le client a retiré le pass de son téléphone. | Webhook `pass.uninstalled` |
| **Utilisé** | Le pass a été scanné et validé. | |
| **Expiré** | La date d’expiration est passée. Le pass reste visible dans le Wallet, marqué comme expiré. | Date d’expiration du pass |
Les webhooks se configurent au niveau du wallet. Voir [Webhooks](/docs/webhooks).
## Relancer les inactifs
Un client a reçu sa carte mais ne l’a jamais installée ? relance tous les inactifs (`all`) ou une liste précise (`specific`).
## Valider un pass : redeem et unredeem
Au scan, votre caisse ou votre contrôle d’accès appelle avec l’identifiant du **template** et le **code-barres** lu.
Le pass passe en « utilisé ». Un second scan du même pass est refusé avec `PASS_ALREADY_REDEEMED`.
Le caissier s’est trompé ? Annulez avec . Sur un pass jamais validé, l’API renvoie `PASS_NOT_REDEEMED`.
:::tip[Une seule source de vérité]
Faites valider le pass par eldo wallet, pas seulement par votre caisse. Le statut se met à jour dans le Wallet du client et dans vos statistiques.
:::
## Forcer un statut
Vous pouvez aussi écrire le statut directement :
| Pass | Endpoint | Statuts |
|---|---|---|
| Coupon | | `UNUSED`, `USED`, `EXPIRED` |
| Coupon (expirer tout de suite) | | |
| Transport | | `UNUSED`, `USED` |
| Événement | | |
## L’expiration
- **Carte de fidélité** : bloc `validity` de . `expirationType` vaut `NO_EXPIRATION`, `AT_DATETIME` (date fixe) ou `AFTER_PERIOD` (une durée après la création, en années, mois ou semaines).
- **Coupon** : `expirationDate` sur le template, surchargeable client par client à l’envoi.
- **Transport** : `expirationDate` sur le pass, ou pour tout un trajet avec .
Une fois expiré, le pass reste dans le Wallet du client, grisé. Il sert de justificatif.
Le filtre `status` de accepte les valeurs `active`, `inactive`, `deleted`, `canceled` et `expired`.
## Pour aller plus loin
- [Codes-barres](/kb/concepts/barcodes)
- [Notifications push](/kb/push-notifications)
- [Webhooks](/docs/webhooks)
### Types de passes Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/kb/concepts/pass-types
# Types de passes Apple Wallet et Google Wallet
eldo wallet propose cinq types de passes. Choisissez selon **ce que le client fait avec le pass**, pas selon votre secteur.
| Type | Le client s’en sert pour… | Exemples | Cas d’usage |
|---|---|---|---|
| **Carte de fidélité** (store card) | S’identifier, cumuler des points ou une cagnotte, prouver son adhésion | Carte enseigne, carte garagiste, carte d’adhérent | [Retail](/use-cases/retail), [Auto](/use-cases/automotive), [Mutuelles](/use-cases/health-insurance), [Sport](/use-cases/sport) |
| **Coupon** | Obtenir une remise, une ou plusieurs fois | -20 % anniversaire, trajet offert | [Retail](/use-cases/retail) |
| **Événement** | Entrer dans un lieu à une date donnée | Concert, salon, match, séance de cinéma | [Événements](/use-cases/events), [Sport](/use-cases/sport), [Cinéma](/use-cases/cinema) |
| **Transport** | Monter à bord | Bus, car, train, tram, ferry, avion | [Transport](/use-cases/transport), [Ferry](/use-cases/ferry), [Aérien](/use-cases/airlines) |
| **Hôtel** | Retrouver sa réservation, ses dates, sa chambre | 3 nuits, chambre 204 | [Hôtels](/use-cases/hotels) |
Le type de pass doit être **activé** sur votre wallet (`allowedPasses`, voir ). Sinon, l’API refuse la création du template.
## Carte de fidélité : `STORE_CARD` ou `MEMBER_CARD`
Une seule carte par wallet, réglée avec :
- `STORE_CARD` : carte de magasin, avec un gain mis en avant (points, euros, dollars, dirhams).
- `MEMBER_CARD` : carte de membre, centrée sur l’identité du porteur (numéro d’adhérent, licence, immatriculation…).
Le gain d’un client se met à jour avec ou, depuis la caisse, par code-barres avec .
## Transport : un template, six modes
Le template de transport prend un `type` : `Bus`, `Boat`, `Train`, `Air`, `Tram` ou `Generic`.
Le même modèle d’intégration sert pour un car, un TER, une traversée ou un vol. Le pass accepte un numéro de vol, une porte et un siège.
## Coupon simple ou multi-instance
Un coupon peut être émis une fois par client, ou en **plusieurs instances** pour un même client (`isMultipleInstance`), chacune avec son code-barres.
Un coupon peut aussi être le **coupon de bienvenue** (`isWelcomeCoupon`), envoyé à chaque nouvelle inscription. Un seul coupon de bienvenue actif à la fois.
## Pour aller plus loin
- [Templates et passes](/kb/concepts/templates-vs-passes)
- [Codes-barres](/kb/concepts/barcodes)
### Templates et passes
Source: https://developers.eldowallet.fr/kb/concepts/templates-vs-passes
# Templates et passes
Deux objets structurent toute l’API eldo wallet :
- **Le template** : le modèle. Il porte l’identité visuelle et les informations communes à tous les porteurs. Vous le créez **une fois**.
- **Le pass** : la carte d’un client précis. Il porte ses données personnelles : nom, place, code-barres, solde. Vous en émettez **un par client**.
```mermaid
flowchart LR
T["Template
couleurs, strip,
conditions, format de code-barres"]
T --> P1["Pass · Marie
barcode, place 12"]
T --> P2["Pass · Loïc
barcode, place 13"]
T --> P3["Pass · Claire
barcode, place 14"]
```
## Exemple
Un concert, c’est **un** template d’événement : nom, lieu, date, strip officiel, couleurs.
Chaque spectateur reçoit **son** pass : porte, rang, siège, code-barres.
## Qui porte quoi
| Information | Template | Pass |
|---|---|---|
| Couleurs, strip | ✅ | |
| Format de code-barres | ✅ | |
| Options de sécurité (partage, usage unique…) | ✅ | |
| Conditions, contact | ✅ | |
| Nom et email du porteur | | ✅ |
| Valeur du code-barres | | ✅ |
| Place, trajet, dates, solde propres au client | | ✅ |
## Les templates par type de pass
| Type | Créer le template | Émettre un pass | Émettre en masse |
|---|---|---|---|
| Coupon | | | (même endpoint, asynchrone) |
| Événement | | | |
| Transport | | | |
| Hôtel | | | |
:::warning[Content-Type]
Les créations de templates acceptent une image (le *strip*). Elles s’envoient en **`multipart/form-data`**. Les objets imbriqués (`colors`, `security`, `locations`…) passent en **chaîne JSON** dans le champ du formulaire, les booléens en `"true"` / `"false"`. Les émissions de passes sont en `application/json`. Voir [Erreurs API fréquentes](/kb/troubleshooting/common-api-errors).
:::
## Et la carte de fidélité ?
La carte de fidélité est un cas à part : **une seule par wallet**. Son template, c’est la *store card*.
- Vous réglez son design avec : `cardType` (`STORE_CARD` ou `MEMBER_CARD`), nom du programme, couleurs, strip, unité de gain, champs affichés.
- Chaque client créé avec reçoit sa carte (avec `sendCard`, eldo wallet lui envoie le lien).
- Les [types de clients](/kb/concepts/customer-types) rangent les porteurs de la carte par segment.
## Modifier un template après coup
Un template modifié se répercute sur les passes déjà émis : un nouveau strip, et toutes les cartes changent de visuel.
Faites-le pour une vraie opération, pas tous les jours.
## Pour aller plus loin
- [Types de passes](/kb/concepts/pass-types)
- [Cycle de vie d’un pass](/kb/concepts/pass-lifecycle)
- [Fichiers et images](/docs/files-and-images)
### FAQ Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/kb/faq/general
# FAQ Apple Wallet et Google Wallet
## Le client doit-il installer une application ?
Non. Apple Wallet est installé d’office sur iPhone. Google Wallet est disponible sur Android.
Le client ouvre son lien, ajoute le pass, c’est terminé.
## Un même lien marche-t-il sur iPhone et Android ?
Oui. Le lien d’ajout détecte l’appareil et propose Apple Wallet ou Google Wallet.
## Le pass fonctionne-t-il sans connexion ?
Oui. Une fois ajouté, le pass s’affiche hors ligne, code-barres compris. Les mises à jour arrivent quand le téléphone retrouve le réseau.
## Quels types de passes puis-je émettre ?
Carte de fidélité, coupon, événement, transport (bus, train, tram, ferry, avion…) et hôtel. Voir [Types de passes](/kb/concepts/pass-types).
## Puis-je tout faire sans développer ?
Une bonne partie, oui. Le back-office eldo wallet couvre le design de la carte, le QR d’inscription en magasin, les notifications à tous les porteurs, les localisations et les statistiques.
L’API sert à brancher vos systèmes : CRM, caisse, billetterie. Les [cas d’usage](/use-cases/retail) indiquent ce qui demande une intégration.
## Qui envoie l’email ou le SMS au client ?
Au choix :
- **eldo wallet** l’envoie pour vous : `sendCard: true` à la création du client, `enableSendEmailOrSms: true` à l’émission d’un titre de transport.
- **Vous** gardez le lien et l’envoyez par votre propre canal : email transactionnel, SMS, application, QR imprimé.
Le canal par défaut (email, SMS ou les deux) et les règles par type de message se règlent dans .
## Que se passe-t-il si le client change de téléphone ?
Le pass suit le compte du client : sauvegarde iCloud côté Apple, compte Google côté Android.
Il ne passe pas d’une plateforme à l’autre : un client qui passe d’iPhone à Android rouvre son lien d’ajout.
## J’ai déjà des cartes chez un autre fournisseur. Mes clients vont-ils les perdre ?
Non. Vos clients gardent leur numéro de carte et leurs points. Si vos comptes Apple Developer et Google Wallet sont à votre nom, leurs cartes installées sont reprises sans rien réinstaller ; sinon, ils reçoivent une nouvelle carte avec les mêmes données. Voir [Changer de fournisseur wallet](/blog/changer-de-fournisseur-wallet).
## Puis-je mettre à jour un pass déjà installé ?
Oui, c’est tout l’intérêt. Modifiez la donnée côté eldo wallet (client, gain, trajet, template) : le pass se met à jour sur le téléphone. Voir [Cycle de vie d’un pass](/kb/concepts/pass-lifecycle).
## Comment empêcher un client de partager son pass ?
Activez les options de sécurité du template (`disableIOSPassSharing`, `disableMultipleHolders`, `enableRotatingBarcode`…), et `sharingProhibited` / `sharingProhibitedAndroid` sur la carte de fidélité. Voir [Codes-barres](/kb/concepts/barcodes).
## Comment savoir qui a vraiment ajouté sa carte ?
Recevez les événements `pass.installed` et `pass.uninstalled` par [webhook](/docs/webhooks), ou filtrez vos clients par statut avec . donne les totaux.
## Comment gérer le consentement marketing ?
Chaque client a ses préférences de communication : canaux par type de message, et notifications informatives ou commerciales. Voir et [Notifications push](/kb/push-notifications).
## Combien de clients par wallet ?
Jusqu’à 100 000. Au-delà, l’API renvoie `SYSTEM_DOES_NOT_SUPPORT_MORE_THAN_100000_CUSTOMERS`.
## Combien de localisations par pass ?
Apple Wallet en prend en compte 10 au maximum. Voir [Localisations](/kb/concepts/locations).
## Y a-t-il un environnement de test ?
Oui, gratuit et sans engagement. Voir [Environnements](/docs/environments).
## Combien coûte eldo wallet ?
Les tarifs dépendent de vos volumes (nombre de porteurs, envois) et des fonctionnalités dont vous avez besoin. L'environnement de test est gratuit. [Contactez notre équipe](https://www.eldowallet.fr/contact/) : elle vous fait une proposition adaptée à votre projet.
## Dans quelles langues sont les messages de l’API ?
Le header `x-lang` choisit la langue des réponses. Voir [Localisation](/docs/localization).
### Importer une base clients
Source: https://developers.eldowallet.fr/kb/guides/import-customers-csv
# Importer une base clients
Vous lancez votre programme avec une base existante : un export Salesforce, HubSpot, ou un simple fichier CSV.
Vous ne créez pas les clients un par un : vous les importez **en masse**.
## Deux chemins
| | Import CSV | Création en masse (JSON) |
|---|---|---|
| Endpoint | | |
| Format | Fichier CSV en `multipart/form-data` | Tableau `items` en `application/json` |
| Pour… | Une migration ponctuelle depuis un export | Une synchronisation récurrente depuis votre CRM |
| Suivi | | ou `webhookUrl` |
## Avant de commencer
- La carte de fidélité configurée (). Voir [Templates et passes](/kb/concepts/templates-vs-passes).
- Les [types de clients](/kb/concepts/customer-types) créés si vous segmentez votre base.
- Un jeton d’API valide. Voir [Authentification](/docs/authentication).
## Étape 1 · Préparez le fichier
Une ligne par client. Colonnes utiles : prénom, nom, email (obligatoires), téléphone, et si vous en avez : code-barres (votre numéro client), type de client, gain de départ, date de naissance, date de renouvellement, date d’adhésion, société.
| Règle | Pourquoi |
|---|---|
| Un email unique par client | Un email déjà présent dans le wallet est refusé (`EMAIL_ALREADY_EXISTS`). |
| Un code-barres unique | Deux clients ne partagent jamais le même code-barres (`BARCODE_ALREADY_EXISTS`). |
| Téléphone au format international (`+33…`) | Nécessaire pour l’envoi par SMS. |
| Encodage UTF-8 | Les accents des noms restent lisibles sur la carte. |
Pour le modèle de fichier exact (noms de colonnes, séparateur), contactez le [support eldo wallet](#support).
## Étape 2 · Envoyez le fichier
:::warning[Laissez curl écrire le Content-Type]
Avec `-F`, curl envoie `multipart/form-data` avec son `boundary`. N’ajoutez pas de header `Content-Type` à la main.
:::
L’import tourne **en arrière-plan**. Suivez-le avec .
## Étape 3 · Décidez qui envoie les cartes
`sendNotificationsToCustomers` décide de ce qui se passe après l’import :
| Valeur | Ce qui se passe | Pour… |
|---|---|---|
| `"true"` | eldo wallet envoie à chaque client son lien d’ajout au Wallet. | Un lancement avec activation immédiate. |
| `"false"` | Les fiches sont créées, personne n’est prévenu. | Une migration silencieuse, puis votre propre campagne au moment choisi. |
Côté JSON (), le même choix se fait client par client avec `sendCard`.
## Variante · Création en masse en JSON
- Jusqu’à **5 000 éléments** par appel, traités en **asynchrone**.
- La réponse contient l’identifiant de l’opération : suivez-la avec , ou attendez l’appel sur `webhookUrl`.
- `forceSync: true` force un traitement synchrone, refusé à partir de 1 000 éléments (`SYNC_EXECUTION_NOT_ALLOWED`).
## Étape 4 · Traitez les rejets
Consultez le résultat de l’opération : clients créés, doublons, lignes invalides.
Corrigez les lignes rejetées et relancez **uniquement** celles-là. Relancer tout le fichier crée des erreurs de doublon.
## Étape 5 · Suivez l’activation
- : nombre de clients et de cartes installées.
- : liste paginée et filtrable (`status`, `createdAtStart`, `search`…).
- : relancez ceux qui n’ont pas installé leur carte.
- [Webhooks](/docs/webhooks) : recevez `pass.installed` quand un client ajoute sa carte.
:::note[Volume maximal]
Un wallet ne dépasse pas 100 000 clients (`SYSTEM_DOES_NOT_SUPPORT_MORE_THAN_100000_CUSTOMERS`).
:::
## Pour aller plus loin
- [Cas d’usage Retail](/use-cases/retail)
- [Email ou SMS non reçu](/kb/troubleshooting/email-not-received)
- [Erreurs API fréquentes](/kb/troubleshooting/common-api-errors)
### Envoyer à des non-clients
Source: https://developers.eldowallet.fr/kb/guides/send-to-non-clients
# Envoyer à des non-clients
Un partenaire vous transmet une liste de prospects. Un salon vous confie 300 invitations presse. Ces personnes n’ont pas de carte de fidélité chez vous.
Vous leur envoyez quand même un coupon ou un billet, **sans les inscrire d’abord**.
## Client ou non-client ?
| | Client | Non-client |
|---|---|---|
| Fiche dans le wallet | Oui, créée avant () | Non |
| Identifié par | `clientId` | `firstName`, `lastName`, `email` (obligatoires), `phoneNumber` |
| Cas typique | Coupon anniversaire, récompense de palier | Campagne prospects, invitations, partenaires |
## Par type de pass
| Pass | Endpoint | Comment |
|---|---|---|
| Coupon | | Dans `clients`, mettez un `clientId` pour un client, ou prénom, nom, email pour un non-client. Les deux peuvent cohabiter dans le même envoi. |
| Événement | | Prénom, nom, email, et la place (`leftRow`, `centerRow`, `rightRow`). |
| Événement, en masse | | Même chose, jusqu’à 5 000 billets, en asynchrone. |
| Transport, hôtel | , | Ces passes s’émettent toujours à partir des coordonnées du voyageur. |
## Exemple : un coupon à des prospects
Chaque destinataire peut avoir **sa propre** valeur, description, date d’expiration, code promo ou code-barres. Ici, -10 % pour un contact froid, -20 % pour un contact chaud :
L’envoi est une **opération en masse** : la réponse donne l’identifiant de l’opération, à suivre avec ou via `webhookUrl`.
:::warning[Coordonnées manquantes]
Sans `clientId`, prénom, nom et email sont obligatoires. Sinon : `MISSING_RECIPIENT_DETAILS_FOR_NON_CLIENT`.
:::
## Bonnes pratiques
- **Ayez le consentement.** Envoyer un email ou un SMS à un non-client reste de la prospection. Vérifiez la base légale de votre fichier.
- **Un code-barres par bon** si votre caisse doit savoir quel bon a été utilisé.
- **Mesurez.** Suivez l’usage des coupons avec .
## Pour aller plus loin
- [Cas d’usage Événements](/use-cases/events)
- [Cas d’usage Retail](/use-cases/retail)
- [Email ou SMS non reçu](/kb/troubleshooting/email-not-received)
### Retard, annulation : mettre à jour un trajet
Source: https://developers.eldowallet.fr/kb/guides/update-a-trip
# Retard, annulation : mettre à jour un trajet
Le bus part 30 minutes plus tard. Le ferry change de quai. Vous avez 200 voyageurs sur ce départ.
Vous ne mettez pas à jour 200 billets : vous mettez à jour **un trajet**.
## La clé : le `tripNumber`
Le `tripNumber` regroupe tous les billets d’un même service (un départ, une date). Renseignez-le **à chaque émission de billet** ( ou ).
Sans `tripNumber`, pas de mise à jour groupée.
:::tip[Un tripNumber par départ]
Utilisez un identifiant unique par départ daté (ligne + date + heure, par exemple `MUL-GVA-20261112-0930`), pas le numéro de ligne seul. Sinon, un retard du lundi modifie aussi les billets du mardi.
:::
## Le parcours
```mermaid
sequenceDiagram
participant R as Régulation / billettique
participant E as eldo wallet
participant W as Apple / Google Wallet
participant V as Voyageur
R->>E: PATCH /transits/{transitId}/passes/trip/{tripNumber}
E->>W: mise à jour de tous les billets du trajet
W->>V: billet à jour + notification
R->>E: POST /transits/{transitId}/passes/trip/{tripNumber}/notify
E->>W: message texte
W->>V: « Retard 30 min, cause météo »
```
## Étape 1 · Mettez à jour les données
accepte les nouvelles heures et dates de départ et d’arrivée, les gares d’origine et de destination, et la date d’expiration.
Tous les billets du trajet sont mis à jour. Le voyageur voit le nouvel horaire sans rien faire.
:::warning[Dates]
Si vous changez `departureDate`, envoyez aussi `arrivalDate`. L’arrivée doit rester après le départ (`ARRIVAL_TIME_MUST_BE_AFTER_DEPARTURE_TIME_CONSIDERING_DATES`).
:::
## Étape 2 · Expliquez
Un nouvel horaire ne dit pas pourquoi. Ajoutez un message avec :
## Cas particuliers
| Situation | Que faire |
|---|---|
| Retard ou avance | sur les heures, puis un message. |
| Changement de quai ou de voie | Un message avec . |
| Changement de gare | `originName` / `originStationCode` dans . |
| Un seul voyageur concerné (siège, nom) | sur son billet. |
| Plusieurs billets, valeurs différentes | |
| Le modèle de la ligne change (conditions, visuel) | sur le template. |
| Annulation du départ | Un message, puis retirez les billets avec si besoin. |
## Pour aller plus loin
- [Cas d’usage Transport](/use-cases/transport)
- [Cas d’usage Ferry](/use-cases/ferry)
- [Notifications push](/kb/push-notifications)
### Notifications push Apple Wallet et Google Wallet
Source: https://developers.eldowallet.fr/kb/push-notifications
# Notifications push Apple Wallet et Google Wallet
Une carte installée dans Apple Wallet ou Google Wallet est un canal direct vers l’écran de verrouillage de votre client. Pas d’application à installer, pas d’email noyé dans une boîte.
## Un seul endpoint, quatre réglages
couvre tous les cas. Quatre champs décident du comportement :
| Champ | Valeurs | Effet |
|---|---|---|
| `target` | `ALL`, `SPECIFIC` | Tous les porteurs, ou seulement les clients listés dans `clients` |
| `type` | `INSTANT`, `SCHEDULED` | Tout de suite, ou à la date `scheduleAt` (obligatoire en `SCHEDULED`) |
| `category` | `INFORMATIVE`, `COMMERCIAL` | Information de service ou message marketing : eldo wallet respecte le consentement du client pour chaque catégorie |
| `clients` | `id`, `title`, `message` | Avec `SPECIFIC` : la liste des destinataires, avec un titre et un message **propres à chacun** si besoin |
`defaultTitle` et `defaultMessage` servent pour tous les destinataires qui n’ont pas de texte personnalisé.
```mermaid
sequenceDiagram
participant S as Votre serveur
participant E as eldo wallet
participant A as Apple / Google
participant C as Téléphone du client
S->>E: POST /push-notifications
E->>E: filtre selon le consentement (category)
E->>A: mise à jour des passes
A->>C: notification sur l'écran de verrouillage
S->>E: GET /push-notifications/{id}/stats
```
## Exemple : une annonce planifiée à tous
## Exemple : un message par client
## Consentement : informatif ou commercial
Chaque client a ses préférences : `pushInformativeEnabled` et `pushCommercialEnabled`.
Une notification `COMMERCIAL` n’atteint pas un client qui a refusé les messages commerciaux. Lisez et modifiez ces préférences avec et .
:::warning[Classez honnêtement]
« Votre commande est prête » est informatif. « -30 % ce week-end » est commercial. Classer une promotion en `INFORMATIVE` contourne le choix du client : ne le faites pas.
:::
### Pourquoi c'est important
eldo wallet filtre les destinataires **au moment de l'envoi**, d'après la catégorie que vous indiquez. Il ne lit pas le contenu du message. Une promotion envoyée en `INFORMATIVE` atteint donc aussi les clients qui ont **refusé** les messages commerciaux.
Les conséquences pour vous :
- **Juridique.** En France et dans l'Union européenne, la prospection commerciale par voie électronique repose sur le consentement de la personne (RGPD, règles de la CNIL). Écrire à un client qui a refusé ces messages vous expose à des plaintes et à des sanctions. Son refus est daté et conservé : en garde la trace.
- **Perte du canal.** Un client agacé coupe les notifications du pass ou le supprime de son wallet. Vous perdez alors aussi les messages utiles : commande prête, retard, renouvellement de carte. Le webhook `pass.uninstalled` vous le signale, trop tard.
- **Confiance.** Une notification « de service » qui cache une publicité apprend au client à ignorer toutes vos notifications, y compris les importantes.
- **Statistiques faussées.** Vos statistiques d'envoi par catégorie ne veulent plus rien dire : impossible de savoir ce qui fonctionne.
En cas de doute, choisissez `COMMERCIAL` : vous touchez moins de clients, mais tous ont accepté de vous lire.
## Notifications liées à un trajet
Pour les titres de transport, ciblez **un trajet**, pas tous les porteurs.
envoie un message à tous les billets d’un même `tripNumber`. Voir [Mettre à jour un trajet](/kb/guides/update-a-trip).
## Notifications automatiques
Certains événements notifient sans appel de votre part : nouvelle carte, gain mis à jour, nouveau coupon, nouvel événement…
Les règles se règlent par type de notification et par canal (email, SMS, notification) dans `communicationRules` (). Les textes se personnalisent avec les modèles de notification ().
## Suivre et gérer
- : livraison d’une notification.
- , : historique.
- , : modifier ou annuler une notification planifiée.
## Bonnes pratiques
- **Un message, une action.** « Votre commande est prête, jusqu’à samedi 19 h » vaut mieux qu’un paragraphe.
- **Ciblez.** Un push envoyé à tous pour une info qui concerne 10 % des porteurs fait désinstaller la carte.
- **Respectez les horaires.** Planifiez avec `SCHEDULED` plutôt que d’envoyer à 23 h.
- **Espacez les envois planifiés.** Deux notifications trop proches dans le temps sont refusées avec `PUSH_NOTIFICATION_SCHEDULE_CONFLICT` (409).
- **Une date dans le futur.** Une date déjà passée renvoie `SCHEDUle_DATE_PASSED`.
:::note[Comportement d’iOS]
Sur iPhone, la notification s’affiche parce qu’un champ du pass change de valeur. Deux envois successifs avec exactement le même texte peuvent ne rien afficher la seconde fois.
:::
## Pour aller plus loin
- [Apple Wallet vs Google Wallet](/kb/concepts/apple-vs-google-wallet)
- [Localisations](/kb/concepts/locations) : la notification sans envoi, quand le client passe à proximité
- [Le pass ne se met pas à jour](/kb/troubleshooting/pass-not-updating)
### Erreurs API fréquentes
Source: https://developers.eldowallet.fr/kb/troubleshooting/common-api-errors
# Erreurs API fréquentes
La liste complète des codes est dans la [référence des erreurs](/docs/errors). Ici, les cas qui reviennent le plus, et comment les corriger.
Toutes les erreurs ont la même forme : un `message` lisible (dans la langue du header `x-lang`), un `errorCode` au format `STATUT:CODE` (par exemple `404:MODEL_NOT_FOUND`), le `path` appelé et la `date`.
## Le n° 1 : du JSON envoyé à un endpoint multipart
Les créations et mises à jour qui acceptent une image attendent du **`multipart/form-data`** :
| Endpoint | Content-Type |
|---|---|
| , , , | `multipart/form-data` |
| , , | `multipart/form-data` |
| , | `multipart/form-data` |
| Clients, passes, notifications, trajets | `application/json` |
Erreurs associées : `INVALID_MULTIPART` (boundary absent ou mal formé), `UNSUPPORTED_MEDIA_TYPE` (415), `FILE_REQUIRED` (image obligatoire absente).
Trois règles en multipart :
1. **Laissez l’outil écrire le header.** Avec `curl -F` ou un `FormData` JavaScript, le `Content-Type` et son `boundary` sont ajoutés pour vous. Un header écrit à la main, sans boundary, fait échouer la requête.
2. **Objets imbriqués en chaîne JSON.** `colors`, `security`, `locations`, `displayOptions`, `iosHeader`, `date` : un champ de formulaire contenant du JSON.
3. **Booléens en texte** : `"true"` / `"false"`. Images PNG ou JPEG, de 1 Ko à 5 Mo.
## 401 : non authentifié
- Header `Authorization: Bearer $ELDO_TOKEN` absent ou mal formé : `UNAUTHORIZED`.
- Jeton expiré : reconnectez-vous (), ou utilisez un jeton de wallet pour les intégrations serveur (). Voir [Authentification](/docs/authentication).
## 403 : accès refusé
Vous êtes authentifié, mais la ressource ne vous appartient pas (template ou client d’un autre wallet), ou votre rôle ne suffit pas : `FORBIDDEN`.
Un client d’un autre wallet renvoie `CLIENT_DOES_NOT_BELONG_TO_THIS_WALLET`.
## 404 : introuvable
- `MODEL_NOT_FOUND` : identifiant inexistant. Les identifiants sont des ObjectId : **24 caractères hexadécimaux**.
- `PATH_NOT_FOUND` : URL inconnue. Vérifiez l'URL de base (`https://api-v2.test.eldowallet.fr` en test, voir [Environnements](/docs/environments)) et le chemin.
- `PASS_NOT_FOUND` : le code-barres scanné ne correspond à aucun pass de ce template.
- `STORECARD_NOT_FOUND` : la carte de fidélité du wallet n’est pas encore configurée ().
## 409 : conflit
- `EMAIL_ALREADY_EXISTS`, `CLIENT_ALREADY_EXISTS` : ce client existe déjà dans le wallet. Mettez-le à jour au lieu de le recréer.
- `BARCODE_ALREADY_EXISTS` : ce code-barres est déjà attribué.
- `OVERLAPPING_DATES` : la chambre d’hôtel est déjà réservée sur ces dates.
- `PUSH_NOTIFICATION_SCHEDULE_CONFLICT` : une notification est déjà planifiée trop près de cette date.
- `STORE_CARD_ALREADY_EXISTS` : un wallet n’a qu’une carte de fidélité. Modifiez-la avec .
## 400 : requête invalide
- `VALIDATION_ERROR`, `MISSING_REQUIRED_FIELDS` : champ obligatoire manquant ou valeur hors liste. Le détail liste les champs en cause.
- `UNEXPECTED_FIELD` : un champ inconnu a été envoyé. Vérifiez l’orthographe, par exemple `barcodeFormat` (coupon, transport) et `barcodeType` (événement, carte de fidélité).
- `INVALID_JSON` : corps JSON mal formé.
- `PASS_ALREADY_REDEEMED` : second sur le même pass. Si le premier scan était une erreur, annulez avec .
- `PASS_NOT_REDEEMED` : sur un pass jamais validé.
- `SYNC_EXECUTION_NOT_ALLOWED` : `forceSync: true` sur une opération en masse de 1 000 éléments ou plus.
## 5xx : erreur serveur ou service externe
- `500` (`UNKNOWN_ERROR`) : réessayez. Si l’erreur persiste, [contactez le support](#support) avec le `path`, la `date` et le corps envoyé.
- `502` : le fournisseur SMS a échoué (`SMS_SEND_FAILED`…). Réessayez plus tard.
- `503` (`PASS_BUILDER_ERROR`) : le service qui génère les passes est indisponible. Réessayez plus tard.
## Pour aller plus loin
- [Référence des erreurs](/docs/errors)
- [Authentification](/docs/authentication)
- [Fichiers et images](/docs/files-and-images)
### Email ou SMS non reçu
Source: https://developers.eldowallet.fr/kb/troubleshooting/email-not-received
# Email ou SMS non reçu
Le client dit qu’il n’a rien reçu. Avant de renvoyer, vérifiez ces points.
## 1. L’envoi était-il demandé ?
eldo wallet n’envoie un message que si vous le lui demandez :
| Appel | Drapeau d’envoi |
|---|---|
| , | `sendCard` |
| | `sendNotificationsToCustomers` |
| , | `enableSendEmailOrSms` |
Drapeau à `false` ? C’est voulu : à vous de transmettre le lien.
## 2. Les règles de communication l’autorisent-elles ?
- Le canal du wallet (`communicationChannel` : `email`, `sms` ou `all`) et les règles par type de message (`communicationRules`) se lisent avec .
- Le client a pu refuser un canal : vérifiez ses préférences avec , et leur historique avec .
## 3. Les coordonnées sont-elles correctes ?
- Faute de frappe dans l’email, domaine inexistant.
- Téléphone sans indicatif international : utilisez `+33…`.
- Vérifiez la fiche avec , corrigez avec .
## 4. Le SMS est-il configuré et crédité ?
| Erreur | Cause |
|---|---|
| `SMS_CREDENTIALS_NOT_CONFIGURED`, `SMS_CONFIG_REQUIRED` | Aucun fournisseur SMS configuré sur le wallet. |
| `INSUFFICIENT_CREDIT` | Plus assez de crédits pour l’envoi. |
| `INSUFFICIENT_CREDIT_PARTIAL` (409) | Certains canaux n’ont pas assez de crédits : confirmez pour n’envoyer que sur les canaux crédités. |
| `SMS_LOGIN_FAILED`, `SMS_SEND_FAILED` (502) | Le fournisseur SMS a échoué. Réessayez plus tard. |
## 5. Côté client
- **Spams et onglets « Promotions »** : demandez au client de vérifier.
- **Filtre d’entreprise** : les adresses professionnelles bloquent parfois les liens.
- **SMS filtrés** : certains téléphones rangent les SMS d’expéditeurs inconnus à part.
## 6. Relancez
renvoie le lien aux clients qui n’ont pas installé leur carte : tous (`all`) ou une liste (`specific`).
## Pour aller plus loin
- [FAQ générale](/kb/faq/general)
- [Importer une base clients](/kb/guides/import-customers-csv)
### Le pass ne se met pas à jour
Source: https://developers.eldowallet.fr/kb/troubleshooting/pass-not-updating
# Le pass ne se met pas à jour
Vous avez modifié une donnée. L’appel API a répondu en succès. Mais le client voit toujours l’ancienne valeur.
Suivez ces vérifications dans l’ordre.
```mermaid
flowchart TD
A[Le pass affiche l'ancienne valeur] --> B{L'appel API a réussi ?}
B -- Non --> B1[Corrigez l'erreur : voir Erreurs API fréquentes]
B -- Oui --> C{Le pass est installé sur le téléphone ?}
C -- Non --> C1[Le client doit d'abord ajouter le pass]
C -- Oui --> D{Vous avez modifié le bon objet ?}
D -- Non --> D1[Template ou pass client : voir le tableau]
D -- Oui --> E{Le téléphone a du réseau et les mises à jour actives ?}
E -- Non --> E1[Mise à jour à la prochaine connexion]
E -- Oui --> F[Contactez le support avec l'identifiant du client et l'heure de l'appel]
```
Toujours bloqué ? [Contactez le support](#support) en précisant l’identifiant du client et l’heure de l’appel.
## 1. L’appel a-t-il vraiment réussi ?
Regardez le code HTTP et le corps de la réponse.
- `NOTHING_TO_UPDATE` (204) : les valeurs envoyées sont identiques aux valeurs actuelles. Rien ne part.
- Erreur `INVALID_MULTIPART` ou `UNSUPPORTED_MEDIA_TYPE` : mauvais Content-Type. Voir [Erreurs API fréquentes](/kb/troubleshooting/common-api-errors).
- Opération en masse : la réponse immédiate dit seulement que l’opération est acceptée. Vérifiez son résultat avec .
## 2. Le pass est-il installé ?
Un pass envoyé mais jamais ajouté au Wallet ne reçoit aucune mise à jour : il n’existe pas encore sur le téléphone.
Vérifiez le statut du client avec ou , ou écoutez le webhook `pass.installed`. S’il n’a pas installé, relancez-le avec .
Le client a peut-être **supprimé** le pass (webhook `pass.uninstalled`). Il doit le rajouter depuis son lien.
## 3. Avez-vous modifié le bon objet ?
| Vous voulez changer… | Le bon appel |
|---|---|
| Le gain (points, cagnotte) d’un client | , ou depuis la caisse |
| Le nom, l’email, le type d’un client | |
| Le strip ou les infos d’un seul client | |
| Le design de la carte de fidélité pour tous | |
| L’horaire d’un trajet | |
| Le billet d’un seul voyageur | |
| Un coupon d’un client | |
| Une réservation d’hôtel | |
## 4. Le pass est-il dans un état final ?
Un pass annulé ou expiré ne se met plus à jour : `PASS_ALREADY_CANCELED`, `PASS_ALREADY_EXPIRED`.
## 5. Côté téléphone
- **Pas de réseau** : la mise à jour arrive à la prochaine connexion.
- **Mises à jour automatiques désactivées** : sur iPhone, le client peut couper les mises à jour d’un pass dans ses détails. Il peut aussi tirer vers le bas sur le verso du pass pour forcer un rafraîchissement.
- **Délai** : la mise à jour passe par les serveurs d’Apple ou de Google. Elle n’est pas toujours instantanée.
## 6. La valeur a changé, mais pas de notification ?
C’est normal dans certains cas : une mise à jour n’affiche une notification que si le champ modifié est configuré pour notifier, et si la règle de notification correspondante est active (`communicationRules`, ). Voir [Notifications push](/kb/push-notifications).
## Pour aller plus loin
- [Cycle de vie d’un pass](/kb/concepts/pass-lifecycle)
- [Apple Wallet vs Google Wallet](/kb/concepts/apple-vs-google-wallet)
## API reference
The complete API contract (every endpoint, parameter, schema and error) is the OpenAPI file: https://developers.eldowallet.fr/openapi.fr.yaml