> ## Documentation Index
> Fetch the complete documentation index at: https://apidocs.gimpayapp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Enrôler une carte bancaire

> Rattacher une carte bancaire de type débit ou prépayée à un usager déjà enrôlé dans GIMpay.

Cet appel rattache une **carte bancaire supplémentaire** à un usager existant. Pour le premier instrument d'un nouvel usager, utilisez plutôt [l'enrôlement d'usager](/endpoints/users/enroll).

## Champs requis selon le type de carte

Quatre champs sont exigés dans tous les cas — `refUsager`, `refContributeurDemandeur`, `refContributeurEmetteur` et `typeCarteBancaire`. Les autres dépendent du type de carte :

| `typeCarteBancaire` | Champs à fournir en plus |
| ------------------- | ------------------------ |
| `DEBIT`             | `pan`, `cvv`             |
| `PREPAYEE`          | `codeClient`             |

<Note>
  Le schéma OpenAPI marque `codeClient`, `pan`, `cvv` et `dateExpiration` comme facultatifs, car aucun n'est requis pour *tous* les types. La combinaison réellement attendue est celle du tableau ci-dessus.
</Note>

## Format des données de carte

| Champ            | Format attendu                                                      |
| ---------------- | ------------------------------------------------------------------- |
| `pan`            | Les **quatre derniers chiffres** de la carte, pas le numéro complet |
| `cvv`            | Le code à 3 chiffres au dos de la carte                             |
| `dateExpiration` | `MM/yyyy` — par exemple `05/2028`                                   |

<Warning>
  Ne journalisez jamais le `pan` complet ni le `cvv`, que ce soit côté serveur ou dans les traces de votre application. GIMpay ne retourne d'ailleurs qu'un PAN masqué en lecture, et le `cvv` est systématiquement nul dans les réponses.
</Warning>

## Points de vigilance

<AccordionGroup>
  <Accordion title="typeCarteBancaire accepte DEBIT ou PREPAYEE" icon="credit-card">
    Ce sont les deux seules valeurs du contrat GIMgar Sud. Voir le [glossaire](/glossary/enumerations#typecartebancaire).

    Une valeur `CREDIT` apparaît dans le suivi d'implémentation du SDK Flutter mais ne figure ni dans la spécification technique v1.1, ni dans le schéma OpenAPI servant le playground ci-dessous. Écart non arbitré — ne vous appuyez pas dessus sans confirmation de GIM.
  </Accordion>

  <Accordion title="Aucune valeur de réseau de carte n'est définie" icon="circle-question">
    Le contrat ne prévoit pas de champ pour le réseau (schema) : `typeCarteBancaire` porte le mode de fonctionnement de la carte, pas son réseau d'acceptation.
  </Accordion>
</AccordionGroup>

## Réponses

Le corps utile arrive dans `body`, à l'intérieur de l'enveloppe commune `{ message, status, body, timestamp }`, et contient `refInstrumentPaiement` ainsi que le PAN sous forme masquée.

## Et ensuite ?

<CardGroup cols={2}>
  <Card title="Vérifier les droits de la carte" icon="shield-check" href="/api-reference/introduction">
    `GET /wallets/{referenceWallet}/authorization`
  </Card>

  <Card title="Exécuter une opération" icon="arrows-rotate" href="/endpoints/operations/execute">
    Utilisez cette carte comme instrument initiateur.
  </Card>
</CardGroup>


## OpenAPI

````yaml openapi.json POST /api/v1/wallets/card
openapi: 3.0.3
info:
  title: Registre des APIs GIM Gar Sud
  version: 1.0.9-sdk0.3.0
  description: >
    APIs exposées par GIM Gar Sud pour permettre aux Contributeurs Tiers de
    Service Financier (CTSF) de consommer les services de GIMpay : enrôlement
    d'usagers et d'instruments de paiement, opérations financières, OTP,
    consentements, documents d'identité et fidélité.
  contact:
    name: Support intégrateurs GimPay
    email: support@it-centrex.com
servers:
  - url: https://egimgarsud.gimpayapp.com
    variables:
      environnement:
        default: egimgarsud
        description: Sous-domaine de l'environnement (sandbox ou production).
security:
  - bearerAuth: []
tags:
  - name: Authentification
  - name: Wallets
    description: Instruments de paiement (cartes, comptes bancaires, mobile wallets)
  - name: Opérations
  - name: OTP
  - name: Usagers
  - name: Bénéficiaires
  - name: MMP favorites
  - name: Pays
  - name: Contributeurs
  - name: Mini-places de marché
  - name: Services
  - name: Terminaux
  - name: Documents
  - name: Consentements & demandes
paths:
  /api/v1/wallets/card:
    post:
      tags:
        - Wallets
      summary: Enrôler une carte bancaire
      operationId: enrollCard
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EnrollCardRequest'
      responses:
        '201':
          description: Carte enrôlée.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiEnvelope'
                  - type: object
                    properties:
                      body:
                        $ref: '#/components/schemas/EnrollCardResponse'
        '400':
          $ref: '#/components/responses/Error400'
        '401':
          $ref: '#/components/responses/Error401'
        '500':
          $ref: '#/components/responses/Error500'
components:
  schemas:
    EnrollCardRequest:
      type: object
      description: >
        Champs conditionnels selon `typeCarteBancaire` : PREPAYEE → seul
        `codeClient` est requis (`pan`, `cvv`, `dateExpiration` interdits) ;
        DEBIT/CREDIT → `pan`, `cvv` et `dateExpiration` sont requis
        (`codeClient` interdit).
      required:
        - refContributeurDemandeur
        - refContributeurEmetteur
        - refUsager
        - typeCarteBancaire
      properties:
        refContributeurDemandeur:
          type: string
          description: >-
            La référence du contributeur demandeur qui demande l'enrôlement de
            l'instrument de paiement
        refContributeurEmetteur:
          type: string
          description: >-
            La référence du contributeur émetteur de l'instrument de paiement à
            enrôler
        refUsager:
          type: string
          description: La reference de l'usager
        typeCarteBancaire:
          $ref: '#/components/schemas/TypeCarteBancaire'
        codeClient:
          type: string
          description: Requis pour PREPAYEE.
        pan:
          type: string
          description: 13 à 19 chiffres. Requis pour DEBIT/CREDIT.
        cvv:
          type: string
          description: Requis pour DEBIT/CREDIT.
        dateExpiration:
          type: string
          description: Requis pour DEBIT/CREDIT.
          pattern: MM/yyyy
    ApiEnvelope:
      type: object
      description: Enveloppe standard de toutes les réponses (sauf auth).
      properties:
        message:
          type: string
          description: Message technique décrivant le résultat de l'appel.
        status:
          type: integer
          description: Code de statut HTTP de la réponse.
        timestamp:
          type: string
          format: date-time
          description: Horodatage de la réponse.
    EnrollCardResponse:
      type: object
      properties:
        refUsager:
          type: string
          description: La reference de l'usager
        libelle:
          type: string
          description: Libellé de l'opération
        pan:
          type: string
          description: >-
            Les 4 derniers chiffres du PAN (Primary Account Number) de la carte
            bancaire
        typeCarteBancaire:
          type: string
          description: Le type de la carte bancaire
          enum:
            - DEBIT
            - PREPAYEE
        reference:
          type: string
          description: Référence unique de la demande.
    TypeCarteBancaire:
      type: string
      enum:
        - DEBIT
        - CREDIT
        - PREPAYEE
    ErrorEnvelope:
      allOf:
        - $ref: '#/components/schemas/ApiEnvelope'
        - type: object
          properties:
            body:
              nullable: true
  responses:
    Error400:
      description: Requête invalide (champ manquant ou mal formé).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    Error401:
      description: Non autorisé — jeton manquant, invalide ou expiré.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    Error500:
      description: Erreur interne du serveur.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Jeton émis par `POST /api/v1/auth/token`.

````