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

# Créer une campagne

> Créez une nouvelle campagne d’envoi de messages WhatsApp

## Créer une campagne

Créez une nouvelle campagne d'envoi de messages WhatsApp en utilisant une liste de contacts existante.

### Endpoint

<ParamField method="POST" path="/v1/campaigns/create" />

### Headers

<ParamField header="Authorization" type="string" required>
  Bearer token avec votre Secret Key (format: `Bearer sk_...`)
</ParamField>

### Body Parameters

<ParamField body="name" type="string" required>
  Nom de la campagne
</ParamField>

<ParamField body="type" type="string" required>
  Type de campagne: `bulk_contacts`, `bulk_groups`, `individual`
</ParamField>

<ParamField body="listId" type="string" required>
  ID de la liste de contacts à utiliser (Requis pour `bulk_contacts`)
</ParamField>

<ParamField body="whatsappProfiles" type="array" required>
  Tableau des IDs de profils WhatsApp à utiliser
</ParamField>

<ParamField body="variations" type="array" required>
  Variations de messages (spintax, A/B testing). Voir structure ci-dessous.
</ParamField>

<ParamField body="messageDelay" type="object">
  Délai entre messages: `{min: 5, max: 10}` (en secondes, défaut: 5-10s)
</ParamField>

<ParamField body="sendingWindows" type="array">
  Fenêtres d'envoi: `[{start: "09:00", end: "18:00"}]` (défaut: 24h/24)
</ParamField>

<ParamField body="timezone" type="string">
  Timezone: `Africa/Abidjan`, `Europe/Paris`, etc. (défaut: `UTC`)
</ParamField>

<ParamField body="scheduledAt" type="string">
  Date programmée (ISO 8601)
</ParamField>

### Structure de variations

```json theme={null}
{
  "id": "var_1",
  "type": "text",
  "content": "Bonjour {{name}}, souhaitez-vous continuer ?",
  "buttons": [
    {"id": "yes", "text": "Oui", "type": "reply"},
    {"id": "site", "text": "Voir le site", "type": "url", "url": "https://wachap.com/{{campaign}}"}
  ],
  "footerText": "WaChap"
}
```

### Boutons dans les variations

Chaque variation `text`, `image`, `video` ou `document` peut contenir :

| Champ        | Type   | Description                             |
| :----------- | :----- | :-------------------------------------- |
| `buttons`    | array  | 1 à 3 boutons `reply`, `url` ou `call`  |
| `footerText` | string | Pied facultatif, limité à 60 caractères |

Le spintax et les variables de contact sont traités dans `buttons[].text`, `buttons[].url`, `buttons[].phoneNumber` et `footerText`, comme dans `content`. Consultez [Boutons interactifs](/fr/messages/interactive-buttons) pour les contraintes complètes.

### Types de messages supportés

| Type       | Description          | Champs requis                       |
| :--------- | :------------------- | :---------------------------------- |
| `text`     | Message texte simple | `content`                           |
| `image`    | Image avec caption   | `content` (caption), `mediaUrl`     |
| `video`    | Vidéo avec caption   | `content` (caption), `mediaUrl`     |
| `document` | Document PDF, etc.   | `content` (nom fichier), `mediaUrl` |
| `audio`    | Message vocal/audio  | `mediaUrl`                          |

### Variables de personnalisation

* `{{name}}` - Nom du contact
* `{{phone}}` - Numéro du contact
* `{{email}}`, `{{city}}`, etc. - Toute colonne de votre liste de contacts

### Spintax (variation de texte)

Utilisez `{option1|option2|option3}` pour générer des variations aléatoires :
`{Bonjour|Salut|Hello} {{name}}` → génère différentes salutations.
Cela permet d'éviter la détection de spam et rend chaque message unique.

### Exemples de requêtes

<CodeGroup>
  ```bash BASH theme={null}
  curl -X POST https://api.wachap.com/v1/campaigns/create \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer token" \
    -d '{
      "name": "Promo Black Friday 2024",
      "type": "bulk_contacts",
      "listId": "65f1234567890abcdef12345",
      "whatsappProfiles": ["a1233b-a1233b-a1233b-a1233b-a1233bcdjdg9878"],
      "variations": [
        {
          "id": "var_1",
          "type": "text",
          "content": "{Bonjour|Salut|Hello} {{name}}, découvrez notre offre !",
          "buttons": [
            {"id": "offer", "text": "Voir l’offre", "type": "url", "url": "https://example.com/offre/{{phone}}"},
            {"id": "call", "text": "Nous appeler", "type": "call", "phoneNumber": "+2290100000000"}
          ],
          "footerText": "Offre limitée"
        }
      ],
      "messageDelay": {"min": 5, "max": 10},
      "timezone": "Africa/Abidjan"
    }'
  ```

  ```javascript JAVASCRIPT theme={null}
  const response = await fetch('https://api.wachap.com/v1/campaigns/create', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer token'
    },
    body: JSON.stringify({
      name: 'Test A/B Promo',
      type: 'bulk_contacts',
      listId: '65f1234567890abcdef12345',
      whatsappProfiles: ['a1233b-a1233b-a1233b-a1233b-a1233bcdjdg9878'],
      variations: [
        {
          id: 'version_a',
          type: 'text',
          content: 'Bonjour {{name}}, -20% sur tout le site !'
        },
        {
          id: 'version_b',
          type: 'text',
          content: 'Hello {{name}}, offre flash -20% aujourd\'hui !'
        }
      ]
    })
  });
  const data = await response.json();
  console.log(data);
  ```

  ```python PYTHON theme={null}
  import requests
  from datetime import datetime, timedelta

  # Programmer pour demain à 10h
  scheduled_time = (datetime.now() + timedelta(days=1)).replace(hour=10, minute=0, second=0)

  url = 'https://api.wachap.com/v1/campaigns/create'
  headers = {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer token'
  }
  payload = {
      'name': 'Campagne Programmée',
      'listId': '65f1234567890abcdef12345',
      'whatsappProfiles': ['a1233b-a1233b-a1233b-a1233b-a1233bcdjdg9878'],
      'variations': [{ 'content': 'Bonjour {{name}} !' }],
      'scheduledAt': scheduled_time.isoformat()
  }
  response = requests.post(url, headers=headers, json=payload)
  print(response.json())
  ```
</CodeGroup>

### Exemple de réponse

```json theme={null}
{
  "success": true,
  "campaignId": "675c1234567890abcdef1234",
  "campaign": {
    "$id": "675c1234567890abcdef1234",
    "userId": "user_xxx",
    "name": "Promo Black Friday 2024",
    "status": "ready",
    "totalContacts": 1523
  }
}
```

### Notes importantes

* **listId requis** : Pour `type: bulk_contacts`, le `listId` est obligatoire.
* **Statut automatique** : Si `listId` est fourni, le statut sera `ready` (prêt à lancer).
* **Multiples profils** : Rotation automatique entre les profils WhatsApp fournis.
* **Boutons facultatifs** : Omettez `buttons` ou utilisez un tableau vide pour envoyer uniquement le message.

### Codes d'erreur

| Code  | Description                                                    |
| :---- | :------------------------------------------------------------- |
| `400` | MISSING\_NAME, MISSING\_TYPE, MISSING\_LIST\_ID, INVALID\_TYPE |
| `401` | INVALID\_SECRET\_KEY - Clé secrète invalide                    |
| `404` | Liste de contacts non trouvée                                  |
| `500` | Erreur lors de la création                                     |


## OpenAPI

````yaml POST /campaigns/create
openapi: 3.0.3
info:
  title: WaChap API
  version: 2.0.0
servers:
  - url: https://api.wachap.com/v1
    description: WaChap API server
security:
  - BearerAuth: []
tags:
  - name: Instances
    description: Créer et gérer des instances WhatsApp
  - name: Webhook
    description: Configuration des webhooks de réception
  - name: Messages
    description: Envoyer des messages WhatsApp
  - name: Comptes
    description: Gérer vos comptes WhatsApp connectés
  - name: SMS
    description: Service SMS de WaChap (V4) via FCM
  - name: Étiquettes WhatsApp
    description: Créer et associer des étiquettes aux conversations WhatsApp
paths:
  /campaigns/create:
    post:
      tags:
        - Campagnes
      summary: Créer une campagne
      description: Créez une nouvelle campagne d'envoi de messages.
      operationId: createCampaign
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                type:
                  type: string
                  enum:
                    - bulk_contacts
                    - bulk_groups
                    - individual
                listId:
                  type: string
                whatsappProfiles:
                  type: array
                  items:
                    type: string
                variations:
                  type: array
                  items:
                    type: object
                    required:
                      - type
                      - content
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                        enum:
                          - text
                          - image
                          - video
                          - document
                          - audio
                      content:
                        type: string
                        description: >-
                          Texte du message ou légende du média. Accepte les
                          variables et le spintax.
                      mediaUrl:
                        type: string
                      buttons:
                        type: array
                        minItems: 1
                        maxItems: 3
                        description: >-
                          Disponible pour text, image, video et document. Les
                          variables et le spintax sont traités dans les champs
                          des boutons.
                        items:
                          $ref: '#/components/schemas/InteractiveButton'
                      footerText:
                        type: string
                        maxLength: 60
                messageDelay:
                  type: object
                sendingWindows:
                  type: array
                  items:
                    type: object
                timezone:
                  type: string
                scheduledAt:
                  type: string
            examples:
              campaignWithButtons:
                value:
                  name: Confirmation événement
                  type: bulk_contacts
                  listId: list_123
                  whatsappProfiles:
                    - account_123
                  variations:
                    - id: var_1
                      type: text
                      content: Bonjour {{name}}, confirmez-vous votre présence ?
                      buttons:
                        - id: 'yes'
                          text: Oui
                          type: reply
                        - id: details
                          text: Voir les détails
                          type: url
                          url: https://example.com/evenement
                      footerText: WaChap
      responses:
        '200':
          description: OK
        '400':
          description: Paramètres de campagne ou boutons invalides
components:
  schemas:
    InteractiveButton:
      type: object
      required:
        - text
      properties:
        id:
          type: string
          description: >-
            Identifiant unique du bouton dans le message. Généré automatiquement
            s’il est omis.
        text:
          type: string
          minLength: 1
          maxLength: 20
          description: Libellé affiché dans WhatsApp.
        type:
          type: string
          enum:
            - reply
            - url
            - call
          default: reply
        url:
          type: string
          format: uri
          pattern: ^https?://
          description: URL HTTP(S) requise pour un bouton de type url.
        phoneNumber:
          type: string
          pattern: ^\+?[1-9][0-9]{5,14}$
          description: Numéro international requis pour un bouton de type call.
      example:
        id: confirm
        text: Confirmer
        type: reply
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````