# API de Mensajes

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

<Aside type="caution" title="/createMessage y /createTargetedMessage están obsoletos">
Las nuevas integraciones deberían usar la [**API de Mensajería v2**](/es/developer/api-reference/messaging-api-v2/) unificada — un solo endpoint reemplaza a toda la familia `/create*Message`. Consulta la [guía de migración](/es/developer/api-reference/messaging-api-v2/migration-from-v1/) para un mapeo campo por campo.

Los métodos heredados a continuación siguen siendo completamente operativos. `/deleteMessage`, `/cancelMessage` y `/getMessageDetails` no están obsoletos — úsalos como de costumbre con mensajes creados en v1 o v2.
</Aside>

<Aside type="note">
Para empezar, por favor revisa las descripciones de los [parámetros de la solicitud /createMessage](/es/developer/api-reference/messages-api/api-prerequisites).
</Aside>

## createMessage <Badge text="Obsoleto" variant="caution" size="small" />

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

Crea una nueva notificación push.

#### Cuerpo de la Solicitud

| Nombre                                            | Tipo   | Descripción                                                                |
| ----------------------------------------------- | ------ | -------------------------------------------------------------------------- |
| auth*          | string | [Token de acceso a la API](/es/developer/api-reference/api-identifiers/#api-access-token) desde el Panel de Control de Pushwoosh.                             |
| application*   | string | [Código de aplicación de Pushwoosh](/es/developer/api-reference/api-identifiers/#application-code)                                               |
| notifications* | array  | Array JSON de parámetros de mensaje. Consulta los detalles en un ejemplo de solicitud a continuación.  |

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

<Aside type="note">
El método /createMessage admite plantillas de contenido. Para obtener más información, consulta la [guía de Liquid Templates](/es/developer/guides/personalization/liquid-templates/).
</Aside>

### Ejemplo de solicitud

```json title="Ejemplo"
{
  "request": {
    "application": "XXXXX-XXXXX",       // requerido. Código de aplicación de Pushwoosh.
    "auth": "yxoPUlwqm…………pIyEX4H",     // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh.
    "notifications": [{
      "send_date": "now",               // opcional. AAAA-MM-DD HH:mm O 'now'
      "content": {                      // opcional. objeto O cadena.
        "en": "English",                //           Usa "wns_content" en su lugar para Windows.
        "fr": "French"
      },
      "title": {                        // opcional. objeto O cadena. 
        "en": "Title",                  //           Ignorado si se especifican títulos específicos de la plataforma
        "fr": "Titre"                   //           'ios_title', 'android_header', etc.
      },                                //           consulta los ejemplos de parámetros específicos de la plataforma a continuación.
      "subtitle":{                      // opcional. objeto O cadena. 
        "en": "Subtitle",               //           Ignorado si se especifican títulos específicos de la plataforma
        "fr": "Sous-titre"              //           'ios_subtitle', etc.
      },                                //           consulta los ejemplos de parámetros específicos de la plataforma a continuación.
      "ignore_user_timezone": true,     // opcional.
      "timezone": "America/New_York",   // opcional. Si se ignora, UTC-0 es el predeterminado para "send_date".
                                        //           Consulta https://php.net/manual/timezones.php para
                                        //           las zonas horarias admitidas.
      "campaign": "CAMPAIGN_CODE",      // opcional. Código de campaña al que deseas
                                        //           asignar este mensaje push.
      "geozone": {                      // opcional. Enviar a Geozona
        "lat": 22.22,
        "lng": 33.33,
        "range": 110
      },
      "rich_media": "XXXXX-XXXXX",      // opcional. Copia el código de Rich Media de la barra de URL de
                                        //           la página del editor de Rich Media en el Panel de Control de Pushwoosh.
      "link": "https://google.com",     // opcional. Para enlaces profundos (deeplinks) añade "minimize_link": 0
      "minimize_link": 0,               // opcional. 0 — no minimizar, 2 — bitly. Predeterminado = 2.
                                        //           Ten en cuenta que los acortadores tienen restricciones
                                        //           en el número de llamadas.
      "data": {                         // opcional. Cadena JSON u objeto JSON, se pasará como
        "key": "value"                  //           parámetro "u" en el payload (convertido a cadena JSON).
      },
      "transactionId": "unique UUID",   // opcional. Identificador de mensaje único para evitar duplicados
                                        //           en caso de problemas de red. Se almacena en el lado de
                                        //           Pushwoosh durante 5 minutos. 
      "platforms": [                    // opcional. 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",          // opcional. Código de Preset de Push desde tu Panel de Control.
                                        //           Si se envían parámetros específicos en la solicitud,
                                        //           estos anulan los parámetros del preset.
      "send_rate": 100,                 // opcional. Throttling. Los valores válidos van de 100 a 1000 pushes/segundo.
      "send_rate_avoid": true,          // opcional. Si se establece en true, el límite de throttling no se aplicará a
                                        //           esta notificación push específica.
      // Relacionado con plantillas, por favor consulta la guía del Motor de Plantillas para obtener más información
      "template_bindings": {            // opcional.
        "TemplatePlaceholder": "Value"
      },
      "dynamic_content_placeholders": { // opcional. Marcadores de posición para contenido dinámico en lugar de etiquetas de dispositivo.
        "firstname": "John",
        "lastname": "Doe"
      },
      "message_type": "marketing",       // opcional. "marketing" o "transactional".
                                         // Si se omite, los usuarios con PW_ControlGroup: true no recibirán el mensaje.

      // Parámetros de frequency capping. Asegúrate de que el frequency capping Global esté configurado en el Panel de Control.
      // El frequency capping no se aplica a los mensajes transaccionales.
      // En todos los demás casos, incluido el "message_type" omitido, se aplica el frequency capping.
      "capping_days": 30,               // opcional. Cantidad de días para el frequency capping (máx. 30 días)
      "capping_count": 10,              // opcional. El número máximo de pushes que se pueden enviar desde una
                                        //           aplicación específica a un dispositivo particular dentro de un período de 'capping_days'.
                                        //           En caso de que el mensaje creado exceda el
                                        //           límite de 'capping_count' para un dispositivo, no
                                        //           se enviará a ese dispositivo.
      "capping_exclude": true,          // opcional. Si se establece en true, esta notificación push no
                                        //           se contará para el capping de futuros pushes.
      "capping_avoid": true,            // opcional. Si se establece en true, el capping no se aplicará a
                                        //           esta notificación push específica.
        
      // Para guardar el mensaje en la Bandeja de Entrada a través de la API, usa "inbox_date" o "inbox_image".
      // El mensaje se guarda cuando se utiliza al menos uno de estos parámetros.
      "inbox_date": "2017-02-02",       // opcional. Especifica cuándo eliminar un mensaje de la Bandeja de Entrada.
                                        //           El mensaje se eliminará de la Bandeja de Entrada a las 00:00:01 UTC
                                        //           de la fecha especificada, por lo que el día anterior es el
                                        //           último día que un usuario puede ver el mensaje en su Bandeja de Entrada.
                                        //           Si no se especifica, la fecha de eliminación predeterminada es el
                                        //           día siguiente a la fecha de envío.
      "inbox_image": "Inbox image URL", // opcional. La imagen que se mostrará junto al mensaje. 
	  "inbox_days": 5,                  // opcional. Especifica cuándo eliminar un mensaje de la
                                        //           Bandeja de Entrada (vida útil de un mensaje de bandeja de entrada en días). 
                                        //           Se puede usar en lugar del parámetro "inbox_date".
                                        //           Hasta 30 días.
      
      "devices": [                      // opcional. Especifica tokens o hwids para enviar pushes dirigidos.
          "hwid_XXXX"                   //           No más de 1000 tokens/hwids en
      ],                                //           un array. Si se establece, el mensaje solo se enviará a
                                        //           los dispositivos de la lista. No se permite el Grupo de Aplicaciones para la lista de dispositivos.
                                        //           Los tokens push de iOS solo pueden estar en minúsculas.
      "to": [                           // opcional. Para correo electrónico, SMS y canales similares. Lista de destinatarios
          "email_1", "email_2"          //           (p. ej., direcciones de correo electrónico, números de teléfono). Máx. 1000 elementos.
      ],                                //           Para push, usa "devices" en su lugar.
      // Notificaciones push centradas en el usuario
      "users": [                        // opcional. Si se establece, el mensaje solo se entregará a los
          "user_XXXX"                   //           ID de usuario especificados (establecidos a través de la llamada /registerUser). 
      ],                                //           Si se especifica junto con devices o to,
                                        //           estos últimos serán ignorados. No más de 1000 ID de usuario
                                        //           en un array. No se permite el Grupo de Aplicaciones para la lista de usuarios.

      // Filtros y condiciones
      "filter": "FILTER_NAME",          // opcional.
      "conditions": [                   // opcional. Consulta la nota a continuación.
        ["Country", "EQ", "fr"],
        ["Language", "EQ", "en"]
      ],    
      "conditions_operator": "AND"      // opcional. Operador lógico para los arrays de condiciones.
                                        //           Valores posibles: AND | OR. AND es el predeterminado.
    }]
  }
}
```

### Ejemplo de solicitud de notificación VoIP

Pushwoosh admite notificaciones de llamada estilo VoIP para iOS y Android. \
A continuación puedes encontrar ejemplos de solicitudes a la API `createMessage` para cada plataforma.

#### iOS

```json title="Ejemplo"
{
  "request": {
    "application": "XXXXX-XXXXX",     // requerido. Código de aplicación de Pushwoosh.
    "auth": "yxoPUlwqm…………pIyEX4H",   // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh.
    "notifications": [
      {
        "voip_push": true,            // requerido. Se requiere el parámetro para enviar una notificación push VoIP.
        "ios_root_params": {
          "aps": {
            "mutable-content": 1      // requerido para archivos adjuntos de medios en iOS10+.
          },
          "callerName": "CallerName", // opcional. Nombre del llamante. Si no se especifica, se muestra "llamante desconocido".
          "video": true,              // opcional. Indica si se admiten videollamadas.
          "supportsHolding": true,    // opcional. Indica si se admite la funcionalidad de llamada en espera.
          "supportsDTMF": false,      // opcional. Controla el soporte de la señal de multifrecuencia de doble tono.
          "callId": "42",             // opcional. El identificador único de la llamada a cancelar.
          "cancelCall": true          // opcional. Establece en "true" para cancelar la llamada con el "callId" especificado.
        }
      }
    ]
  }
}
```

#### Android

```json title="Ejemplo"
{
  "request": {
    "application": "XXXXX-XXXXX",   // requerido. Código de aplicación de Pushwoosh.
    "auth": "yxoPUlwqm…………pIyEX4H", // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh.
    "notifications": [
      {
      "voip_push": true,            // requerido. Se requiere el parámetro para enviar una notificación push VoIP.
      "android_root_params": {
        "callerName": "callerName", // opcional. Nombre del llamante. Si no se especifica, se muestra "llamante desconocido".
        "video": true,              // opcional. Indica si se admiten videollamadas.
        "callId": 42,               // opcional. El identificador único de la llamada a cancelar.
        "cancelCall": true          // opcional. Establece en "true" para cancelar la llamada con el "callId" especificado.
        }
      }
    ]
  }
}

```


### Parámetros específicos de la plataforma

#### Parámetros de iOS

```json title="Ejemplo"
{
  "request": {
    "application": "12345-67891",         // requerido. Código de aplicación de Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H",       // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "notifications": [{
      "ios_title": {                      // opcional. Objeto O cadena. Añade un título específico de iOS para la notificación push.
        "en": "title"
      },
      "ios_subtitle": {                   // opcional. Objeto O cadena. Añade un subtítulo específico de iOS para la notificación push.
        "en": "subtitle"
      },
      "ios_content": {                    // opcional. Objeto O cadena. Añade contenido específico de iOS para la notificación push.
        "en": "content"
      },
      "ios_badges": 5,                    // opcional. Número de insignia de la aplicación iOS.
                                          //           Usa "+n" o "-n" para incrementar/decrementar el valor de la insignia en n.
      "ios_sound": "sound file.wav",      // opcional. Nombre del archivo de sonido en el paquete principal de la aplicación.
                                          //           Si se deja vacío, el dispositivo producirá un sonido de sistema predeterminado.
      "ios_sound_off": true,              // opcional. Habilitar/deshabilitar el sonido establecido por el campo "ios_sound".
      "ios_ttl": 3600,                    // opcional. Parámetro de tiempo de vida: vida útil máxima del mensaje en segundos.
      "ios_silent": 1,                    // opcional. Habilita notificaciones silenciosas (ignora "sound" y "content").
      "ios_category_id": "1",             // opcional. ID de categoría de iOS8 de Pushwoosh.
      "ios_root_params": {                // opcional. Parámetros de nivel raíz para el diccionario aps.
        "aps": {
          "content-available": "0",       // opcional. Establece "1" para enviar un push silencioso y "0" para un push regular.
          "mutable-content": 1            // requerido para archivos adjuntos de medios en iOS10+.
        },
        "callerName": "CallerName",       // opcional parámetro VoIP. Nombre del llamante. Si no se especifica, se muestra "llamante desconocido".
        "video": true,                    // opcional parámetro VoIP. Indica si se admiten videollamadas.
        "supportsHolding": true,          // opcional parámetro VoIP. Indica si se admite la funcionalidad de llamada en espera.
        "supportsDTMF": false,            // opcional parámetro VoIP. Controla el soporte de la señal de multifrecuencia de doble tono.
        "data": {}                        // opcional Datos proporcionados por el usuario, máx. de 4KB
      },
      "ios_attachment": "URL",            // opcional. Inserta contenido multimedia en la notificación.
      "ios_thread_id": "some thread id",  // opcional. Identificador para agrupar notificaciones relacionadas.
                                          //           Los mensajes con el mismo ID de hilo se agruparán
                                          //           en la pantalla de bloqueo y en el Centro de Notificaciones.
      "ios_critical": true,               // opcional. Marca la notificación de iOS como una alerta crítica
                                          //           reproduciendo sonido incluso si un dispositivo está silenciado o
                                          //           el modo No Molestar está activado.
      "ios_category_custom": "category",  // opcional. Categoría APNS personalizada.
      "ios_interruption_level": "active", // opcional. Uno de "passive", "active", "time-sensitive",
                                          //           "critical". Indica la importancia y
                                          //           el tiempo de entrega de una notificación. Consulta la
                                          //           guía de push único para más detalles.
      "apns_collapse_id": "promo",        // opcional. Identificador de colapso de APNs. Las notificaciones con el mismo
                                          //           apns_collapse_id se reemplazan entre sí en el dispositivo.
      "apns_trim_content": 1              // opcional. (0|1) Recorta las cadenas de contenido excedentes con puntos suspensivos.
    }]
  }
}
```

#### Parámetros de Android

```json title="Ejemplo"
{
  "request": {
    "application": "12345-67891",            // requerido. Código de aplicación de Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H",          // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "notifications": [{
      "android_header": {                    // opcional. Encabezado de la notificación de Android.
        "en": "header"
      },
      "android_content": {                   // opcional. Contenido de la notificación de Android.
        "en": "content"
      },
      "android_root_params": {               // opcional. Objeto clave-valor personalizado.
        "key": "value",                      //           Parámetros de nivel raíz para los destinatarios del payload de Android.
        "CancelID": 12345678,                // opcional. Cancela la notificación push con el
        "voip": true,                        // requerido parámetro VoIP. Se requiere el parámetro para enviar notificaciones push VoIP.
        "callerName": "callerName",          // opcional parámetro VoIP. Nombre del llamante. Si no se especifica, se muestra "llamante desconocido".
        "video": true,                       // opcional parámetro VoIP. Indica si se admiten videollamadas.
      },                                     //           ID de Mensaje especificado (obtén el ID del Historial de Mensajes)
      "android_sound": "soundfile",          // opcional. Sin extensión de archivo. Si se deja vacío,
                                             //           el dispositivo producirá un sonido de sistema predeterminado.
      "android_sound_off": true,             // opcional. Habilitar/deshabilitar el sonido establecido por el campo "android_sound"
      "android_icon": "icon.png",            // opcional.
      "android_custom_icon": "URL.png",      // opcional. URL completa al archivo de imagen.
      "android_banner": "URL.png",           // opcional. URL completa al archivo de imagen.
      "android_badges": 5,                   // opcional. Número de insignia del icono de la aplicación de Android.
                                             //           Usa "+n" o "-n" para incrementar/decrementar el valor de la insignia en n.
      "android_gcm_ttl": 3600,               // opcional. Parámetro de tiempo de vida: vida útil máxima del mensaje en segundos.
      "android_vibration": 0,                // opcional. Forzar vibración en Android para pushes de alta prioridad.
      "android_led": "#rrggbb",              // opcional. Color hexadecimal del LED, el dispositivo hará su mejor aproximación.
      "android_priority": -1,                // opcional. Establece el parámetro de "importancia" para dispositivos con
                                             //           Android 8.0 y superior, así como el parámetro de "prioridad"
                                             //           para dispositivos con Android 7.1 e inferior. Establece el
                                             //           nivel de interrupción de un canal de notificación o una notificación
                                             //           particular. Los valores válidos son -2, -1, 0, 1, 2.
      "android_delivery_priority": "normal", // opcional. "normal" o "high".
                                             //           Habilita la entrega de la notificación cuando el
                                             //           dispositivo está en modo de ahorro de energía.
      "android_ibc": "#RRGGBB",              // opcional. color de fondo del icono en Lollipop, #RRGGBB,
                                             //           #AARRGGBB, "red", "black", "yellow", etc.
      "android_silent": 1,                   // opcional. 0 o 1. Habilita la notificación silenciosa.
                                             //           Ignora el sonido y el contenido
      "android_group_id": "123",             // opcional. Identificador para agrupar notificaciones relacionadas. Los mensajes con
                                             //           el mismo ID de hilo se agruparán en
                                             //           el Centro de Notificaciones.
      "android_collapse_key": "promo"        // opcional. Clave de colapso de FCM. Las notificaciones con la misma
                                             //           clave de colapso se reemplazan entre sí mientras el dispositivo está desconectado.
    }]
  }
}
```

**Parámetros de Huawei**

```json title="Huawei"
{
  "request": {
    "application": "12345-67891",                   // requerido. Código de aplicación de Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H",                 // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "notifications": [{
      "huawei_android_header": {                    // opcional. Objeto O cadena. Título de la notificación
        "en": "header"
      },
      "huawei_android_content": {                   // opcional. Objeto O cadena. Contenido de la notificación
        "en": "content"
      },
      "huawei_android_badges": true,                // opcional.
      "huawei_android_silent": 0,                   // opcional. 0 o 1. Habilita la notificación silenciosa.
                                                    //           Ignora el sonido y el contenido
      "huawei_android_icon": "URL.png",             // opcional.
      "huawei_android_led": "#FF0011",              // opcional. Color hexadecimal del LED, el dispositivo hará su mejor aproximación
      "huawei_android_vibration": 1,                // opcional. Forzar vibración en Huawei para pushes de alta prioridad
      "huawei_android_sound": "sound.wav",          // opcional. Si se deja vacío, el dispositivo producirá
                                                    //           un sonido de sistema predeterminado
      "huawei_android_sound_off": true,             // opcional. Habilitar/deshabilitar el sonido establecido por
                                                    //           el campo "huawei_android_sound"
      "huawei_android_custom_icon": "URL.png",      // opcional
      "huawei_android_gcm_ttl": 2400,               // opcional. Parámetro de tiempo de vida: máxima
                                                    //           vida útil del mensaje en segundos
      "huawei_android_banner": "URL.png",           // opcional. URL de ruta completa al archivo de imagen
      "huawei_android_root_params": {               // opcional. Objeto clave-valor personalizado.
        "key": "value"                              //           Parámetros de nivel raíz para los destinatarios del payload de Huawei.
      },
      "huawei_android_priority": 0,                 // opcional. Valores válidos: -2, -1, 0, 1, 2
      "huawei_android_ibc": "#0011AA",              // opcional. Color de fondo del icono en Lollipop
      "huawei_android_lockscreen": 1,               // opcional
      "huawei_android_delivery_priority": "normal", // opcional. "normal" o "high". Habilita la notificación
                                                    //           entrega en modo de ahorro de energía
      "huawei_android_group_id": "group_id"         // opcional. Identificador para agrupar notificaciones relacionadas
    }]
  }
}
```

#### Parámetros de Safari

```json title="Safari"
{
  "request": {
    "application": "12345-67891",    // requerido. Código de aplicación de Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H",  // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "notifications": [{
      "safari_url_args": [           // requerido, pero el valor puede estar vacío
        "firstArgument",
        "secondArgument"
      ],
      "safari_title": {              // opcional. Objeto O cadena. Título de la notificación.
        "en": "content"
      },
      "safari_content": {            // opcional. Objeto O cadena. Contenido de la notificación.
        "en": "content"
      },
      "safari_action": "Click here", // opcional.
      "safari_ttl": 3600             // opcional. Parámetro de tiempo de vida: la máxima
                                     //           vida útil de un mensaje en segundos.
    }]
  }
}


```

#### Parámetros de Chrome

```json title="Chrome"
{
  "request": {
    "application": "12345-67891",          // requerido. Código de aplicación de Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H",        // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "notifications": [{
      "chrome_title": {                    // opcional. Objeto O cadena. Puedes especificar el encabezado 
        "en": "title"                      //           del mensaje en este parámetro.
      },
      "chrome_content": {                  // opcional. Objeto O cadena. Puedes especificar el contenido 
        "en": "content"                    //           del mensaje en este parámetro.
      },
      "chrome_icon": "URL.png",            // opcional. URL completa al icono o ruta del archivo de recursos de la extensión
      "chrome_gcm_ttl": 3600,              // opcional. Parámetro de tiempo de vida: vida útil máxima del mensaje en segundos.
      "chrome_duration": 20,               // opcional. máx. 50 segundos. Cambia el tiempo de visualización del push de Chrome.
                                           //           Establece en 0 para mostrar el push hasta que el usuario interactúe con él.
      "chrome_image": "image_URL",         // opcional. URL a una imagen grande. 
      "chrome_root_params": {              // opcional. Establece parámetros específicos para los mensajes enviados a Chrome.
        "key": "value"
      }, 
      "chrome_button_text1": "text1",      // opcional
      "chrome_button_url1": "button1_URL", // opcional. Ignorado si chrome_button_text1 no está establecido.
      "chrome_button_text2": "text2",      // opcional
      "chrome_button_url2": "button2_url"  // opcional. Ignorado si chrome_button_text2 no está establecido. 
    }]
  }
}
```

#### Parámetros de Firefox

```json title="Firefox"
{
  "request": {
    "application": "12345-67891",   // requerido. Código de aplicación de Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H", // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "notifications": [{
      "firefox_title": {            // opcional. Objeto O cadena. Puedes especificar el encabezado del mensaje aquí.
        "en": "title"
      },
      "firefox_content": {          // opcional. Objeto O cadena. Puedes especificar el contenido del mensaje aquí.
        "en": "content"
      },
      "firefox_icon": "URL.png",    // opcional. URL de ruta completa al icono o ruta al
                                    //           archivo en los recursos de la extensión.
      "firefox_root_params": {      // opcional. Establece parámetros específicos para los mensajes enviados a Firefox.
        "key": "value"
      } 
    }]
  }
}
```

#### Parámetros de Amazon

```json title="Amazon"
{
  "request": {
    "application": "12345-67891",   // requerido. Código de aplicación de Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H", // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "notifications": [{
      "adm_header": {               // opcional. Objeto O cadena. Puedes especificar el encabezado del mensaje aquí.
        "en": "header"
      },
      "adm_content": {              // opcional. Objeto O cadena. Puedes especificar el contenido del mensaje aquí.
        "en": "content"
      },
      "adm_root_params": {          // opcional. Objeto clave-valor personalizado
        "key": "value"
      },
      "adm_sound": "push.mp3",      // opcional.
      "adm_sound_off": true,        // opcional. Habilitar/deshabilitar el sonido establecido por el campo "adm_sound"
      "adm_icon": "icon.png",       // opcional. URL completa al icono.
      "adm_custom_icon": "URL.png", // opcional.
      "adm_banner": "URL.png",      // opcional.
      "adm_ttl": 3600,              // opcional. Parámetro de tiempo de vida: la máxima
                                    //           vida útil del mensaje en segundos.
      "adm_priority": -1            // opcional. Prioridad del push en el cajón de pushes de Amazon,
                                    //           los valores válidos son -2, -1, 0, 1 y 2.
    }]
  }
}
```

#### Parámetros de Mac OS X

```json title="Mac OS X"
{
  "request": {
    "application": "12345-67891",   // requerido. Código de aplicación de Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H", // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "notifications": [{
      "mac_title": {                // opcional. Objeto O cadena. Añade Título para la notificación push.
        "en": "title"
      },
      "mac_subtitle": {             // opcional. Añade subtítulo para la notificación push.
        "en": "subtitle"
      },
      "mac_content": {              // opcional. Añade contenido para la notificación push.
        "en": "content"
      },
      "mac_badges": 3,              // opcional.
      "mac_sound": "sound.caf",     // opcional.
      "mac_sound_off": true,        // opcional. Habilitar/deshabilitar el sonido establecido por el campo "mac_sound"
      "mac_root_params": {          // opcional.
        "content-available": 1
      },
      "mac_ttl": 3600               // opcional. Parámetro de tiempo de vida: vida útil máxima del mensaje en segundos.
    }]
  }
}
```

#### Parámetros de Windows

```json title="Windows"
{
  "request": {
    "application": "12345-67891",   // requerido. Código de aplicación de Pushwoosh
    "auth": "yxoPUlwqm…………pIyEX4H", // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "notifications": [{
      "wns_content": {              // requerido. Contenido (XML o raw) de la notificación codificado en base64 de MIME
                                    //           en forma de Objeto O Cadena
        "en": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9ImF2YWlsYWJsZSIvPg==",
        "de": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9Im5ld01lc3NhZ2UiLz4="
      },
      "wns_type": "Badge",          // opcional. 'Tile' | 'Toast' | 'Badge' | 'Raw'
      "wns_tag": "myTag",           // opcional. Usado en la política de reemplazo de Tile.
                                    //           Una cadena alfanumérica de no más de 16 caracteres.
      "wns_cache": 1,               // opcional. (1|0) Se traduce en el valor de X-WNS-Cache-Policy.
      "wns_ttl": 600                // opcional. Tiempo de expiración para la notificación en segundos.
    }]
  }
}
```
<Aside>
¡Inicio rápido! ¡Echa un vistazo a estas geniales bibliotecas de terceros!

Biblioteca de Python **por Pushwoosh**:
[https://github.com/makcyd/pushwoosh_api](https://github.com/makcyd/pushwoosh_api)

Biblioteca de Laravel:
[https://github.com/laravel-notification-channels/pushwoosh](https://github.com/laravel-notification-channels/pushwoosh)

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

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

Biblioteca de Rails
[https://github.com/iarie/pwush](https://github.com/iarie/pwush)

Biblioteca de Golang
[https://github.com/yyoshiki41/go-pushwoosh](https://github.com/yyoshiki41/go-pushwoosh)
</Aside>

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

Ten en cuenta que las cuentas no empresariales no pueden enviar más de 600 solicitudes `/createMessage` y/o [`/createTargetedMessage`](/es/developer/api-reference/messages-api/#createtargetedmessage) por minuto.

Sin embargo, si envías pushes a través del parámetro **devices** a **10 dispositivos o menos**, no hay restricciones para ningún tipo de cuenta siempre que el seguimiento de mensajería de la API esté deshabilitado.

Ten en cuenta que **siempre guardamos los pushes programados** en el Historial de Mensajes, incluso si los estás enviando a menos de 10 dispositivos a través del parámetro devices. Por lo tanto, dichos pushes también están sujetos a throttling.
</Aside>

**Respuesta**:

| Código de estado HTTP | status_code | Descripción                                       |
| ---------------- | ------------ | ------------------------------------------------- |
| 200              | 200          | Mensaje creado con éxito                      |
| 200              | 210          | Error de argumento. Consulta status_message para más información |
| 400              | N/A          | Cadena de solicitud mal formada                          |
| 500              | 500          | Error interno                                    |

<Aside type="note">
Un error en un array de notificaciones

Si la solicitud `createMessage` tiene varios mensajes en el array `notifications`, se procesarán y enviarán uno por uno. Si uno de los mensajes no se puede analizar, nuestra API devolverá `"status_code":210` con los códigos de los mensajes enviados con éxito, es decir, los que preceden al mensaje defectuoso en la solicitud.
</Aside>

### Seguimiento de mensajería de la API

Por motivos de balanceo de carga, _no almacenamos los mensajes enviados a través de la API con el parámetro “devices” que contiene menos de 10 dispositivos en un array_. Debido a esto, dichos mensajes no se mostrarán en tu Historial de Mensajes.

Para ver los informes de push durante la fase de prueba, utiliza el **seguimiento de mensajería de la API**. Activar esta opción te permite _anular este límite durante 1 hora y guardar dichos pushes en el Historial de Mensajes_. El seguimiento de mensajería de la API se desactiva automáticamente después de 1 hora.

El seguimiento de mensajería de la API se puede activar en la página de [Historial de Mensajes](/es/product/statistics-and-analytics/message-history/) haciendo clic en **Iniciar seguimiento de mensajería de la API** en la esquina superior derecha.

### Condiciones de etiqueta

Cada condición de etiqueta es un array como `[tagName, operator, operand]` donde

* tagName: nombre de una etiqueta
* operator: "EQ" | "IN" | "NOTEQ" | "NOTIN" | "LTE" | "GTE" | "BETWEEN" | "NOTSET" | "ANY"
* operand: cadena | entero | array | fecha

#### Descripción del operador

* EQ: el valor de la etiqueta es igual al operando;
* IN: el valor de la etiqueta se cruza con el operando (el operando siempre debe ser un array);
* NOTEQ: el valor de la etiqueta no es igual a un operando;
* NOTIN: el valor de la etiqueta no se cruza con el operando (el operando siempre debe ser un array);
* GTE: el valor de la etiqueta es mayor o igual que el operando;
* LTE: el valor de la etiqueta es menor o igual que el operando;
* BETWEEN: el valor de la etiqueta es mayor o igual que el valor mínimo del operando pero menor o igual que el valor máximo del operando (el operando siempre debe ser un array);
* NOTSET: etiqueta no establecida. El operando no se considera;
* ANY: la etiqueta tiene cualquier valor. El operando no se considera.

#### Etiquetas de cadena

Operadores válidos: EQ, IN, NOTEQ, NOTIN, NOTSET, ANY\
Operandos válidos:

* EQ, NOTEQ: el operando debe ser una cadena;
* IN, NOTIN: el operando debe ser un array de cadenas como `["valor 1", "valor 2", "valor N"]`;
* NOTSET: etiqueta no establecida. El operando no se considera;
* ANY: la etiqueta tiene cualquier valor. El operando no se considera.

#### Etiquetas de entero

Operadores válidos: EQ, IN, NOTEQ, NOTIN, BETWEEN, GTE, LTE, NOTSET, ANY\
Operandos válidos:

* EQ, NOTEQ, GTE, LTE: el operando debe ser un entero;
* IN, NOTIN: el operando debe ser un array de enteros como `[valor 1, valor 2, valor N]`;
* BETWEEN: el operando debe ser un array de enteros como `[valor_min, valor_max]`;
* NOTSET: etiqueta no establecida. El operando no se considera;
* ANY: la etiqueta tiene cualquier valor. El operando no se considera.

#### Etiquetas de fecha

Operadores válidos: EQ, IN, NOTEQ, NOTIN, BETWEEN, GTE, LTE, NOTSET, ANY\
Operandos válidos:

* `"AAAA-MM-DD 00:00"` (cadena)
* marca de tiempo unix `1234567890` (entero)
* `"hace N días"` (cadena) para los operadores EQ, BETWEEN, GTE, LTE

#### Etiquetas booleanas

Operadores válidos: EQ, NOTSET, ANY\
Operandos válidos: `0, 1, true, false`

#### Etiquetas de lista

Operadores válidos: IN, NOTIN, NOTSET, ANY\
Operandos válidos: el operando debe ser un array de cadenas como `["valor 1", "valor 2", "valor N"]`.

<Aside type="danger">
Recuerda que los parámetros “filter” y “conditions” no deben usarse juntos.\
Además, ambos **serán ignorados**, si el parámetro "devices" se utiliza en la misma solicitud.
</Aside>

<Aside type="note">
#### Etiquetas de país e idioma

El valor de la etiqueta de idioma es un código de dos letras en minúsculas según [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)\
El valor de la etiqueta de país es un código de dos letras en MAYÚSCULAS según [ISO_3166-2](https://en.wikipedia.org/wiki/ISO_3166-2)\
Por ejemplo, para enviar una notificación push a suscriptores de habla portuguesa en Brasil, deberás especificar la siguiente condición: `"conditions": [["Country", "EQ", "BR"],["Language", "EQ", "pt"]]`
</Aside>

### Snippets de /createMessage

<Aside type="caution" title="Importante">
Por favor, ten cuidado al usar los snippets. Limita el número de destinatarios especificando el parámetro "users", "devices", "filter" o "conditions". Si no se especifica ninguno de estos parámetros, el mensaje se enviará **a todos los dispositivos** suscritos a las notificaciones push de la aplicación.
</Aside>

Ejemplos de solicitudes `/createMessage`:

<Tabs>
<TabItem label="Bash">
```bash
#!/bin/bash
 
#Usage
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]).
%% sendMessage argument: message text %%
 
%% Authentication & App_id %%
-define(PW_AUTH, "YOUR_AUTH_TOKEN").
-define(PW_APPLICATION, "YOUR_PUSHWOOSH_APP_CODE").
 
%% KickStart %%
run() ->
    application:start(unicode),
    application:start(crypto),
    application:start(public_key),
    application:start(ssl),
    application:start(inets),
    %% HTTP Client verbosity options flase, verbose, debug
    httpc:set_options([{verbose, false}]).  
stop() ->
    application:stop(ssl),
    application:stop(public_key),       
    application:stop(crypto),
    application:stop(inets).
%% JSON Wars !
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 to JSON API 1.3
    Url = "https://api.pushwoosh.com/json/1.3/createMessage",
    EncodedMessage = encode(Message_text),
    {ok, Response} = httpc:request(
        %%Method 
        post, 
        %%Request
        {Url, [{"User-Agent", "Erlang exemple"}], "application/json; charset=UTF-8", 
        "{\"request\":{
        \"application\": \""?PW_APPLICATION"\",
        \"auth\": \""?PW_AUTH"\",
        \"notifications\": [{
        \"send_date\": \"now\",
        \"content\": "++EncodedMessage++"
        }]}}"},
        %%HTTP options
        [{ssl,[{verify, verify_none}]}, {version, "HTTP/1.0"}],
        %%Options
        []),
    io:format("And received ~p", [Response]).
```
</TabItem>

<TabItem label="Ruby">
```ruby
class PushNotification
 
  #- PushWoosh API Documentation https://www.pushwoosh.com/programming-push-notification/pushwoosh-push-notification-remote-api/ 
  #- Two methods here:
  #     - PushNotification.new.notify_all(message) Notifies all with the same option
  #     - PushNotification.new.notify_devices(notification_options = {}) Notifies specific devices with custom options
 
  include HTTParty #Make sure to have the HTTParty gem declared in your gemfile https://github.com/jnunemaker/httparty
  default_params :output => 'json'
  format :json
 
  def initialize
    #- Change to your settings
    @auth = {:application  => "00000-00000",:auth => "auth_token"}
  end
 
  # PushNotification.new.notify_all("This is a test notification to all devices")
  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 = {})
    #- Default options, uncomment :data or :devices if needed
    default_notification_options = {
                        # YYYY-MM-DD HH:mm  OR 'now'
                        :send_date  => "now",
                        # Object( language1: 'content1', language2: 'content2' ) OR string
                        :content  => {
                            :fr  => "Test",
                            :en  => "Test"
                        },
                        # JSON string or JSON object "custom": "json data"
                        #:data  => {
                        #    :custom_data  => value
                        #},
                        # omit this field (push notification will be delivered to all the devices for the application), or provide the list of devices IDs
                        #:devices  => {}
                      }
 
    #- Merging with specific options
    final_notification_options = default_notification_options.merge(notification_options)
 
    #- Constructing the final call
    options = @auth.merge({:notifications  => [final_notification_options]})
    options = {:request  => options}                                                                                                                             
    #- Executing the POST API Call with HTTPARTY - :body => options.to_json allows us to send the json as an object instead of a string
    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
// Uses JSON classes from 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:
    # For Python 3.0 and later
    from urllib.request import urlopen
    from urllib.request import Request
except ImportError:
    # Fall back to Python 2's urllib2
    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`

Elimina un mensaje programado.

#### Cuerpo de la Solicitud

| Nombre                                      | Tipo   | Descripción                                      |
| ----------------------------------------- | ------ | ------------------------------------------------ |
| auth*    | string | [Token de acceso a la API](/es/developer/api-reference/api-identifiers/#api-access-token) desde el Panel de Control de Pushwoosh.   |
| message* | string | [Código de mensaje](/es/developer/api-reference/api-identifiers/#message-code) obtenido en la solicitud `/createMessage`. |

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

```json title="Ejemplo"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "message": "xxxx-xxxxxxx-xxxxxx" // requerido. Código de mensaje obtenido en /createMessage
  }
}
```

<Aside type="danger">
No puedes eliminar mensajes que ya han sido enviados.
</Aside>

**Códigos de estado:**

| Código de estado HTTP | status_code | Descripción                                         |
| ---------------- | ------------ | --------------------------------------------------- |
| 200              | 200          | Mensaje eliminado con éxito                        |
| 200              | 210          | Error de argumento. Consulta status_message para más información |
| 400              | N/A          | Cadena de solicitud mal formada                            |
| 500              | 500          | Error interno                                      |

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

// creates request instance
$request = DeleteMessageRequest::create()->setMessage('MESSAGE_CODE');

// call '/deleteMessage' Web Service
$response = $pushwoosh->deleteMessage($request);

if($response->isOk()) {
    print 'Great, my message has been deleted !';
} else {
    print 'Oups, the deletion failed :-('; 
    print 'Status code : ' . $response->getStatusCode();
    print 'Status message : ' . $response->getStatusMessage();
}
```

## getMessageDetails

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

Recupera los detalles del mensaje.

#### Cuerpo de la Solicitud

| Nombre                                      | Tipo   | Descripción                                    |
| ----------------------------------------- | ------ | ---------------------------------------------- |
| auth*    | string | [Token de acceso a la API](/es/developer/api-reference/api-identifiers/#api-access-token) desde el Panel de Control de Pushwoosh. |
| message* | string | [Código de mensaje](/es/developer/api-reference/api-identifiers/#message-code) o ID de mensaje.                    |

<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="Ejemplo"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "message": "xxxx-xxxxxxx-xxxxxx" // requerido. código de mensaje o ID de mensaje
  }
}
```

## createTargetedMessage <Badge text="Obsoleto" variant="caution" size="small" />

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

Crea una nueva notificación push dirigida.

#### Cuerpo de la Solicitud

| Nombre                                              | Tipo    | Descripción                                                                                                                            |
| ------------------------------------------------- | ------- |----------------------------------------------------------------------------------------------------------------------------------------|
| auth*            | string  | [Token de acceso a la API](/es/developer/api-reference/api-identifiers/#api-access-token) desde el Panel de Control de Pushwoosh.                                                                                         |
| devices_filter* | string  | Consulta la nota a continuación.                                                                                                                      |
| send_date*      | string  | AAAA-MM-DD HH:mm o 'now'.                                                                                                             |
| ignore_user_timezone                            | boolean | Si se ignora, UTC-0 es el predeterminado para "send_date".                                                                                         |
| timezone                                          | string  | Si se ignora, UTC-0 es el predeterminado para "send_date".                                                                                         |
| campaign                                          | string  | [Código de una campaña](/es/developer/api-reference/api-identifiers/#campaign-code) a la que deseas asignar este mensaje push.                                                                      |
| content*         | string  | Contenido de la notificación. Consulta el ejemplo de solicitud para más detalles.                                                                             |
| transactionId                                     | string  | Identificador de mensaje único para evitar la duplicación de mensajes en caso de problemas de red. Se almacena en el lado de Pushwoosh durante 5 minutos. |
| link                                              | string  | Enlace que se abrirá una vez que un usuario abra un mensaje push.                                                                                    |
| minimize_link                                    | integer | 0 - no minimizar, 2 - bit.ly. Predeterminado = 2.                                                                                          |
| data                                              | object  | Cadena JSON u objeto JSON. Se pasará como parámetro "u" en el payload (convertido a cadena JSON).                                 |
| preset                                            | string  | [Código de preset](/es/developer/api-reference/api-identifiers/#preset-code).                                                                                                                           |
| send_rate                                        | integer | Throttling. Los valores válidos van de 100 a 1000 pushes por segundo.                                                                       |
| inbox_date                                       | string  | Especifica cuándo eliminar un mensaje de la Bandeja de Entrada.                                                                                       |
| inbox_image                                      | string  | URL de la imagen que se mostrará junto al mensaje en la Bandeja de Entrada.                                                                            |

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

<TabItem label="400 Errores de sintaxis JSON">
```
The request cannot be fulfilled due to bad syntax.
```
</TabItem>
</Tabs>

Más ejemplos de respuesta:

<Tabs>
<TabItem label="210 - sintaxis">
```json
{
  "status_code": 210,
  "status_message": "Errors occurred while compiling filter",
  "response": {
    "errors": [{
      "message": "Invalid tag set specification. \")\" expected.",
      "type": "syntax"
    }]
  }
}
```
</TabItem>

<TabItem label="210 - semántico">
```json
{
  "status_code": 210,
  "status_message": "Errors occurred while compiling filter",
  "response": {
    "errors": [{
      "message": "Application \"11111-11111\" not found",
      "type": "semantic",
      "near": "\"11111-11111\""
    }]
  }
}

```
</TabItem>

<TabItem label="210 - léxico">
```json
{
  "status_code": 210,
  "status_message": "Errors occurred while compiling filter",
  "response": {
    "errors": [{
      "message": "Invalid character \"/\" at 1:19",
      "type": "lexical"
    }]
  }
}
```
</TabItem>
</Tabs>

<Aside type="danger" title="Modo difícil">
¿Deberías usar [`/createMessage`](#createmessage) en su lugar?
</Aside>


<Tabs>
<TabItem label="Ejemplo">
```json title="Ejemplo"
{
  "request": {
    "auth": "yxoPUlwqm…………pIyEX4H",    // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "devices_filter": "A(\"XXXXX-XXXXX\") * T(\"City\", EQ, \"Name\")", // requerido. Sintaxis explicada a continuación
    "send_date": "now",                // opcional. AAAA-MM-DD HH:mm O 'now'
    "ignore_user_timezone": true,      // opcional.
    "timezone": "America/New_York",    // opcional. Si se ignora, UTC-0 es el predeterminado para "send_date".
                                       //           Más información en https://php.net/manual/timezones.php.
    "campaign": "CAMPAIGN_CODE",       // opcional. Código de campaña al que deseas asignar este mensaje push.
    "content": {                       // opcional. Objeto O cadena. Usa "wns_content" en su lugar para Windows.
      "en": "English",
      "de": "Deutsch"
    },
    "transactionId": "unique UUID",    // opcional. Identificador de mensaje único para evitar la duplicación de mensajes
                                       //           en caso de problemas de red. Se almacena en el lado de
                                       //           Pushwoosh durante 5 minutos.
    "rich_media": "XXXXX-XXXXX",       // opcional. Copia el código de Rich Media de la barra de URL de la
                                       //           página del editor de Rich Media en el Panel de Control de Pushwoosh. 
    "link": "https://google.com",      // opcional. Para enlaces profundos (deeplinks) añade "minimize_link": 0
    "minimize_link": 0,                // opcional. 0 — no minimizar, 2 — bitly. Predeterminado = 2.
                                       //           El acortador de URL de Google está deshabilitado desde el 30 de marzo de 2019.
                                       //           Ten en cuenta que los acortadores tienen restricciones
                                       //           en el número de llamadas.
    "data": {                          // opcional. Cadena JSON u objeto JSON.
      "key": "value"                   //           Se pasará como parámetro "u" en el payload
    },                                 //           (convertido a cadena JSON).
    "preset": "XXXXX-XXXXX",           // opcional. Código de Preset de Push desde tu Panel de Control.
    "send_rate": 100,                  // opcional. Throttling. Los valores válidos van de 100 a 1000 pushes/segundo.
    "dynamic_content_placeholders": {  // opcional. Marcadores de posición para contenido dinámico en lugar de etiquetas de dispositivo.
      "firstname": "John",
      "lastname": "Doe"
    },

    // Para guardar el mensaje en la Bandeja de Entrada a través de la API, usa "inbox_date" o "inbox_image".
    // El mensaje se guarda cuando se utiliza al menos uno de estos parámetros. 
    "inbox_image": "Inbox image URL",  // opcional. La imagen que se mostrará junto al mensaje.
    "inbox_date": "2017-02-02"         // opcional. Especifica cuándo eliminar un mensaje de la Bandeja de Entrada.
                                       //           El mensaje se eliminará de la Bandeja de Entrada a las 00:00:01 UTC de
                                       //           la fecha especificada, por lo que el día anterior es el último
                                       //           día que un usuario puede ver el mensaje en su Bandeja de Entrada.
                                       //           Si no se especifica, la fecha de eliminación predeterminada es el siguiente
                                       //           día después de la fecha de envío.
  }
}
```
</TabItem>

<TabItem label="Parámetros específicos de la plataforma">
```json title="Parámetros específicos de la plataforma"
{
  "request": {
    "auth": "yxoPUlwqm…………pIyEX4H",        // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "devices_filter": "FILTER CONDITION",
    "send_date": "now",                    // opcional. AAAA-MM-DD HH:mm O 'now'
    "content": {                           // opcional. Objeto O cadena.
      "en": "English",                     //           Usa "wns_content" en su lugar para Windows.
      "de": "Deutsch"
    },
    "ignore_user_timezone": true,          // opcional.
    "timezone": "America/New_York",        // opcional. Si se ignora, UTC-0 es el predeterminado para "send_date".
                                           //           Más información en https://php.net/manual/timezones.php.
    "campaign": "CAMPAIGN_CODE",           // opcional. Código de campaña al que deseas asignar este mensaje push.
    
    // Parámetros relacionados con iOS
    "ios_badges": 5,                       // opcional. Número de insignia de la aplicación iOS.
                                           //           Usa "+n" o "-n" para incrementar/decrementar el valor de la insignia en n.
    "ios_sound": "sound file.wav",         // opcional. Nombre del archivo de sonido en el paquete principal de la aplicación.
                                           //           Si se deja vacío, el dispositivo no producirá sonido
                                           //           al recibir un push.
    "ios_sound_off": true,                 // opcional. Habilitar/deshabilitar el sonido establecido por el campo "ios_sound".
    "ios_ttl": 3600,                       // opcional. Parámetro de tiempo de vida: vida útil máxima del mensaje en segundos.
    "ios_silent": 1,                       // opcional. Habilita notificaciones silenciosas (ignora "sound" y "content").
    "ios_category_id": "1",                // opcional. ID de categoría de iOS8 de Pushwoosh.
    "ios_category_custom": "category",     // opcional. Categoría APNS personalizada.
    "ios_root_params": {                   // opcional. Parámetros de nivel raíz para el diccionario aps.
      "aps": {
        "content-available": "0",          // opcional. Establece "1" para enviar un push silencioso y "0" para un push regular.
        "mutable-content": 1               // requerido para archivos adjuntos de medios en iOS10+.
      },
      "attachment": "YOUR_ATTACHMENT_URL", // URL de adjunto de medios de iOS10+.
      "data": {}                           // opcional. Datos proporcionados por el usuario, máx. de 4KB
    },
    "apns_trim_content": 1,                // opcional. (0|1) Recorta las cadenas de contenido excedentes con puntos suspensivos.
    "ios_title": {                         // opcional. Añade título para la notificación push de iOS.
      "en": "title"
    },
    "ios_subtitle": {                      // opcional. Añade subtítulo para la notificación push de iOS.
      "en": "subTitle"
    },
    "ios_content": {                       // opcional. Añade contenido para la notificación push de iOS.
      "en": "content"
    },
    
    // Parámetros relacionados con Android
    "android_root_params": {               // opcional. Objeto clave-valor personalizado.
      "key": "value"                       //           Parámetros de nivel raíz para los destinatarios del payload de Android.
    },
    "android_sound": "soundfile",          // opcional. Sin extensión de archivo. Si se deja vacío, el dispositivo
                                           //           no producirá sonido al recibir un push.
    "android_sound_off": true,             // opcional. Habilitar/deshabilitar el sonido establecido por el campo "android_sound"
    "android_header": {                    // opcional. Objeto O cadena. Encabezado de la notificación de Android.
      "en": "header" 
    },
    "android_content": {                   // opcional. Objeto O cadena. Contenido de la notificación de Android.
      "en": "content"
    },
    "android_icon": "icon.png",  
    "android_custom_icon": "URL.png",      // opcional. URL de ruta completa al archivo de imagen.
    "android_banner": "URL.png",           // opcional. URL de ruta completa al archivo de imagen.
    "android_badges": 5,                   // opcional. entero. Número de insignia del icono de la aplicación de Android.
                                           //           Usa "+n" o "-n" para incrementar/decrementar el valor de la insignia en n.
    "android_gcm_ttl": 3600,               // opcional. Parámetro de tiempo de vida: vida útil máxima del mensaje en segundos.
    "android_vibration": 0,                // opcional. Forzar vibración en Android para pushes de alta prioridad.
    "android_led": "#rrggbb",              // opcional. Color hexadecimal del LED, el dispositivo hará su mejor aproximación.
    "android_priority": -1,                // opcional. Establece el parámetro de "importancia" para dispositivos con Android 8.0
                                           //           y superior, así como el parámetro de "prioridad" para dispositivos
                                           //           con Android 7.1 e inferior. Establece el nivel de interrupción
                                           //           de un canal de notificación o una notificación particular.
                                           //           Los valores válidos son -2, -1, 0, 1, 2.
    "android_delivery_priority": "normal", // opcional. "normal" o "high". Habilita la entrega de la notificación
                                           //           cuando el dispositivo está en modo de ahorro de energía. 
    "android_ibc": "#RRGGBB",              // opcional. color de fondo del icono en Lollipop, #RRGGBB,
                                           //           #AARRGGBB, "red", "black", "yellow", etc.
    "android_silent": 1,                   // opcional. 0 o 1. Habilita la notificación silenciosa.
                                           //           Ignora el sonido y el contenido
    
    // Parámetros relacionados con Amazon
    "adm_root_params": {                   // opcional. Objeto clave-valor personalizado
      "key": "value"
    },
    "adm_sound": "push.mp3",
    "adm_sound_off": true,                 // opcional. Habilitar/deshabilitar el sonido establecido por el campo "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,                       // opcional. Parámetro de tiempo de vida: la máxima
                                           //           vida útil del mensaje en segundos.
    "adm_priority": -1,                    // opcional. Prioridad del push en el cajón de pushes de Amazon,
                                           //           los valores válidos son -2, -1, 0, 1 y 2.
    
    // Parámetros relacionados con Mac OS X
    "mac_badges": 3,
    "mac_sound": "sound.caf",
    "mac_sound_off": true,
    "mac_root_params": {
      "content-available": 1
    },
    "mac_ttl": 3600,                       // opcional. Parámetro de tiempo de vida: vida útil máxima del mensaje en segundos.
    "mac_title": {                         // opcional. Añade Título para la notificación push.
      "en": "title"
    },
    "mac_subtitle": {                      // opcional. Añade subtítulo para la notificación push de MacOS.
      "en": "subtitle"
    },
    "mac_content": {                       // opcional. Añade contenido para la notificación push de MacOS.
      "en": "content"
    },
    
    // Parámetros relacionados con Windows
    "wns_content": {                       // requerido. Contenido (XML o raw) de la notificación codificado
                                           //           en base64 de MIME en forma de Objeto O Cadena
      "en": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9ImF2YWlsYWJsZSIvPg==",
      "de": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9Im5ld01lc3NhZ2UiLz4="
    },
    "wns_type": "Badge",                   // 'Tile' | 'Toast' | 'Badge' | 'Raw'
    "wns_tag": "myTag",                    // opcional. Usado en la política de reemplazo de Tile.
                                           //           Una cadena alfanumérica de no más de 16 caracteres.
    "wns_cache": 1,                        // opcional. (1|0) Se traduce en el valor de X-WNS-Cache-Policy.
    "wns_ttl": 600,                        // opcional. Tiempo de expiración para la notificación en segundos.
    
    // Parámetros relacionados con Safari
    "safari_title": {                      // opcional. Objeto O cadena. Título de la notificación.
      "en": "title"
    },
    "safari_content": {                    // opcional. Objeto O cadena. Contenido de la notificación.
      "en": "content"
    },
    "safari_action": "Click here",         // opcional.
    "safari_url_args": [                   // requerido. pero el valor puede estar vacío
      "firstArgument",
      "secondArgument"
    ],
    "safari_ttl": 3600,                    // opcional. Parámetro de tiempo de vida: la máxima
                                           //           vida útil de un mensaje en segundos.
    
    // Parámetros relacionados con Chrome
    "chrome_title": {                      // opcional. Puedes especificar el encabezado del mensaje en este parámetro.
      "en": "title"
    },
    "chrome_content": {                    // opcional. Puedes especificar el contenido del mensaje en este parámetro.
      "en": "content"
    },
    "chrome_icon": "icon_URL",             // opcional. URL de ruta completa al icono o ruta del archivo de recursos de la extensión
    "chrome_gcm_ttl": 3600,                // opcional. Parámetro de tiempo de vida: vida útil máxima del mensaje en segundos.
    "chrome_duration": 20,                 // opcional. Cambia el tiempo de visualización del push de Chrome. Establece en 0 para mostrar el push
                                           //           hasta que el usuario interactúe con él.
    "chrome_image": "image_URL",           // opcional. URL a una imagen grande
    "chrome_root_params": {                // opcional. Establece parámetros específicos para los mensajes enviados a Chrome.
      "key": "value"
    },
    "chrome_button_text1": "text1",        // opcional.
    "chrome_button_url1": "button1_URL",   // opcional. Ignorado si chrome_button_text1 no está establecido.
    "chrome_button_text2": "text2",        // opcional.
    "chrome_button_url2": "button2_url",   // opcional. Ignorado si chrome_button_text2 no está establecido.
    
    // Parámetros relacionados con Firefox
    "firefox_title": {                     // opcional. Objeto O cadena. Puedes especificar el encabezado del mensaje aquí.
      "en": "title"
    },
    "firefox_content": {                   // opcional. Objeto O cadena. Puedes especificar el contenido del mensaje aquí.
      "en": "content"
    },
    "firefox_icon": "icon_URL",            // opcional. URL de ruta completa al icono o ruta
                                           //           al archivo en los recursos de la extensión.
    "firefox_root_params": {               // opcional. Establece parámetros específicos para los mensajes enviados a Firefox.
      "key": "value"
    }
  }
}
```
</TabItem>
</Tabs>

Los conceptos básicos son muy simples: todos los filtros se realizan en los **conjuntos** de entidades.

### Conjuntos

Los conjuntos se definen como:

**1.** Dispositivos suscritos a la aplicación particular (A);\
**2.** Dispositivos que coinciden con los valores de etiqueta especificados (T) o el valor de etiqueta específico de la aplicación (AT);\


### Sintaxis

Probemos con algunos ejemplos según la lista anterior.

#### Dirigirse a los suscriptores de la aplicación

El filtro "A" define un conjunto de dispositivos suscritos a una aplicación particular:

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

donde

* "XXXXX-XXXXX" – Código de Aplicación de Pushwoosh
* \["iOS", "Android", ...] – array de plataformas objetivo. Si se omite, el mensaje se enviará a todas las plataformas disponibles para esta aplicación.

#### Filtrado por valores de etiqueta

El filtro "T" define un conjunto de dispositivos que tienen asignados los valores de etiqueta especificados.

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

Define el conjunto de dispositivos que tienen la etiqueta “age” establecida en uno de los valores: 17, 18, 19, 20.

<Aside type="caution">
Para **etiquetas específicas de la aplicación**, se aplica el filtro "AT". Asegúrate de especificar un Código de Aplicación correspondiente como primer valor en un conjunto AT:

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


### Tipos de etiquetas y operadores

Lo más importante a entender es que las etiquetas se comparten entre las aplicaciones, y esto presenta un instrumento muy poderoso para segmentar y filtrar a tus usuarios objetivo sin vincularte a una aplicación en particular.

La etiqueta puede ser de tres tipos diferentes: **Cadena, Entero, Lista**. El tipo de etiqueta define qué operadores puedes usar para una etiqueta en particular.

#### Etiquetas de cadena

**Operadores aplicables:**

* **EQ** – se dirige a dispositivos con un valor de etiqueta especificado
* **IN** – se dirige a dispositivos con cualquiera de los valores de etiqueta especificados
* **NOTIN** – se dirige a dispositivos sin valores de etiqueta especificados
* **NOTEQ** – se dirige a dispositivos con un valor de etiqueta no igual a uno especificado
* **NOTSET** – se dirige a dispositivos sin valor para una etiqueta especificada
* **ANY** – se dirige a dispositivos con cualquier valor establecido para una etiqueta especificada

Ejemplos:

`T (\"Age\", EQ, 30)` – filtra usuarios de 30 años

`T (\"favorite_color\", IN, [\"red\",\"green\",\"blue\"])` – filtra usuarios que han elegido rojo, verde o azul como su color favorito.

`T (\"Name", NOTSET, \"\")` – se dirige a dispositivos sin valor para la etiqueta Name.

Puedes usar valores numéricos con las etiquetas de cadena, pero dichos valores se convertirán a una cadena.

#### Etiquetas de entero

**Operadores aplicables:**

* **GTE** – mayor o igual que un valor especificado
* **LTE**– menor o igual que un valor especificado
* **EQ** – igual a un valor especificado
* **BETWEEN** – entre los valores mínimo y máximo especificados
* **IN** – cualquiera de los valores especificados
* **NOTIN** – ningún valor especificado asignado a un dispositivo
* **NOTEQ** – dispositivos con un valor de etiqueta no igual a uno especificado
* **NOTSET** – dispositivos sin valor para una etiqueta especificada
* **ANY** – dispositivos con cualquier valor establecido para una etiqueta especificada

Ejemplos:

`T (\"Level\", EQ, 14)` – filtra usuarios solo en el nivel 14.

`T (\"Level\", BETWEEN, [1,5)` – filtra usuarios en los niveles 1, 2, 3, 4 y 5.

`T (\"Level", GTE, 29)` – se dirige a usuarios que han alcanzado al menos el nivel 29. 

#### Etiquetas de lista

**Operadores aplicables:**

* **IN** – dispositivos con cualquiera de los valores de etiqueta especificados

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

#### Etiquetas de fecha

**Operadores aplicables:**

* **GTE** – mayor o igual que un valor especificado
* **LTE**– menor o igual que un valor especificado
* **EQ** – igual a un valor especificado
* **BETWEEN** – entre los valores mínimo y máximo especificados
* **NOTEQ** – dispositivos con un valor de etiqueta no igual a uno especificado
* **NOTSET** – dispositivos sin valor para una etiqueta especificada
* **ANY** – dispositivos con cualquier valor establecido para una etiqueta especificada

Ejemplos:

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

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

### Operaciones

* “+” – une dos conjuntos (equivale a OR)
* “\*” – intersecta dos conjuntos (equivale a AND)
* “\” – resta un conjunto de otro (equivale a NOT)

Todas las operaciones son asociativas a la izquierda. "+" y "*" tienen la misma prioridad. "\" tiene mayor prioridad. Puedes usar paréntesis para definir las prioridades de los cálculos.

Ten en cuenta que la operación “\” no es conmutativa. `A("12345-12345") \ A("67890-67890")` no es lo mismo que `A("67890-67890") \ A("12345-12345")`.


<Aside type="note">
No puedes usar ninguno de los siguientes parámetros relacionados con la segmentación en la solicitud /createTargetedMessage:

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

Todos los demás parámetros listados en [`/createMessage`](#createmessage) son compatibles.
</Aside>

<Aside type="caution" title="Importante">
Hay un problema conocido con el método `/createTargetedMessage`: si no especificas ninguna aplicación en la sección "devices_filter", Pushwoosh no muestra ninguna aplicación en los detalles del push.
</Aside>

## getPushHistory <Badge text="Obsoleto" variant="caution" size="small" />

<Aside type="note">
Usa [**/messages:list**](/es/developer/api-reference/statistics-api/message-statistics-api/#messageslist) para recuperar el historial de mensajes y datos más detallados en su lugar.
</Aside>

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

Obtiene el historial de mensajes con detalles de push.

#### Cuerpo de la Solicitud

| Nombre                                   | Tipo    | Descripción                                                                                                          |
| -------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------- |
| auth* | string  | [Token de acceso a la API](/es/developer/api-reference/api-identifiers/#api-access-token) desde el Panel de Control de Pushwoosh.                                                                       |
| limitMessages                          | integer | Limita el número de mensajes en una respuesta. Valores posibles de 10 a 1000.                                        |
| source                                 | string  | Fuente del historial de push. Puede ser nulo o: "CP", "API", "GeoZone", "RSS", "AutoPush", "A/B Test".       |
| searchBy                               | string  | Valores posibles para buscar. Puede ser nulo o: "notificationID", "notificationCode", "applicationCode", "campaignCode". |
| value                                  | string  | Valor de búsqueda establecido según el campo "searchBy".                                                                  |
| lastNotificationID                     | string  | Usado para paginación. Último messageId de la llamada /getPushHistory anterior. Consulta los detalles a continuación.                       |

<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="Ejemplo"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "source": null,                  // opcional. Los valores posibles son nulo, "CP", "API", "GeoZone",
                                     //           "RSS", "AutoPush", "A/B Test"
    "searchBy": "applicationCode",   // opcional. Los valores posibles son "", "notificationID",
                                     //           "notificationCode", "applicationCode", "campaignCode"
    "value": "C8717-703F2",          // opcional. Valor de búsqueda establecido según el campo "searchBy".
    "lastNotificationID": 0,         // opcional. Usado para paginación. Último messageId de la
                                     //           llamada /getPushHistory anterior. Consulta los detalles a continuación.
    "limitMessages": 1000            // opcional. Valor posible de 10 a 1000.
  }
}
```

Este método devolverá 1000 mensajes de la cuenta ordenados por ID de mensaje. Para obtener la segunda página, especifica el último ID de mensaje de la respuesta anterior en el parámetro **lastNotificationId**.

### Tipos de datos de respuesta

```
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 (obsolete) -- list (JSON) | null
data -- dict (JSON) | null
open -- dict [dict [string: int]]  | ""   Example: 'open': {'AAAAA-BBBBB': {'IOS': 1, 'ANDROID': 1}}
sent -- dict [dict [string: int]]  | ""   Example: 'sent': {'AAAAA-BBBBB': {'IOS': 10, 'ANDROID': 10}}
ctr -- dict [string: int] | ""  Example: {'AAAAA-BBBBB': 1}
errors -- dict [string: int] | ""  Example: {'ANDROID': 1, 'IOS': 1}
```



## cancelMessage

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

Cancela un mensaje programado.

#### Cuerpo de la Solicitud

| Nombre                                      | Tipo   | Descripción                                           |
| ----------------------------------------- | ------ | ----------------------------------------------------- |
| auth*    | string | [Token de acceso a la API](/es/developer/api-reference/api-identifiers/#api-access-token) desde el Panel de Control de Pushwoosh.        |
| message* | string | El [código de mensaje](/es/developer/api-reference/api-identifiers/#message-code) obtenido en la respuesta de `/createMessage`. |

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

<Aside type="note">
El método solo está permitido para mensajes que están en estado pendiente, en espera o en procesamiento.
</Aside>

```json title="Ejemplo"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // requerido. Token de acceso a la API desde el Panel de Control de Pushwoosh
    "message": "xxxx-xxxxxxx-xxxxxx" // requerido. El código de mensaje obtenido en la respuesta de /createMessage
  }
}
```

**Códigos de estado:**

| Código de estado HTTP | status_code | Descripción                                         |
| ---------------- | ------------ | --------------------------------------------------- |
| 200              | 200          | Mensaje cancelado con éxito                       |
| 200              | 210          | Error de argumento. Consulta status_message para más información.  |
| 400              | N/A          | Cadena de solicitud mal formada                            |
| 500              | 500          | Error interno                                      |