> ## 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.

# Vérifier un code OTP

> Transmettre un code OTP à un contributeur tiers pour validation, dans le cadre d'un enrôlement.

Cet appel transmet un code OTP **au contributeur tiers émetteur** de l'instrument de paiement, pour qu'il le valide. Si le code est correct, l'usager est autorisé à poursuivre son parcours.

Il complète le cycle ouvert par [`POST /check-existence`](/endpoints/wallets/check-existence) : lorsque cet appel signale qu'un instrument n'est pas encore connu de GIMpay, un OTP part vers le numéro rattaché au compte. C'est ce code que vous validez ici, avant de procéder à l'enrôlement.

<Note>
  Distinguez bien les deux endpoints OTP :

  | Endpoint                                     | Usage                                                                       |
  | -------------------------------------------- | --------------------------------------------------------------------------- |
  | [`POST /otp/debit`](/endpoints/otp/generate) | Sécuriser une **opération de débit** — le code part ensuite dans `authData` |
  | `POST /otp/confirm` *(cette page)*           | Valider un code auprès d'un **contributeur tiers**, lors d'un enrôlement    |
</Note>

## Identifier le compte

Les cinq champs sont **tous obligatoires**. Ils désignent le compte chez le contributeur tiers, pas encore une entité GIMpay. Puisqu'à ce stade l'instrument n'est justement pas enrôlé :

| Champ                     | Rôle                                                                |
| ------------------------- | ------------------------------------------------------------------- |
| `codeOtp`                 | Le code saisi par l'usager                                          |
| `identifiantCompte`       | L'identifiant du compte chez le contributeur (code client, MSISDN…) |
| `indicatif`               | Indicatif international **sans** le symbole `+`                     |
| `numero`                  | Numéro local du téléphone                                           |
| `refContributeurEmetteur` | Le contributeur qui a émis l'OTP                                    |

<Warning>
  `indicatif` et `numero` doivent reprendre **exactement** les valeurs envoyées à [`POST /check-existence`](/endpoints/wallets/check-existence). Le contributeur associe l'OTP à ce couple : une divergence, même de formatage, peut faire échouer la validation.
</Warning>

## Points de vigilance

<AccordionGroup>
  <Accordion title="Un 400 ne distingue pas code faux et donnée mal formée" icon="circle-exclamation">
    La spécification décrit le `400` comme « une donnée fournie est incorrecte ou invalide ». Ce qui couvre aussi bien un code OTP erroné qu'un `indicatif` mal formaté. Inspectez le champ `message` de la réponse pour orienter le message affiché à l'usager.
  </Accordion>
</AccordionGroup>

## Réponses

Un `200` signifie que le code est valide. Le corps utile est un booléen dans `body`, à l'intérieur de l'enveloppe commune `{ message, status, body, timestamp }`.

## Et ensuite ?

<CardGroup cols={2}>
  <Card title="Enrôler l'usager" icon="user-plus" href="/endpoints/users/enroll">
    Une fois l'OTP validé, créez l'usager et son premier instrument.
  </Card>

  <Card title="Vérifier l'existence" icon="magnifying-glass" href="/endpoints/wallets/check-existence">
    L'étape qui déclenche l'envoi de cet OTP.
  </Card>
</CardGroup>


## OpenAPI

````yaml openapi.json POST /api/v1/otp/confirm
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/otp/confirm:
    post:
      tags:
        - OTP
      summary: Transmettre un OTP pour confirmation
      operationId: confirmOtp
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OtpConfirmRequest'
      responses:
        '200':
          $ref: '#/components/responses/BooleanBody'
        '401':
          $ref: '#/components/responses/Error401'
        '404':
          $ref: '#/components/responses/Error404'
        '500':
          $ref: '#/components/responses/Error500'
components:
  schemas:
    OtpConfirmRequest:
      type: object
      required:
        - refContributeurEmetteur
        - identifiantCompte
        - codeOtp
        - numero
        - indicatif
      properties:
        refContributeurEmetteur:
          type: string
          description: >-
            La référence du contributeur émetteur de l'instrument de paiement à
            enrôler
        identifiantCompte:
          type: string
          description: Identifiant du compte chez le contributeur tiers.
        codeOtp:
          type: string
          example: '123456'
          description: Code OTP saisi par l'usager.
        numero:
          type: string
          minLength: 8
          maxLength: 10
          description: Numéro local du téléphone.
        indicatif:
          type: string
          minLength: 1
          maxLength: 3
          description: Indicatif international pays, sans le symbole +.
    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.
    ErrorEnvelope:
      allOf:
        - $ref: '#/components/schemas/ApiEnvelope'
        - type: object
          properties:
            body:
              nullable: true
  responses:
    BooleanBody:
      description: Succès. Le `body` de l'enveloppe est un booléen.
      content:
        application/json:
          schema:
            allOf:
              - $ref: '#/components/schemas/ApiEnvelope'
              - type: object
                properties:
                  body:
                    type: boolean
    Error401:
      description: Non autorisé — jeton manquant, invalide ou expiré.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    Error404:
      description: Ressource introuvable.
      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`.

````