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

# Demander un paiement (bêta)

> Demande à votre client de payer depuis son compte mobile money : il reçoit une demande sur son téléphone et confirme
avec son code PIN. Le résultat arrive par webhook (`mobile_money.collection.completed` ou `.failed`).

- `reference` est **votre** référence unique. Renvoyer la même demande renvoie le même paiement avec `200` :
  votre client n'est jamais débité deux fois. La même référence avec un autre service, montant ou numéro est refusée.
- `webhook_url` et `callback_url` envoyées ici l'emportent sur celles du service.
- Renvoie `201` avec le statut `processing` (ou `pending` si l'opérateur n'a pas encore répondu : nous vérifions pour vous).
- En mode test, le résultat est immédiat (voir [Mode test](/fr/test-mode)).




## OpenAPI

````yaml /fr/openapi.yaml post /mobile-money/collections
openapi: 3.1.0
info:
  title: API KemyPay
  version: '1.0'
  description: >
    KemyPay vous permet d'encaisser des paiements mobile money dans 12 pays
    d'Afrique avec une seule API, avec un solde par

    service, par pays et par devise.


    Chaque requête est authentifiée par une clé API secrète (`sk_live_…` ou
    `sk_test_…`) et doit venir d'une de

    vos adresses IP autorisées. Les réponses utilisent la même enveloppe : `{
    "success": true, "data": …, "meta": … }`, ou

    `{ "success": false, "error": { "code", "message", "details" }, "meta": …
    }`.


    Les encaissements, le calcul de prix et la devinette de l'opérateur sont en
    **bêta** : ils sont en cours de déploiement en production.
  contact:
    name: KemyPay Support
    email: hi@kemypay.com
servers:
  - url: https://api.kemypay.com/v1
    description: Production
security:
  - BearerAuth: []
tags:
  - name: Catalog
    description: Pays, opérateurs, prix et catégories de service
  - name: Services
    description: Vos services (un par application ou activité), validés par notre équipe
  - name: Collections
    description: Encaisser un paiement depuis le compte mobile money d'un client (bêta)
  - name: Balances
    description: Un solde par service, par pays et par devise
paths:
  /mobile-money/collections:
    post:
      tags:
        - Collections
      summary: Demander un paiement (bêta)
      description: >
        Demande à votre client de payer depuis son compte mobile money : il
        reçoit une demande sur son téléphone et confirme

        avec son code PIN. Le résultat arrive par webhook
        (`mobile_money.collection.completed` ou `.failed`).


        - `reference` est **votre** référence unique. Renvoyer la même demande
        renvoie le même paiement avec `200` :
          votre client n'est jamais débité deux fois. La même référence avec un autre service, montant ou numéro est refusée.
        - `webhook_url` et `callback_url` envoyées ici l'emportent sur celles du
        service.

        - Renvoie `201` avec le statut `processing` (ou `pending` si l'opérateur
        n'a pas encore répondu : nous vérifions pour vous).

        - En mode test, le résultat est immédiat (voir [Mode
        test](/fr/test-mode)).
      operationId: createCollection
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCollectionRequest'
      responses:
        '200':
          description: Même référence renvoyée — le paiement existant, inchangé
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    $ref: '#/components/schemas/Collection'
                  meta:
                    $ref: '#/components/schemas/Meta'
        '201':
          description: Paiement demandé
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    $ref: '#/components/schemas/Collection'
                  meta:
                    $ref: '#/components/schemas/Meta'
        '403':
          $ref: '#/components/responses/ServiceNotActive'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
        '503':
          $ref: '#/components/responses/OperatorUnavailable'
components:
  schemas:
    CreateCollectionRequest:
      type: object
      required:
        - service
        - amount
        - currency
        - phone_number
        - reference
      properties:
        service:
          type: string
          format: uuid
          description: Le code du service qui encaisse.
          example: 019a8f2e-4c1b-7d3a-9e55-2b6f0c1d8a47
        amount:
          type: string
          description: >-
            La valeur de la marchandise, en chaîne. Respectez les `decimals` de
            l'opérateur.
          example: '1000'
        currency:
          type: string
          example: XAF
        country:
          type: string
          description: >-
            Vérification facultative. Refusé si l'opérateur est dans un autre
            pays.
          example: CMR
        operator:
          type: string
          description: >-
            Code de l'opérateur (`MTN_CMR`). Facultatif — deviné à partir du
            numéro s'il manque.
          example: MTN_CMR
        phone_number:
          type: string
          description: >-
            Numéro mobile money avec l'indicatif du pays. Les espaces, tirets et
            `+` sont retirés.
          example: '237670000000'
        reference:
          type: string
          description: >-
            Votre propre référence unique (1 à 100 lettres, chiffres, `.` `_`
            `:` `-`). Permet de renvoyer l'appel sans risque.
          example: order-2026-10-29-0001
        fee_bearer:
          type: string
          enum:
            - merchant
            - customer
          description: 'Par défaut : le réglage du service.'
        description:
          type: string
          description: >-
            Affiché à votre client sur la demande de paiement. 4 à 22 lettres,
            chiffres ou espaces.
          example: Afroyamo Premium
        metadata:
          type: object
          description: Jusqu'à 10 clés avec des valeurs texte. Renvoyées dans les webhooks.
          additionalProperties:
            type: string
          example:
            user_id: '42'
        webhook_url:
          type: string
          format: uri
          description: https. L'emporte sur la `webhook_url` du service pour ce paiement.
        callback_url:
          type: string
          format: uri
          description: L'emporte sur la `callback_url` du service pour ce paiement.
    Collection:
      type: object
      properties:
        code:
          type: string
          format: uuid
          example: 019a9c41-7e2d-4b8f-a1c3-5d6e7f8a9b0c
        reference:
          type: string
          example: order-2026-10-29-0001
        service_code:
          type: string
          format: uuid
          example: 019a8f2e-4c1b-7d3a-9e55-2b6f0c1d8a47
        status:
          type: string
          enum:
            - pending
            - processing
            - completed
            - failed
          example: processing
        country:
          type: string
          example: CMR
        operator:
          type: string
          example: MTN_CMR
        phone_number:
          type: string
          example: '237670000000'
        currency:
          type: string
          example: XAF
        value:
          type: string
          description: La valeur de la marchandise que vous avez envoyée.
          example: '1000.00'
        amount:
          type: string
          description: Ce que paie le client.
          example: '1033.00'
        fee:
          type: string
          example: '33.00'
        fee_bearer:
          type: string
          enum:
            - merchant
            - customer
          example: customer
        net_amount:
          type: string
          description: Crédité au solde du service quand le paiement réussit.
          example: '1000.00'
        description:
          type:
            - string
            - 'null'
          example: Afroyamo Premium
        metadata:
          type: object
          additionalProperties:
            type: string
          example:
            user_id: '42'
        failure_code:
          type:
            - string
            - 'null'
          enum:
            - payer_not_found
            - payment_not_approved
            - insufficient_balance
            - payer_limit_reached
            - invalid_phone_number
            - invalid_amount
            - operator_unavailable
            - payment_in_progress
            - expired
            - unknown_error
            - null
          example: null
        failure_message:
          type:
            - string
            - 'null'
          example: null
        operator_transaction_id:
          type:
            - string
            - 'null'
          description: La référence de la transaction chez l'opérateur, une fois payé.
          example: null
        callback_url:
          type:
            - string
            - 'null'
          example: https://afroyamo.com/payment/done
        created_at:
          type: string
          format: date-time
          example: '2026-10-29T10:00:00+00:00'
        completed_at:
          type:
            - string
            - 'null'
          format: date-time
          example: null
    Meta:
      type: object
      properties:
        request_id:
          type: string
          example: a4f8e2c1b3d97056
        timestamp:
          type: string
          format: date-time
          example: '2026-10-29T10:00:00+00:00'
        mode:
          type: string
          enum:
            - test
            - live
          example: live
    Error:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: object
          properties:
            code:
              type: string
              example: VALIDATION_ERROR
            message:
              type: string
              example: Some fields of the payment are missing or invalid.
            details:
              type: object
              additionalProperties: true
              example:
                phone_number: >-
                  Required: the mobile money number with the country code,
                  digits only, for example 237670000000.
        meta:
          $ref: '#/components/schemas/Meta'
  responses:
    ServiceNotActive:
      description: >-
        `FORBIDDEN` : le service n'est pas `active` (en mode test,
        `pending_review` est accepté).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            success: false
            error:
              code: FORBIDDEN
              message: >-
                The service is pending_review: it cannot collect payments in
                live mode.
              details:
                service_status: pending_review
            meta:
              request_id: a4f8e2c1b3d97056
              timestamp: '2026-10-29T10:00:00+00:00'
              mode: live
    NotFound:
      description: >-
        `RESOURCE_NOT_FOUND` : aucun service ni paiement avec ce code dans votre
        compte et ce mode.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ValidationError:
      description: >-
        `VALIDATION_ERROR` : un ou plusieurs champs manquent ou sont invalides.
        `details` explique chaque champ.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    OperatorUnavailable:
      description: >-
        `OPERATION_FAILED` : l'opérateur est fermé aux encaissements en ce
        moment. Proposez un autre opérateur.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            success: false
            error:
              code: OPERATION_FAILED
              message: >-
                ORANGE_CMR is temporarily unavailable for collections. Offer
                another operator or try again later.
              details:
                failure_code: operator_unavailable
            meta:
              request_id: a4f8e2c1b3d97056
              timestamp: '2026-10-29T10:00:00+00:00'
              mode: live
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >-
        Votre clé API secrète : `sk_live_…` (argent réel) ou `sk_test_…` (mode
        test).

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.