# 消息 API

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

<Aside type="caution" title="/createMessage 和 /createTargetedMessage 已弃用">
新的集成应使用统一的 [**消息 API v2**](/zh/developer/api-reference/messaging-api-v2/) — 一个端点取代了整个 `/create*Message` 系列。有关字段到字段的映射，请参阅[迁移指南](/zh/developer/api-reference/messaging-api-v2/migration-from-v1/)。

下面的旧方法仍然完全可用。`/deleteMessage`、`/cancelMessage` 和 `/getMessageDetails` 并未弃用 — 您可以像往常一样对 v1 或 v2 创建的消息使用它们。
</Aside>

<Aside type="note">
要开始使用，请查看 [/createMessage 请求参数](/zh/developer/api-reference/messages-api/api-prerequisites)的描述。
</Aside>

## createMessage <Badge text="已弃用" variant="caution" size="small" />

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

创建一个新的推送通知。

#### 请求正文

| 名称                                            | 类型   | 描述                                                                |
| ----------------------------------------------- | ------ | -------------------------------------------------------------------------- |
| auth*          | string | 来自 Pushwoosh 控制面板的 [API 访问令牌](/zh/developer/api-reference/api-identifiers/#api-access-token)。                             |
| application*   | string | [Pushwoosh 应用程序代码](/zh/developer/api-reference/api-identifiers/#application-code)                                               |
| notifications* | array  | 消息参数的 JSON 数组。详情请参见下面的请求示例。  |

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

<Aside type="note">
/createMessage 方法支持内容模板。要了解更多信息，请参阅 [Liquid 模板指南](/zh/developer/guides/personalization/liquid-templates/)。
</Aside>

### 请求示例

```json title="示例"
{
  "request": {
    "application": "XXXXX-XXXXX",       // 必需。Pushwoosh 应用程序代码。
    "auth": "yxoPUlwqm…………pIyEX4H",     // 必需。来自 Pushwoosh 控制面板的 API 访问令牌。
    "notifications": [{
      "send_date": "now",               // 可选。YYYY-MM-DD HH:mm 或 'now'
      "content": {                      // 可选。对象或字符串。
        "en": "English",                //           对于 Windows，请改用 "wns_content"。
        "fr": "French"
      },
      "title": {                        // 可选。对象或字符串。
        "en": "Title",                  //           如果指定了特定于平台的标题，则忽略
        "fr": "Titre"                   //           'ios_title', 'android_header' 等。
      },                                //           请参见下面的特定于平台的参数示例。
      "subtitle":{                      // 可选。对象或字符串。
        "en": "Subtitle",               //           如果指定了特定于平台的标题，则忽略
        "fr": "Sous-titre"              //           'ios_subtitle' 等。
      },                                //           请参见下面的特定于平台的参数示例。
      "ignore_user_timezone": true,     // 可选。
      "timezone": "America/New_York",   // 可选。如果忽略，则 "send_date" 默认为 UTC-0。
                                        //           有关支持的时区，请参见 https://php.net/manual/timezones.php。
      "campaign": "CAMPAIGN_CODE",      // 可选。您希望将此推送消息分配到的活动代码。
      "geozone": {                      // 可选。发送到地理区域
        "lat": 22.22,
        "lng": 33.33,
        "range": 110
      },
      "rich_media": "XXXXX-XXXXX",      // 可选。从 Pushwoosh 控制面板的富媒体编辑器页面的 URL 栏中复制富媒体代码。
      "link": "https://google.com",     // 可选。对于深层链接，添加 "minimize_link": 0
      "minimize_link": 0,               // 可选。0 — 不最小化，2 — bitly。默认为 2。
                                        //           请注意，短链接服务对调用次数有限制。
      "data": {                         // 可选。JSON 字符串或 JSON 对象，将作为
        "key": "value"                  //           有效负载中的 "u" 参数传递（转换为 JSON 字符串）。
      },
      "transactionId": "unique UUID",   // 可选。唯一的消息标识符，以防止在
                                        //           网络问题的情况下重复。在 Pushwoosh 端存储 5 分钟。
      "platforms": [                    // 可选。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",          // 可选。来自您控制面板的推送预设代码。
                                        //           如果在请求中发送了特定参数，
                                        //           它们将覆盖预设的参数。
      "send_rate": 100,                 // 可选。节流。有效值为 100 到 1000 推送/秒。
      "send_rate_avoid": true,          // 可选。如果设置为 true，节流限制将不适用于
                                        //           此特定的推送通知。
      // 与模板相关，请参阅模板引擎指南以了解更多信息
      "template_bindings": {            // 可选。
        "TemplatePlaceholder": "Value"
      },
      "dynamic_content_placeholders": { // 可选。用于动态内容的占位符，而不是设备标签。
        "firstname": "John",
        "lastname": "Doe"
      },
      "message_type": "marketing",       // 可选。"marketing" 或 "transactional"。
                                         // 如果省略，PW_ControlGroup: true 的用户将不会收到该消息。

      // 频率上限参数。确保在控制面板中配置了全局频率上限。
      // 频率上限不适用于事务性消息。
      // 在所有其他情况下，包括省略 "message_type"，频率上限均适用。
      "capping_days": 30,               // 可选。频率上限的天数（最多 30 天）
      "capping_count": 10,              // 可选。在 'capping_days' 期间内，
                                        //           从特定应用发送到特定设备的最大推送次数。
                                        //           如果创建的消息超过了设备的 'capping_count' 限制，
                                        //           它将不会发送到该设备。
      "capping_exclude": true,          // 可选。如果设置为 true，此推送通知将
                                        //           不计入未来推送的上限。
      "capping_avoid": true,            // 可选。如果设置为 true，上限将不适用于
                                        //           此特定的推送通知。
        
      // 要通过 API 将消息保存到收件箱，请使用 "inbox_date" 或 "inbox_image"。
      // 当至少使用其中一个参数时，消息将被保存。
      "inbox_date": "2017-02-02",       // 可选。指定何时从收件箱中删除消息。
                                        //           消息将在指定日期的 00:00:01 UTC 从收件箱中删除，
                                        //           因此前一天是用户可以在其收件箱中看到消息的最后一天。
                                        //           如果未指定，默认删除日期是发送日期的第二天。
      "inbox_image": "Inbox image URL", // 可选。将在消息旁边显示的图像。
	  "inbox_days": 5,                  // 可选。指定何时从收件箱中删除消息
                                        //           （收件箱消息的生命周期，以天为单位）。
                                        //           可以代替 "inbox_date" 参数使用。
                                        //           最多 30 天。
      
      "devices": [                      // 可选。指定令牌或 hwid 以发送定向推送
          "hwid_XXXX"                   //           通知。数组中不超过 1000 个令牌/hwid。
      ],                                //           如果设置，消息将仅发送到
                                        //           列表中的设备。设备列表不允许使用应用程序组。
                                        //           iOS 推送令牌只能是小写。
      "to": [                           // 可选。用于电子邮件、短信和类似渠道。收件人列表
          "email_1", "email_2"          //           （例如电子邮件地址、电话号码）。最多 1000 项。
      ],                                //           对于推送，请改用 "devices"。
      // 以用户为中心的推送通知
      "users": [                        // 可选。如果设置，消息将仅传递到
          "user_XXXX"                   //           指定的用户 ID（通过 /registerUser 调用设置）。
      ],                                //           如果与 devices 或 to 一起指定，
                                        //           后者将被忽略。数组中不超过 1000 个用户 ID。
                                        //           用户列表不允许使用应用程序组。

      // 过滤器和条件
      "filter": "FILTER_NAME",          // 可选。
      "conditions": [                   // 可选。请参见下面的备注。
        ["Country", "EQ", "fr"],
        ["Language", "EQ", "en"]
      ],    
      "conditions_operator": "AND"      // 可选。条件数组的逻辑运算符。
                                        //           可能的值：AND | OR。默认为 AND。
    }]
  }
}
```

### VoIP 通知请求示例

Pushwoosh 支持 iOS 和 Android 的 VoIP 风格呼叫通知。\
下面您可以找到每个平台的 API `createMessage` 请求示例。

#### iOS

```json title="示例"
{
  "request": {
    "application": "XXXXX-XXXXX",     // 必需。Pushwoosh 应用程序代码。
    "auth": "yxoPUlwqm…………pIyEX4H",   // 必需。来自 Pushwoosh 控制面板的 API 访问令牌。
    "notifications": [
      {
        "voip_push": true,            // 必需。发送 VoIP 推送通知需要此参数。
        "ios_root_params": {
          "aps": {
            "mutable-content": 1      // iOS10+ 媒体附件必需。
          },
          "callerName": "CallerName", // 可选。呼叫者姓名。如果未指定，则显示“未知呼叫者”。
          "video": true,              // 可选。指示是否支持视频通话。
          "supportsHolding": true,    // 可选。指示是否支持呼叫保持功能。
          "supportsDTMF": false,      // 可选。控制双音多频信号支持。
          "callId": "42",             // 可选。要取消的呼叫的唯一标识符。
          "cancelCall": true          // 可选。设置为 "true" 以取消具有指定 "callId" 的呼叫。
        }
      }
    ]
  }
}
```

#### Android

```json title="示例"
{
  "request": {
    "application": "XXXXX-XXXXX",   // 必需。Pushwoosh 应用程序代码。
    "auth": "yxoPUlwqm…………pIyEX4H", // 必需。来自 Pushwoosh 控制面板的 API 访问令牌。
    "notifications": [
      {
      "voip_push": true,            // 必需。发送 VoIP 推送通知需要此参数。
      "android_root_params": {
        "callerName": "callerName", // 可选。呼叫者姓名。如果未指定，则显示“未知呼叫者”。
        "video": true,              // 可选。指示是否支持视频通话。
        "callId": 42,               // 可选。要取消的呼叫的唯一标识符。
        "cancelCall": true          // 可选。设置为 "true" 以取消具有指定 "callId" 的呼叫。
        }
      }
    ]
  }
}

```


### 特定于平台的参数

#### iOS 参数

```json title="示例"
{
  "request": {
    "application": "12345-67891",         // 必需。Pushwoosh 应用程序代码
    "auth": "yxoPUlwqm…………pIyEX4H",       // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "notifications": [{
      "ios_title": {                      // 可选。对象或字符串。为推送通知添加 iOS 特定标题。
        "en": "title"
      },
      "ios_subtitle": {                   // 可选。对象或字符串。为推送通知添加 iOS 特定副标题。
        "en": "subtitle"
      },
      "ios_content": {                    // 可选。对象或字符串。为推送通知添加 iOS 特定内容。
        "en": "content"
      },
      "ios_badges": 5,                    // 可选。iOS 应用程序角标数。
                                          //           使用 "+n" 或 "-n" 将角标值增加/减少 n。
      "ios_sound": "sound file.wav",      // 可选。应用程序主包中的声音文件名。
                                          //           如果留空，设备将产生默认系统声音。
      "ios_sound_off": true,              // 可选。启用/禁用由 "ios_sound" 字段设置的声音。
      "ios_ttl": 3600,                    // 可选。生存时间参数 - 消息最大生命周期（秒）。
      "ios_silent": 1,                    // 可选。启用静默通知（忽略 "sound" 和 "content"）。
      "ios_category_id": "1",             // 可选。来自 Pushwoosh 的 iOS8 类别 ID。
      "ios_root_params": {                // 可选。aps 字典的根级别参数。
        "aps": {
          "content-available": "0",       // 可选。设置为 "1" 发送静默推送，"0" 发送常规推送。
          "mutable-content": 1            // iOS10+ 媒体附件必需。
        },
        "callerName": "CallerName",       // 可选 VoIP 参数。呼叫者姓名。如果未指定，则显示“未知呼叫者”。
        "video": true,                    // 可选 VoIP 参数。指示是否支持视频通话。
        "supportsHolding": true,          // 可选 VoIP 参数。指示是否支持呼叫保持功能。
        "supportsDTMF": false,            // 可选 VoIP 参数。控制双音多频信号支持。
        "data": {}                        // 可选 用户提供的数据，最大 4KB
      },
      "ios_attachment": "URL",            // 可选。在通知中插入媒体内容。
      "ios_thread_id": "some thread id",  // 可选。用于对相关通知进行分组的标识符。
                                          //           具有相同线程 ID 的消息将在锁定屏幕和通知中心分组。
      "ios_critical": true,               // 可选。将 iOS 通知标记为紧急警报
                                          //           即使设备静音或开启“请勿打扰”模式也会播放声音。
      "ios_category_custom": "category",  // 可选。自定义 APNS 类别。
      "ios_interruption_level": "active", // 可选。 "passive"、"active"、"time-sensitive"、
                                          //           "critical" 之一。指示通知的重要性和
                                          //           传递时间。详情请参阅一次性推送指南。
      "apns_collapse_id": "promo",        // 可选。APNs 折叠标识符。具有相同
                                          //           apns_collapse_id 的通知将在设备上相互替换。
      "apns_trim_content": 1              // 可选。(0|1) 用省略号修剪超出的内容字符串。
    }]
  }
}
```

#### Android 参数

```json title="示例"
{
  "request": {
    "application": "12345-67891",            // 必需。Pushwoosh 应用程序代码
    "auth": "yxoPUlwqm…………pIyEX4H",          // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "notifications": [{
      "android_header": {                    // 可选。Android 通知标题。
        "en": "header"
      },
      "android_content": {                   // 可选。Android 通知内容。
        "en": "content"
      },
      "android_root_params": {               // 可选。自定义键值对象。
        "key": "value",                      //           android 有效负载接收者的根级别参数。
        "CancelID": 12345678,                // 可选。取消具有
        "voip": true,                        // 必需的 VoIP 参数。发送 VoIP 推送通知需要此参数。
        "callerName": "callerName",          // 可选的 VoIP 参数。呼叫者姓名。如果未指定，则显示“未知呼叫者”。
        "video": true,                       // 可选的 VoIP 参数。指示是否支持视频通话。
      },                                     //           指定消息 ID 的推送通知（从消息历史记录中获取 ID）
      "android_sound": "soundfile",          // 可选。无文件扩展名。如果留空，
                                             //           设备将产生默认系统声音。
      "android_sound_off": true,             // 可选。启用/禁用由 "android_sound" 字段设置的声音
      "android_icon": "icon.png",            // 可选。
      "android_custom_icon": "URL.png",      // 可选。图像文件的完整 URL。
      "android_banner": "URL.png",           // 可选。图像文件的完整 URL。
      "android_badges": 5,                   // 可选。Android 应用程序图标角标数。
                                             //           使用 "+n" 或 "-n" 将角标值增加/减少 n。
      "android_gcm_ttl": 3600,               // 可选。生存时间参数 — 消息最大生命周期（秒）。
      "android_vibration": 0,                // 可选。Android 高优先级推送的强制振动。
      "android_led": "#rrggbb",              // 可选。LED 十六进制颜色，设备将尽力近似。
      "android_priority": -1,                // 可选。为 Android 8.0 及更高版本的设备设置 "importance" 参数，
                                             //           以及为 Android 7.1 及更低版本的设备设置 "priority" 参数。
                                             //           建立通知渠道或特定通知的
                                             //           中断级别。有效值为 -2, -1, 0, 1, 2。
      "android_delivery_priority": "normal", // 可选。"normal" 或 "high"。
                                             //           在设备处于省电模式时
                                             //           启用通知的传递。
      "android_ibc": "#RRGGBB",              // 可选。Lollipop 上的图标背景颜色，#RRGGBB，
                                             //           #AARRGGBB, "red", "black", "yellow" 等。
      "android_silent": 1,                   // 可选。0 或 1。启用静默通知。
                                             //           忽略声音和内容
      "android_group_id": "123",             // 可选。用于对相关通知进行分组的标识符。具有
                                             //           相同线程 ID 的消息将在
                                             //           通知中心分组。
      "android_collapse_key": "promo"        // 可选。FCM 折叠键。具有相同
                                             //           折叠键的通知在设备离线时相互替换。
    }]
  }
}
```

**华为参数**

```json title="华为"
{
  "request": {
    "application": "12345-67891",                   // 必需。Pushwoosh 应用程序代码
    "auth": "yxoPUlwqm…………pIyEX4H",                 // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "notifications": [{
      "huawei_android_header": {                    // 可选。对象或字符串。通知标题
        "en": "header"
      },
      "huawei_android_content": {                   // 可选。对象或字符串。通知内容
        "en": "content"
      },
      "huawei_android_badges": true,                // 可选。
      "huawei_android_silent": 0,                   // 可选。0 或 1。启用静默通知。
                                                    //           忽略声音和内容
      "huawei_android_icon": "URL.png",             // 可选。
      "huawei_android_led": "#FF0011",              // 可选。LED 十六进制颜色，设备将尽力近似
      "huawei_android_vibration": 1,                // 可选。华为高优先级推送的强制振动
      "huawei_android_sound": "sound.wav",          // 可选。如果留空，设备将产生
                                                    //           默认系统声音
      "huawei_android_sound_off": true,             // 可选。启用/禁用由
                                                    //           "huawei_android_sound" 字段设置的声音
      "huawei_android_custom_icon": "URL.png",      // 可选
      "huawei_android_gcm_ttl": 2400,               // 可选。生存时间参数 - 消息最大
                                                    //           生命周期（秒）
      "huawei_android_banner": "URL.png",           // 可选。图像文件的完整路径 URL
      "huawei_android_root_params": {               // 可选。自定义键值对象。
        "key": "value"                              //           华为有效负载接收者的根级别参数。
      },
      "huawei_android_priority": 0,                 // 可选。有效值：-2, -1, 0, 1, 2
      "huawei_android_ibc": "#0011AA",              // 可选。Lollipop 上的图标背景颜色
      "huawei_android_lockscreen": 1,               // 可选
      "huawei_android_delivery_priority": "normal", // 可选。"normal" 或 "high"。启用通知
                                                    //           在省电模式下传递
      "huawei_android_group_id": "group_id"         // 可选。用于对相关通知进行分组的标识符
    }]
  }
}
```

#### Safari 参数

```json title="Safari"
{
  "request": {
    "application": "12345-67891",    // 必需。Pushwoosh 应用程序代码
    "auth": "yxoPUlwqm…………pIyEX4H",  // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "notifications": [{
      "safari_url_args": [           // 必需，但值可以为空
        "firstArgument",
        "secondArgument"
      ],
      "safari_title": {              // 可选。对象或字符串。通知的标题。
        "en": "content"
      },
      "safari_content": {            // 可选。对象或字符串。通知的内容。
        "en": "content"
      },
      "safari_action": "Click here", // 可选。
      "safari_ttl": 3600             // 可选。生存时间参数 — 消息的最大
                                     //           生命周期（秒）。
    }]
  }
}


```

#### Chrome 参数

```json title="Chrome"
{
  "request": {
    "application": "12345-67891",          // 必需。Pushwoosh 应用程序代码
    "auth": "yxoPUlwqm…………pIyEX4H",        // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "notifications": [{
      "chrome_title": {                    // 可选。对象或字符串。您可以在此参数中指定消息的标题。
        "en": "title"                      //           
      },
      "chrome_content": {                  // 可选。对象或字符串。您可以在此参数中指定消息的内容。
        "en": "content"                    //           
      },
      "chrome_icon": "URL.png",            // 可选。图标的完整 URL 或扩展资源文件路径
      "chrome_gcm_ttl": 3600,              // 可选。生存时间参数 – 消息最大生命周期（秒）。
      "chrome_duration": 20,               // 可选。最大 50 秒。更改 chrome 推送显示时间。
                                           //           设置为 0 以显示推送，直到用户与其交互。
      "chrome_image": "image_URL",         // 可选。大图的 URL。
      "chrome_root_params": {              // 可选。设置发送到 Chrome 的消息的特定参数。
        "key": "value"
      }, 
      "chrome_button_text1": "text1",      // 可选
      "chrome_button_url1": "button1_URL", // 可选。如果未设置 chrome_button_text1，则忽略。
      "chrome_button_text2": "text2",      // 可选
      "chrome_button_url2": "button2_url"  // 可选。如果未设置 chrome_button_text2，则忽略。
    }]
  }
}
```

#### Firefox 参数

```json title="Firefox"
{
  "request": {
    "application": "12345-67891",   // 必需。Pushwoosh 应用程序代码
    "auth": "yxoPUlwqm…………pIyEX4H", // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "notifications": [{
      "firefox_title": {            // 可选。对象或字符串。您可以在此处指定消息标题。
        "en": "title"
      },
      "firefox_content": {          // 可选。对象或字符串。您可以在此处指定消息内容。
        "en": "content"
      },
      "firefox_icon": "URL.png",    // 可选。图标的完整路径 URL 或
                                    //           扩展资源中文件的路径。
      "firefox_root_params": {      // 可选。设置发送到 Firefox 的消息的特定参数。
        "key": "value"
      } 
    }]
  }
}
```

#### Amazon 参数

```json title="Amazon"
{
  "request": {
    "application": "12345-67891",   // 必需。Pushwoosh 应用程序代码
    "auth": "yxoPUlwqm…………pIyEX4H", // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "notifications": [{
      "adm_header": {               // 可选。对象或字符串。您可以在此处指定消息标题。
        "en": "header"
      },
      "adm_content": {              // 可选。对象或字符串。您可以在此处指定消息内容。
        "en": "content"
      },
      "adm_root_params": {          // 可选。自定义键值对象
        "key": "value"
      },
      "adm_sound": "push.mp3",      // 可选。
      "adm_sound_off": true,        // 可选。启用/禁用由 "adm_sound" 字段设置的声音
      "adm_icon": "icon.png",       // 可选。图标的完整 URL。
      "adm_custom_icon": "URL.png", // 可选。
      "adm_banner": "URL.png",      // 可选。
      "adm_ttl": 3600,              // 可选。生存时间参数 — 消息的最大
                                    //           生命周期（秒）。
      "adm_priority": -1            // 可选。Amazon 推送抽屉中推送的优先级，
                                    //           有效值为 -2, -1, 0, 1 和 2。
    }]
  }
}
```

#### Mac OS X 参数

```json title="Mac OS X"
{
  "request": {
    "application": "12345-67891",   // 必需。Pushwoosh 应用程序代码
    "auth": "yxoPUlwqm…………pIyEX4H", // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "notifications": [{
      "mac_title": {                // 可选。对象或字符串。为推送通知添加标题。
        "en": "title"
      },
      "mac_subtitle": {             // 可选。为推送通知添加副标题。
        "en": "subtitle"
      },
      "mac_content": {              // 可选。为推送通知添加内容。
        "en": "content"
      },
      "mac_badges": 3,              // 可选。
      "mac_sound": "sound.caf",     // 可选。
      "mac_sound_off": true,        // 可选。启用/禁用由 "mac_sound" 字段设置的声音
      "mac_root_params": {          // 可选。
        "content-available": 1
      },
      "mac_ttl": 3600               // 可选。生存时间参数 — 消息最大生命周期（秒）。
    }]
  }
}
```

#### Windows 参数

```json title="Windows"
{
  "request": {
    "application": "12345-67891",   // 必需。Pushwoosh 应用程序代码
    "auth": "yxoPUlwqm…………pIyEX4H", // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "notifications": [{
      "wns_content": {              // 必需。以 MIME 的 base64 编码的通知内容（XML 或原始）
                                    //           以对象或字符串的形式
        "en": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9ImF2YWlsYWJsZSIvPg==",
        "de": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9Im5ld01lc3NhZ2UiLz4="
      },
      "wns_type": "Badge",          // 可选。'Tile' | 'Toast' | 'Badge' | 'Raw'
      "wns_tag": "myTag",           // 可选。用于磁贴替换策略。
                                    //           不超过 16 个字符的字母数字字符串。
      "wns_cache": 1,               // 可选。(1|0) 转换为 X-WNS-Cache-Policy 值。
      "wns_ttl": 600                // 可选。通知的过期时间（秒）。
    }]
  }
}
```
<Aside>
快速入门！查看这些优秀的第三方库！

Python 库 **由 Pushwoosh 提供**：
[https://github.com/makcyd/pushwoosh_api](https://github.com/makcyd/pushwoosh_api)

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

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

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

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

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

<Aside type="caution">
#### /createMessage 节流

请记住，非企业账户每分钟不能发送超过 600 个 `/createMessage` 和/或 [`/createTargetedMessage`](/zh/developer/api-reference/messages-api/#createtargetedmessage) 请求。

但是，如果您通过 **devices** 参数向 **10 个或更少设备** 发送推送，只要禁用了 API 消息追踪，任何账户类型都没有限制。

请注意，**我们总是将预定的推送保存**到消息历史记录中，即使您通过 devices 参数将它们发送到少于 10 个设备。因此，此类推送也会被节流。
</Aside>

**响应**：

| HTTP 状态码 | status_code | 描述                                       |
| ---------------- | ------------ | ------------------------------------------------- |
| 200              | 200          | 消息创建成功                      |
| 200              | 210          | 参数错误。更多信息请参见 status_message |
| 400              | N/A          | 请求字符串格式错误                          |
| 500              | 500          | 内部错误                                    |

<Aside type="note">
通知数组中的错误

如果 `createMessage` 请求在 `notifications` 数组中有多个消息，它们将逐一处理和发送。如果其中一条消息无法解析，我们的 API 将返回 `"status_code":210` 以及成功发送的消息的代码，即请求中位于错误消息之前的消息。
</Aside>

### API 消息追踪

出于负载均衡的目的，_我们不存储通过 API 发送的、在“devices”参数中包含少于 10 个设备的消息_。因此，此类消息将不会显示在您的消息历史记录中。

要在测试阶段查看推送报告，请使用 **API 消息追踪**。开启此选项**ON**允许您_在 1 小时内覆盖此限制，并将此类推送保存在消息历史记录中_。API 消息追踪在 1 小时后自动关闭**OFF**。

API 消息追踪可以在[消息历史记录](/zh/product/statistics-and-analytics/message-history/)页面上通过点击右上角的**开始 API 消息追踪**来激活。

### 标签条件

每个标签条件都是一个数组，如 `[tagName, operator, operand]`，其中

* tagName：标签名称
* operator："EQ" | "IN" | "NOTEQ" | "NOTIN" | "LTE" | "GTE" | "BETWEEN" | "NOTSET" | "ANY"
* operand：字符串 | 整数 | 数组 | 日期

#### 操作符描述

* EQ：标签值等于操作数；
* IN：标签值与操作数相交（操作数必须始终是数组）；
* NOTEQ：标签值不等于操作数；
* NOTIN：标签值不与操作数相交（操作数必须始终是数组）；
* GTE：标签值大于或等于操作数；
* LTE：标签值小于或等于操作数；
* BETWEEN：标签值大于或等于最小操作数值但小于或等于最大操作数值（操作数必须始终是数组）；
* NOTSET：标签未设置。不考虑操作数；
* ANY：标签有任何值。不考虑操作数。

#### 字符串标签

有效操作符：EQ, IN, NOTEQ, NOTIN, NOTSET, ANY\
有效操作数：

* EQ, NOTEQ：操作数必须是字符串；
* IN, NOTIN：操作数必须是字符串数组，如 `["value 1", "value 2", "value N"]`；
* NOTSET：标签未设置。不考虑操作数；
* ANY：标签有任何值。不考虑操作数。

#### 整数标签

有效操作符：EQ, IN, NOTEQ, NOTIN, BETWEEN, GTE, LTE, NOTSET, ANY\
有效操作数：

* EQ, NOTEQ, GTE, LTE：操作数必须是整数；
* IN, NOTIN：操作数必须是整数数组，如 `[value 1, value 2, value N]`；
* BETWEEN：操作数必须是整数数组，如 `[min_value, max_value]`；
* NOTSET：标签未设置。不考虑操作数；
* ANY：标签有任何值。不考虑操作数。

#### 日期标签

有效操作符：EQ, IN, NOTEQ, NOTIN, BETWEEN, GTE, LTE, NOTSET, ANY\
有效操作数：

* `"YYYY-MM-DD 00:00"` (字符串)
* unix 时间戳 `1234567890` (整数)
* `"N days ago"` (字符串) 用于操作符 EQ, BETWEEN, GTE, LTE

#### 布尔标签

有效操作符：EQ, NOTSET, ANY\
有效操作数：`0, 1, true, false`

#### 列表标签

有效操作符：IN, NOTIN, NOTSET, ANY\
有效操作数：操作数必须是字符串数组，如 `["value 1", "value 2", "value N"]`。

<Aside type="danger">
请记住，“filter”和“conditions”参数不应一起使用。\
此外，如果在同一请求中使用了“devices”参数，它们都**将被忽略**。
</Aside>

<Aside type="note">
#### 国家和语言标签

语言标签值是根据 [ISO-639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) 的小写双字母代码\
国家标签值是根据 [ISO_3166-2](https://en.wikipedia.org/wiki/ISO_3166-2) 的大写双字母代码\
例如，要向巴西的葡萄牙语订阅者发送推送通知，您需要指定以下条件：`"conditions": [["Country", "EQ", "BR"],["Language", "EQ", "pt"]]`
</Aside>

### /createMessage 代码片段

<Aside type="caution" title="重要">
使用代码片段时请小心。通过指定 "users"、"devices"、"filter" 或 "conditions" 参数来限制收件人数量。如果未指定这些参数，消息将发送给**订阅了该应用程序推送通知的每个设备**。
</Aside>

示例 `/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`

删除一条预定的消息。

#### 请求正文

| 名称                                      | 类型   | 描述                                      |
| ----------------------------------------- | ------ | ------------------------------------------------ |
| auth*    | string | 来自 Pushwoosh 控制面板的 [API 访问令牌](/zh/developer/api-reference/api-identifiers/#api-access-token)。   |
| message* | string | 在 `/createMessage` 请求中获得的[消息代码](/zh/developer/api-reference/api-identifiers/#message-code)。 |

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

```json title="示例"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "message": "xxxx-xxxxxxx-xxxxxx" // 必需。在 /createMessage 中获得的消息代码
  }
}
```

<Aside type="danger">
您不能删除已经发送出去的消息。
</Aside>

**状态码：**

| HTTP 状态码 | status_code | 描述                                         |
| ---------------- | ------------ | --------------------------------------------------- |
| 200              | 200          | 消息删除成功                        |
| 200              | 210          | 参数错误。更多信息请参见 status_message |
| 400              | N/A          | 请求字符串格式错误                            |
| 500              | 500          | 内部错误                                      |

```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`

检索消息详情。

#### 请求正文

| 名称                                      | 类型   | 描述                                    |
| ----------------------------------------- | ------ | ---------------------------------------------- |
| auth*    | string | 来自 Pushwoosh 控制面板的 [API 访问令牌](/zh/developer/api-reference/api-identifiers/#api-access-token)。 |
| message* | string | [消息代码](/zh/developer/api-reference/api-identifiers/#message-code) 或消息 ID。                    |

<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="示例"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "message": "xxxx-xxxxxxx-xxxxxx" // 必需。消息代码或消息 ID
  }
}
```

## createTargetedMessage <Badge text="已弃用" variant="caution" size="small" />

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

创建一个新的定向推送通知。

#### 请求正文

| 名称                                              | 类型    | 描述                                                                                                                            |
| ------------------------------------------------- | ------- |----------------------------------------------------------------------------------------------------------------------------------------|
| auth*            | string  | 来自 Pushwoosh 控制面板的 [API 访问令牌](/zh/developer/api-reference/api-identifiers/#api-access-token)。                                                                                         |
| devices_filter* | string  | 请参见下面的备注。                                                                                                                      |
| send_date*      | string  | YYYY-MM-DD HH:mm 或 'now'。                                                                                                             |
| ignore_user_timezone                            | boolean | 如果忽略，则 "send_date" 默认为 UTC-0。                                                                                         |
| timezone                                          | string  | 如果忽略，则 "send_date" 默认为 UTC-0。                                                                                         |
| campaign                                          | string  | 您希望将此推送消息分配到的[活动代码](/zh/developer/api-reference/api-identifiers/#campaign-code)。                                                                      |
| content*         | string  | 通知内容。详情请参见请求示例。                                                                             |
| transactionId                                     | string  | 唯一的消息标识符，以防止在网络问题的情况下重复消息。在 Pushwoosh 端存储 5 分钟。 |
| link                                              | string  | 用户打开推送消息后要打开的链接。                                                                                    |
| minimize_link                                    | integer | 0 - 不最小化，2 - bit.ly。默认为 2。                                                                                          |
| data                                              | object  | JSON 字符串或 JSON 对象。将作为有效负载中的 "u" 参数传递（转换为 JSON 字符串）。                                 |
| preset                                            | string  | [预设代码](/zh/developer/api-reference/api-identifiers/#preset-code)。                                                                                                                           |
| send_rate                                        | integer | 节流。有效值为每秒 100 到 1000 次推送。                                                                       |
| inbox_date                                       | string  | 指定何时从收件箱中删除消息。                                                                                       |
| inbox_image                                      | string  | 将在收件箱中消息旁边显示的图像的 URL。                                                                            |

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

<TabItem label="400 JSON 语法错误">
```
由于语法错误，无法满足请求。
```
</TabItem>
</Tabs>

更多响应示例：

<Tabs>
<TabItem label="210 - 语法">
```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 - 语义">
```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 - 词法">
```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="困难模式">
您是否应该改用 [`/createMessage`](#createmessage)？
</Aside>


<Tabs>
<TabItem label="示例">
```json title="示例"
{
  "request": {
    "auth": "yxoPUlwqm…………pIyEX4H",    // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "devices_filter": "A(\"XXXXX-XXXXX\") * T(\"City\", EQ, \"Name\")", // 必需。语法在下面解释
    "send_date": "now",                // 可选。YYYY-MM-DD HH:mm 或 'now'
    "ignore_user_timezone": true,      // 可选。
    "timezone": "America/New_York",    // 可选。如果忽略，则 "send_date" 默认为 UTC-0。
                                       //           更多信息 https://php.net/manual/timezones.php。
    "campaign": "CAMPAIGN_CODE",       // 可选。您希望将此推送消息分配到的活动代码。
    "content": {                       // 可选。对象或字符串。对于 Windows，请改用 "wns_content"。
      "en": "English",
      "de": "Deutsch"
    },
    "transactionId": "unique UUID",    // 可选。唯一的消息标识符，以防止在
                                       //           网络问题的情况下重复消息。在 Pushwoosh 端存储 5 分钟。
    "rich_media": "XXXXX-XXXXX",       // 可选。从 Pushwoosh 控制面板的富媒体编辑器页面的 URL 栏中复制富媒体代码。
    "link": "https://google.com",      // 可选。对于深层链接，添加 "minimize_link": 0
    "minimize_link": 0,                // 可选。0 — 不最小化，2 — bitly。默认为 2。
                                       //           自 2019 年 3 月 30 日起，Google URL 缩短器已禁用。
                                       //           请注意，缩短器对调用次数有限制。
    "data": {                          // 可选。JSON 字符串或 JSON 对象。
      "key": "value"                   //           将作为有效负载中的 "u" 参数传递
    },                                 //           （转换为 JSON 字符串）。
    "preset": "XXXXX-XXXXX",           // 可选。来自您控制面板的推送预设代码。
    "send_rate": 100,                  // 可选。节流。有效值为每秒 100 到 1000 次推送。
    "dynamic_content_placeholders": {  // 可选。用于动态内容的占位符，而不是设备标签。
      "firstname": "John",
      "lastname": "Doe"
    },

    // 要通过 API 将消息保存到收件箱，请使用 "inbox_date" 或 "inbox_image"。
    // 当至少使用其中一个参数时，消息将被保存。
    "inbox_image": "Inbox image URL",  // 可选。将在消息旁边显示的图像。
    "inbox_date": "2017-02-02"         // 可选。指定何时从收件箱中删除消息。
                                       //           消息将在指定日期的 00:00:01 UTC 从收件箱中删除，
                                       //           因此前一天是用户可以在其收件箱中看到消息的最后一天。
                                       //           如果未指定，默认删除日期是发送日期的第二天。
  }
}
```
</TabItem>

<TabItem label="特定于平台的参数">
```json title="特定于平台的参数"
{
  "request": {
    "auth": "yxoPUlwqm…………pIyEX4H",        // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "devices_filter": "FILTER CONDITION",
    "send_date": "now",                    // 可选。YYYY-MM-DD HH:mm 或 'now'
    "content": {                           // 可选。对象或字符串。
      "en": "English",                     //           对于 Windows，请改用 "wns_content"。
      "de": "Deutsch"
    },
    "ignore_user_timezone": true,          // 可选。
    "timezone": "America/New_York",        // 可选。如果忽略，则 "send_date" 默认为 UTC-0。
                                           //           更多信息 https://php.net/manual/timezones.php。
    "campaign": "CAMPAIGN_CODE",           // 可选。您希望将此推送消息分配到的活动代码。
    
    // iOS 相关参数
    "ios_badges": 5,                       // 可选。iOS 应用程序角标数。
                                           //           使用 "+n" 或 "-n" 将角标值增加/减少 n。
    "ios_sound": "sound file.wav",         // 可选。应用程序主包中的声音文件名。
                                           //           如果留空，设备在收到推送时
                                           //           不会产生声音。
    "ios_sound_off": true,                 // 可选。启用/禁用由 "ios_sound" 字段设置的声音。
    "ios_ttl": 3600,                       // 可选。生存时间参数 — 消息最大生命周期（秒）。
    "ios_silent": 1,                       // 可选。启用静默通知（忽略 "sound" 和 "content"）。
    "ios_category_id": "1",                // 可选。来自 Pushwoosh 的 iOS8 类别 ID。
    "ios_category_custom": "category",     // 可选。自定义 APNS 类别。
    "ios_root_params": {                   // 可选。aps 字典的根级别参数。
      "aps": {
        "content-available": "0",          // 可选。设置为 "1" 发送静默推送，"0" 发送常规推送。
        "mutable-content": 1               // iOS10+ 媒体附件必需。
      },
      "attachment": "YOUR_ATTACHMENT_URL", // iOS10+ 媒体附件 URL。
      "data": {}                           // 可选。用户提供的数据，最大 4KB
    },
    "apns_trim_content": 1,                // 可选。(0|1) 用省略号修剪超出的内容字符串。
    "ios_title": {                         // 可选。为 iOS 推送通知添加标题。
      "en": "title"
    },
    "ios_subtitle": {                      // 可选。为 iOS 推送通知添加副标题。
      "en": "subTitle"
    },
    "ios_content": {                       // 可选。为 iOS 推送通知添加内容。
      "en": "content"
    },
    
    // Android 相关参数
    "android_root_params": {               // 可选。自定义键值对象。
      "key": "value"                       //           android 有效负载接收者的根级别参数。
    },
    "android_sound": "soundfile",          // 可选。无文件扩展名。如果留空，设备
                                           //           在收到推送时不会产生声音。
    "android_sound_off": true,             // 可选。启用/禁用由 "android_sound" 字段设置的声音
    "android_header": {                    // 可选。对象或字符串。Android 通知标题。
      "en": "header" 
    },
    "android_content": {                   // 可选。对象或字符串。Android 通知内容。
      "en": "content"
    },
    "android_icon": "icon.png",  
    "android_custom_icon": "URL.png",      // 可选。图像文件的完整路径 URL。
    "android_banner": "URL.png",           // 可选。图像文件的完整路径 URL。
    "android_badges": 5,                   // 可选。整数。Android 应用程序图标角标数。
                                           //           使用 "+n" 或 "-n" 将角标值增加/减少 n。
    "android_gcm_ttl": 3600,               // 可选。生存时间参数 — 消息最大生命周期（秒）。
    "android_vibration": 0,                // 可选。Android 高优先级推送的强制振动。
    "android_led": "#rrggbb",              // 可选。LED 十六进制颜色，设备将尽力近似。
    "android_priority": -1,                // 可选。为 Android 8.0 及更高版本的设备设置 "importance" 参数，
                                           //           以及为 Android 7.1 及更低版本的设备设置 "priority" 参数。
                                           //           建立通知渠道或特定通知的中断级别。
                                           //           有效值为 -2, -1, 0, 1, 2。
    "android_delivery_priority": "normal", // 可选。"normal" 或 "high"。启用通知在
                                           //           设备处于省电模式时传递。
    "android_ibc": "#RRGGBB",              // 可选。Lollipop 上的图标背景颜色，#RRGGBB，
                                           //           #AARRGGBB, "red", "black", "yellow" 等。
    "android_silent": 1,                   // 可选。0 或 1。启用静默通知。
                                           //           忽略声音和内容
    
    // Amazon 相关参数
    "adm_root_params": {                   // 可选。自定义键值对象
      "key": "value"
    },
    "adm_sound": "push.mp3",
    "adm_sound_off": true,                 // 可选。启用/禁用由 "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,                       // 可选。生存时间参数 — 消息的最大
                                           //           生命周期（秒）。
    "adm_priority": -1,                    // 可选。Amazon 推送抽屉中推送的优先级，
                                           //           有效值为 -2, -1, 0, 1 和 2。
    
    // Mac OS X 相关参数
    "mac_badges": 3,
    "mac_sound": "sound.caf",
    "mac_sound_off": true,
    "mac_root_params": {
      "content-available": 1
    },
    "mac_ttl": 3600,                       // 可选。生存时间参数 — 消息最大生命周期（秒）。
    "mac_title": {                         // 可选。为推送通知添加标题。
      "en": "title"
    },
    "mac_subtitle": {                      // 可选。为 MacOS 推送通知添加副标题。
      "en": "subtitle"
    },
    "mac_content": {                       // 可选。为 MacOS 推送通知添加内容。
      "en": "content"
    },
    
    // Windows 相关参数
    "wns_content": {                       // 必需。以 MIME 的 base64 编码的通知内容（XML 或原始）
                                           //           以对象或字符串的形式
      "en": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9ImF2YWlsYWJsZSIvPg==",
      "de": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9Im5ld01lc3NhZ2UiLz4="
    },
    "wns_type": "Badge",                   // 'Tile' | 'Toast' | 'Badge' | 'Raw'
    "wns_tag": "myTag",                    // 可选。用于磁贴替换策略。
                                           //           不超过 16 个字符的字母数字字符串。
    "wns_cache": 1,                        // 可选。(1|0) 转换为 X-WNS-Cache-Policy 值。
    "wns_ttl": 600,                        // 可选。通知的过期时间（秒）。
    
    // Safari 相关参数
    "safari_title": {                      // 可选。对象或字符串。通知的标题。
      "en": "title"
    },
    "safari_content": {                    // 可选。对象或字符串。通知的内容。
      "en": "content"
    },
    "safari_action": "Click here",         // 可选。
    "safari_url_args": [                   // 必需。但值可以为空
      "firstArgument",
      "secondArgument"
    ],
    "safari_ttl": 3600,                    // 可选。生存时间参数 — 消息的最大
                                           //           生命周期（秒）。
    
    // Chrome 相关参数
    "chrome_title": {                      // 可选。您可以在此参数中指定消息的标题。
      "en": "title"
    },
    "chrome_content": {                    // 可选。您可以在此参数中指定消息的内容。
      "en": "content"
    },
    "chrome_icon": "icon_URL",             // 可选。图标的完整路径 URL 或扩展资源文件路径
    "chrome_gcm_ttl": 3600,                // 可选。生存时间参数 – 消息最大生命周期（秒）。
    "chrome_duration": 20,                 // 可选。更改 chrome 推送显示时间。设置为 0 以显示推送
                                           //           直到用户与其交互。
    "chrome_image": "image_URL",           // 可选。大图的 URL
    "chrome_root_params": {                // 可选。设置发送到 Chrome 的消息的特定参数。
      "key": "value"
    },
    "chrome_button_text1": "text1",        // 可选。
    "chrome_button_url1": "button1_URL",   // 可选。如果未设置 chrome_button_text1，则忽略。
    "chrome_button_text2": "text2",        // 可选。
    "chrome_button_url2": "button2_url",   // 可选。如果未设置 chrome_button_text2，则忽略。
    
    // Firefox 相关参数
    "firefox_title": {                     // 可选。对象或字符串。您可以在此处指定消息标题。
      "en": "title"
    },
    "firefox_content": {                   // 可选。对象或字符串。您可以在此处指定消息内容。
      "en": "content"
    },
    "firefox_icon": "icon_URL",            // 可选。图标的完整路径 URL 或
                                           //           扩展资源中文件的路径。
    "firefox_root_params": {               // 可选。设置发送到 Firefox 的消息的特定参数。
      "key": "value"
    }
  }
}
```
</TabItem>
</Tabs>

基础非常简单——所有过滤器都在实体的**集合**上执行。

### 集合

集合定义为：

**1.** 订阅特定应用程序的设备 (A)；\
**2.** 匹配指定标签值 (T) 或特定于应用程序的标签值 (AT) 的设备；\


### 语法

让我们根据上面的列表尝试一些示例。

#### 定位应用订阅者

"A" 过滤器定义了一组订阅特定应用程序的设备：

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

其中

* "XXXXX-XXXXX" – Pushwoosh 应用程序代码
* \["iOS", "Android", ...] – 目标平台数组。如果省略，消息将发送到此应用程序可用的所有平台。

#### 按标签值过滤

"T" 过滤器定义了一组分配了指定标签值的设备。

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

定义了“年龄”标签设置为 17、18、19、20 之一的设备集。

<Aside type="caution">
对于**特定于应用程序的标签**，应用 "AT" 过滤器。请确保在 AT 集中指定相应的应用程序代码作为第一个值：

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


### 标签类型和操作符

理解标签在应用程序之间共享非常重要，它为细分和过滤目标用户提供了一个非常强大的工具，而无需将自己绑定到特定的应用程序。

标签可以是三种不同类型之一：**字符串、整数、列表**。标签类型定义了您可以对特定标签使用的操作符。

#### 字符串标签

**适用操作符：**

* **EQ** – 定位具有指定标签值的设备
* **IN** – 定位具有任何指定标签值的设备
* **NOTIN** – 定位没有指定标签值的设备
* **NOTEQ** – 定位标签值不等于指定值的设备
* **NOTSET** – 定位指定标签没有值的设备
* **ANY** – 定位指定标签设置了任何值的设备

示例：

`T (\"Age\", EQ, 30)` – 过滤 30 岁的用户

`T (\"favorite_color\", IN, [\"red\",\"green\",\"blue\"])` – 过滤选择红色、绿色或蓝色作为他们最喜欢颜色的用户。

`T (\"Name", NOTSET, \"\")` – 定位 Name 标签没有值的设备。

您可以对字符串标签使用数值，但这些值将被转换为字符串。

#### 整数标签

**适用操作符：**

* **GTE** – 大于或等于指定值
* **LTE**– 小于或等于指定值
* **EQ** – 等于指定值
* **BETWEEN** – 在指定的最小值和最大值之间
* **IN** – 任何指定的值
* **NOTIN** – 没有指定的值分配给设备
* **NOTEQ** – 标签值不等于指定值的设备
* **NOTSET** – 指定标签没有值的设备
* **ANY** – 指定标签设置了任何值的设备

示例：

`T (\"Level\", EQ, 14)` – 仅过滤 14 级的用户。

`T (\"Level\", BETWEEN, [1,5)` – 过滤 1、2、3、4 和 5 级的用户。

`T (\"Level", GTE, 29)` – 定位至少达到 29 级的用户。

#### 列表标签

**适用操作符：**

* **IN** – 具有任何指定标签值的设备

示例：`T("Category", IN, ["breaking_news","business","politics"])`

#### 日期标签

**适用操作符：**

* **GTE** – 大于或等于指定值
* **LTE**– 小于或等于指定值
* **EQ** – 等于指定值
* **BETWEEN** – 在指定的最小值和最大值之间
* **NOTEQ** – 标签值不等于指定值的设备
* **NOTSET** – 指定标签没有值的设备
* **ANY** – 指定标签设置了任何值的设备

示例：

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

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

### 操作

* “+” – 连接两个集合（等于 OR）
* “\*” – 两个集合的交集（等于 AND）
* “\” – 从一个集合中减去另一个集合（等于 NOT）

所有操作都是左结合的。"+" 和 "*" 具有相同的优先级。"\" 具有更高的优先级。您可以使用括号来定义计算的优先级。

请注意，“\” 操作不是可交换的。`A("12345-12345") \ A("67890-67890")` 与 `A("67890-67890") \ A("12345-12345")` 不同。


<Aside type="note">
您不能在 /createTargetedMessage 请求中使用以下任何与定位相关的参数：

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

支持 [`/createMessage`](#createmessage) 中列出的所有其他参数。
</Aside>

<Aside type="caution" title="重要">
`/createTargetedMessage` 方法存在一个已知问题：如果您在 "devices_filter" 部分未指定任何应用程序，Pushwoosh 不会在推送详情中显示任何应用程序。
</Aside>

## getPushHistory <Badge text="已弃用" variant="caution" size="small" />

<Aside type="note">
请改用 [**/messages:list**](/zh/developer/api-reference/statistics-api/message-statistics-api/#messageslist) 来检索消息历史记录和更详细的数据。
</Aside>

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

获取带有推送详情的消息历史记录。

#### 请求正文

| 名称                                   | 类型    | 描述                                                                                                          |
| -------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------- |
| auth* | string  | 来自 Pushwoosh 控制面板的 [API 访问令牌](/zh/developer/api-reference/api-identifiers/#api-access-token)。                                                                       |
| limitMessages                          | integer | 限制响应中的消息数量。可能的值从 10 到 1000。                                        |
| source                                 | string  | 推送历史记录来源。可以为 null 或："CP", "API", "GeoZone", "RSS", "AutoPush", "A/B Test"。       |
| searchBy                               | string  | 可能的搜索值。可以为 null 或："notificationID", "notificationCode", "applicationCode", "campaignCode"。 |
| value                                  | string  | 根据 "searchBy" 字段设置的搜索值。                                                                  |
| lastNotificationID                     | string  | 用于分页。上一次 /getPushHistory 调用的最后一个 messageId。详情见下文。                       |

<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="示例"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "source": null,                  // 可选。可能的值为 null, "CP", "API", "GeoZone",
                                     //           "RSS", "AutoPush", "A/B Test"
    "searchBy": "applicationCode",   // 可选。可能的值为 "", "notificationID",
                                     //           "notificationCode", "applicationCode", "campaignCode"
    "value": "C8717-703F2",          // 可选。根据 "searchBy" 字段设置的搜索值。
    "lastNotificationID": 0,         // 可选。用于分页。上一次 /getPushHistory 调用的最后一个 messageId。
                                     //           详情见下文。
    "limitMessages": 1000            // 可选。可能的值从 10 到 1000。
  }
}
```

此方法将返回账户中按消息 ID 排序的 1000 条消息。要获取第二页，请在 **lastNotificationId** 参数中指定上一个响应的最后一条消息 ID。

### 响应数据类型

```
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`

删除一条预定的消息。

#### 请求正文

| 名称                                      | 类型   | 描述                                           |
| ----------------------------------------- | ------ | ----------------------------------------------------- |
| auth*    | string | 来自 Pushwoosh 控制面板的 [API 访问令牌](/zh/developer/api-reference/api-identifiers/#api-access-token)。        |
| message* | string | 在 `/createMessage` 响应中获得的[消息代码](/zh/developer/api-reference/api-identifiers/#message-code)。 |

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

<Aside type="note">
此方法仅允许用于处于待处理、等待或处理中状态的消息。
</Aside>

```json title="示例"
{
  "request":{
    "auth": "yxoPUlwqm…………pIyEX4H",  // 必需。来自 Pushwoosh 控制面板的 API 访问令牌
    "message": "xxxx-xxxxxxx-xxxxxx" // 必需。在 /createMessage 响应中获得的消息代码
  }
}
```

**状态码：**

| HTTP 状态码 | status_code | 描述                                         |
| ---------------- | ------------ | --------------------------------------------------- |
| 200              | 200          | 消息取消成功                       |
| 200              | 210          | 参数错误。更多信息请参见 status_message。  |
| 400              | N/A          | 请求字符串格式错误                            |
| 500              | 500          | 内部错误                                      |