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

# Déclarer une adresse IP autorisée

> Déclarez les adresses depuis lesquelles vos serveurs appellent. C'est un second facteur de fait : une clé volée ne sert à rien si elle doit être présentée depuis votre infrastructure.


<Tip>
  Si vous ne savez pas quelle adresse déclarer, demandez-la d'abord à [`GET /merchants/me/ip-check`](/guichet/api/ip-check) : derrière un NAT ou un proxy sortant, ce n'est pas toujours celle que vous croyez.

  Adresse IPv4 seule ou plage CIDR. Pensez aux régions de secours et aux tâches de fond.
</Tip>


## OpenAPI

````yaml POST /merchants/me/allowed-ips
openapi: 3.1.0
info:
  title: Djonanko Guichet API
  version: 1.0.0
  description: >
    API d'agrégation mobile money de Djonanko. Elle permet à une entreprise

    partenaire d'**encaisser** (`cash-in`) et de **transférer** (`cash-out`) sur
    les

    réseaux mobile money d'Afrique de l'Ouest et du Centre, directement depuis
    ses

    propres serveurs.


    Contrairement à l'API Djonanko Pay, le Guichet ne passe **ni par un lien de

    paiement ni par une page hébergée** : vous appelez l'API, le client est
    sollicité

    sur son téléphone, et vous recevez l'issue par notification signée.


    ### Ce qu'il faut retenir avant de commencer


    - **Authentification** : `x-api-key` + `x-api-secret` sur chaque appel.

    - **Montants entiers** : le XOF, le XAF et le GNF n'ont pas de sous-unité.
      `5000` vaut 5 000 FCFA. Aucune décimale n'est acceptée.
    - **Idempotence obligatoire** : l'en-tête `Idempotency-Key` est exigé sur
      `POST /cashin` et `POST /cashout`.
    - **Un portefeuille unique** par compte : les encaissements le créditent,
    les
      transferts le débitent.
    - **Notifications signées** : vérifiez l'en-tête `Djonanko-Signature` avant
    de
      traiter.

    Toutes les réponses sont en JSON. Chaque réponse porte un en-tête

    `x-request-id` à citer dans vos demandes de support.
  contact:
    name: Support Djonanko
    url: https://www.djonanko.ci/#contact
servers:
  - url: https://guichet.apidjonanko.tech/v1
    description: Production
security:
  - ApiKey: []
    ApiSecret: []
tags:
  - name: Encaissement
    description: Débiter un compte mobile money vers votre portefeuille.
  - name: Transfert
    description: Créditer un compte mobile money depuis votre portefeuille.
  - name: Opérations
    description: Consulter l'état et l'historique de vos opérations.
  - name: Portefeuille
    description: Solde et relevé des mouvements.
  - name: Compte
    description: Création de compte, profil, clés d'API.
  - name: Sécurité
    description: Adresses IP autorisées.
  - name: Notifications
    description: Configuration, supervision et rejeu des notifications sortantes.
paths:
  /merchants/me/allowed-ips:
    post:
      tags:
        - Sécurité
      summary: Déclarer une adresse IP autorisée
      description: >
        Déclarez les adresses depuis lesquelles vos serveurs appellent. C'est un
        second facteur de fait : une clé volée ne sert à rien si elle doit être
        présentée depuis votre infrastructure.
      operationId: createAllowedIp
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cidr
              properties:
                cidr:
                  type: string
                  description: >
                    Adresse IPv4 seule, ou plage en notation CIDR. IPv4
                    uniquement.
                  example: 41.207.12.34
                label:
                  type: string
                  maxLength: 120
                  example: passerelle sortante Abidjan
      responses:
        '201':
          description: Adresse déclarée.
          content:
            application/json:
              schema:
                type: object
                properties:
                  allowedIp:
                    type: object
                    properties:
                      id:
                        type: string
                        format: uuid
                      cidr:
                        type: string
                      label:
                        type:
                          - string
                          - 'null'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  responses:
    BadRequest:
      description: Requête invalide (`VALIDATION_ERROR`, `IDEMPOTENCY_KEY_REQUIRED`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            success: false
            error:
              code: VALIDATION_ERROR
              message: La requête est invalide.
              details:
                fields:
                  - amount must be an integer number
            requestId: 9f1c2b7e-4a5d-4c8f-b0a1-e2d3c4b5a697
            timestamp: '2026-10-01T10:12:04.000Z'
    Unauthorized:
      description: Identifiants absents ou invalides.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            success: false
            error:
              code: INVALID_CREDENTIALS
              message: Identifiants API invalides.
            requestId: 9f1c2b7e-4a5d-4c8f-b0a1-e2d3c4b5a697
            timestamp: '2026-10-01T10:12:04.000Z'
  schemas:
    Error:
      type: object
      description: Forme de toutes les réponses d'erreur.
      properties:
        success:
          type: boolean
          enum:
            - false
        error:
          type: object
          properties:
            code:
              type: string
              description: >
                Code stable. **Branchez votre logique dessus**, jamais sur
                `message`, qui peut être reformulé.
              example: INSUFFICIENT_BALANCE
            message:
              type: string
              example: Le solde disponible de votre portefeuille est insuffisant.
            details:
              type:
                - object
                - 'null'
              description: Contexte complémentaire, variable selon le code.
              additionalProperties: true
        requestId:
          type: string
          description: Également renvoyé dans l'en-tête `x-request-id`.
          example: 9f1c2b7e-4a5d-4c8f-b0a1-e2d3c4b5a697
        timestamp:
          type: string
          format: date-time
  securitySchemes:
    ApiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: Votre clé publique, préfixée `gk_live_` (ou `gk_test_`).
    ApiSecret:
      type: apiKey
      in: header
      name: x-api-secret
      description: >
        Votre secret, préfixé `gs_live_` (ou `gs_test_`). Affiché une seule
        fois, à l'émission de la clé. Il ne doit jamais quitter vos serveurs.

````

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