> For the complete documentation index, see [llms.txt](https://docs.thewalletcrew.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.thewalletcrew.io/developers-guides/fr/integration-guides/wallet/pass-lifecycle.md).

# Gérez le cycle de vie des cartes avec l’API

## Gérez le cycle de vie des cartes avec l'API

L'API Wallet Crew gère une carte de la création à la suppression du Wallet. Elle prend en charge les mises à jour de carte, les notifications Wallet et les événements du cycle de vie pour Apple Wallet et Google Wallet.

Utilisez ce guide pour choisir l'action de cycle de vie appropriée. Utilisez le [Référence de l'API](https://docs.thewalletcrew.io/api-reference) pour les schémas, les paramètres et les réponses.

<details>

<summary><strong>Exemples concrets</strong></summary>

* Un détaillant crée une carte de fidélité à l'aide d'un identifiant client CRM.
* Une compagnie aérienne met à jour les informations de porte d'embarquement et envoie une actualisation du Wallet.
* Une plateforme d'événements enregistre la suppression du Wallet via `Carte:Uninstalled`.

</details>

### Avant de gérer une carte

Les cartes utilisent des identifiants pour relier chaque carte Wallet à des enregistrements externes. Ces identifiants permettent aux connecteurs de récupérer les dernières données sources lors du rendu.

Revue [Données de la carte et synchronisation](/developers-guides/fr/pass-architecture/pass-data-and-sync.md) avant de concevoir une intégration. Utilisez [Structure](/developers-guides/fr/pass-architecture/structure.md) pour choisir des clés d'identifiant stables.

### Modèle d'état de la carte

Wallet Crew ne dispose d'aucun champ d'état universel pour les cartes. Les données de la carte définissent l'état. [Modèles Liquid](/developers-guides/fr/integration-guides/wallet/liquid-templating.md) associent ces données aux champs natifs du Wallet.

Apple Wallet prend en charge ces champs liés à l'état :

* `voided` — un booléen qui marque la carte comme invalide dans le Wallet. Réglez-le sur `false` pour annuler la modification.
* `expirationDate` — une date ISO 8601 qui définit quand la carte expire.

Google Wallet prend en charge ces champs liés à l'état :

* `state` — l'un des `ACTIVE`, `COMPLETED`, `EXPIRED`, ou `INACTIVE`.
* `validTimeInterval` — la fenêtre temporelle pendant laquelle la carte reste valide.

Mappez les champs pertinents dans les modèles Apple Wallet et Google Wallet. L'état affiché ne change qu'après un nouveau rendu de la carte.

{% hint style="info" %}
Wallet Crew ne dispose d'aucun état de suppression logicielle ni d'archivage. L'API ne supprime pas les enregistrements de carte. Pour désactiver une carte, mettez à jour le champ d'état de la plateforme concernée.
{% endhint %}

### Création d'une carte

Créez une carte via l'opération ci-dessous. Fournissez au moins un identifiant externe du système source.

Wallet Crew valide les identifiants via l'une de ces méthodes d'autorisation :

* signature HMAC
* Secret enregistré
* Liste d'autorisation de sécurité
* `Carte.Write` scope

Une carte requiert des données à la création. Wallet Crew récupère les données du connecteur à la demande lors du premier rendu de la carte. Incluez des données qui permettent à un connecteur de localiser l'enregistrement externe.

## Create a new pass.

> \*\*Authorization:\*\* Requires \`Pass.Write\` scope OR valid identifier validation (HMAC signature, secret, or allowlisted unsigned).\
> \
> \*\*Security:\*\* Each identifier must validate via: (1) HMAC (key.hmac), (2) registered secret (key.secret), (3) security allowlist, or (4) Pass.Write scope. Omit identifiers if JWT contains customer claims.\
> \
> \*\*Pass Type:\*\* Template to use. Must match file in tenant \`server/passes/\` config.\
> \
> \*\*Use Cases:\*\* API-based pass creation; customer self-service with HMAC; bulk imports.\
> \
> \*\*Example — create with HMAC-signed identifier:\*\*\
> \`\`\`\
> POST /api/{tenantId}/passes?passType=loyalty\
> &#x20;           \
> {\
> &#x20; "identifiers": {\
> &#x20;   "shopify.customerId": "12345",\
> &#x20;   "shopify.customerId.hmac": "{hmac-of-12345}"\
> &#x20; },\
> &#x20; "additionalData": { "loyaltyTier": "silver" }\
> }\
> \`\`\`\
> \*\*Example — create with Pass.Write scope (no HMAC required):\*\*\
> \`\`\`\
> POST /api/{tenantId}/passes?passType=loyalty\
> &#x20;           \
> {\
> &#x20; "identifiers": { "shopify.customerId": "12345" },\
> &#x20; "additionalData": { "loyaltyTier": "silver" }\
> }\
> \`\`\`

````json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Pass"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["ScopedAuthorizeRequirement"]},{"apiKey":["ScopedAuthorizeRequirement"]}],"components":{"securitySchemes":{"admin-bearer":{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://auth.neostore.cloud/authorize?audience=https://app.neostore.cloud/api/","scopes":{}}}},"apiKey":{"type":"apiKey","name":"X-API-KEY","in":"header"}},"schemas":{"CreatePassData":{"type":"object","allOf":[{"$ref":"#/components/schemas/PassData"}],"properties":{"extensions":{"type":["null","object"],"additionalProperties":{"type":"null"},"description":"Extensibility data related to this pass."}},"additionalProperties":false,"description":"Data payload for pass creation operations."},"PassData":{"type":"object","properties":{"identifiers":{"type":"object","additionalProperties":{"type":"string"},"description":"External identifiers of the customer for this pass. Keys must not start with `id.`; common examples are `y2.customerId` or `shopify.customerId`.\nUse an empty value to remove an identifier. Leave the collection empty to keep existing identifiers unchanged."},"additionalData":{"type":["null","object"],"additionalProperties":{"type":"null"},"description":"Arbitrary data to persist with the pass (for example, loyalty tier, store code, or campaign flags)."}},"additionalProperties":false},"ProblemDetails":{"type":"object","properties":{"type":{"type":["null","string"]},"title":{"type":["null","string"]},"status":{"type":["null","integer"],"format":"int32"},"detail":{"type":["null","string"]},"instance":{"type":["null","string"]}},"additionalProperties":{}},"HttpValidationProblemDetails":{"type":"object","allOf":[{"$ref":"#/components/schemas/ProblemDetails"}],"properties":{"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"additionalProperties":{}}}},"paths":{"/api/{tenantId}/passes":{"post":{"tags":["Pass"],"summary":"Create a new pass.","description":"**Authorization:** Requires `Pass.Write` scope OR valid identifier validation (HMAC signature, secret, or allowlisted unsigned).\n\n**Security:** Each identifier must validate via: (1) HMAC (key.hmac), (2) registered secret (key.secret), (3) security allowlist, or (4) Pass.Write scope. Omit identifiers if JWT contains customer claims.\n\n**Pass Type:** Template to use. Must match file in tenant `server/passes/` config.\n\n**Use Cases:** API-based pass creation; customer self-service with HMAC; bulk imports.\n\n**Example — create with HMAC-signed identifier:**\n```\nPOST /api/{tenantId}/passes?passType=loyalty\n            \n{\n  \"identifiers\": {\n    \"shopify.customerId\": \"12345\",\n    \"shopify.customerId.hmac\": \"{hmac-of-12345}\"\n  },\n  \"additionalData\": { \"loyaltyTier\": \"silver\" }\n}\n```\n**Example — create with Pass.Write scope (no HMAC required):**\n```\nPOST /api/{tenantId}/passes?passType=loyalty\n            \n{\n  \"identifiers\": { \"shopify.customerId\": \"12345\" },\n  \"additionalData\": { \"loyaltyTier\": \"silver\" }\n}\n```","parameters":[{"name":"passType","in":"query","description":"Type of the pass to create. Must match a file in the tenant `server/passes/` configuration.","schema":{"type":"string"}},{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Data related to this pass.","content":{"application/json":{"schema":{"description":"Data payload for pass creation operations.","$ref":"#/components/schemas/CreatePassData"}},"text/json":{"schema":{"description":"Data payload for pass creation operations.","$ref":"#/components/schemas/CreatePassData"}},"application/*+json":{"schema":{"description":"Data payload for pass creation operations.","$ref":"#/components/schemas/CreatePassData"}}}},"responses":{"200":{"description":"Pass created successfully.","content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"string"}},"text/json":{"schema":{"type":"string"}}}},"401":{"description":"Identifiers cannot be validated and caller lacks Pass.Write scope.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}}}}}}
````

{% hint style="info" %}
La création d'une carte ne récupère pas immédiatement les données du connecteur. La première installation ou le premier rendu déclenche cette récupération.
{% endhint %}

### Mise à jour des données de la carte

Utilisez l'opération ci-dessous pour mettre à jour les données de la carte et demander une actualisation du Wallet. Les champs soumis fusionnent avec les données de carte existantes. Les champs omis restent inchangés. Une valeur vide ou `null` supprime le champ soumis.

## Update a pass and optionally its type.

> \*\*Authorization:\*\* Requires \`Pass.Write\` scope.\
> \
> \*\*Identification:\*\* Use internal \`id\` (e.g., \`id=Ed34kg3oA47\`) or external identifiers with \`id.\` prefix (e.g., \`id.y2.customerId=1233332\`). Multiple identifiers must match exactly one pass.\
> \
> \*\*Data:\*\* Merged with existing data. Empty/null removes fields; omitted fields unchanged.\
> \
> \*\*Metadata:\*\* Set \`options.UpdateMetadata=true\` for recomputation (slower). Set \`options.BypassQueue=true\` for synchronous updates instead of queueing.\
> \
> \*\*Type:\*\* Optionally convert pass to different type.\
> \
> \*\*Use Cases:\*\* Update identifiers/metadata; push notifications; type conversion; bulk updates; urgent changes.\
> \
> \*\*Example — update by platform pass ID:\*\*\
> \`\`\`\
> PATCH /api/{tenantId}/passes?id=xK9mP2nQr7sT\
> &#x20;           \
> {\
> &#x20; "additionalData": { "loyaltyTier": "gold" },\
> &#x20; "options": { "updateMetadata": true }\
> }\
> \`\`\`\
> \*\*Example — update by external identifier:\*\*\
> \`\`\`\
> PATCH /api/{tenantId}/passes?id.shopify.customerId=12345\
> &#x20;           \
> {\
> &#x20; "identifiers": { "email": "<user@example.com>" },\
> &#x20; "additionalData": { "loyaltyTier": "gold" },\
> &#x20; "options": { "updateMetadata": false }\
> }\
> \`\`\`

````json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Pass"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["ScopedAuthorizeRequirement"]},{"apiKey":["ScopedAuthorizeRequirement"]}],"components":{"securitySchemes":{"admin-bearer":{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://auth.neostore.cloud/authorize?audience=https://app.neostore.cloud/api/","scopes":{}}}},"apiKey":{"type":"apiKey","name":"X-API-KEY","in":"header"}},"schemas":{"SingleUpdatePassData":{"type":"object","allOf":[{"$ref":"#/components/schemas/UpdatePassData_SingleUpdatePassDataOptions"}],"properties":{"bypassQueue":{"type":"boolean","description":"Indicates whether the push update should bypass the queue and run immediately. Queuing helps protect the system load and should only be bypassed when required.","default":false,"deprecated":true}},"additionalProperties":false,"description":"Data payload for single pass update operations."},"UpdatePassData_SingleUpdatePassDataOptions":{"type":"object","properties":{"identifiers":{"type":"object","additionalProperties":{"type":"string"},"description":"External identifiers of the customer for this pass. Keys must not start with `id.`; common examples are `y2.customerId` or `shopify.customerId`.\nUse an empty value to remove an identifier. Leave the collection empty to keep existing identifiers unchanged."},"additionalData":{"type":["null","object"],"additionalProperties":{"type":"null"},"description":"Arbitrary data to persist with the pass (for example, loyalty tier, store code, or campaign flags)."},"passType":{"type":["null","string"],"description":"Optional pass type to convert the pass to."},"updateMetadata":{"type":"boolean","description":"Specifies if passes metadata should be updated. Updating metadata is time consuming and could be avoided for notification only push update","default":false,"deprecated":true},"options":{"description":"Options for single pass update operations. Metadata recomputation is enabled by default.\nUse Neo.Web.Api.Controllers.PassController.SingleUpdatePassDataOptions.BypassQueue to apply the update synchronously instead of queueing.","$ref":"#/components/schemas/SingleUpdatePassDataOptions"}},"additionalProperties":false},"SingleUpdatePassDataOptions":{"type":"object","allOf":[{"description":"Options used when updating passes.","$ref":"#/components/schemas/UpdatePassDataOptions"}],"properties":{"bypassQueue":{"type":"boolean","description":"Indicates whether the push update should bypass the queue and run immediately. Queuing helps protect the system load and should only be bypassed when required.","default":false}},"additionalProperties":false,"description":"Options for single pass update operations. Metadata recomputation is enabled by default.\nUse Neo.Web.Api.Controllers.PassController.SingleUpdatePassDataOptions.BypassQueue to apply the update synchronously instead of queueing."},"UpdatePassDataOptions":{"type":"object","properties":{"updateMetadata":{"type":"boolean","description":"When true, recompute and persist pass metadata. Updating metadata is slower and is usually unnecessary for notification-only updates."},"correlationId":{"type":["null","string"],"description":"Groups related updates under the same correlationId. Useful for batch updates (for example nightly jobs) to make retries and logs traceable."}},"additionalProperties":false,"description":"Options used when updating passes."},"ProblemDetails":{"type":"object","properties":{"type":{"type":["null","string"]},"title":{"type":["null","string"]},"status":{"type":["null","integer"],"format":"int32"},"detail":{"type":["null","string"]},"instance":{"type":["null","string"]}},"additionalProperties":{}},"HttpValidationProblemDetails":{"type":"object","allOf":[{"$ref":"#/components/schemas/ProblemDetails"}],"properties":{"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"additionalProperties":{}}}},"paths":{"/api/{tenantId}/passes":{"patch":{"tags":["Pass"],"summary":"Update a pass and optionally its type.","description":"**Authorization:** Requires `Pass.Write` scope.\n\n**Identification:** Use internal `id` (e.g., `id=Ed34kg3oA47`) or external identifiers with `id.` prefix (e.g., `id.y2.customerId=1233332`). Multiple identifiers must match exactly one pass.\n\n**Data:** Merged with existing data. Empty/null removes fields; omitted fields unchanged.\n\n**Metadata:** Set `options.UpdateMetadata=true` for recomputation (slower). Set `options.BypassQueue=true` for synchronous updates instead of queueing.\n\n**Type:** Optionally convert pass to different type.\n\n**Use Cases:** Update identifiers/metadata; push notifications; type conversion; bulk updates; urgent changes.\n\n**Example — update by platform pass ID:**\n```\nPATCH /api/{tenantId}/passes?id=xK9mP2nQr7sT\n            \n{\n  \"additionalData\": { \"loyaltyTier\": \"gold\" },\n  \"options\": { \"updateMetadata\": true }\n}\n```\n**Example — update by external identifier:**\n```\nPATCH /api/{tenantId}/passes?id.shopify.customerId=12345\n            \n{\n  \"identifiers\": { \"email\": \"user@example.com\" },\n  \"additionalData\": { \"loyaltyTier\": \"gold\" },\n  \"options\": { \"updateMetadata\": false }\n}\n```","parameters":[{"name":"identifiers","in":"query","description":"identifier of the pass. To update a pass with a Wallet Crew internal id only specify `id` (example : `\"id\": \"Ed34kg3oA47\"`) to update a pass with external identifier prefix the key with `id.` (example : `\"id.y2.customerId\": \"1233332\"`) \n\nWhen multiple external identifiers is submitted all identifiers should be found. \nIf more than one pass is found an exception will be thrown.","schema":{"type":"object","additionalProperties":{"type":"string"}}},{"name":"passType","in":"query","description":"type of the pass to update. type name should be one of the file in the `server/passes/` tenant configuration.","schema":{"type":"string"}},{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"data related to this pass. This data will be merge with the existing data.","content":{"application/json":{"schema":{"description":"Data payload for single pass update operations.","$ref":"#/components/schemas/SingleUpdatePassData"}},"text/json":{"schema":{"description":"Data payload for single pass update operations.","$ref":"#/components/schemas/SingleUpdatePassData"}},"application/*+json":{"schema":{"description":"Data payload for single pass update operations.","$ref":"#/components/schemas/SingleUpdatePassData"}}}},"responses":{"200":{"description":"Pass update enqueued or applied successfully."},"404":{"description":"No pass found matching the provided identifiers.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}}}}}}
````

#### Comportement des notifications push

**Mises à jour du backend et de l'appareil**

Les mises à jour de carte opèrent à deux niveaux indépendants :

1. **Mise à jour du backend** — Wallet Crew met à jour l'enregistrement de la carte.
2. **Notification de l'appareil** — Wallet Crew notifie les plateformes Wallet lorsque des enregistrements actifs existent.

La mise à jour du backend s'effectue quel que soit l'état d'installation. La livraison sur l'appareil dépend du fait que la carte reste installée.

**Notification de l'appareil**

Après les mises à jour du backend, Wallet Crew tente de notifier Apple Wallet et Google Wallet. La notification dépend des enregistrements actifs :

* Une carte installée peut recevoir une mise à jour via sa plateforme Wallet.
* Une carte désinstallée n'a aucun enregistrement actif, donc aucune notification d'appareil n'est envoyée.
* Une installation ultérieure reçoit la dernière version de la carte de Wallet Crew.

**File d'attente et déduplication**

Wallet Crew met les mises à jour en file d'attente par défaut avec `bypassQueue : false`. La file d'attente protège le débit du système et déduplique le travail. Si une autre mise à jour atteint la même carte avant l'exécution de la tâche en file d'attente, la file d'attente ignore la tâche précédente.

Définissez `bypassQueue : true` pour les mises à jour synchrones urgentes. Utilisez-le pour des changements tels que les mises à jour du statut d'embarquement qui doivent atteindre le Wallet immédiatement.

**Nouveau rendu sur l'appareil**

{% hint style="info" %}
Une notification ne met pas directement à jour une propriété. Lorsqu'un appareil reçoit une notification, son Wallet demande la dernière version de la carte. Wallet Crew récupère des données fraîches du connecteur avant de renvoyer cette version.
{% endhint %}

{% hint style="info" %}
Les mises à jour du backend persistent. Cela permet des mises à jour sûres pendant qu'une carte est désinstallée.
{% endhint %}

Pour les mappages de modèles et les champs de carte, voir [Mettre à jour les données de carte dans les modèles](/developers-guides/fr/integration-guides/wallet/update-pass-data-in-templates.md).

### Envoi d'une notification autonome

Envoyez une notification textuelle sans modifier les données de la carte avec l'opération ci-dessous. La notification apparaît dans l'application Wallet indépendamment d'une mise à jour des données.

Utilisez `content` pour une chaîne simple. Utilisez `localizedContent` pour un objet indexé par des codes de langue ISO 639. Utilisez un seul format de contenu par requête.

## PUT /api/{tenantId}/passes/{passId}/notification

> Send a notification to the pass identified by its pass identifier

```json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Pass"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["ScopedAuthorizeRequirement"]},{"apiKey":["ScopedAuthorizeRequirement"]}],"components":{"securitySchemes":{"admin-bearer":{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://auth.neostore.cloud/authorize?audience=https://app.neostore.cloud/api/","scopes":{}}}},"apiKey":{"type":"apiKey","name":"X-API-KEY","in":"header"}},"schemas":{"NotifyRequest":{"type":"object","properties":{"content":{"type":["null","string"],"description":"Could be null if LocalizedContent is specified"},"localizedContent":{"type":["null","object"],"additionalProperties":{"type":"string"},"description":"Localized notification content by language code.\nKey: ISO 639-1 code or \"iso2-region\" (e.g., \"en\", \"en-US\").\nValue: The notification content for that language.","propertyNames":{"pattern":"^[a-z]{2}(-[A-Z]{2})?$"}},"options":{"$ref":"#/components/schemas/NotifyRequestOptions"}},"additionalProperties":false},"NotifyRequestOptions":{"type":"object","properties":{"updateData":{"type":"boolean","description":"Indicate if pass data should also be updated when the notification is sent.","default":false},"correlationId":{"maxLength":100,"minLength":10,"type":["null","string"],"description":"Correlation identifier to group and trace related API calls."}},"additionalProperties":false},"ProblemDetails":{"type":"object","properties":{"type":{"type":["null","string"]},"title":{"type":["null","string"]},"status":{"type":["null","integer"],"format":"int32"},"detail":{"type":["null","string"]},"instance":{"type":["null","string"]}},"additionalProperties":{}},"HttpValidationProblemDetails":{"type":"object","allOf":[{"$ref":"#/components/schemas/ProblemDetails"}],"properties":{"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"additionalProperties":{}}}},"paths":{"/api/{tenantId}/passes/{passId}/notification":{"put":{"tags":["Pass"],"summary":"Send a notification to the pass identified by its pass identifier","parameters":[{"name":"passId","in":"path","description":"The internal identifier of the pass","required":true,"schema":{"type":"string"}},{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The notification content","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotifyRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/NotifyRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/NotifyRequest"}}}},"responses":{"200":{"description":"OK"},"404":{"description":"Not Found","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}}}}}}
```

### Suppression du Wallet

Lorsqu'un utilisateur final supprime une carte, la plateforme Wallet notifie Wallet Crew. Apple envoie une requête HTTP `DELETE` à la route d'enregistrement Apple. Google envoie un message avec `eventType = "del"`.

Wallet Crew envoie `Carte:Uninstalled` lorsque le dernier enregistrement actif atteint zéro. La suppression d'une carte de l'un de deux iPhones n'envoie pas l'événement.

La charge utile du webhook comprend :

* `passId`, `passType`, `identifiants`, et `métadonnées`
* `appareil` et `deviceIdentifier` — Google définit `deviceIdentifier` sur `null`
* `registrationInformation.activeRegistrationCount` et `registrationInformation.totalRegistrationCount`

Wallet Crew transmet l'événement via le point de terminaison de webhook configuré. La requête comprend `X-NEOSTORE-EVENTNAME: Carte:Uninstalled`.

{% hint style="info" %}
La suppression d'une carte d'un Wallet ne supprime pas son enregistrement dans Wallet Crew. La carte peut être réinstallée ultérieurement.
{% endhint %}

Configurez la livraison du point de terminaison et validez les signatures dans [Webhooks](/developers-guides/fr/integration-guides/webhooks.md).

### FAQ

<details>

<summary><strong>La mise à jour des données de carte modifie-t-elle immédiatement une carte installée ?</strong></summary>

Non. La mise à jour crée une nouvelle version de carte et déclenche une actualisation du Wallet. Apple Wallet ou Google Wallet demande alors cette version.

</details>

<details>

<summary><strong>Une carte peut-elle être supprimée via l'API ?</strong></summary>

Non. L'API ne supprime pas les enregistrements de carte. Définissez les champs d'état spécifiques à la plateforme pour désactiver une carte.

</details>

<details>

<summary><strong>Pourquoi une mise à jour du Wallet n'a-t-elle pas été distribuée ?</strong></summary>

La distribution push nécessite un enregistrement de fournisseur actif. Confirmez que la carte a été installée sur la plateforme Wallet concernée.

</details>

<details>

<summary><strong>Puis-je utiliser les mises à jour échouées pour détecter les cartes désinstallées ?</strong></summary>

Non. Les mises à jour n'échouent pas lorsqu'une carte est désinstallée. Wallet Crew traite avec succès la mise à jour du backend. Aucun push vers l'appareil n'est envoyé lorsque la carte n'a aucun enregistrement actif.

Vérifiez l'état d'installation avec le [point de terminaison des détails de la carte](https://docs.thewalletcrew.io/api-reference). Sinon, écoutez les [événements Carte:Installed et Carte:Uninstalled](/developers-guides/fr/integration-guides/wallet/pass-lifecycle.md#wallet-removal).

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.thewalletcrew.io/developers-guides/fr/integration-guides/wallet/pass-lifecycle.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
