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

# Envoyer une notification

> Envoyez une notification par e-mail, SMS et/ou WhatsApp via un endpoint unique. Scope requis : notifications.write.

L'envoi utilise un endpoint unique. Passez `channels` pour diffuser dans une seule requête vers plusieurs canaux et `recipients` pour fournir une adresse distincte par canal. Un abonnement actif et les quotas du forfait s'appliquent à chaque canal.

Vous pouvez envoyer votre propre modèle marchand, au lieu du message par défaut de BizConnectPay, en créant d'abord un modèle avec [l'API des modèles de notification](https://docs.bizconnectpay.com/api-reference/notifications/templates.md). À l'envoi, fournissez `template_code`, `language` et les `variables` correspondantes. Pour diffuser sur plusieurs canaux, créez un modèle avec le même code pour chacun d'eux. Chaque message reprend le contenu du modèle associé à son canal. Les e-mails affichent le nom de marque configuré sur le modèle ; l'adresse d'expédition reste celle configurée par la plateforme.

### Protection anti-bannissement WhatsApp

Les envois WhatsApp s'appuient sur notre passerelle Baileys intégrée et appliquent des sécurités strictes :

* Délais aléatoires gaussiens de 2s à 8s (distribution Box-Muller).
* Simulation de saisie humaine (`composing` / `paused`).
* Prise en charge automatique des mots-clés d'opt-out `STOP` et d'opt-in `START`.
* Mise en liste noire temporaire de 7 jours pour tout numéro non joignable afin de préserver la réputation de l'expéditeur.

```bash cURL theme={null}
curl --request POST \
  --url https://api.bizconnectpay.com/api/v1/notifications/messages \
  --header 'Authorization: Bearer <application_access_token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "channels": ["EMAIL", "SMS", "WHATSAPP"],
    "recipients": {
      "EMAIL": "client@example.com",
      "SMS": "+237699001122",
      "WHATSAPP": "+237699001122"
    },
    "template_code": "PAYMENT_SUCCESS",
    "language": "fr",
    "variables": {
      "customer_name": "Awa",
      "amount": "25 000",
      "currency": "XOF",
      "reference": "CMD-1042"
    }
  }'
```

Pour conserver l'ancien envoi sans modèle, omettez `template_code` et envoyez directement `message` et, pour l'e-mail, `subject`.

```json 202 Accepted theme={null}
{
  "success": true,
  "data": {
    "status": "sent",
    "messages": [
      {"id": "b304c0ec-6949-4171-8bc9-57ef9a9870be", "channel": "EMAIL", "recipient_address": "client@example.com", "status": "sent", "provider": "SMTP"},
      {"id": "2c4d0981-297f-41c6-9ad7-f2c8715c18d6", "channel": "SMS", "recipient_address": "+237699001122", "status": "sent", "provider": "HTTP_SMS"},
      {"id": "cd297fe7-066b-4626-bf10-304b93e2c52b", "channel": "WHATSAPP", "recipient_address": "+237699001122", "status": "sent", "provider": "BAILEYS_WHATSAPP"}
    ]
  },
  "meta": {
    "correlation_id": "0d207567-9d7a-4221-a537-8ffb64a2f8b5"
  }
}
```

Chaque canal est livré et journalisé séparément. Si un canal échoue, la réponse `207 Multi-Status` contient le résultat de chacun ; les autres canaux sont tout de même traités. Pour une notification sur un seul canal, utilisez `channel` et `recipient_address` au lieu de `channels` et `recipients`.


## OpenAPI

````yaml openapi.json POST /notifications/messages
openapi: 3.1.0
info:
  title: BizConnectPay API
  version: 1.0.0
  description: >-
    API serveur-à-serveur pour les collectes, décaissements, transactions,
    remboursements, liens de paiement et cartes virtuelles.
servers:
  - url: https://api.bizconnectpay.com/api/v1
    description: Passerelle API BizConnectPay
security:
  - bearerAuth: []
tags:
  - name: Authentification
  - name: Services
  - name: Collectes
  - name: Transactions
  - name: Décaissements
  - name: Remboursements
  - name: Liens de paiement
  - name: Porteurs de carte
  - name: Cartes virtuelles
  - name: Notifications
paths:
  /notifications/messages:
    post:
      tags:
        - Notifications
      summary: Envoyer une notification
      description: >-
        Envoie une notification par e-mail, SMS et/ou WhatsApp via le même
        endpoint. Utilisez `channels` et `recipients` pour diffuser sur
        plusieurs canaux en un seul appel. Scope requis : `notifications.write`.
      operationId: sendNotificationMessage
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NotificationMessageRequest'
      responses:
        '202':
          $ref: '#/components/responses/Accepted'
        '207':
          $ref: '#/components/responses/Accepted'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          $ref: '#/components/responses/ValidationError'
components:
  schemas:
    NotificationMessageRequest:
      type: object
      anyOf:
        - required:
            - message
        - required:
            - template_code
      properties:
        channel:
          type: string
          enum:
            - SMS
            - EMAIL
            - WHATSAPP
          description: Canal unique (alternative à channels).
        channels:
          type: array
          minItems: 1
          maxItems: 3
          uniqueItems: true
          items:
            type: string
            enum:
              - SMS
              - EMAIL
              - WHATSAPP
        recipient_address:
          type: string
          description: Adresse unique (alternative à recipients).
        recipients:
          type: object
          description: Destinataires par canal, par exemple EMAIL, SMS et WHATSAPP.
          properties:
            EMAIL:
              type: string
              format: email
            SMS:
              type: string
            WHATSAPP:
              type: string
        message:
          type: string
          description: Contenu texte direct (alternative à template_code)
        subject:
          type: string
          description: Objet de la notification (EMAIL, mode message direct)
        template_code:
          type: string
          maxLength: 100
          description: Code d'un modèle actif configuré pour chacun des canaux utilisés
        language:
          type: string
          enum:
            - fr
            - en
          default: fr
        variables:
          type: object
          additionalProperties:
            type:
              - string
              - number
              - boolean
              - 'null'
    SuccessEnvelope:
      type: object
      properties:
        success:
          type: boolean
          const: true
        data: {}
        meta:
          $ref: '#/components/schemas/Meta'
    ErrorEnvelope:
      type: object
      properties:
        success:
          type: boolean
          const: false
        data:
          type: object
          properties:
            error:
              type: object
              properties:
                code:
                  type: string
                message:
                  type: string
                details:
                  type:
                    - object
                    - array
        meta:
          $ref: '#/components/schemas/Meta'
    Meta:
      type: object
      properties:
        correlation_id:
          type:
            - string
            - 'null'
          format: uuid
  responses:
    Accepted:
      description: Demande acceptée pour traitement
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/SuccessEnvelope'
    Unauthenticated:
      description: Authentification requise ou invalide
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    Forbidden:
      description: Scope ou état de compte insuffisant
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    ValidationError:
      description: Payload ou règle métier invalide
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````

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