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

# Demander un retrait

> Retrait de votre solde disponible vers une méthode de retrait vérifiée

<Warning>
  Un retrait fait sortir de l'argent réel de la plateforme — le header `Idempotency-Key` est **requis**. Sans lui, deux requêtes identiques (double-clic, retry réseau) créeraient deux retraits distincts, débitant chacun votre solde séparément. Voir [Idempotence](/api-reference/introduction#idempotence).
</Warning>

<Note>
  Nécessite une clé API avec le scope `PAYOUT`. La méthode de retrait ciblée doit appartenir à votre marchand et être `is_verified: true` — une méthode fraîchement créée ne l'est jamais, un administrateur doit la vérifier au préalable. Toutes les erreurs métier (`invalid_payout_method`, `payout_method_not_verified`, `wallet_frozen`, `insufficient_balance`) sont renvoyées en `422`.
</Note>


## OpenAPI

````yaml api-reference/openapi.json POST /settlements/
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:
  /settlements/:
    post:
      tags:
        - Retraits
      summary: Demander un retrait
      description: >-
        Nécessite un header Idempotency-Key (argent réel qui quitte la
        plateforme) et une clé API de scope PAYOUT. La méthode de retrait doit
        appartenir au marchand et être vérifiée (is_verified=true).
      parameters:
        - name: Idempotency-Key
          in: header
          required: true
          schema:
            type: string
            format: uuid
          description: >-
            Valeur unique par tentative logique de retrait — rejouer la même clé
            avec le même corps renvoie la réponse d'origine.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                payout_method:
                  type: string
                  format: uuid
                country:
                  type: string
                  description: Code ISO2 du pays, ex BJ
                requested_amount:
                  type: string
                  format: decimal
              required:
                - payout_method
                - country
                - requested_amount
            example:
              payout_method: b3e1c2d4-1111-2222-3333-444455556666
              country: BJ
              requested_amount: '150000.00'
      responses:
        '201':
          description: Retrait créé
          content:
            application/json:
              example:
                id: 9f0a1b2c-1111-2222-3333-444455556666
                reference: 6c9e1a2b-3333-4444-5555-666677778888
                merchant: 8a1f5c3e-0000-1111-2222-333344445555
                payout_method: b3e1c2d4-1111-2222-3333-444455556666
                country: BJ
                requested_amount: '150000.00'
                fee_charge_mode: DEDUCTED
                client_fee: '1500.00'
                gateway_fee: '500.00'
                platform_fee: '1000.00'
                fee_config: standard_payout_fee
                debited_amount: '150000.00'
                net_amount: '148500.00'
                currency: XOF
                status: PENDING
                approved_by_admin: null
                approved_at: null
                executed_at: null
                completed_at: null
                proof_url: null
                failure_reason: null
                created_at: '2026-08-12T10:05:00Z'
                updated_at: '2026-08-12T10:05:00Z'
        '422':
          description: >-
            Erreur métier — invalid_payout_method, payout_method_not_verified,
            wallet_frozen ou insufficient_balance
          content:
            application/json:
              example:
                message: Méthode de payout non vérifiée.
                code: payout_method_not_verified
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).

````