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

# Confirmer un paiement par OTP

> Deuxième étape pour les réseaux qui exigent une confirmation côté client après le push initial

<Note>
  Concerne certains réseaux seulement (par exemple Wizall au Sénégal ou Coris au Bénin, liste non exhaustive) — la plupart des paiements mobile money n'ont pas besoin de cette étape. Si le réseau ne la supporte pas, l'appel échoue avec `400 otp_not_applicable`.
</Note>

<Warning>
  `422 otp_confirmation_failed` est un message volontairement générique — le détail de l'erreur gateway n'est jamais exposé tel quel.
</Warning>


## OpenAPI

````yaml api-reference/openapi.json POST /payments/{payment_id}/confirm-otp/
openapi: 3.1.0
info:
  title: SasPay API
  description: >-
    API d'encaissement et de paiement mobile money/carte pour l'Afrique de
    l'Ouest et du Centre. Toutes les routes marchand nécessitent une clé API
    secrète (header Authorization: Bearer sk_...).
  version: 1.0.0
servers:
  - url: https://api.saspay.me/api/v1
security:
  - bearerAuth: []
paths:
  /payments/{payment_id}/confirm-otp/:
    post:
      tags:
        - Paiements
      summary: Confirmer un paiement par OTP
      description: >-
        Deuxième étape pour les réseaux qui exigent une confirmation côté client
        après le push initial (par exemple Wizall au Sénégal ou Coris au Bénin,
        liste non exhaustive).
      parameters:
        - name: payment_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - otp
              properties:
                otp:
                  type: string
                  example: '482913'
            example:
              otp: '482913'
      responses:
        '200':
          description: Résultat de la confirmation
          content:
            application/json:
              example:
                message: OTP confirmé
                id: 9c3f2a10-4b7e-4f1a-9d2e-9b6a7c1e4a02
                status: SUCCESS
        '400':
          description: Le réseau de cette transaction ne supporte pas la confirmation OTP
          content:
            application/json:
              example:
                message: Ce moyen de paiement ne nécessite pas de confirmation OTP.
                code: otp_not_applicable
        '404':
          description: Paiement introuvable
          content:
            application/json:
              example:
                message: Transaction introuvable.
                code: not_found
        '409':
          description: >-
            Transaction dans un état incompatible avec la confirmation OTP.
            Codes possibles : `not_pending`, `no_gateway`, `no_attempt`.
          content:
            application/json:
              example:
                message: Aucune tentative réussie à confirmer sur cette transaction.
                code: no_attempt
        '422':
          description: >-
            Échec de la confirmation — message volontairement générique, ne
            fuite jamais le détail gateway
          content:
            application/json:
              example:
                message: >-
                  Échec de la confirmation du code. Vérifiez le code ou
                  réessayez.
                code: otp_confirmation_failed
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: sk_live_... / sk_test_...
      description: >-
        Clé API secrète du marchand — header Authorization: Bearer sk_live_xxx
        (ou sk_test_xxx en environnement de test).

````