# 메시지 API

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

<Aside type="caution" title="/createMessage 및 /createTargetedMessage는 더 이상 사용되지 않습니다">
새로운 통합은 통합된 [**메시징 API v2**](/ko/developer/api-reference/messaging-api-v2/)를 사용해야 합니다. 이 하나의 엔드포인트가 전체 `/create*Message` 제품군을 대체합니다. 필드별 매핑은 [마이그레이션 가이드](/ko/developer/api-reference/messaging-api-v2/migration-from-v1/)를 참조하세요.

아래의 레거시 메서드는 계속해서 완전히 작동합니다. `/deleteMessage`, `/cancelMessage`, `/getMessageDetails`는 더 이상 사용되지 않으므로 v1 또는 v2에서 생성된 메시지에 대해 평소와 같이 사용하세요.
</Aside>

<Aside type="note">
시작하려면 [/createMessage 요청 매개변수](/ko/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 Control Panel의 [API 액세스 토큰](/ko/developer/api-reference/api-identifiers/#api-access-token)입니다.                             |
| application*   | string | [Pushwoosh 애플리케이션 코드](/ko/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 템플릿 가이드](/ko/developer/guides/personalization/liquid-templates/)를 참조하세요.
</Aside>

### 요청 예시

```json title="예시"
{
  "request": {
    "application": "XXXXX-XXXXX",       // required. Pushwoosh application code.
    "auth": "yxoPUlwqm…………pIyEX4H",     // required. API access token from Pushwoosh Control Panel.
    "notifications": [{
      "send_date": "now",               // optional. YYYY-MM-DD HH:mm OR 'now'
      "content": {                      // optional. object OR string.
        "en": "English",                //           Use "wns_content" instead for Windows.
        "fr": "French"
      },
      "title": {                        // optional. object OR string. 
        "en": "Title",                  //           Ignored if platform-specific titles are specified
        "fr": "Titre"                   //           'ios_title', 'android_header', etc.
      },                                //           see the platform-specific parameters examples below.
      "subtitle":{                      // optional. object OR string. 
        "en": "Subtitle",               //           Ignored if platform-specific titles are specified
        "fr": "Sous-titre"              //           'ios_subtitle', etc.
      },                                //           see the platform-specific parameters examples below.
      "ignore_user_timezone": true,     // optional.
      "timezone": "America/New_York",   // optional. If ignored UTC-0 is default for "send_date".
                                        //           See https://php.net/manual/timezones.php for
                                        //           supported timezones.
      "campaign": "CAMPAIGN_CODE",      // optional. Campaign code to which you want to
                                        //           assign this push message.
      "geozone": {                      // optional. Send to Geozone
        "lat": 22.22,
        "lng": 33.33,
        "range": 110
      },
      "rich_media": "XXXXX-XXXXX",      // optional. Copy the Rich Media code from the URL bar of
                                        //           the Rich Media editor page in Pushwoosh Control Panel.
      "link": "https://google.com",     // optional. For deeplinks add "minimize_link": 0
      "minimize_link": 0,               // optional. 0 — do not minimize, 2 — bitly. Default = 2.
                                        //           Please note that shorteners have restrictions
                                        //           on a number of calls.
      "data": {                         // optional. JSON string or JSON object, will be passed as
        "key": "value"                  //           "u" parameter in the payload (converted to JSON string).
      },
      "transactionId": "unique UUID",   // optional. Unique message identifier to prevent duplicating
                                        //           in case of network problems. Stored on the side of
                                        //           Pushwoosh for 5 minutes. 
      "platforms": [                    // optional. 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",          // optional. Push Preset Code from your Control Panel.
                                        //           If specific params are sent in the request,
                                        //           they override preset's params.
      "send_rate": 100,                 // optional. Throttling. Valid values are from 100 to 1000 pushes/second.
      "send_rate_avoid": true,          // optional. If set to true, throttling limit will not be applied to
                                        //           this specific push notification.
      // Templating related, please refer to the Template Engine guide to learn more
      "template_bindings": {            // optional.
        "TemplatePlaceholder": "Value"
      },
      "dynamic_content_placeholders": { // optional. Placeholders for dynamic content instead of device tags.
        "firstname": "John",
        "lastname": "Doe"
      },
      "message_type": "marketing",       // optional. "marketing" or "transactional".
                                         // If omitted, users with PW_ControlGroup: true will not receive the message.

      // Frequency capping params. Ensure that Global frequency capping is configured in the Control Panel.
      // Frequency capping does not apply to transactional messages.
      // In all other cases, including omitted "message_type", frequency capping applies.
      "capping_days": 30,               // optional. Amount of days for frequency capping (max 30 days)
      "capping_count": 10,              // optional. The max number of pushes that can be sent from a
                                        //           specific app to a particular device within a 'capping_days'
                                        //           period. In case the message created exceeds the
                                        //           'capping_count' limit for a device, it won't
                                        //           be sent to that device.
      "capping_exclude": true,          // optional. If set to true, this push notification will not
                                        //           be counted towards the capping for future pushes.
      "capping_avoid": true,            // optional. If set to true, capping will not be applied to
                                        //           this specific push notification.
        
      // To save the message to the Inbox via API, use "inbox_date" or "inbox_image".
      // The message is saved when at least one of these parameters is used.
      "inbox_date": "2017-02-02",       // optional. Specify when to remove a message from the Inbox.
                                        //           Message will be removed from Inbox at 00:00:01 UTC
                                        //           of the date specified, so the previous date is the
                                        //           last day a user can see the message in their Inbox.
                                        //           If not specified, the default removal date is the
                                        //           next day after the send date.
      "inbox_image": "Inbox image URL", // optional. The image to be shown near the message. 
	  "inbox_days": 5,                  // optional. Specify when to remove a message from the
                                        //           Inbox(lifetime of an inbox message in days). 
                                        //           Can be used instead of the "inbox_date" parameter.
                                        //           Up to 30 days.
      
      "devices": [                      // optional. Specify tokens or hwids to send targeted push 
          "hwid_XXXX"                   //           notifications. Not more than 1000 tokens/hwids in
      ],                                //           an array. If set, the message will only be sent to
                                        //           the devices on the list. Application Group for devices
                                        //           list is not allowed. iOS push tokens can only be lower case.
      "to": [                           // optional. For email, SMS, and similar channels. List of recipients
          "email_1", "email_2"          //           (e.g. email addresses, phone numbers). Max 1000 items.
      ],                                //           For push, use "devices" instead.
      // User-centric push notifications
      "users": [                        // optional. If set, message will only be delivered to the
          "user_XXXX"                   //           specified user ID's (set via /registerUser call). 
      ],                                //           If specified together with devices or to,
                                        //           the latter will be ignored. Not more than 1000 user
                                        //           ID's in an array. Application Group for users list
                                        //           is not allowed.

      // Filters and conditions
      "filter": "FILTER_NAME",          // optional.
      "conditions": [                   // optional. See the remark below.
        ["Country", "EQ", "fr"],
        ["Language", "EQ", "en"]
      ],    
      "conditions_operator": "AND"      // optional. Logical operator for conditions arrays.
                                        //           Possible values: AND | OR. AND is default.
    }]
  }
}
```

### VoIP 알림 요청 예시

Pushwoosh는 iOS 및 Android용 VoIP 스타일 통화 알림을 지원합니다. \
아래에서 각 플랫폼에 대한 API `createMessage` 요청 예시를 찾을 수 있습니다.

#### iOS

```json title="예시"
{
  "request": {
    "application": "XXXXX-XXXXX",     // required. Pushwoosh application code.
    "auth": "yxoPUlwqm…………pIyEX4H",   // required. API access token from Pushwoosh Control Panel.
    "notifications": [
      {
        "voip_push": true,            // required. Parameter is required to send out a VoIP push notification.
        "ios_root_params": {
          "aps": {
            "mutable-content": 1      // required for iOS10+ Media attachments.
          },
          "callerName": "CallerName", // optional. Caller name. If not specified, "unknown caller" is shown.
          "video": true,              // optional. Indicates whether video calls are supported.
          "supportsHolding": true,    // optional. Indicates whether call holding functionality is supported.
          "supportsDTMF": false,      // optional. Controls Dual-Tone Multi-Frequency signal support.
          "callId": "42",             // optional. The unique identifier of the call to cancel.
          "cancelCall": true          // optional. Set to "true" to cancel the call with the specified "callId".
        }
      }
    ]
  }
}
```

#### Android

```json title="예시"
{
  "request": {
    "application": "XXXXX-XXXXX",   // required. Pushwoosh application code.
    "auth": "yxoPUlwqm…………pIyEX4H", // required. API access token from Pushwoosh Control Panel.
    "notifications": [
      {
      "voip_push": true,            // required. Parameter is required to send out a VoIP push notification.
      "android_root_params": {
        "callerName": "callerName", // optional. Caller name. If not specified, "unknown caller" is shown.
        "video": true,              // optional. Indicates whether video calls are supported.
        "callId": 42,               // optional. The unique identifier of the call to cancel.
        "cancelCall": true          // optional. Set to "true" to cancel the call with the specified "callId".
        }
      }
    ]
  }
}

```


### 플랫폼별 매개변수

#### iOS 매개변수

```json title="예시"
{
  "request": {
    "application": "12345-67891",         // required. Pushwoosh application code
    "auth": "yxoPUlwqm…………pIyEX4H",       // required. API access token from Pushwoosh Control Panel
    "notifications": [{
      "ios_title": {                      // optional. Object OR string. Adds iOS specific title for push notification.
        "en": "title"
      },
      "ios_subtitle": {                   // optional. Object OR string. Adds iOS specific subtitle for push notification.
        "en": "subtitle"
      },
      "ios_content": {                    // optional. Object OR string. Adds iOS specific content for push notification.
        "en": "content"
      },
      "ios_badges": 5,                    // optional. iOS application badge number.
                                          //           Use "+n" or "-n" to increment/decrement the badge value by n.
      "ios_sound": "sound file.wav",      // optional. Sound file name in the main bundle of application.
                                          //           If left empty, the device will produce a default system sound.
      "ios_sound_off": true,              // optional. Enable/disable sound set by "ios_sound" field.
      "ios_ttl": 3600,                    // optional. Time to live parameter - maximum message lifespan in seconds.
      "ios_silent": 1,                    // optional. Enables silent notifications (ignore "sound" and "content").
      "ios_category_id": "1",             // optional. iOS8 category ID from Pushwoosh.
      "ios_root_params": {                // optional. Root level parameters to the aps dictionary.
        "aps": {
          "content-available": "0",       // optional. Set "1" to send a silent push and "0" for regular push.
          "mutable-content": 1            // required for iOS10+ Media attachments.
        },
        "callerName": "CallerName",       // optional VoIP parameter. Caller name. If not specified, "unknown caller" is shown.
        "video": true,                    // optional VoIP parameter. Indicates whether video calls are supported.
        "supportsHolding": true,          // optional VoIP parameter. Indicates whether call holding functionality is supported.
        "supportsDTMF": false,            // optional VoIP parameter. Controls Dual-Tone Multi-Frequency signal support.
        "data": {}                        // optional User supplied data, max of 4KB
      },
      "ios_attachment": "URL",            // optional. Insert media content in notification.
      "ios_thread_id": "some thread id",  // optional. Identifier to group related notifications.
                                          //           Messages with the same thread ID will be grouped
                                          //           on the lock screen and in the Notification Center.
      "ios_critical": true,               // optional. Marks iOS notification as a critical alert
                                          //           playing sound even if a device is muted or
                                          //           Do Not Disturb mode is on.
      "ios_category_custom": "category",  // optional. Custom APNS category.
      "ios_interruption_level": "active", // optional. One of "passive", "active", "time-sensitive",
                                          //           "critical". Indicates the importance and
                                          //           delivery timing of a notification. Refer to the
                                          //           One-time push guide for details.
      "apns_collapse_id": "promo",        // optional. APNs collapse identifier. Notifications with the same
                                          //           apns_collapse_id replace each other on the device.
      "apns_trim_content": 1              // optional. (0|1) Trims the exceeding content strings with ellipsis.
    }]
  }
}
```

#### Android 매개변수

```json title="예시"
{
  "request": {
    "application": "12345-67891",            // required. Pushwoosh application code
    "auth": "yxoPUlwqm…………pIyEX4H",          // required. API access token from Pushwoosh Control Panel
    "notifications": [{
      "android_header": {                    // optional. Android notification header.
        "en": "header"
      },
      "android_content": {                   // optional. Android notification content.
        "en": "content"
      },
      "android_root_params": {               // optional. Custom key-value object.
        "key": "value",                      //           Root level parameters for the android payload recipients.
        "CancelID": 12345678,                // optional. Cancels the push notification with the
        "voip": true,                        // required VoIP parameter. Parameter is required to send out VoIP push notifications.
        "callerName": "callerName",          // optional VoIP parameter. Caller name. If not specified, "unknown caller" is shown.
        "video": true,                       // optional VoIP parameter. Indicates whether video calls are supported.
      },                                     //           specified Message ID (get the ID from the Message History)
      "android_sound": "soundfile",          // optional. No file extension. If left empty,
                                             //           the device will produce a default system sound.
      "android_sound_off": true,             // optional. Enable/disable sound set by "android_sound" field
      "android_icon": "icon.png",            // optional.
      "android_custom_icon": "URL.png",      // optional. Full URL to the image file.
      "android_banner": "URL.png",           // optional. Full URL to the image file.
      "android_badges": 5,                   // optional. Android application icon badge number.
                                             //           Use "+n" or "-n" to increment/decrement the badge value by n.
      "android_gcm_ttl": 3600,               // optional. Time to live parameter — maximum message lifespan in seconds.
      "android_vibration": 0,                // optional. Android force-vibration for high-priority pushes.
      "android_led": "#rrggbb",              // optional. LED hex color, device will do its best approximation.
      "android_priority": -1,                // optional. Sets the "importance" parameter for devices with
                                             //           Android 8.0 and higher, as well as the "priority" parameter
                                             //           for devices with Android 7.1 and lower. Establishes the
                                             //           interruption level of a notification channel or a particular
                                             //           notification. Valid values are -2, -1, 0, 1, 2.
      "android_delivery_priority": "normal", // optional. "normal" or "high".
                                             //           Enables notification’s delivery when the
                                             //           device is in the power saving mode.
      "android_ibc": "#RRGGBB",              // optional. icon background color on Lollipop, #RRGGBB,
                                             //           #AARRGGBB, "red", "black", "yellow", etc.
      "android_silent": 1,                   // optional. 0 or 1. Enable silent notification.
                                             //           Ignore sound and content
      "android_group_id": "123",             // optional. Identifier to group related notifications. Messages with
                                             //           the same thread ID will be grouped in
                                             //           the Notification Center.
      "android_collapse_key": "promo"        // optional. FCM collapse key. Notifications with the same
                                             //           collapse key replace each other while the device is offline.
    }]
  }
}
```

**Huawei 매개변수**

```json title="Huawei"
{
  "request": {
    "application": "12345-67891",                   // required. Pushwoosh application code
    "auth": "yxoPUlwqm…………pIyEX4H",                 // required. API access token from Pushwoosh Control Panel
    "notifications": [{
      "huawei_android_header": {                    // optional. Object OR string. Notification title
        "en": "header"
      },
      "huawei_android_content": {                   // optional. Object OR string. Notification content
        "en": "content"
      },
      "huawei_android_badges": true,                // optional.
      "huawei_android_silent": 0,                   // optional. 0 or 1. Enable silent notification.
                                                    //           Ignore sound and content
      "huawei_android_icon": "URL.png",             // optional.
      "huawei_android_led": "#FF0011",              // optional. LED hex color, device will do its best approximation
      "huawei_android_vibration": 1,                // optional. Huawei force-vibration for high-priority pushes
      "huawei_android_sound": "sound.wav",          // optional. If left empty, the device will produce
                                                    //           a default system sound
      "huawei_android_sound_off": true,             // optional. Enable/disable sound set by
                                                    //           "huawei_android_sound" field
      "huawei_android_custom_icon": "URL.png",      // optional
      "huawei_android_gcm_ttl": 2400,               // optional. Time to live parameter - maximum
                                                    //           message lifespan in seconds
      "huawei_android_banner": "URL.png",           // optional. Full path URL to the image file
      "huawei_android_root_params": {               // optional. Custom key-value object.
        "key": "value"                              //           Root-level parameters for Huawei payload recipients.
      },
      "huawei_android_priority": 0,                 // optional. Valid values: -2, -1, 0, 1, 2
      "huawei_android_ibc": "#0011AA",              // optional. Icon background color on Lollipop
      "huawei_android_lockscreen": 1,               // optional
      "huawei_android_delivery_priority": "normal", // optional. "normal" or "high". Enables notification
                                                    //           delivery in power saving mode
      "huawei_android_group_id": "group_id"         // optional. Identifier to group related notifications
    }]
  }
}
```

#### Safari 매개변수

```json title="Safari"
{
  "request": {
    "application": "12345-67891",    // required. Pushwoosh application code
    "auth": "yxoPUlwqm…………pIyEX4H",  // required. API access token from Pushwoosh Control Panel
    "notifications": [{
      "safari_url_args": [           // required, but the value may be empty
        "firstArgument",
        "secondArgument"
      ],
      "safari_title": {              // optional. Object OR string. Title of the notification.
        "en": "content"
      },
      "safari_content": {            // optional. Object OR string. Content of the notification.
        "en": "content"
      },
      "safari_action": "Click here", // optional.
      "safari_ttl": 3600             // optional. Time to live parameter — the maximum
                                     //           lifespan of a message in seconds.
    }]
  }
}


```

#### Chrome 매개변수

```json title="Chrome"
{
  "request": {
    "application": "12345-67891",          // required. Pushwoosh application code
    "auth": "yxoPUlwqm…………pIyEX4H",        // required. API access token from Pushwoosh Control Panel
    "notifications": [{
      "chrome_title": {                    // optional. Object OR string. You can specify the header 
        "en": "title"                      //           of the message in this parameter.
      },
      "chrome_content": {                  // optional. Object OR string. You can specify the content 
        "en": "content"                    //           of the message in this parameter.
      },
      "chrome_icon": "URL.png",            // optional. Full URL to the icon or extension resources file path
      "chrome_gcm_ttl": 3600,              // optional. Time to live parameter – maximum message lifespan in seconds.
      "chrome_duration": 20,               // optional. max 50 seconds. Changes chrome push display time.
                                           //           Set to 0 to display push until user interacts with it.
      "chrome_image": "image_URL",         // optional. URL to large image. 
      "chrome_root_params": {              // optional. Set parameters specific to messages sent to Chrome.
        "key": "value"
      }, 
      "chrome_button_text1": "text1",      // optional
      "chrome_button_url1": "button1_URL", // optional. Ignored if chrome_button_text1 is not set.
      "chrome_button_text2": "text2",      // optional
      "chrome_button_url2": "button2_url"  // optional. Ignored if chrome_button_text2 is not set. 
    }]
  }
}
```

#### Firefox 매개변수

```json title="Firefox"
{
  "request": {
    "application": "12345-67891",   // required. Pushwoosh application code
    "auth": "yxoPUlwqm…………pIyEX4H", // required. API access token from Pushwoosh Control Panel
    "notifications": [{
      "firefox_title": {            // optional. Object OR string. You can specify message header here.
        "en": "title"
      },
      "firefox_content": {          // optional. Object OR string. You can specify message content here.
        "en": "content"
      },
      "firefox_icon": "URL.png",    // optional. Full path URL to the icon or path to the
                                    //           file in extension resources.
      "firefox_root_params": {      // optional. Set parameters specific to messages sent to Firefox.
        "key": "value"
      } 
    }]
  }
}
```

#### Amazon 매개변수

```json title="Amazon"
{
  "request": {
    "application": "12345-67891",   // required. Pushwoosh application code
    "auth": "yxoPUlwqm…………pIyEX4H", // required. API access token from Pushwoosh Control Panel
    "notifications": [{
      "adm_header": {               // optional. Object OR string. You can specify message header here.
        "en": "header"
      },
      "adm_content": {              // optional. Object OR string. You can specify message content here.
        "en": "content"
      },
      "adm_root_params": {          // optional. Custom key-value object
        "key": "value"
      },
      "adm_sound": "push.mp3",      // optional.
      "adm_sound_off": true,        // optional. Enable/disable sound set by "adm_sound" field
      "adm_icon": "icon.png",       // optional. Full URL to the icon.
      "adm_custom_icon": "URL.png", // optional.
      "adm_banner": "URL.png",      // optional.
      "adm_ttl": 3600,              // optional. Time to live parameter — the maximum message
                                    //           lifespan in seconds.
      "adm_priority": -1            // optional. Priority of the push in Amazon push drawer,
                                    //           valid values are -2, -1, 0, 1 and 2.
    }]
  }
}
```

#### Mac OS X 매개변수

```json title="Mac OS X"
{
  "request": {
    "application": "12345-67891",   // required. Pushwoosh application code
    "auth": "yxoPUlwqm…………pIyEX4H", // required. API access token from Pushwoosh Control Panel
    "notifications": [{
      "mac_title": {                // optional. Object OR string. Adds Title for push notification.
        "en": "title"
      },
      "mac_subtitle": {             // optional. Adds subtitle for push notification.
        "en": "subtitle"
      },
      "mac_content": {              // optional. Adds content for push notification.
        "en": "content"
      },
      "mac_badges": 3,              // optional.
      "mac_sound": "sound.caf",     // optional.
      "mac_sound_off": true,        // optional. Enable/disable sound set by "mac_sound" field
      "mac_root_params": {          // optional.
        "content-available": 1
      },
      "mac_ttl": 3600               // optional. Time to live parameter — maximum message lifespan in seconds.
    }]
  }
}
```

#### Windows 매개변수

```json title="Windows"
{
  "request": {
    "application": "12345-67891",   // required. Pushwoosh application code
    "auth": "yxoPUlwqm…………pIyEX4H", // required. API access token from Pushwoosh Control Panel
    "notifications": [{
      "wns_content": {              // required. Content (XML or raw) of notification encoded in MIME's base64
                                    //           in form of Object OR String
        "en": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9ImF2YWlsYWJsZSIvPg==",
        "de": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9Im5ld01lc3NhZ2UiLz4="
      },
      "wns_type": "Badge",          // optional. 'Tile' | 'Toast' | 'Badge' | 'Raw'
      "wns_tag": "myTag",           // optional. Used in Tile replacement policy.
                                    //           An alphanumeric string of no more than 16 characters.
      "wns_cache": 1,               // optional. (1|0) Translates into X-WNS-Cache-Policy value.
      "wns_ttl": 600                // optional. Expiration time for notification in seconds.
    }]
  }
}
```
<Aside>
빠른 시작! 이 멋진 타사 라이브러리를 확인해 보세요!

Python 라이브러리 **by 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`](/ko/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 메시징 추적

로드 밸런싱을 위해, _저희는 "devices" 매개변수가 10개 미만의 기기를 포함하는 배열로 API를 통해 전송된 메시지를 저장하지 않습니다_. 이로 인해 이러한 메시지는 메시지 기록에 표시되지 않습니다.

테스트 단계에서 푸시 보고서를 보려면 **API 메시징 추적**을 사용하세요. 이 옵션을 **ON**으로 설정하면 _1시간 동안 이 제한을 재정의하고 이러한 푸시를 메시지 기록에 저장_할 수 있습니다. API 메시징 추적은 1시간 후에 자동으로 **OFF**됩니다.

API 메시징 추적은 [메시지 기록](/ko/product/statistics-and-analytics/message-history/) 페이지의 오른쪽 상단에 있는 **API 메시징 추적 시작**을 클릭하여 활성화할 수 있습니다.

### 태그 조건

각 태그 조건은 `[tagName, operator, operand]`와 같은 배열입니다. 여기서

* tagName: 태그 이름
* operator: "EQ" | "IN" | "NOTEQ" | "NOTIN" | "LTE" | "GTE" | "BETWEEN" | "NOTSET" | "ANY"
* operand: string | integer | array | date

#### 연산자 설명

* 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"` (문자열)
* 유닉스 타임스탬프 `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 Control Panel의 [API 액세스 토큰](/ko/developer/api-reference/api-identifiers/#api-access-token)입니다.   |
| message* | string | `/createMessage` 요청에서 얻은 [메시지 코드](/ko/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",  // required. API access token from Pushwoosh Control Panel
    "message": "xxxx-xxxxxxx-xxxxxx" // required. Message code obtained in /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 Control Panel의 [API 액세스 토큰](/ko/developer/api-reference/api-identifiers/#api-access-token)입니다. |
| message* | string | [메시지 코드](/ko/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",  // required. API access token from Pushwoosh Control Panel
    "message": "xxxx-xxxxxxx-xxxxxx" // required. message code or message ID
  }
}
```

## createTargetedMessage <Badge text="더 이상 사용되지 않음" variant="caution" size="small" />

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

새로운 대상 푸시 알림을 생성합니다.

#### 요청 본문

| 이름                                              | 유형    | 설명                                                                                                                            |
| ------------------------------------------------- | ------- |----------------------------------------------------------------------------------------------------------------------------------------|
| auth*            | string  | Pushwoosh Control Panel의 [API 액세스 토큰](/ko/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  | 이 푸시 메시지를 할당하려는 [캠페인 코드](/ko/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  | [프리셋 코드](/ko/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",    // required. API access token from Pushwoosh Control Panel
    "devices_filter": "A(\"XXXXX-XXXXX\") * T(\"City\", EQ, \"Name\")", // required. Syntax explained below
    "send_date": "now",                // optional. YYYY-MM-DD HH:mm OR 'now'
    "ignore_user_timezone": true,      // optional.
    "timezone": "America/New_York",    // optional. If ignored UTC-0 is default for "send_date".
                                       //           More info https://php.net/manual/timezones.php.
    "campaign": "CAMPAIGN_CODE",       // optional. Campaign code to which you want to assign this push message.
    "content": {                       // optional. Object OR string. Use "wns_content" instead for Windows.
      "en": "English",
      "de": "Deutsch"
    },
    "transactionId": "unique UUID",    // optional. Unique message identifier to prevent duplicating messages
                                       //           in case of network problems. Stored on the side of
                                       //           Pushwoosh for 5 minutes.
    "rich_media": "XXXXX-XXXXX",       // optional. Copy the Rich Media code from the URL bar of the
                                       //           Rich Media editor page in Pushwoosh Control Panel. 
    "link": "https://google.com",      // optional. For deeplinks add "minimize_link": 0
    "minimize_link": 0,                // optional. 0 — do not minimize, 2 — bitly. Default = 2.
                                       //           Google URL shortener is disabled since March 30, 2019.
                                       //           Please note that shorteners have restrictions
                                       //           on a number of calls.
    "data": {                          // optional. JSON string or JSON object.
      "key": "value"                   //           Will be passed as "u" parameter in the payload
    },                                 //           (converted to JSON string).
    "preset": "XXXXX-XXXXX",           // optional. Push Preset Code from your Control Panel.
    "send_rate": 100,                  // optional. Throttling. Valid values are from 100 to 1000 pushes/second.
    "dynamic_content_placeholders": {  // optional. Placeholders for dynamic content instead of device tags.
      "firstname": "John",
      "lastname": "Doe"
    },

    // To save the message to the Inbox via API, use "inbox_date" or "inbox_image".
    // The message is saved when at least one of these parameters is used. 
    "inbox_image": "Inbox image URL",  // optional. The image to be shown near the message.
    "inbox_date": "2017-02-02"         // optional. Specify when to remove a message from the Inbox.
                                       //           Message will be removed from Inbox at 00:00:01 UTC of
                                       //           the date specified, so the previous date is the last
                                       //           day a user can see the message in their Inbox.
                                       //           If not specified, the default removal date is the next
                                       //           day after the send date.
  }
}
```
</TabItem>

<TabItem label="플랫폼별 매개변수">
```json title="플랫폼별 매개변수"
{
  "request": {
    "auth": "yxoPUlwqm…………pIyEX4H",        // required. API access token from Pushwoosh Control Panel
    "devices_filter": "FILTER CONDITION",
    "send_date": "now",                    // optional. YYYY-MM-DD HH:mm OR 'now'
    "content": {                           // optional. Object OR string.
      "en": "English",                     //           Use "wns_content" instead for Windows.
      "de": "Deutsch"
    },
    "ignore_user_timezone": true,          // optional.
    "timezone": "America/New_York",        // optional. If ignored UTC-0 is default for "send_date".
                                           //           More info https://php.net/manual/timezones.php.
    "campaign": "CAMPAIGN_CODE",           // optional. Campaign code to which you want to assign this push message.
    
    // iOS related parameters
    "ios_badges": 5,                       // optional. iOS application badge number.
                                           //           Use "+n" or "-n" to increment/decrement the badge value by n.
    "ios_sound": "sound file.wav",         // optional. Sound file name in the main bundle of application.
                                           //           If left empty, the device will produce no sound
                                           //           upon receiving a push.
    "ios_sound_off": true,                 // optional. Enable/disable sound set by "ios_sound" field.
    "ios_ttl": 3600,                       // optional. Time to live parameter — maximum message lifespan in seconds.
    "ios_silent": 1,                       // optional. Enables silent notifications (ignore "sound" and "content").
    "ios_category_id": "1",                // optional. iOS8 category ID from Pushwoosh.
    "ios_category_custom": "category",     // optional. Custom APNS category.
    "ios_root_params": {                   // optional. Root level parameters to the aps dictionary.
      "aps": {
        "content-available": "0",          // optional. Set "1" to send a silent push and "0" for regular push.
        "mutable-content": 1               // required for iOS10+ Media attachments.
      },
      "attachment": "YOUR_ATTACHMENT_URL", // iOS10+ media attachment URL.
      "data": {}                           // optional. User supplied data, max of 4KB
    },
    "apns_trim_content": 1,                // optional. (0|1) Trims the exceeding content strings with ellipsis.
    "ios_title": {                         // optional. Adds title for iOS push notification.
      "en": "title"
    },
    "ios_subtitle": {                      // optional. Adds subtitle for iOS push notification.
      "en": "subTitle"
    },
    "ios_content": {                       // optional. Adds content for iOS push notification.
      "en": "content"
    },
    
    // Android related parameters
    "android_root_params": {               // optional. Custom key-value object.
      "key": "value"                       //           Root level parameters for the android payload recipients.
    },
    "android_sound": "soundfile",          // optional. No file extension. If left empty, the device
                                           //           will produce no sound upon receiving a push.
    "android_sound_off": true,             // optional. Enable/disable sound set by "android_sound" field
    "android_header": {                    // optional. Object OR string. Android notification header.
      "en": "header" 
    },
    "android_content": {                   // optional. Object OR string. Android notification content.
      "en": "content"
    },
    "android_icon": "icon.png",  
    "android_custom_icon": "URL.png",      // optional. Full path URL to the image file.
    "android_banner": "URL.png",           // optional. Full path URL to the image file.
    "android_badges": 5,                   // optional. integer. Android application icon badge number.
                                           //           Use "+n" or "-n" to increment/decrement the badge value by n.
    "android_gcm_ttl": 3600,               // optional. Time to live parameter — maximum message lifespan in seconds.
    "android_vibration": 0,                // optional. Android force-vibration for high-priority pushes.
    "android_led": "#rrggbb",              // optional. LED hex color, device will do its best approximation.
    "android_priority": -1,                // optional. Sets the "importance" parameter for devices with Android 8.0
                                           //           and higher, as well as the "priority" parameter for devices
                                           //           with Android 7.1 and lower. Establishes the interruption
                                           //           level of a notification channel or a particular notification.
                                           //           Valid values are -2, -1, 0, 1, 2.
    "android_delivery_priority": "normal", // optional. "normal" or "high". Enables notification’s delivery
                                           //           when the device is in the power saving mode. 
    "android_ibc": "#RRGGBB",              // optional. icon background color on Lollipop, #RRGGBB,
                                           //           #AARRGGBB, "red", "black", "yellow", etc.
    "android_silent": 1,                   // optional. 0 or 1. Enable silent notificaiton.
                                           //           Ignore sound and content
    
    // Amazon related parameters
    "adm_root_params": {                   // optional. Custom key-value object
      "key": "value"
    },
    "adm_sound": "push.mp3",
    "adm_sound_off": true,                 // optional. Enable/disable sound set by "adm_sound" field
    "adm_header": {
      "en": "Header"
    },
    "adm_content": {
      "en": "content"
    },
    "adm_icon": "icon.png",
    "adm_custom_icon": "URL.png",
    "adm_banner": "URL.png",
    "adm_ttl": 3600,                       // optional. Time to live parameter — the maximum message
                                           //           lifespan in seconds.
    "adm_priority": -1,                    // optional. Priority of the push in Amazon push drawer,
                                           //           valid values are -2, -1, 0, 1 and 2.
    
    // Mac OS X related parameters
    "mac_badges": 3,
    "mac_sound": "sound.caf",
    "mac_sound_off": true,
    "mac_root_params": {
      "content-available": 1
    },
    "mac_ttl": 3600,                       // optional. Time to live parameter — maximum message lifespan in seconds.
    "mac_title": {                         // optional. Adds Title for push notification.
      "en": "title"
    },
    "mac_subtitle": {                      // optional. Adds subtitle for MacOS push notification.
      "en": "subtitle"
    },
    "mac_content": {                       // optional. Adds content for MacOS push notification.
      "en": "content"
    },
    
    // Windows related parameters
    "wns_content": {                       // required. Content (XML or raw) of notification encoded
                                           //           in MIME's base64 in form of Object OR String
      "en": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9ImF2YWlsYWJsZSIvPg==",
      "de": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YmFkZ2UgdmFsdWU9Im5ld01lc3NhZ2UiLz4="
    },
    "wns_type": "Badge",                   // 'Tile' | 'Toast' | 'Badge' | 'Raw'
    "wns_tag": "myTag",                    // optional. Used in Tile replacement policy.
                                           //           An alphanumeric string of no more than 16 characters.
    "wns_cache": 1,                        // optional. (1|0) Translates into X-WNS-Cache-Policy value.
    "wns_ttl": 600,                        // optional. Expiration time for notification in seconds.
    
    // Safari related parameters
    "safari_title": {                      // optional. Object OR string. Title of the notification.
      "en": "title"
    },
    "safari_content": {                    // optional. Object OR string. Content of the notification.
      "en": "content"
    },
    "safari_action": "Click here",         // optional.
    "safari_url_args": [                   // required. but the value may be empty
      "firstArgument",
      "secondArgument"
    ],
    "safari_ttl": 3600,                    // optional. Time to live parameter — the maximum
                                           //           lifespan of a message in seconds.
    
    // Chrome related parameters
    "chrome_title": {                      // optional. You can specify the header of the message in this parameter.
      "en": "title"
    },
    "chrome_content": {                    // optional. You can specify the content of the message in this parameter.
      "en": "content"
    },
    "chrome_icon": "icon_URL",             // optional. Full path URL to the icon or extension resources file path
    "chrome_gcm_ttl": 3600,                // optional. Time to live parameter – maximum message lifespan in seconds.
    "chrome_duration": 20,                 // optional. Changes chrome push display time. Set to 0 to display push
                                           //           until user interacts with it.
    "chrome_image": "image_URL",           // optional. URL to large image
    "chrome_root_params": {                // optional. Set parameters specific to messages sent to Chrome.
      "key": "value"
    },
    "chrome_button_text1": "text1",        // optional.
    "chrome_button_url1": "button1_URL",   // optional. Ignored if chrome_button_text1 is not set.
    "chrome_button_text2": "text2",        // optional.
    "chrome_button_url2": "button2_url",   // optional. Ignored if chrome_button_text2 is not set.
    
    // Firefox related parameters
    "firefox_title": {                     // optional. Object OR string. You can specify message header here.
      "en": "title"
    },
    "firefox_content": {                   // optional. Object OR string. You can specify message content here.
      "en": "content"
    },
    "firefox_icon": "icon_URL",            // optional. Full path URL to the icon or path
                                           //           to the file in extension resources.
    "firefox_root_params": {               // optional. Set parameters specific to messages sent to 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])`

"age" 태그가 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, \"\")` – 이름 태그에 대한 값이 없는 기기를 대상으로 합니다.

문자열 태그와 함께 숫자 값을 사용할 수 있지만 이러한 값은 문자열로 변환됩니다.

#### 정수 태그

**적용 가능한 연산자:**

* **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**](/ko/developer/api-reference/statistics-api/message-statistics-api/#messageslist)를 사용하여 메시지 기록 및 더 자세한 데이터를 검색하세요.
</Aside>

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

푸시 세부 정보가 포함된 메시지 기록을 가져옵니다.

#### 요청 본문

| 이름                                   | 유형    | 설명                                                                                                          |
| -------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------- |
| auth* | string  | Pushwoosh Control Panel의 [API 액세스 토큰](/ko/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",  // required. API access token from Pushwoosh Control Panel
    "source": null,                  // optional. Possible values are null, "CP", "API", "GeoZone",
                                     //           "RSS", "AutoPush", "A/B Test"
    "searchBy": "applicationCode",   // optional. Possible values are "", "notificationID",
                                     //           "notificationCode", "applicationCode", "campaignCode"
    "value": "C8717-703F2",          // optional. Search value set according to the "searchBy" field.
    "lastNotificationID": 0,         // optional. Used for pagination. Last messageId from the
                                     //           previous /getPushHistory call. See details below.
    "limitMessages": 1000            // optional. Possible value from 10 to 1000.
  }
}
```

이 메서드는 메시지 ID별로 정렬된 계정의 1000개 메시지를 반환합니다. 두 번째 페이지를 얻으려면 이전 응답의 마지막 메시지 ID를 **lastNotificationId** 매개변수에 지정하세요.

### 응답 데이터 유형

```
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 Control Panel의 [API 액세스 토큰](/ko/developer/api-reference/api-identifiers/#api-access-token)입니다.        |
| message* | string | `/createMessage` 응답에서 얻은 [메시지 코드](/ko/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",  // required. API access token from Pushwoosh Control Panel
    "message": "xxxx-xxxxxxx-xxxxxx" // required. The message code obtained in /createMessage response
  }
}
```

**상태 코드:**

| HTTP 상태 코드 | status_code | 설명                                         |
| ---------------- | ------------ | --------------------------------------------------- |
| 200              | 200          | 메시지가 성공적으로 취소되었습니다                       |
| 200              | 210          | 인수 오류입니다. 자세한 내용은 status_message를 참조하세요.  |
| 400              | N/A          | 잘못된 형식의 요청 문자열                            |
| 500              | 500          | 내부 오류                                      |