# API Messages

import { Badge } from '@astrojs/starlight/components';

<Aside type="caution" title="/createMessage et /createTargetedMessage sont obsolètes">
Les nouvelles intégrations devraient utiliser l'[**API de messagerie unifiée v2**](/fr/developer/api-reference/messaging-api-v2/) — un seul point de terminaison remplace toute la famille `/create*Message`. Consultez le [guide de migration](/fr/developer/api-reference/messaging-api-v2/migration-from-v1/) pour une correspondance champ par champ.

Les méthodes héritées ci-dessous restent pleinement opérationnelles. `/deleteMessage`, `/cancelMessage` et `/getMessageDetails` ne sont pas obsolètes — utilisez-les comme d'habitude pour les messages créés en v1 ou v2.
</Aside>

<Aside type="note">
Pour commencer, veuillez consulter les descriptions des [paramètres de la requête /createMessage](/fr/developer/api-reference/messages-api/api-prerequisites).
</Aside>

## createMessage <Badge text="Obsolète" variant="caution" size="small" />

`POST` `https://api.pushwoosh.com/json/1.3/createMessage`

Crée une nouvelle notification push.

#### Corps de la requête

| Nom                                             | Type   | Description                                                                |
| ----------------------------------------------- | ------ | -------------------------------------------------------------------------- |
| auth*          | string | [Jeton d'accès API](/fr/developer/api-reference/api-identifiers/#api-access-token) depuis le panneau de contrôle Pushwoosh.                             |
| application*   | string | [Code d'application Pushwoosh](/fr/developer/api-reference/api-identifiers/#application-code)                                               |
| notifications* | array  | Tableau JSON des paramètres du message. Voir les détails dans un exemple de requête ci-dessous.  |

<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": {
    "Messages": [
      "C3F8-C3863ED4-334AD4F1"
    ]
  }
}
```
</TabItem>
</Tabs>

<Aside type="note">
La méthode /createMessage prend en charge les modèles de contenu. Pour en savoir plus, veuillez vous référer au [guide des modèles Liquid](/fr/developer/guides/personalization/liquid-templates/).
</Aside>

### Exemple de requête

```json title="Exemple"
{
  "request": {
    "application": "XXXXX-XXXXX",       // requis. Code d'application Pushwoosh.
    "auth": "yxoPUlwqm…………pIyEX4H",     // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh.
    "notifications": [{
      "send_date": "now",               // optionnel. AAAA-MM-JJ HH:mm OU 'now'
      "content": {                      // optionnel. objet OU chaîne de caractères.
        "en": "English",                //           Utilisez "wns_content" à la place pour Windows.
        "fr": "French"
      },
      "title": {                        // optionnel. objet OU chaîne de caractères. 
        "en": "Title",                  //           Ignoré si des titres spécifiques à la plateforme sont spécifiés
        "fr": "Titre"                   //           'ios_title', 'android_header', etc.
      },                                //           voir les exemples de paramètres spécifiques à la plateforme ci-dessous.
      "subtitle":{                      // optionnel. objet OU chaîne de caractères. 
        "en": "Subtitle",               //           Ignoré si des titres spécifiques à la plateforme sont spécifiés
        "fr": "Sous-titre"              //           'ios_subtitle', etc.
      },                                //           voir les exemples de paramètres spécifiques à la plateforme ci-dessous.
      "ignore_user_timezone": true,     // optionnel.
      "timezone": "America/New_York",   // optionnel. Si ignoré, UTC-0 est la valeur par défaut pour "send_date".
                                        //           Voir https://php.net/manual/timezones.php pour
                                        //           les fuseaux horaires pris en charge.
      "campaign": "CAMPAIGN_CODE",      // optionnel. Code de campagne auquel vous souhaitez
                                        //           assigner ce message push.
      "geozone": {                      // optionnel. Envoyer à la Geozone
        "lat": 22.22,
        "lng": 33.33,
        "range": 110
      },
      "rich_media": "XXXXX-XXXXX",      // optionnel. Copiez le code Rich Media depuis la barre d'URL de
                                        //           la page de l'éditeur Rich Media dans le panneau de contrôle Pushwoosh.
      "link": "https://google.com",     // optionnel. Pour les liens profonds, ajoutez "minimize_link": 0
      "minimize_link": 0,               // optionnel. 0 — ne pas minimiser, 2 — bitly. Par défaut = 2.
                                        //           Veuillez noter que les raccourcisseurs ont des restrictions
                                        //           sur le nombre d'appels.
      "data": {                         // optionnel. Chaîne JSON ou objet JSON, sera passé comme
        "key": "value"                  //           paramètre "u" dans la charge utile (converti en chaîne JSON).
      },
      "transactionId": "unique UUID",   // optionnel. Identifiant de message unique pour éviter la duplication
                                        //           en cas de problèmes de réseau. Stocké du côté de
                                        //           Pushwoosh pendant 5 minutes. 
      "platforms": [                    // optionnel. 1 — iOS; 3 — Android; 7 — Mac OS X; 8 — Windows;
        1, 3, 7, 8, 9, 10,              //           9 — Amazon; 10 — Safari; 11 — Chrome;
        11, 12, 17                      //           12 — Firefox; 17 — Huawei
      ],
      "preset": "XXXXX-XXXXX",          // optionnel. Code de préréglage Push depuis votre panneau de contrôle.
                                        //           Si des paramètres spécifiques sont envoyés dans la requête,
                                        //           ils remplacent les paramètres du préréglage.
      "send_rate": 100,                 // optionnel. Limitation du débit. Les valeurs valides sont de 100 à 1000 pushes/seconde.
      "send_rate_avoid": true,          // optionnel. Si défini sur true, la limite de limitation ne sera pas appliquée à
                                        //           cette notification push spécifique.
      // Lié aux modèles, veuillez vous référer au guide du moteur de modèles pour en savoir plus
      "template_bindings": {            // optionnel.
        "TemplatePlaceholder": "Value"
      },
      "dynamic_content_placeholders": { // optionnel. Espaces réservés pour le contenu dynamique au lieu des tags de l'appareil.
        "firstname": "John",
        "lastname": "Doe"
      },
      "message_type": "marketing",       // optionnel. "marketing" ou "transactional".
                                         // Si omis, les utilisateurs avec PW_ControlGroup: true ne recevront pas le message.

      // Paramètres de limitation de fréquence. Assurez-vous que la limitation de fréquence globale est configurée dans le panneau de contrôle.
      // La limitation de fréquence ne s'applique pas aux messages transactionnels.
      // Dans tous les autres cas, y compris "message_type" omis, la limitation de fréquence s'applique.
      "capping_days": 30,               // optionnel. Nombre de jours pour la limitation de fréquence (max 30 jours)
      "capping_count": 10,              // optionnel. Le nombre maximum de pushes pouvant être envoyés depuis une
                                        //           application spécifique à un appareil particulier dans une période de 'capping_days'.
                                        //           Si le message créé dépasse la limite 'capping_count'
                                        //           pour un appareil, il ne sera pas envoyé à cet appareil.
      "capping_exclude": true,          // optionnel. Si défini sur true, cette notification push ne sera pas
                                        //           comptée dans la limitation pour les futurs pushes.
      "capping_avoid": true,            // optionnel. Si défini sur true, la limitation ne sera pas appliquée à
                                        //           cette notification push spécifique.
        
      // Pour enregistrer le message dans la boîte de réception via l'API, utilisez "inbox_date" ou "inbox_image".
      // Le message est enregistré lorsqu'au moins un de ces paramètres est utilisé.
      "inbox_date": "2017-02-02",       // optionnel. Spécifiez quand supprimer un message de la boîte de réception.
                                        //           Le message sera supprimé de la boîte de réception à 00:00:01 UTC
                                        //           de la date spécifiée, donc la date précédente est le
                                        //           dernier jour où un utilisateur peut voir le message dans sa boîte de réception.
                                        //           Si non spécifié, la date de suppression par défaut est le
                                        //           jour suivant la date d'envoi.
      "inbox_image": "Inbox image URL", // optionnel. L'image à afficher à côté du message. 
	  "inbox_days": 5,                  // optionnel. Spécifiez quand supprimer un message de la
                                        //           boîte de réception (durée de vie d'un message de boîte de réception en jours). 
                                        //           Peut être utilisé à la place du paramètre "inbox_date".
                                        //           Jusqu'à 30 jours.
      
      "devices": [                      // optionnel. Spécifiez des jetons ou des hwids pour envoyer des pushes ciblés.
          "hwid_XXXX"                   //           Pas plus de 1000 jetons/hwids dans
      ],                                //           un tableau. Si défini, le message ne sera envoyé qu'aux
                                        //           appareils de la liste. Le groupe d'applications pour la liste d'appareils
                                        //           n'est pas autorisé. Les jetons push iOS ne peuvent être qu'en minuscules.
      "to": [                           // optionnel. Pour les e-mails, SMS et canaux similaires. Liste des destinataires
          "email_1", "email_2"          //           (par ex. adresses e-mail, numéros de téléphone). Max 1000 éléments.
      ],                                //           Pour les pushes, utilisez "devices" à la place.
      // Notifications push centrées sur l'utilisateur
      "users": [                        // optionnel. Si défini, le message ne sera livré qu'aux
          "user_XXXX"                   //           ID utilisateur spécifiés (définis via l'appel /registerUser). 
      ],                                //           Si spécifié avec des appareils ou to,
                                        //           ces derniers seront ignorés. Pas plus de 1000 ID utilisateur
                                        //           dans un tableau. Le groupe d'applications pour la liste d'utilisateurs
                                        //           n'est pas autorisé.

      // Filtres et conditions
      "filter": "FILTER_NAME",          // optionnel.
      "conditions": [                   // optionnel. Voir la remarque ci-dessous.
        ["Country", "EQ", "fr"],
        ["Language", "EQ", "en"]
      ],    
      "conditions_operator": "AND"      // optionnel. Opérateur logique pour les tableaux de conditions.
                                        //           Valeurs possibles : AND | OR. AND est la valeur par défaut.
    }]
  }
}
```

### Exemple de requête de notification VoIP

Pushwoosh prend en charge les notifications d'appel de type VoIP pour iOS et Android. \
Vous trouverez ci-dessous un exemple de requêtes API `createMessage` pour chaque plateforme.

#### iOS

```json title="Exemple"
{
  "request": {
    "application": "XXXXX-XXXXX",     // requis. Code d'application Pushwoosh.
    "auth": "yxoPUlwqm…………pIyEX4H",   // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh.
    "notifications": [
      {
        "voip_push": true,            // requis. Le paramètre est requis pour envoyer une notification push VoIP.
        "ios_root_params": {
          "aps": {
            "mutable-content": 1      // requis pour les pièces jointes multimédias iOS10+.
          },
          "callerName": "CallerName", // optionnel. Nom de l'appelant. Si non spécifié, "appelant inconnu" est affiché.
          "video": true,              // optionnel. Indique si les appels vidéo sont pris en charge.
          "supportsHolding": true,    // optionnel. Indique si la fonctionnalité de mise en attente des appels est prise en charge.
          "supportsDTMF": false,      // optionnel. Contrôle la prise en charge du signal de fréquence multifréquence à double tonalité.
          "callId": "42",             // optionnel. L'identifiant unique de l'appel à annuler.
          "cancelCall": true          // optionnel. Définir sur "true" pour annuler l'appel avec le "callId" spécifié.
        }
      }
    ]
  }
}
```

#### Android

```json title="Exemple"
{
  "request": {
    "application": "XXXXX-XXXXX",   // requis. Code d'application Pushwoosh.
    "auth": "yxoPUlwqm…………pIyEX4H", // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh.
    "notifications": [
      {
      "voip_push": true,            // requis. Le paramètre est requis pour envoyer une notification push VoIP.
      "android_root_params": {
        "callerName": "callerName", // optionnel. Nom de l'appelant. Si non spécifié, "appelant inconnu" est affiché.
        "video": true,              // optionnel. Indique si les appels vidéo sont pris en charge.
        "callId": 42,               // optionnel. L'identifiant unique de l'appel à annuler.
        "cancelCall": true          // optionnel. Définir sur "true" pour annuler l'appel avec le "callId" spécifié.
        }
      }
    ]
  }
}

```


### Paramètres spécifiques à la plateforme

#### Paramètres iOS

```json title="Exemple"
{
  "request": {
    "application": "12345-67891",         // requis. Code d'application Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H",       // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "notifications": [{
      "ios_title": {                      // optionnel. Objet OU chaîne de caractères. Ajoute un titre spécifique à iOS pour la notification push.
        "en": "title"
      },
      "ios_subtitle": {                   // optionnel. Objet OU chaîne de caractères. Ajoute un sous-titre spécifique à iOS pour la notification push.
        "en": "subtitle"
      },
      "ios_content": {                    // optionnel. Objet OU chaîne de caractères. Ajoute un contenu spécifique à iOS pour la notification push.
        "en": "content"
      },
      "ios_badges": 5,                    // optionnel. Numéro de badge de l'application iOS.
                                          //           Utilisez "+n" ou "-n" pour incrémenter/décrémenter la valeur du badge de n.
      "ios_sound": "sound file.wav",      // optionnel. Nom du fichier son dans le bundle principal de l'application.
                                          //           Si laissé vide, l'appareil produira un son système par défaut.
      "ios_sound_off": true,              // optionnel. Activer/désactiver le son défini par le champ "ios_sound".
      "ios_ttl": 3600,                    // optionnel. Paramètre de durée de vie - durée de vie maximale du message en secondes.
      "ios_silent": 1,                    // optionnel. Active les notifications silencieuses (ignore "sound" et "content").
      "ios_category_id": "1",             // optionnel. ID de catégorie iOS8 de Pushwoosh.
      "ios_root_params": {                // optionnel. Paramètres de niveau racine pour le dictionnaire aps.
        "aps": {
          "content-available": "0",       // optionnel. Définir "1" pour envoyer un push silencieux et "0" pour un push normal.
          "mutable-content": 1            // requis pour les pièces jointes multimédias iOS10+.
        },
        "callerName": "CallerName",       // optionnel paramètre VoIP. Nom de l'appelant. Si non spécifié, "appelant inconnu" est affiché.
        "video": true,                    // optionnel paramètre VoIP. Indique si les appels vidéo sont pris en charge.
        "supportsHolding": true,          // optionnel paramètre VoIP. Indique si la fonctionnalité de mise en attente des appels est prise en charge.
        "supportsDTMF": false,            // optionnel paramètre VoIP. Contrôle la prise en charge du signal de fréquence multifréquence à double tonalité.
        "data": {}                        // optionnel Données fournies par l'utilisateur, max 4 Ko
      },
      "ios_attachment": "URL",            // optionnel. Insérer du contenu multimédia dans la notification.
      "ios_thread_id": "some thread id",  // optionnel. Identifiant pour regrouper les notifications associées.
                                          //           Les messages avec le même ID de fil de discussion seront regroupés
                                          //           sur l'écran de verrouillage et dans le Centre de notifications.
      "ios_critical": true,               // optionnel. Marque la notification iOS comme une alerte critique
                                          //           jouant un son même si un appareil est en sourdine ou
                                          //           si le mode Ne pas déranger est activé.
      "ios_category_custom": "category",  // optionnel. Catégorie APNS personnalisée.
      "ios_interruption_level": "active", // optionnel. Un de "passive", "active", "time-sensitive",
                                          //           "critical". Indique l'importance et
                                          //           le moment de la livraison d'une notification. Se référer au
                                          //           guide de push ponctuel pour plus de détails.
      "apns_collapse_id": "promo",        // optionnel. Identifiant de regroupement APNs. Les notifications avec le même
                                          //           apns_collapse_id se remplacent mutuellement sur l'appareil.
      "apns_trim_content": 1              // optionnel. (0|1) Tronque les chaînes de contenu excédentaires avec des points de suspension.
    }]
  }
}
```

#### Paramètres Android

```json title="Exemple"
{
  "request": {
    "application": "12345-67891",            // requis. Code d'application Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H",          // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "notifications": [{
      "android_header": {                    // optionnel. En-tête de notification Android.
        "en": "header"
      },
      "android_content": {                   // optionnel. Contenu de la notification Android.
        "en": "content"
      },
      "android_root_params": {               // optionnel. Objet clé-valeur personnalisé.
        "key": "value",                      //           Paramètres de niveau racine pour les destinataires de la charge utile Android.
        "CancelID": 12345678,                // optionnel. Annule la notification push avec le
        "voip": true,                        // requis paramètre VoIP. Le paramètre est requis pour envoyer des notifications push VoIP.
        "callerName": "callerName",          // optionnel paramètre VoIP. Nom de l'appelant. Si non spécifié, "appelant inconnu" est affiché.
        "video": true,                       // optionnel paramètre VoIP. Indique si les appels vidéo sont pris en charge.
      },                                     //           ID de message spécifié (obtenez l'ID depuis l'historique des messages)
      "android_sound": "soundfile",          // optionnel. Pas d'extension de fichier. Si laissé vide,
                                             //           l'appareil produira un son système par défaut.
      "android_sound_off": true,             // optionnel. Activer/désactiver le son défini par le champ "android_sound"
      "android_icon": "icon.png",            // optionnel.
      "android_custom_icon": "URL.png",      // optionnel. URL complète vers le fichier image.
      "android_banner": "URL.png",           // optionnel. URL complète vers le fichier image.
      "android_badges": 5,                   // optionnel. Numéro de badge de l'icône de l'application Android.
                                             //           Utilisez "+n" ou "-n" pour incrémenter/décrémenter la valeur du badge de n.
      "android_gcm_ttl": 3600,               // optionnel. Paramètre de durée de vie — durée de vie maximale du message en secondes.
      "android_vibration": 0,                // optionnel. Vibration forcée Android pour les pushes à haute priorité.
      "android_led": "#rrggbb",              // optionnel. Couleur hexadécimale de la LED, l'appareil fera sa meilleure approximation.
      "android_priority": -1,                // optionnel. Définit le paramètre "importance" pour les appareils avec
                                             //           Android 8.0 et supérieur, ainsi que le paramètre "priority"
                                             //           pour les appareils avec Android 7.1 et inférieur. Établit le
                                             //           niveau d'interruption d'un canal de notification ou d'une notification
                                             //           particulière. Les valeurs valides sont -2, -1, 0, 1, 2.
      "android_delivery_priority": "normal", // optionnel. "normal" ou "high".
                                             //           Permet la livraison de la notification lorsque
                                             //           l'appareil est en mode d'économie d'énergie.
      "android_ibc": "#RRGGBB",              // optionnel. couleur de fond de l'icône sur Lollipop, #RRGGBB,
                                             //           #AARRGGBB, "red", "black", "yellow", etc.
      "android_silent": 1,                   // optionnel. 0 ou 1. Activer la notification silencieuse.
                                             //           Ignorer le son et le contenu
      "android_group_id": "123",             // optionnel. Identifiant pour regrouper les notifications associées. Les messages avec
                                             //           le même ID de fil de discussion seront regroupés dans
                                             //           le Centre de notifications.
      "android_collapse_key": "promo"        // optionnel. Clé de regroupement FCM. Les notifications avec la même
                                             //           clé de regroupement se remplacent mutuellement lorsque l'appareil est hors ligne.
    }]
  }
}
```

**Paramètres Huawei**

```json title="Huawei"
{
  "request": {
    "application": "12345-67891",                   // requis. Code d'application Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H",                 // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "notifications": [{
      "huawei_android_header": {                    // optionnel. Objet OU chaîne de caractères. Titre de la notification
        "en": "header"
      },
      "huawei_android_content": {                   // optionnel. Objet OU chaîne de caractères. Contenu de la notification
        "en": "content"
      },
      "huawei_android_badges": true,                // optionnel.
      "huawei_android_silent": 0,                   // optionnel. 0 ou 1. Activer la notification silencieuse.
                                                    //           Ignorer le son et le contenu
      "huawei_android_icon": "URL.png",             // optionnel.
      "huawei_android_led": "#FF0011",              // optionnel. Couleur hexadécimale de la LED, l'appareil fera sa meilleure approximation
      "huawei_android_vibration": 1,                // optionnel. Vibration forcée Huawei pour les pushes à haute priorité
      "huawei_android_sound": "sound.wav",          // optionnel. Si laissé vide, l'appareil produira
                                                    //           un son système par défaut
      "huawei_android_sound_off": true,             // optionnel. Activer/désactiver le son défini par
                                                    //           le champ "huawei_android_sound"
      "huawei_android_custom_icon": "URL.png",      // optionnel
      "huawei_android_gcm_ttl": 2400,               // optionnel. Paramètre de durée de vie - durée de vie maximale
                                                    //           du message en secondes
      "huawei_android_banner": "URL.png",           // optionnel. URL du chemin complet vers le fichier image
      "huawei_android_root_params": {               // optionnel. Objet clé-valeur personnalisé.
        "key": "value"                              //           Paramètres de niveau racine pour les destinataires de la charge utile Huawei.
      },
      "huawei_android_priority": 0,                 // optionnel. Valeurs valides : -2, -1, 0, 1, 2
      "huawei_android_ibc": "#0011AA",              // optionnel. Couleur de fond de l'icône sur Lollipop
      "huawei_android_lockscreen": 1,               // optionnel
      "huawei_android_delivery_priority": "normal", // optionnel. "normal" ou "high". Active la notification
                                                    //           livraison en mode d'économie d'énergie
      "huawei_android_group_id": "group_id"         // optionnel. Identifiant pour regrouper les notifications associées
    }]
  }
}
```

#### Paramètres Safari

```json title="Safari"
{
  "request": {
    "application": "12345-67891",    // requis. Code d'application Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H",  // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "notifications": [{
      "safari_url_args": [           // requis, mais la valeur peut être vide
        "firstArgument",
        "secondArgument"
      ],
      "safari_title": {              // optionnel. Objet OU chaîne de caractères. Titre de la notification.
        "en": "content"
      },
      "safari_content": {            // optionnel. Objet OU chaîne de caractères. Contenu de la notification.
        "en": "content"
      },
      "safari_action": "Click here", // optionnel.
      "safari_ttl": 3600             // optionnel. Paramètre de durée de vie — la durée de vie maximale
                                     //           d'un message en secondes.
    }]
  }
}


```

#### Paramètres Chrome

```json title="Chrome"
{
  "request": {
    "application": "12345-67891",          // requis. Code d'application Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H",        // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "notifications": [{
      "chrome_title": {                    // optionnel. Objet OU chaîne de caractères. Vous pouvez spécifier l'en-tête 
        "en": "title"                      //           du message dans ce paramètre.
      },
      "chrome_content": {                  // optionnel. Objet OU chaîne de caractères. Vous pouvez spécifier le contenu 
        "en": "content"                    //           du message dans ce paramètre.
      },
      "chrome_icon": "URL.png",            // optionnel. URL complète vers l'icône ou chemin du fichier de ressources de l'extension
      "chrome_gcm_ttl": 3600,              // optionnel. Paramètre de durée de vie – durée de vie maximale du message en secondes.
      "chrome_duration": 20,               // optionnel. max 50 secondes. Modifie le temps d'affichage du push Chrome.
                                           //           Définir à 0 pour afficher le push jusqu'à ce que l'utilisateur interagisse avec lui.
      "chrome_image": "image_URL",         // optionnel. URL vers une grande image. 
      "chrome_root_params": {              // optionnel. Définir des paramètres spécifiques aux messages envoyés à Chrome.
        "key": "value"
      }, 
      "chrome_button_text1": "text1",      // optionnel
      "chrome_button_url1": "button1_URL", // optionnel. Ignoré si chrome_button_text1 n'est pas défini.
      "chrome_button_text2": "text2",      // optionnel
      "chrome_button_url2": "button2_url"  // optionnel. Ignoré si chrome_button_text2 n'est pas défini. 
    }]
  }
}
```

#### Paramètres Firefox

```json title="Firefox"
{
  "request": {
    "application": "12345-67891",   // requis. Code d'application Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H", // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "notifications": [{
      "firefox_title": {            // optionnel. Objet OU chaîne de caractères. Vous pouvez spécifier l'en-tête du message ici.
        "en": "title"
      },
      "firefox_content": {          // optionnel. Objet OU chaîne de caractères. Vous pouvez spécifier le contenu du message ici.
        "en": "content"
      },
      "firefox_icon": "URL.png",    // optionnel. URL du chemin complet vers l'icône ou chemin vers le
                                    //           fichier dans les ressources de l'extension.
      "firefox_root_params": {      // optionnel. Définir des paramètres spécifiques aux messages envoyés à Firefox.
        "key": "value"
      } 
    }]
  }
}
```

#### Paramètres Amazon

```json title="Amazon"
{
  "request": {
    "application": "12345-67891",   // requis. Code d'application Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H", // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "notifications": [{
      "adm_header": {               // optionnel. Objet OU chaîne de caractères. Vous pouvez spécifier l'en-tête du message ici.
        "en": "header"
      },
      "adm_content": {              // optionnel. Objet OU chaîne de caractères. Vous pouvez spécifier le contenu du message ici.
        "en": "content"
      },
      "adm_root_params": {          // optionnel. Objet clé-valeur personnalisé
        "key": "value"
      },
      "adm_sound": "push.mp3",      // optionnel.
      "adm_sound_off": true,        // optionnel. Activer/désactiver le son défini par le champ "adm_sound"
      "adm_icon": "icon.png",       // optionnel. URL complète vers l'icône.
      "adm_custom_icon": "URL.png", // optionnel.
      "adm_banner": "URL.png",      // optionnel.
      "adm_ttl": 3600,              // optionnel. Paramètre de durée de vie — la durée de vie maximale du message
                                    //           en secondes.
      "adm_priority": -1            // optionnel. Priorité du push dans le tiroir de push Amazon,
                                    //           les valeurs valides sont -2, -1, 0, 1 et 2.
    }]
  }
}
```

#### Paramètres Mac OS X

```json title="Mac OS X"
{
  "request": {
    "application": "12345-67891",   // requis. Code d'application Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H", // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "notifications": [{
      "mac_title": {                // optionnel. Objet OU chaîne de caractères. Ajoute un titre pour la notification push.
        "en": "title"
      },
      "mac_subtitle": {             // optionnel. Ajoute un sous-titre pour la notification push.
        "en": "subtitle"
      },
      "mac_content": {              // optionnel. Ajoute un contenu pour la notification push.
        "en": "content"
      },
      "mac_badges": 3,              // optionnel.
      "mac_sound": "sound.caf",     // optionnel.
      "mac_sound_off": true,        // optionnel. Activer/désactiver le son défini par le champ "mac_sound"
      "mac_root_params": {          // optionnel.
        "content-available": 1
      },
      "mac_ttl": 3600               // optionnel. Paramètre de durée de vie — durée de vie maximale du message en secondes.
    }]
  }
}
```

#### Paramètres Windows

```json title="Windows"
{
  "request": {
    "application": "12345-67891",   // requis. Code d'application Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H", // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "notifications": [{
      "wns_content": {              // requis. Contenu (XML ou brut) de la notification encodé en base64 de MIME
                                    //           sous forme d'Objet OU de Chaîne de caractères
        "en": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9ImF2YWlsYWJsZSIvPg==",
        "de": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9Im5ld01lc3NhZ2UiLz4="
      },
      "wns_type": "Badge",          // optionnel. 'Tile' | 'Toast' | 'Badge' | 'Raw'
      "wns_tag": "myTag",           // optionnel. Utilisé dans la politique de remplacement de tuile.
                                    //           Une chaîne alphanumérique de 16 caractères maximum.
      "wns_cache": 1,               // optionnel. (1|0) Se traduit en valeur X-WNS-Cache-Policy.
      "wns_ttl": 600                // optionnel. Temps d'expiration de la notification en secondes.
    }]
  }
}
```
<Aside>
Démarrage rapide ! Découvrez ces superbes bibliothèques tierces !

Bibliothèque Python **par Pushwoosh** :
[https://github.com/makcyd/pushwoosh_api](https://github.com/makcyd/pushwoosh_api)

Bibliothèque Laravel :
[https://github.com/laravel-notification-channels/pushwoosh](https://github.com/laravel-notification-channels/pushwoosh)

Client Node JS
[https://github.com/vizeat/pushwoosh-node](https://github.com/vizeat/pushwoosh-node)

Client Meteor JS
[https://github.com/lpender/meteor-pushwoosh](https://github.com/lpender/meteor-pushwoosh)

Bibliothèque Rails
[https://github.com/iarie/pwush](https://github.com/iarie/pwush)

Bibliothèque Golang
[https://github.com/yyoshiki41/go-pushwoosh](https://github.com/yyoshiki41/go-pushwoosh)
</Aside>

<Aside type="caution">
#### Limitation de /createMessage

Gardez à l'esprit que les comptes non-entreprise ne peuvent pas envoyer plus de 600 requêtes `/createMessage` et/ou [`/createTargetedMessage`](/fr/developer/api-reference/messages-api/#createtargetedmessage) par minute.

Cependant, si vous envoyez des pushes via le paramètre **devices** à **10 appareils ou moins**, il n'y a aucune restriction pour tout type de compte tant que le traçage des messages API est désactivé.

Notez que **nous sauvegardons toujours les pushes programmés** dans l'Historique des messages, même si vous les envoyez à moins de 10 appareils via le paramètre devices. Par conséquent, ces pushes sont également limités.
</Aside>

**Réponse** :

| Code de statut HTTP | status_code | Description                                       |
| ---------------- | ------------ | ------------------------------------------------- |
| 200              | 200          | Message créé avec succès                      |
| 200              | 210          | Erreur d'argument. Voir status_message pour plus d'infos |
| 400              | N/A          | Chaîne de requête malformée                          |
| 500              | 500          | Erreur interne                                    |

<Aside type="note">
Une erreur dans un tableau de notifications

Si la requête `createMessage` contient plusieurs messages dans le tableau `notifications`, ils seront traités et envoyés un par un. Si l'un des messages ne peut pas être analysé, notre API retournera `"status_code":210` avec les codes des messages envoyés avec succès, c'est-à-dire ceux qui précèdent le message défectueux dans la requête.
</Aside>

### Traçage des messages API

À des fins d'équilibrage de charge, _nous ne stockons pas les messages envoyés via l'API avec le paramètre "devices" qui contient moins de 10 appareils dans un tableau_. Pour cette raison, de tels messages ne seront pas affichés dans votre Historique des messages.

Pour voir les rapports de push pendant la phase de test, utilisez le **traçage des messages API**. Activer cette option vous permet de _dépasser cette limite pendant 1 heure et de sauvegarder de tels pushes dans l'Historique des messages_. Le traçage des messages API se désactive automatiquement après 1 heure.

Le traçage des messages API peut être activé sur la page [Historique des messages](/fr/product/statistics-and-analytics/message-history/) en cliquant sur **Démarrer le traçage des messages API** dans le coin supérieur droit.

### Conditions de tag

Chaque condition de tag est un tableau comme `[tagName, operator, operand]` où

* tagName : nom d'un tag
* operator : "EQ" | "IN" | "NOTEQ" | "NOTIN" | "LTE" | "GTE" | "BETWEEN" | "NOTSET" | "ANY"
* operand : chaîne de caractères | entier | tableau | date

#### Description de l'opérateur

* EQ : la valeur du tag est égale à l'opérande ;
* IN : la valeur du tag croise l'opérande (l'opérande doit toujours être un tableau) ;
* NOTEQ : la valeur du tag n'est pas égale à un opérande ;
* NOTIN : la valeur du tag ne croise pas l'opérande (l'opérande doit toujours être un tableau) ;
* GTE : la valeur du tag est supérieure ou égale à l'opérande ;
* LTE : la valeur du tag est inférieure ou égale à l'opérande ;
* BETWEEN : la valeur du tag est supérieure ou égale à la valeur minimale de l'opérande mais inférieure ou égale à la valeur maximale de l'opérande (l'opérande doit toujours être un tableau) ;
* NOTSET : tag non défini. L'opérande n'est pas pris en compte ;
* ANY : le tag a n'importe quelle valeur. L'opérande n'est pas pris en compte.

#### Tags de type chaîne de caractères

Opérateurs valides : EQ, IN, NOTEQ, NOTIN, NOTSET, ANY\
Opérandes valides :

* EQ, NOTEQ : l'opérande doit être une chaîne de caractères ;
* IN, NOTIN : l'opérande doit être un tableau de chaînes de caractères comme `["valeur 1", "valeur 2", "valeur N"]` ;
* NOTSET : tag non défini. L'opérande n'est pas pris en compte ;
* ANY : le tag a n'importe quelle valeur. L'opérande n'est pas pris en compte.

#### Tags de type entier

Opérateurs valides : EQ, IN, NOTEQ, NOTIN, BETWEEN, GTE, LTE, NOTSET, ANY\
Opérandes valides :

* EQ, NOTEQ, GTE, LTE : l'opérande doit être un entier ;
* IN, NOTIN : l'opérande doit être un tableau d'entiers comme `[valeur 1, valeur 2, valeur N]` ;
* BETWEEN : l'opérande doit être un tableau d'entiers comme `[valeur_min, valeur_max]` ;
* NOTSET : tag non défini. L'opérande n'est pas pris en compte ;
* ANY : le tag a n'importe quelle valeur. L'opérande n'est pas pris en compte.

#### Tags de type date

Opérateurs valides : EQ, IN, NOTEQ, NOTIN, BETWEEN, GTE, LTE, NOTSET, ANY\
Opérandes valides :

* `"AAAA-MM-JJ 00:00"` (chaîne de caractères)
* timestamp unix `1234567890` (entier)
* `"Il y a N jours"` (chaîne de caractères) pour les opérateurs EQ, BETWEEN, GTE, LTE

#### Tags de type booléen

Opérateurs valides : EQ, NOTSET, ANY\
Opérandes valides : `0, 1, true, false`

#### Tags de type liste

Opérateurs valides : IN, NOTIN, NOTSET, ANY\
Opérandes valides : l'opérande doit être un tableau de chaînes de caractères comme `["valeur 1", "valeur 2", "valeur N"]`.

<Aside type="danger">
Rappelez-vous que les paramètres "filter" et "conditions" ne doivent pas être utilisés ensemble.\
De plus, ils **seront tous les deux ignorés**, si le paramètre "devices" est utilisé dans la même requête.
</Aside>

<Aside type="note">
#### Tags Pays et Langue

La valeur du tag Langue est un code à deux lettres en minuscules selon [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)\
La valeur du tag Pays est un code à deux lettres en MAJUSCULES selon [ISO_3166-2](https://en.wikipedia.org/wiki/ISO_3166-2)\
Par exemple, pour envoyer une notification push aux abonnés lusophones au Brésil, vous devrez spécifier la condition suivante : `"conditions": [["Country", "EQ", "BR"],["Language", "EQ", "pt"]]`
</Aside>

### Extraits de code /createMessage

<Aside type="caution" title="Important">
Veuillez être prudent lors de l'utilisation des extraits de code. Limitez le nombre de destinataires en spécifiant les paramètres "users", "devices", "filter" ou "conditions". Si aucun de ces paramètres n'est spécifié, le message sera envoyé **à chaque appareil** abonné aux notifications push de l'application.
</Aside>

Exemples de requêtes `/createMessage` :

<Tabs>
<TabItem label="Bash">
```bash
#!/bin/bash
 
#Utilisation
if [ ! -n "$1" ] || [ ! -n "$2" ]
then
  echo "`basename $0` usage: api_token appid message";
  exit 1;
fi;
MESSAGE="$3";
if [ -z "$3" ]
then
MESSAGE='One push to rule them all!'
fi;
 
echo -e "Response:"
curl --data-binary "
{\"request\":
    {\"application\":\"$2\",
     \"auth\":\"$1\",
     \"notifications\":
        [{
                        \"send_date\": \"now\",
            \"content\": \"$MESSAGE\"
        }]
    }
}" \
-H "Content-type: application/json" \
"https://api.pushwoosh.com/json/1.3/createMessage"
echo "";
exit 0;
```
</TabItem>

<TabItem label="PHP">
```php
<?php 
define('PW_AUTH', 'API TOKEN');
define('PW_APPLICATION', 'APPLICATION CODE');
define('PW_DEBUG', true);
 
function pwCall($method, $data) {
    $url = 'https://api.pushwoosh.com/json/1.3/' . $method;
    $request = json_encode(['request' => $data]);
 
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
 
    $response = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);
 
    if (defined('PW_DEBUG') && PW_DEBUG) {
        print "[PW] request: $request
";
        print "[PW] response: $response
";
        print '[PW] info: ' . print_r($info, true);
    }
}
 
pwCall('createMessage', array(
    'application' => PW_APPLICATION,
    'auth' => PW_AUTH,
    'notifications' => array(
            array(
                'send_date' => 'now',
                'content' => 'test',
                'data' => array('custom' => 'json data'),
                'link' => 'https://pushwoosh.com/'
            )
        )
    )
);
```
</TabItem>

<TabItem label="Erlang">
```erlang
-module(pushwoosh).
-export([run/0, stop/0, sendMessage/1]).
%% argument sendMessage : texte du message %%
 
%% Authentification & App_id %%
-define(PW_AUTH, "YOUR_AUTH_TOKEN").
-define(PW_APPLICATION, "YOUR_PUSHWOOSH_APP_CODE").
 
%% Démarrage %%
run() ->
    application:start(unicode),
    application:start(crypto),
    application:start(public_key),
    application:start(ssl),
    application:start(inets),
    %% Options de verbosité du client HTTP false, verbose, debug
    httpc:set_options([{verbose, false}]).  
stop() ->
    application:stop(ssl),
    application:stop(public_key),       
    application:stop(crypto),
    application:stop(inets).
%% Guerres JSON !
encode(S) -> encode(S, [$"]).
encode([], Acc) -> lists:reverse([$" | Acc]);
encode([C | Cs], Acc) ->
        Hex = lists:flatten(io_lib:format("~4.16.0b", [C])),
        encode(Cs, lists:reverse(Hex) ++ "u\" ++ Acc).
 
sendMessage(Message_text) ->
    %% URL vers l'API JSON 1.3
    Url = "https://api.pushwoosh.com/json/1.3/createMessage",
    EncodedMessage = encode(Message_text),
    {ok, Response} = httpc:request(
        %%Méthode 
        post, 
        %%Requête
        {Url, [{"User-Agent", "Erlang exemple"}], "application/json; charset=UTF-8", 
        "{\"request\":{
        \"application\": \""?PW_APPLICATION"\",
        \"auth\": \""?PW_AUTH"\",
        \"notifications\": [{
        \"send_date\": \"now\",
        \"content\": "++EncodedMessage++"
        }]}}"},
        %%Options HTTP
        [{ssl,[{verify, verify_none}]}, {version, "HTTP/1.0"}],
        %%Options
        []),
    io:format("And received ~p", [Response]).
```
</TabItem>

<TabItem label="Ruby">
```ruby
class PushNotification
 
  #- Documentation de l'API PushWoosh https://www.pushwoosh.com/programming-push-notification/pushwoosh-push-notification-remote-api/ 
  #- Deux méthodes ici :
  #     - PushNotification.new.notify_all(message) Notifie tout le monde avec la même option
  #     - PushNotification.new.notify_devices(notification_options = {}) Notifie des appareils spécifiques avec des options personnalisées
 
  include HTTParty #Assurez-vous d'avoir la gemme HTTParty déclarée dans votre gemfile https://github.com/jnunemaker/httparty
  default_params :output => 'json'
  format :json
 
  def initialize
    #- Changez pour vos paramètres
    @auth = {:application  => "00000-00000",:auth => "auth_token"}
  end
 
  # PushNotification.new.notify_all("Ceci est une notification de test pour tous les appareils")
  def notify_all(message)
    notify_devices({:content  => message})
  end
 
  # PushNotification.new.notify_device({
  #  :content  => "TEST",
  #  :data  => {:custom_data  => value},
  #  :devices  => array_of_tokens
  #})
  def notify_devices(notification_options = {})
    #- Options par défaut, décommentez :data ou :devices si nécessaire
    default_notification_options = {
                        # AAAA-MM-JJ HH:mm  OU 'now'
                        :send_date  => "now",
                        # Objet( langue1: 'contenu1', langue2: 'contenu2' ) OU chaîne de caractères
                        :content  => {
                            :fr  => "Test",
                            :en  => "Test"
                        },
                        # Chaîne JSON ou objet JSON "custom": "json data"
                        #:data  => {
                        #    :custom_data  => value
                        #},
                        # omettre ce champ (la notification push sera livrée à tous les appareils de l'application), ou fournir la liste des ID d'appareils
                        #:devices  => {}
                      }
 
    #- Fusion avec des options spécifiques
    final_notification_options = default_notification_options.merge(notification_options)
 
    #- Construction de l'appel final
    options = @auth.merge({:notifications  => [final_notification_options]})
    options = {:request  => options}                                                                                                                             
    #- Exécution de l'appel API POST avec HTTPARTY - :body => options.to_json nous permet d'envoyer le json comme un objet au lieu d'une chaîne de caractères
    response = self.class.post("https://api.pushwoosh.com/json/1.3/createMessage", :body  => options.to_json,:headers => { 'Content-Type' => 'application/json' })
  end
end
```
</TabItem>

<TabItem label="Java">
```java
// Utilise les classes JSON de https://json.org/java/

package com.arellomobile;
 
import org.json.*;
import java.io.*;
import java.net.*;
 
public class SendPushNotificationSample
{
    public static final String PUSHWOOSH_SERVICE_BASE_URL = "https://api.pushwoosh.com/json/1.3/";
    private static final String AUTH_TOKEN = "YOUR_AUTH_TOKEN";
    private static final String APPLICATION_CODE = "PW_APPLICATION_CODE";
 
    public static void main(String[] args) throws JSONException, MalformedURLException
    {
        String method = "createMessage";
        URL url = new URL(PUSHWOOSH_SERVICE_BASE_URL + method);
 
        JSONArray notificationsArray = new JSONArray()
                .put(new JSONObject().put("send_date", "now")
                                     .put("content", "test")
                                     .put("link", "https://pushwoosh.com/"));
 
        JSONObject requestObject = new JSONObject()
                .put("application", APPLICATION_CODE)
                .put("auth", AUTH_TOKEN)
                .put("notifications", notificationsArray);
 
        JSONObject mainRequest = new JSONObject().put("request", requestObject);
        JSONObject response = SendServerRequest.sendJSONRequest(url, mainRequest.toString());
 
        System.out.println("Response is: " + response);
    }
}
 
class SendServerRequest
{
    static JSONObject sendJSONRequest(URL url, String request)
    {
        HttpURLConnection connection = null;
        try
        {
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoInput(true);
            connection.setDoOutput(true);
 
            DataOutputStream writer = new DataOutputStream(connection.getOutputStream());
            writer.write(request.getBytes("UTF-8"));
            writer.flush();
            writer.close();
 
            return parseResponse(connection);
        }
        catch (Exception e)
        {
            System.out.println("An error occurred: " + e.getMessage());
            return null;
        }
        finally
        {
            if (connection != null)
            {
                connection.disconnect();
            }
        }
    }
 
    static JSONObject parseResponse(HttpURLConnection connection) throws IOException, JSONException
    {
        String line;
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        StringBuilder response = new StringBuilder();
 
        while ((line = reader.readLine()) != null)
        {
            response.append(line).append('
');
        }
        reader.close();
 
        return new JSONObject(response.toString());
    }
}
```
</TabItem>

<TabItem label="Python">
```python
import json
 
PW_AUTH = 'API TOKEN'
PW_APPLICATION_CODE = 'APPLICATION CODE'
 
try:
    # Pour Python 3.0 et versions ultérieures
    from urllib.request import urlopen
    from urllib.request import Request
except ImportError:
    # Retour à urllib2 de Python 2
    from urllib2 import urlopen
    from urllib2 import Request
 
def pw_call(method, data):
    url = 'https://api.pushwoosh.com/json/1.3/' + method
    data = json.dumps({'request': data})
    req = Request(url, data.encode('UTF-8'), {'Content-Type': 'application/json'})
    try:
        f = urlopen(req)
        response = f.read()
        f.close()
        print('Pushwoosh response: ' + str(response))
    except Exception as e:
        print ('Request error: ' + str(e))
 
if __name__ == '__main__':
    pw_call('createMessage', {
        'auth': PW_AUTH,
        'application': PW_APPLICATION_CODE,
        'notifications': [
            {
                'send_date': 'now',
                'content': 'test',
                'data': {"custom": "json data"},
                'link': 'https://pushwoosh.com'
            }
        ]
    }
    )
```
</TabItem>

<TabItem label=".NET">
```
using System;
using System.IO;
using System.Net;
using Newtonsoft.Json.Linq;

namespace WebApplication1
{
   public partial class Default : System.Web.UI.Page
   {
       protected void Page_Load(object sender, EventArgs e)
       {
           string pwAuth = "YOUR_AUTH_TOKEN";
           string pwApplication = "PW_APPLICATION_CODE";
           JObject json = new JObject(
               new JProperty("application", pwApplication),
               new JProperty("auth", pwAuth),
               new JProperty("notifications",
                   new JArray(
                       new JObject(
                           new JProperty("send_date", "now"),
                           new JProperty("content", "test"),
                           new JProperty("wp_type", "Toast"),
                           new JProperty("wp_count", 3),
                           new JProperty("data",
                               new JObject(
                                   new JProperty("custom", "json data"))),
                           new JProperty("link", "https://pushwoosh.com/"),
                           new JProperty("conditions",
                               new JArray(
                                   (object)new JArray("Color", "EQ", "black")))))));
           PWCall("createMessage", json);
       }
       private void PWCall(string action, JObject data)
       {
           Uri url = new Uri("https://api.pushwoosh.com/json/1.3/" + action);
           JObject json = new JObject(new JProperty("request", data));
           DoPostRequest(url, json);
       }
       private void DoPostRequest(Uri url, JObject data)
       {
           HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
           req.ContentType = "text/json";
           req.Method = "POST";
           using (var streamWriter = new StreamWriter(req.GetRequestStream()))
           {
               streamWriter.Write(data.ToString());
           }
           HttpWebResponse httpResponse;
           try
           {
               httpResponse = (HttpWebResponse)req.GetResponse();
           }
           catch (Exception exc)
           {
               throw new Exception(string.Format("Problem with {0}, {1}", url, exc.Message));
           }
           using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
           {
               var responseText = streamReader.ReadToEnd();
               Page.Response.Write(responseText);
           }
       }
   }
}
```
</TabItem>

<TabItem label="Go">
```go
package main

import
(
	"fmt"
	"encoding/json"
	"net/http"
	"bytes"
	"io/ioutil"
)

const (
	PW_APPLICATION = "APPLICATION CODE"
	PW_AUTH = "API TOKEN"
	PW_ENDPOINT = "https://api.pushwoosh.com/json/1.3/"
)

func pwCall(method string, data []byte) (bool) {
	url := PW_ENDPOINT + method
	request, err := http.NewRequest("POST", url, bytes.NewBuffer(data))
	request.Header.Set("Content-Type", "application/json")

	client := http.Client{}
	response, err := client.Do(request)
	if err != nil {
		fmt.Println("Error occur: " + err.Error())
		return false
	}
	defer response.Body.Close()

	fmt.Println("Response Status: ", response.Status)
	if (response.StatusCode == 200) {
		body, _ := ioutil.ReadAll(response.Body)
		fmt.Println("Response Body: ", string(body))
		return true
	}
	return false
}

func main() {
	requestData := map[string]interface{}{
		"request": map[string]interface{} {
			"auth": PW_AUTH,
			"application": PW_APPLICATION,
			"notifications": []interface{}{
				map[string]interface{} {
					"send_date": "now",
					"content": "test",
					"link": "https://pushwoosh.com",
				},
			},
		},
	}
	jsonRequest, _ := json.Marshal(requestData)
	requestString := string(jsonRequest)
	fmt.Println("Request body: " + requestString)

	pwCall("createMessage", jsonRequest)
}
```
</TabItem>

<TabItem label="JavaScript">
```javascript
$.ajax({
    type: "POST",
    url: "https://api.pushwoosh.com/json/1.3/createMessage",
    data: JSON.stringify({
        "request": {
            "application": "APPLICATION CODE",
            "auth": "API TOKEN",
            "notifications": [{
                "send_date": "now",
                "ignore_user_timezone": true,
                "content": "Hello world!"
            }]
        }
    }),
    dataType: "json"
}).done(function(data) {
    console.log(data);
});
```
</TabItem>
</Tabs>

## deleteMessage

`POST` `https://api.pushwoosh.com/json/1.3/deleteMessage`

Supprime un message programmé.

#### Corps de la requête

| Nom                                      | Type   | Description                                      |
| ----------------------------------------- | ------ | ------------------------------------------------ |
| auth*    | string | [Jeton d'accès API](/fr/developer/api-reference/api-identifiers/#api-access-token) depuis le panneau de contrôle Pushwoosh.   |
| message* | string | [Code de message](/fr/developer/api-reference/api-identifiers/#message-code) obtenu dans la requête `/createMessage`. |

<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK"
}
```
</TabItem>
</Tabs>

```json title="Exemple"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "message": "xxxx-xxxxxxx-xxxxxx" // requis. Code de message obtenu dans /createMessage
  }
}
```

<Aside type="danger">
Vous ne pouvez pas supprimer les messages qui ont déjà été envoyés.
</Aside>

**Codes de statut :**

| Code de statut HTTP | status_code | Description                                         |
| ---------------- | ------------ | --------------------------------------------------- |
| 200              | 200          | Message supprimé avec succès                        |
| 200              | 210          | Erreur d'argument. Voir status_message pour plus d'infos |
| 400              | N/A          | Chaîne de requête malformée                            |
| 500              | 500          | Erreur interne                                      |

```php
<?php
// voir https://gomoob.github.io/php-pushwoosh/delete-message.html
use Gomoob\Pushwoosh\Model\Request\DeleteMessageRequest;

// crée une instance de requête
$request = DeleteMessageRequest::create()->setMessage('MESSAGE_CODE');

// appelle le service Web '/deleteMessage'
$response = $pushwoosh->deleteMessage($request);

if($response->isOk()) {
    print 'Génial, mon message a été supprimé !';
} else {
    print 'Oups, la suppression a échoué :-('; 
    print 'Code de statut : ' . $response->getStatusCode();
    print 'Message de statut : ' . $response->getStatusMessage();
}
```

## getMessageDetails

`POST` `https://api.pushwoosh.com/json/1.3/getMessageDetails`

Récupère les détails du message.

#### Corps de la requête

| Nom                                      | Type   | Description                                    |
| ----------------------------------------- | ------ | ---------------------------------------------- |
| auth*    | string | [Jeton d'accès API](/fr/developer/api-reference/api-identifiers/#api-access-token) depuis le panneau de contrôle Pushwoosh. |
| message* | string | [Code de message](/fr/developer/api-reference/api-identifiers/#message-code) ou ID de message.                    |

<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": {
    "message": {
      "id": 2068991743,
      "created": "2016-09-14 17:19:42",
      "send_date": "2016-09-14 17:19:41",
      "status": "done",
      "content": {
        "en": "Hello {Name|CapitalizeFirst|friend}! 🚀"
      },
      "platforms": "[1]",
      "ignore_user_timezone": "1",
      "code": "XXXX-92B4C3C5-A7F5EF70",
      "data": {
        "key": "value"
      }
    }
  }
}
```
</TabItem>
</Tabs>

```json title="Exemple"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "message": "xxxx-xxxxxxx-xxxxxx" // requis. code de message ou ID de message
  }
}
```

## createTargetedMessage <Badge text="Obsolète" variant="caution" size="small" />

`POST` `https://api.pushwoosh.com/json/1.3/createTargetedMessage`

Crée une nouvelle notification push ciblée.

#### Corps de la requête

| Nom                                              | Type    | Description                                                                                                                            |
| ------------------------------------------------- | ------- |----------------------------------------------------------------------------------------------------------------------------------------|
| auth*            | string  | [Jeton d'accès API](/fr/developer/api-reference/api-identifiers/#api-access-token) depuis le panneau de contrôle Pushwoosh.                                                                                         |
| devices_filter* | string  | Voir la remarque ci-dessous.                                                                                                                      |
| send_date*      | string  | AAAA-MM-JJ HH:mm ou 'now'.                                                                                                             |
| ignore_user_timezone                            | boolean | Si ignoré, UTC-0 est la valeur par défaut pour "send_date".                                                                                         |
| timezone                                          | string  | Si ignoré, UTC-0 est la valeur par défaut pour "send_date".                                                                                         |
| campaign                                          | string  | [Code d'une campagne](/fr/developer/api-reference/api-identifiers/#campaign-code) à laquelle vous souhaitez assigner ce message push.                                                                      |
| content*         | string  | Contenu de la notification. Voir l'exemple de requête pour plus de détails.                                                                             |
| transactionId                                     | string  | Identifiant de message unique pour éviter la duplication des messages en cas de problèmes de réseau. Stocké du côté de Pushwoosh pendant 5 minutes. |
| link                                              | string  | Lien à ouvrir une fois qu'un utilisateur ouvre un message push.                                                                                    |
| minimize_link                                    | integer | 0 - ne pas minimiser, 2 - bit.ly. Par défaut = 2.                                                                                          |
| data                                              | object  | Chaîne JSON ou objet JSON. Sera passé comme paramètre "u" dans la charge utile (converti en chaîne JSON).                                 |
| preset                                            | string  | [Code de préréglage](/fr/developer/api-reference/api-identifiers/#preset-code).                                                                                                                           |
| send_rate                                        | integer | Limitation du débit. Les valeurs valides sont de 100 à 1000 pushes par seconde.                                                                       |
| inbox_date                                       | string  | Spécifiez quand supprimer un message de la boîte de réception.                                                                                       |
| inbox_image                                      | string  | URL de l'image à afficher à côté du message dans la boîte de réception.                                                                            |

<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": {
    "messageCode": "97B0-C7473871-2FBDFDC6"
  }
}
```
</TabItem>

<TabItem label="400 Erreurs de syntaxe JSON">
```
La requête ne peut pas être satisfaite en raison d'une mauvaise syntaxe.
```
</TabItem>
</Tabs>

Plus d'exemples de réponses :

<Tabs>
<TabItem label="210 - syntaxe">
```json
{
  "status_code": 210,
  "status_message": "Des erreurs se sont produites lors de la compilation du filtre",
  "response": {
    "errors": [{
      "message": "Spécification de l'ensemble de tags invalide. \")\" attendu.",
      "type": "syntax"
    }]
  }
}
```
</TabItem>

<TabItem label="210 - sémantique">
```json
{
  "status_code": 210,
  "status_message": "Des erreurs se sont produites lors de la compilation du filtre",
  "response": {
    "errors": [{
      "message": "Application \"11111-11111\" non trouvée",
      "type": "semantic",
      "near": "\"11111-11111\""
    }]
  }
}

```
</TabItem>

<TabItem label="210 - lexical">
```json
{
  "status_code": 210,
  "status_message": "Des erreurs se sont produites lors de la compilation du filtre",
  "response": {
    "errors": [{
      "message": "Caractère invalide \"/\" à 1:19",
      "type": "lexical"
    }]
  }
}
```
</TabItem>
</Tabs>

<Aside type="danger" title="Mode difficile">
Devriez-vous utiliser [`/createMessage`](#createmessage) à la place ?
</Aside>


<Tabs>
<TabItem label="Exemple">
```json title="Exemple"
{
  "request": {
    "auth": "yxoPUlwqm…………pIyEX4H",    // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "devices_filter": "A(\"XXXXX-XXXXX\") * T(\"City\", EQ, \"Name\")", // requis. Syntaxe expliquée ci-dessous
    "send_date": "now",                // optionnel. AAAA-MM-JJ HH:mm OU 'now'
    "ignore_user_timezone": true,      // optionnel.
    "timezone": "America/New_York",    // optionnel. Si ignoré, UTC-0 est la valeur par défaut pour "send_date".
                                       //           Plus d'infos https://php.net/manual/timezones.php.
    "campaign": "CAMPAIGN_CODE",       // optionnel. Code de campagne auquel vous souhaitez assigner ce message push.
    "content": {                       // optionnel. Objet OU chaîne de caractères. Utilisez "wns_content" à la place pour Windows.
      "en": "English",
      "de": "Deutsch"
    },
    "transactionId": "unique UUID",    // optionnel. Identifiant de message unique pour éviter la duplication des messages
                                       //           en cas de problèmes de réseau. Stocké du côté de
                                       //           Pushwoosh pendant 5 minutes.
    "rich_media": "XXXXX-XXXXX",       // optionnel. Copiez le code Rich Media depuis la barre d'URL de la
                                       //           page de l'éditeur Rich Media dans le panneau de contrôle Pushwoosh. 
    "link": "https://google.com",      // optionnel. Pour les liens profonds, ajoutez "minimize_link": 0
    "minimize_link": 0,                // optionnel. 0 — ne pas minimiser, 2 — bitly. Par défaut = 2.
                                       //           Le raccourcisseur d'URL Google est désactivé depuis le 30 mars 2019.
                                       //           Veuillez noter que les raccourcisseurs ont des restrictions
                                       //           sur le nombre d'appels.
    "data": {                          // optionnel. Chaîne JSON ou objet JSON.
      "key": "value"                   //           Sera passé comme paramètre "u" dans la charge utile
    },                                 //           (converti en chaîne JSON).
    "preset": "XXXXX-XXXXX",           // optionnel. Code de préréglage Push depuis votre panneau de contrôle.
    "send_rate": 100,                  // optionnel. Limitation du débit. Les valeurs valides sont de 100 à 1000 pushes/seconde.
    "dynamic_content_placeholders": {  // optionnel. Espaces réservés pour le contenu dynamique au lieu des tags de l'appareil.
      "firstname": "John",
      "lastname": "Doe"
    },

    // Pour enregistrer le message dans la boîte de réception via l'API, utilisez "inbox_date" ou "inbox_image".
    // Le message est enregistré lorsqu'au moins un de ces paramètres est utilisé. 
    "inbox_image": "Inbox image URL",  // optionnel. L'image à afficher à côté du message.
    "inbox_date": "2017-02-02"         // optionnel. Spécifiez quand supprimer un message de la boîte de réception.
                                       //           Le message sera supprimé de la boîte de réception à 00:00:01 UTC de
                                       //           la date spécifiée, donc la date précédente est le dernier
                                       //           jour où un utilisateur peut voir le message dans sa boîte de réception.
                                       //           Si non spécifié, la date de suppression par défaut est le
                                       //           jour suivant la date d'envoi.
  }
}
```
</TabItem>

<TabItem label="Paramètres spécifiques à la plateforme">
```json title="Paramètres spécifiques à la plateforme"
{
  "request": {
    "auth": "yxoPUlwqm…………pIyEX4H",        // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "devices_filter": "FILTER CONDITION",
    "send_date": "now",                    // optionnel. AAAA-MM-JJ HH:mm OU 'now'
    "content": {                           // optionnel. Objet OU chaîne de caractères.
      "en": "English",                     //           Utilisez "wns_content" à la place pour Windows.
      "de": "Deutsch"
    },
    "ignore_user_timezone": true,          // optionnel.
    "timezone": "America/New_York",        // optionnel. Si ignoré, UTC-0 est la valeur par défaut pour "send_date".
                                           //           Plus d'infos https://php.net/manual/timezones.php.
    "campaign": "CAMPAIGN_CODE",           // optionnel. Code de campagne auquel vous souhaitez assigner ce message push.
    
    // Paramètres liés à iOS
    "ios_badges": 5,                       // optionnel. Numéro de badge de l'application iOS.
                                           //           Utilisez "+n" ou "-n" pour incrémenter/décrémenter la valeur du badge de n.
    "ios_sound": "sound file.wav",         // optionnel. Nom du fichier son dans le bundle principal de l'application.
                                           //           Si laissé vide, l'appareil ne produira aucun son
                                           //           lors de la réception d'un push.
    "ios_sound_off": true,                 // optionnel. Activer/désactiver le son défini par le champ "ios_sound".
    "ios_ttl": 3600,                       // optionnel. Paramètre de durée de vie — durée de vie maximale du message en secondes.
    "ios_silent": 1,                       // optionnel. Active les notifications silencieuses (ignore "sound" et "content").
    "ios_category_id": "1",                // optionnel. ID de catégorie iOS8 de Pushwoosh.
    "ios_category_custom": "category",     // optionnel. Catégorie APNS personnalisée.
    "ios_root_params": {                   // optionnel. Paramètres de niveau racine pour le dictionnaire aps.
      "aps": {
        "content-available": "0",          // optionnel. Définir "1" pour envoyer un push silencieux et "0" pour un push normal.
        "mutable-content": 1               // requis pour les pièces jointes multimédias iOS10+.
      },
      "attachment": "YOUR_ATTACHMENT_URL", // URL de la pièce jointe multimédia iOS10+.
      "data": {}                           // optionnel. Données fournies par l'utilisateur, max 4 Ko
    },
    "apns_trim_content": 1,                // optionnel. (0|1) Tronque les chaînes de contenu excédentaires avec des points de suspension.
    "ios_title": {                         // optionnel. Ajoute un titre pour la notification push iOS.
      "en": "title"
    },
    "ios_subtitle": {                      // optionnel. Ajoute un sous-titre pour la notification push iOS.
      "en": "subTitle"
    },
    "ios_content": {                       // optionnel. Ajoute un contenu pour la notification push iOS.
      "en": "content"
    },
    
    // Paramètres liés à Android
    "android_root_params": {               // optionnel. Objet clé-valeur personnalisé.
      "key": "value"                       //           Paramètres de niveau racine pour les destinataires de la charge utile Android.
    },
    "android_sound": "soundfile",          // optionnel. Pas d'extension de fichier. Si laissé vide, l'appareil
                                           //           ne produira aucun son lors de la réception d'un push.
    "android_sound_off": true,             // optionnel. Activer/désactiver le son défini par le champ "android_sound"
    "android_header": {                    // optionnel. Objet OU chaîne de caractères. En-tête de notification Android.
      "en": "header" 
    },
    "android_content": {                   // optionnel. Objet OU chaîne de caractères. Contenu de la notification Android.
      "en": "content"
    },
    "android_icon": "icon.png",  
    "android_custom_icon": "URL.png",      // optionnel. URL du chemin complet vers le fichier image.
    "android_banner": "URL.png",           // optionnel. URL du chemin complet vers le fichier image.
    "android_badges": 5,                   // optionnel. entier. Numéro de badge de l'icône de l'application Android.
                                           //           Utilisez "+n" ou "-n" pour incrémenter/décrémenter la valeur du badge de n.
    "android_gcm_ttl": 3600,               // optionnel. Paramètre de durée de vie — durée de vie maximale du message en secondes.
    "android_vibration": 0,                // optionnel. Vibration forcée Android pour les pushes à haute priorité.
    "android_led": "#rrggbb",              // optionnel. Couleur hexadécimale de la LED, l'appareil fera sa meilleure approximation.
    "android_priority": -1,                // optionnel. Définit le paramètre "importance" pour les appareils avec Android 8.0
                                           //           et supérieur, ainsi que le paramètre "priority" pour les appareils
                                           //           avec Android 7.1 et inférieur. Établit l'interruption
                                           //           niveau d'un canal de notification ou d'une notification particulière.
                                           //           Les valeurs valides sont -2, -1, 0, 1, 2.
    "android_delivery_priority": "normal", // optionnel. "normal" ou "high". Active la livraison de la notification
                                           //           lorsque l'appareil est en mode d'économie d'énergie. 
    "android_ibc": "#RRGGBB",              // optionnel. couleur de fond de l'icône sur Lollipop, #RRGGBB,
                                           //           #AARRGGBB, "red", "black", "yellow", etc.
    "android_silent": 1,                   // optionnel. 0 ou 1. Activer la notification silencieuse.
                                           //           Ignorer le son et le contenu
    
    // Paramètres liés à Amazon
    "adm_root_params": {                   // optionnel. Objet clé-valeur personnalisé
      "key": "value"
    },
    "adm_sound": "push.mp3",
    "adm_sound_off": true,                 // optionnel. Activer/désactiver le son défini par le champ "adm_sound"
    "adm_header": {
      "en": "Header"
    },
    "adm_content": {
      "en": "content"
    },
    "adm_icon": "icon.png",
    "adm_custom_icon": "URL.png",
    "adm_banner": "URL.png",
    "adm_ttl": 3600,                       // optionnel. Paramètre de durée de vie — la durée de vie maximale du message
                                           //           en secondes.
    "adm_priority": -1,                    // optionnel. Priorité du push dans le tiroir de push Amazon,
                                           //           les valeurs valides sont -2, -1, 0, 1 et 2.
    
    // Paramètres liés à Mac OS X
    "mac_badges": 3,
    "mac_sound": "sound.caf",
    "mac_sound_off": true,
    "mac_root_params": {
      "content-available": 1
    },
    "mac_ttl": 3600,                       // optionnel. Paramètre de durée de vie — durée de vie maximale du message en secondes.
    "mac_title": {                         // optionnel. Ajoute un titre pour la notification push.
      "en": "title"
    },
    "mac_subtitle": {                      // optionnel. Ajoute un sous-titre pour la notification push MacOS.
      "en": "subtitle"
    },
    "mac_content": {                       // optionnel. Ajoute un contenu pour la notification push MacOS.
      "en": "content"
    },
    
    // Paramètres liés à Windows
    "wns_content": {                       // requis. Contenu (XML ou brut) de la notification encodé
                                           //           en base64 de MIME sous forme d'Objet OU de Chaîne de caractères
      "en": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9ImF2YWlsYWJsZSIvPg==",
      "de": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9Im5ld01lc3NhZ2UiLz4="
    },
    "wns_type": "Badge",                   // 'Tile' | 'Toast' | 'Badge' | 'Raw'
    "wns_tag": "myTag",                    // optionnel. Utilisé dans la politique de remplacement de tuile.
                                           //           Une chaîne alphanumérique de 16 caractères maximum.
    "wns_cache": 1,                        // optionnel. (1|0) Se traduit en valeur X-WNS-Cache-Policy.
    "wns_ttl": 600,                        // optionnel. Temps d'expiration de la notification en secondes.
    
    // Paramètres liés à Safari
    "safari_title": {                      // optionnel. Objet OU chaîne de caractères. Titre de la notification.
      "en": "title"
    },
    "safari_content": {                    // optionnel. Objet OU chaîne de caractères. Contenu de la notification.
      "en": "content"
    },
    "safari_action": "Click here",         // optionnel.
    "safari_url_args": [                   // requis. mais la valeur peut être vide
      "firstArgument",
      "secondArgument"
    ],
    "safari_ttl": 3600,                    // optionnel. Paramètre de durée de vie — la durée de vie maximale
                                           //           d'un message en secondes.
    
    // Paramètres liés à Chrome
    "chrome_title": {                      // optionnel. Vous pouvez spécifier l'en-tête du message dans ce paramètre.
      "en": "title"
    },
    "chrome_content": {                    // optionnel. Vous pouvez spécifier le contenu du message dans ce paramètre.
      "en": "content"
    },
    "chrome_icon": "icon_URL",             // optionnel. URL du chemin complet vers l'icône ou chemin du fichier de ressources de l'extension
    "chrome_gcm_ttl": 3600,                // optionnel. Paramètre de durée de vie – durée de vie maximale du message en secondes.
    "chrome_duration": 20,                 // optionnel. Modifie le temps d'affichage du push Chrome. Définir à 0 pour afficher le push
                                           //           jusqu'à ce que l'utilisateur interagisse avec lui.
    "chrome_image": "image_URL",           // optionnel. URL vers une grande image
    "chrome_root_params": {                // optionnel. Définir des paramètres spécifiques aux messages envoyés à Chrome.
      "key": "value"
    },
    "chrome_button_text1": "text1",        // optionnel.
    "chrome_button_url1": "button1_URL",   // optionnel. Ignoré si chrome_button_text1 n'est pas défini.
    "chrome_button_text2": "text2",        // optionnel.
    "chrome_button_url2": "button2_url",   // optionnel. Ignoré si chrome_button_text2 n'est pas défini.
    
    // Paramètres liés à Firefox
    "firefox_title": {                     // optionnel. Objet OU chaîne de caractères. Vous pouvez spécifier l'en-tête du message ici.
      "en": "title"
    },
    "firefox_content": {                   // optionnel. Objet OU chaîne de caractères. Vous pouvez spécifier le contenu du message ici.
      "en": "content"
    },
    "firefox_icon": "icon_URL",            // optionnel. URL du chemin complet vers l'icône ou chemin
                                           //           vers le fichier dans les ressources de l'extension.
    "firefox_root_params": {               // optionnel. Définir des paramètres spécifiques aux messages envoyés à Firefox.
      "key": "value"
    }
  }
}
```
</TabItem>
</Tabs>

Les bases sont très simples – tous les filtres sont effectués sur les **ensembles** d'entités.

### Ensembles

Les ensembles sont définis comme :

**1.** Appareils abonnés à l'application particulière (A) ;\
**2.** Appareils qui correspondent aux valeurs de tag spécifiées (T) ou à la valeur de tag spécifique à l'application (AT) ;\


### Syntaxe

Essayons avec quelques exemples selon la liste ci-dessus.

#### Ciblage des abonnés de l'application

Le filtre "A" définit un ensemble d'appareils abonnés à une application particulière :

`A("XXXXX-XXXXX", ["iOS", "Android", "OsX", "Windows", "Amazon", "Safari", "Chrome", "Firefox"])`

où

* "XXXXX-XXXXX" – Code d'application Pushwoosh
* \["iOS", "Android", ...] – tableau des plateformes ciblées. Si omis, le message sera envoyé à toutes les plateformes disponibles pour cette application.

#### Filtrage par valeurs de tag

Le filtre "T" définit un ensemble d'appareils auxquels des valeurs de tag spécifiées sont assignées.

`T(\"Age\", IN, [17,20])`

Définit l'ensemble des appareils qui ont le tag "age" défini sur l'une des valeurs : 17, 18, 19, 20.

<Aside type="caution">
Pour les **tags spécifiques à l'application**, le filtre "AT" est appliqué. Assurez-vous de spécifier un code d'application correspondant comme première valeur dans un ensemble AT :

`AT(“XXXXX-XXXXX”, “TagName”, EQ, “VALUE”)`
</Aside>


### Types de tags et opérateurs

La chose très importante à comprendre est que les tags sont partagés entre les applications, et cela représente un instrument très puissant pour segmenter et filtrer vos utilisateurs cibles sans vous lier à une application particulière.

Le tag peut être de l'un des trois types différents : **Chaîne de caractères, Entier, Liste**. Le type de tag définit les opérateurs que vous pouvez utiliser pour un tag particulier.

#### Tags de type chaîne de caractères

**Opérateurs applicables :**

* **EQ** – cible les appareils avec une valeur de tag spécifiée
* **IN** – cible les appareils avec l'une des valeurs de tag spécifiées
* **NOTIN** – cible les appareils sans aucune des valeurs de tag spécifiées
* **NOTEQ** – cible les appareils avec une valeur de tag non égale à celle spécifiée
* **NOTSET** – cible les appareils sans valeur pour un tag spécifié
* **ANY** – cible les appareils avec n'importe quelle valeur définie pour un tag spécifié

Exemples :

`T (\"Age\", EQ, 30)` – filtre les utilisateurs âgés de 30 ans

`T (\"favorite_color\", IN, [\"red\",\"green\",\"blue\"])` – filtre les utilisateurs qui ont choisi le rouge, le vert ou le bleu comme couleur préférée.

`T (\"Name", NOTSET, \"\")` – cible les appareils sans valeur pour le tag Nom.

Vous pouvez utiliser des valeurs numériques avec les tags de type chaîne de caractères, mais ces valeurs seront converties en chaîne de caractères.

#### Tags de type entier

**Opérateurs applicables :**

* **GTE** – supérieur ou égal à une valeur spécifiée
* **LTE**– inférieur ou égal à une valeur spécifiée
* **EQ** – égal à une valeur spécifiée
* **BETWEEN** – entre les valeurs min et max spécifiées
* **IN** – n'importe laquelle des valeurs spécifiées
* **NOTIN** – aucune des valeurs spécifiées n'est assignée à un appareil
* **NOTEQ** – appareils avec une valeur de tag non égale à celle spécifiée
* **NOTSET** – appareils sans valeur pour un tag spécifié
* **ANY** – appareils avec n'importe quelle valeur définie pour un tag spécifié

Exemples :

`T (\"Level\", EQ, 14)` – filtre les utilisateurs du niveau 14 uniquement.

`T (\"Level\", BETWEEN, [1,5)` – filtre les utilisateurs des niveaux 1, 2, 3, 4 et 5.

`T (\"Level", GTE, 29)` – cible les utilisateurs qui ont atteint au moins le niveau 29. 

#### Tags de type liste

**Opérateurs applicables :**

* **IN** – appareils avec l'une des valeurs de tag spécifiées

Exemple : `T("Category", IN, ["breaking_news","business","politics"])`

#### Tags de type date

**Opérateurs applicables :**

* **GTE** – supérieur ou égal à une valeur spécifiée
* **LTE**– inférieur ou égal à une valeur spécifiée
* **EQ** – égal à une valeur spécifiée
* **BETWEEN** – entre les valeurs min et max spécifiées
* **NOTEQ** – appareils avec une valeur de tag non égale à celle spécifiée
* **NOTSET** – appareils sans valeur pour un tag spécifié
* **ANY** – appareils avec n'importe quelle valeur définie pour un tag spécifié

Exemples :

`AT("7777D-322A7","Last Application Open", BETWEEN, ["2022-02-28", "2022-03-02"])`

`AT("7777D-322A7","Last Application Open", GTE, "90 days ago")`

### Opérations

* “+” – joint deux ensembles (équivaut à OU)
* “\*” – croise deux ensembles (équivaut à ET)
* “\” – soustrait un ensemble d'un autre (équivaut à NON)

Toutes les opérations sont associatives à gauche. "+" et "*" ont la même priorité. "\" a une priorité plus élevée. Vous pouvez utiliser des parenthèses pour définir les priorités des calculs.

Notez que l'opération “\” n'est pas commutative. `A("12345-12345") \ A("67890-67890")` n'est pas la même chose que `A("67890-67890") \ A("12345-12345")`.


<Aside type="note">
Vous ne pouvez utiliser aucun des paramètres de ciblage suivants dans la requête /createTargetedMessage :

* "application"
* "platforms"
* "devices"
* "filter"
* "conditions"

Tous les autres paramètres listés dans [`/createMessage`](#createmessage) sont pris en charge.
</Aside>

<Aside type="caution" title="Important">
Il y a un problème connu avec la méthode `/createTargetedMessage` : si vous ne spécifiez aucune application dans la section "devices_filter", Pushwoosh n'affiche aucune application dans les détails du push.
</Aside>

## getPushHistory <Badge text="Obsolète" variant="caution" size="small" />

<Aside type="note">
Utilisez [**/messages:list**](/fr/developer/api-reference/statistics-api/message-statistics-api/#messageslist) pour récupérer l'historique des messages et des données plus détaillées à la place.
</Aside>

`POST` `https://api.pushwoosh.com/json/1.3/getPushHistory`

Obtient l'historique des messages avec les détails des pushes.

#### Corps de la requête

| Nom                                   | Type    | Description                                                                                                          |
| -------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------- |
| auth* | string  | [Jeton d'accès API](/fr/developer/api-reference/api-identifiers/#api-access-token) depuis le panneau de contrôle Pushwoosh.                                                                       |
| limitMessages                          | integer | Limite le nombre de messages dans une réponse. Valeurs possibles de 10 à 1000.                                        |
| source                                 | string  | Source de l'historique des pushes. Peut être null ou : "CP", "API", "GeoZone", "RSS", "AutoPush", "A/B Test".       |
| searchBy                               | string  | Valeurs possibles pour la recherche. Peut être null ou : "notificationID", "notificationCode", "applicationCode", "campaignCode". |
| value                                  | string  | Valeur de recherche définie selon le champ "searchBy".                                                                  |
| lastNotificationID                     | string  | Utilisé pour la pagination. Dernier messageId de l'appel /getPushHistory précédent. Voir les détails ci-dessous.                       |

<Tabs>
<TabItem label="200">
```json
{
  "status_code": 200,
  "status_message": "OK",
  "response": {
    "rows": [{
      "id": 10191611434,
      "code": "8071-07AD1171-77238AD1",
      "createDate": "2020-09-14 12:26:21",
      "sendDate": "2020-09-14 12:26:21",
      "content": {
        "en": "Hello!"
      },
      "url": null,
      "ios_title": null,
      "ios_subtitle": null,
      "ios_root_params": null,
      "android_header": null,
      "android_root_params": null,
      "conditions": null,
      "conditions_operator": "AND",
      "filter_code": "E3A64-A5F3C",
      "filter_conditions": "#In-app Purchase(≠0)",
      "filter_name": "Purchased something",
      "geozone": null,
      "campaignId": "",
      "campaignName": "",
      "subscription_segments": null,
      "open": {
        "C90C0-0E786": {
          "IOS": 0
        }
      },
      "sent": {
        "C90C0-0E786": {
          "IOS": 1
        }
      },
      "ctr": {
        "C90C0-0E786": 0
      }
    }, {
      "id": 10191609202,
      "code": "41CA-83F8E0D7-7A63822B",
      "createDate": "2020-09-14 12:25:55",
      "sendDate": "2020-09-14 12:25:55",
      "content": {
        "en": "Hi!"
      },
      "url": null,
      "ios_title": null,
      "ios_subtitle": null,
      "ios_root_params": null,
      "android_header": null,
      "android_root_params": null,
      "conditions": null,
      "conditions_operator": "AND",
      "filter_code": null,
      "filter_conditions": null,
      "filter_name": null,
      "geozone": null,
      "campaignId": "",
      "campaignName": "",
      "subscription_segments": {
        "2D732-BB981": "News"
      },
      "open": {
        "C90C0-0E786": {
          "CHROME": 0,
          "IOS": 0
        }
      },
      "sent": {
        "C90C0-0E786": {
          "CHROME": 1,
          "IOS": 2
        }
      },
      "ctr": {
        "C90C0-0E786": 0
      }
    }]
  }
}
```
</TabItem>
</Tabs>



```json title="Exemple"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "source": null,                  // optionnel. Les valeurs possibles sont null, "CP", "API", "GeoZone",
                                     //           "RSS", "AutoPush", "A/B Test"
    "searchBy": "applicationCode",   // optionnel. Les valeurs possibles sont "", "notificationID",
                                     //           "notificationCode", "applicationCode", "campaignCode"
    "value": "C8717-703F2",          // optionnel. Valeur de recherche définie selon le champ "searchBy".
    "lastNotificationID": 0,         // optionnel. Utilisé pour la pagination. Dernier messageId de
                                     //           l'appel /getPushHistory précédent. Voir les détails ci-dessous.
    "limitMessages": 1000            // optionnel. Valeur possible de 10 à 1000.
  }
}
```

Cette méthode retournera 1000 messages du compte triés par ID de message. Pour obtenir la deuxième page, spécifiez le dernier ID de message de la réponse précédente dans le paramètre **lastNotificationId**.

### Types de données de réponse

```
id -- int | 0 
code -- string
createDate -- string  (date: %Y-%m-%d %H:%M:%S)
sendDate -- string  (date: %Y-%m-%d %H:%M:%S)
content -- array ( dict {lang: value} | list [])
title -- array ( dict {lang: value} | list [])
subtitle -- array ( dict {lang: value} | list [])
url -- string
ios_title -- string | array ( dict {lang: value} ) | null
ios_subtitle -- string | array ( dict {lang: value} ) | null
ios_root_params -- dict (JSON) | null
android_header -- string | array ( dict {lang: value} ) | null
android_root_params -- dict (JSON) | null
conditions -- list (JSON) | null
conditions_operator -- string | null
filter_code -- string | null
filter_name -- string | null
filter_conditions -- string | null
geozone -- string | null
campaignId -- string | ""
campaignName -- string | ""
subscription_segments (obsolète) -- list (JSON) | null
data -- dict (JSON) | null
open -- dict [dict [string: int]]  | ""   Exemple : 'open': {'AAAAA-BBBBB': {'IOS': 1, 'ANDROID': 1}}
sent -- dict [dict [string: int]]  | ""   Exemple : 'sent': {'AAAAA-BBBBB': {'IOS': 10, 'ANDROID': 10}}
ctr -- dict [string: int] | ""  Exemple : {'AAAAA-BBBBB': 1}
errors -- dict [string: int] | ""  Exemple : {'ANDROID': 1, 'IOS': 1}
```



## cancelMessage

`POST` `https://api.pushwoosh.com/json/1.3/cancelMessage`

Supprime un message programmé.

#### Corps de la requête

| Nom                                      | Type   | Description                                           |
| ----------------------------------------- | ------ | ----------------------------------------------------- |
| auth*    | string | [Jeton d'accès API](/fr/developer/api-reference/api-identifiers/#api-access-token) depuis le panneau de contrôle Pushwoosh.        |
| message* | string | Le [Code de message](/fr/developer/api-reference/api-identifiers/#message-code) obtenu dans la réponse `/createMessage`. |

<Tabs>
<TabItem label="200">
```json
{
   "status_code":200,
   "status_message":"OK"
}
```
</TabItem>
</Tabs>

<Aside type="note">
La méthode n'est autorisée que pour les messages qui sont en statut d'attente, en attente ou en traitement.
</Aside>

```json title="Exemple"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // requis. Jeton d'accès API depuis le panneau de contrôle Pushwoosh
    "message": "xxxx-xxxxxxx-xxxxxx" // requis. Le code de message obtenu dans la réponse /createMessage
  }
}
```

**Codes de statut :**

| Code de statut HTTP | status_code | Description                                         |
| ---------------- | ------------ | --------------------------------------------------- |
| 200              | 200          | Message annulé avec succès                       |
| 200              | 210          | Erreur d'argument. Voir status_message pour plus d'infos.  |
| 400              | N/A          | Chaîne de requête malformée                            |
| 500              | 500          | Erreur interne                                      |