# Отправка PUSH

## Отправка PUSH-сообщений

<mark style="color:green;">`POST`</mark> `https://direct.i-dgtl.ru/api/v1/message`

Метод позволяет отправлять массив одиночных сообщений **(от 1 до 1000)**

#### Headers

| Name                                            | Type   | Description        |
| ----------------------------------------------- | ------ | ------------------ |
| Authorization<mark style="color:red;">\*</mark> | string | `Basic {TOKEN_1}`  |
| Content-Type<mark style="color:red;">\*</mark>  | string | `application/json` |

#### Request Body

| Name                                                  | Type    | Description                                                                                                                                                                                                                                                                                              |
| ----------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| channelType<mark style="color:red;">\*</mark>         | string  | Канал отправки (`PUSH`)                                                                                                                                                                                                                                                                                  |
| senderName<mark style="color:red;">\*</mark>          | string  | Имя отправителя. Допускается любая строка                                                                                                                                                                                                                                                                |
| destination<mark style="color:red;">\*</mark>         | string  | Номер телефона абонента                                                                                                                                                                                                                                                                                  |
| content<mark style="color:red;">\*</mark>             | object  | Контент сообщения                                                                                                                                                                                                                                                                                        |
| tags                                                  | array   | Теги сообщения (массив строк). Каждый тег должен соответствовать выражению `^\w+$` (допускаются буквы в любом регистре, цифры и нижнее подчеркивание "\_")                                                                                                                                               |
| useLocalTime                                          | boolean | <p>Флаг, отвечающий за таймзону, в которой будет отправлено сообщение:<br><strong><code>true</code></strong> – отправка в таймзоне абонента<br><strong><code>false</code></strong> – отправка по МСК<br><em>По умолчанию true</em></p>                                                                   |
| localSendTime                                         | string  | <p>Нижняя граница допустимого времени отправки сообщения (с учетом значения<code>useLocalTime</code>)<br>Дата в формате <code>YYYY-MM-DD hh:mm:ss</code> в диапазоне от (текущее время в UTC - 12 часов) до (текущее время в UTC + 7 дней)<br><em>По умолчанию сообщение будет отправлено сразу</em></p> |
| localCompletionTime                                   | string  | Верхняя граница допустимого времени отправки сообщения (с учетом `useLocalTime`) в диапазоне от `localSendTime` до (текущее время в UTC + 70 дней)                                                                                                                                                       |
| ttl                                                   | integer | <p>Время жизни сообщения в секундах. По истечении ttl сообщению устанавливается финальный статус.<br><code>60 ≤ ttl ≤ 86400</code></p>                                                                                                                                                                   |
| hours                                                 | array   | Допустимые часы отправки (массив чисел). В массиве могут быть переданы целые числа от 0 до 23, каждое из которых соответствует разрешенному для отправки интервалу с учетом `useLocalTime`; значения должны быть уникальны.                                                                              |
| days                                                  | array   | Допустимые дни отправки (массив чисел). В массиве могут быть переданы целые числа от 1 (пн) до 7 (вс), каждое из которых соответствует разрешенному для отправки дню недели; значения должны быть уникальны.                                                                                             |
| callbackUrl                                           | string  | Адрес для отправки callback                                                                                                                                                                                                                                                                              |
| callbackEvents                                        | array   | События, по которым будут отправлены callback (массив строк). При наличии `callbackUrl` и отсутствии `callbackEvents` в запросе, будет отправлен callback по событию `delivered`.                                                                                                                        |
| externalMessageId                                     | string  | Внутренний id сообщения в вашей системе. До 100 символов.                                                                                                                                                                                                                                                |
| content.contentType<mark style="color:red;">\*</mark> | String  | Тип контента. Допускается только `text`                                                                                                                                                                                                                                                                  |
| content.deviceApp<mark style="color:red;">\*</mark>   | String  | Название пакета приложения, на которое отправляется PUSH                                                                                                                                                                                                                                                 |
| content.platform<mark style="color:red;">\*</mark>    | String  | Облако отправки сообщения. Допускаются значения APNS, FCM, HCM, RCM                                                                                                                                                                                                                                      |
| content.text<mark style="color:red;">\*</mark>        | String  | Текст сообщения. До 4096 символов.                                                                                                                                                                                                                                                                       |
| content.token<mark style="color:red;">\*</mark>       | String  | Идентификатор абонента в приложении                                                                                                                                                                                                                                                                      |
| content.attributes                                    | object  | Объект с произвольными парами `"key": "value"`. Может быть использован для передачи кастомных параметров для приложения                                                                                                                                                                                  |

::::::{tab-set}

:::::{tab-item} 200

В случае успешного запроса возвращается ответ, в котором перечислены идентификаторы сообщений и коды результата. При значении errors = false гарантируется, что все переданные сообщения успешно созданы.

```
{
  "errors": false,
  "items": [
    {
      "messageUuid": "063474ec-a34f-4558-90c5-984395000004",
      "code": 201
    },
    {
      "messageUuid": "063564ec-a34f-4558-90c5-984395000005",
      "code": 201
    }
  ]
}
```
:::::


:::::{tab-item} 401

Использование невалидного токена / отсутствие заголовка авторизации.

::::{tab-set}

:::{tab-item} 4012

```
{
    "error": {
        "code": 4012,
        "msg": "Bad credentials"
    }
}
```
:::


:::{tab-item} 4010

```
{
    "error": {
        "code": 4010,
        "msg": "Not Authenticated"
    }
}
```
:::

::::

:::::


:::::{tab-item} 403 

Использование неподходящего токена.

```
{
    "error": {
        "code": 4030,
        "msg": "Access Denied"
    }
}
```
:::::


:::::{tab-item} 422 

Невалидные параметры в теле запроса.
:::::


:::::{tab-item} 402

Payment Required. Недостаточно средств на балансе.

```
{
    "error": {
        "code": 402,
        "msg": "Insufficient funds"
    }
}
```
:::::

::::::


::::::{tip}
Рекомендуемое время ожидания ответа: 70 секунд.\
Как правило, ответ на запрос возвращается не более чем за несколько секунд, но таймаут величиной в 70 секунд позволяет гарантированно получить ответ на запрос, в том числе в ситуациях повышенной нагрузки.
::::::

Возможные варианты перечислений:

| Параметр         | Варианты                                                               |
| ---------------- | ---------------------------------------------------------------------- |
| content.platform | [Облака отправки PUSH-сообщений](../extra/references/#dispatch-states) |
| callbackEvents   | [События для отправки callback](../extra/references/#callback-events)  |

## Пример запроса с минимальным набором параметров <a href="#example" id="example"></a>

В примере ниже указан минимально необходимый набор параметров для отправки PUSH-сообщения.

::::::{tab-set}

:::::{tab-item} JSON

```json
POST https://direct.i-dgtl.ru/api/v1/message
Authorization: Basic {TOKEN_1}
Content-Type: application/json
[
  {
    "senderName": "push-sender",
    "channelType": "PUSH",
    "destination": "79999999999",
    "content": {
      "contentType": "text",
      "text": "Текст PUSH-сообщения",
      "platform": "APNS",
      "deviceApp": "ru.i_dgtl.android.push",
      "token": "ceSMD4uWT3y_2z2MLhA...JFHGypuijPYJ_CMHRV"
    }
  }
]
```
:::::


:::::{tab-item} cURL

```
curl -X POST 'https://direct.i-dgtl.ru/api/v1/message' \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic QWxhZGRpbjpvc...' \
-d '[{"senderName":"push-sender","channelType":"PUSH","destination":"79999999999","content":{"contentType":"text","text":"Текст PUSH-сообщения","platform":"APNS","deviceApp":"ru.i_dgtl.android.push","token":"ceSMD4uWT3y_2z2MLhA...JFHGypuijPYJ_CMHRV"}}]'
```
:::::


:::::{tab-item} Python

```
import requests
import json

url = "https://direct.i-dgtl.ru/api/v1/message"

payload = json.dumps([
  {
    "senderName": "push-sender",
    "channelType": "PUSH",
    "destination": "79999999999",
    "content": {
      "contentType": "text",
      "text": "Текст PUSH-сообщения",
      "platform": "APNS",
      "deviceApp": "ru.i_dgtl.android.push",
      "token": "device-token"
    }
  }
])
headers = {
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

```
:::::


:::::{tab-item} JavaScript

```
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");

const raw = JSON.stringify([
  {
    "senderName": "push-sender",
    "channelType": "PUSH",
    "destination": "79999999999",
    "content": {
      "contentType": "text",
      "text": "Текст PUSH-сообщения",
      "platform": "APNS",
      "deviceApp": "ru.i_dgtl.android.push",
      "token": "device-token"
    }
  }
]);

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://direct.i-dgtl.ru/api/v1/message", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));
```
:::::


:::::{tab-item} Java

```
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "[\n  {\n    \"senderName\": \"push-sender\",\n    \"channelType\": \"PUSH\",\n    \"destination\": \"79999999999\",\n    \"content\": {\n      \"contentType\": \"text\",\n      \"text\": \"Текст PUSH-сообщения\",\n      \"platform\": \"APNS\",\n      \"deviceApp\": \"ru.i_dgtl.android.push\",\n      \"token\": \"device-token\"\n    }\n  }\n]");
Request request = new Request.Builder()
  .url("https://direct.i-dgtl.ru/api/v1/message")
  .method("POST", body)
  .addHeader("Content-Type", "application/json")
  .build();
Response response = client.newCall(request).execute();
```
:::::


:::::{tab-item} PHP

```
<?php
$client = new Client();
$headers = [
  'Content-Type' => 'application/json'
];
$body = '[
  {
    "senderName": "push-sender",
    "channelType": "PUSH",
    "destination": "79999999999",
    "content": {
      "contentType": "text",
      "text": "Текст PUSH-сообщения",
      "platform": "APNS",
      "deviceApp": "ru.i_dgtl.android.push",
      "token": "device-token"
    }
  }
]';
$request = new Request('POST', 'https://direct.i-dgtl.ru/api/v1/message', $headers, $body);
$res = $client->sendAsync($request)->wait();
echo $res->getBody();

```
:::::


:::::{tab-item} Go

```
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io"
)

func main() {

  url := "https://direct.i-dgtl.ru/api/v1/message"
  method := "POST"

  payload := strings.NewReader(`[
  {
    "senderName": "push-sender",
    "channelType": "PUSH",
    "destination": "79999999999",
    "content": {
      "contentType": "text",
      "text": "Текст PUSH-сообщения",
      "platform": "APNS",
      "deviceApp": "ru.i_dgtl.android.push",
      "token": "device-token"
    }
  }
]`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := io.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
```
:::::

::::::


## Пример запроса с расширенными параметрами <a href="#example" id="example"></a>

Ниже указан пример запроса для отправки PUSH-сообщения с кастомным объектом attributes, отложенной датой отправки и внутренним id сообщения из вашей системы.

::::::{tab-set}

:::::{tab-item} JSON

```json
POST https://direct.i-dgtl.ru/api/v1/message
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Content-Type: application/json
[
  {
    "channelType": "PUSH",
    "senderName": "push-sender",
    "destination": "79999999999",
    "content": {
      "contentType": "text",
      "text": "Текст пуш-сообщения",
      "deviceApp": "ru.i_dgtl.android.nativepush",
      "platform": "APNS",
      "token": "ceSMD4uWT3y_2z2MLh...JFHGypuijPYJ_CMHRV",
      "attributes": {
        "imageUrl": "https://image.png",
        "size": "medium",
        "key": "value"
      }
    },
    "localSendTime": "2024-03-08 10:00:00",
    "externalMessageId": "bc45281e-b1bc-47da-b231-6d8658b7d12e"
  }
]
```
:::::


:::::{tab-item} cURL

```
curl -X POST 'https://direct.i-dgtl.ru/api/v1/message' \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==' \
-d '[{"channelType":"PUSH","senderName":"push-sender","destination":"79999999999","content":{"contentType":"text","text":"Текст пуш-сообщения","deviceApp":"ru.i_dgtl.android.nativepush","platform":"APNS","token":"ceSMD4uWT3y_2z2MLhAnG...JFHGypuijPYJ_CMHRV","attributes":{"imageUrl":"https://image.png","size":"medium","key":"value"}},"localSendTime":"2024-03-08 10:00:00","externalMessageId":"bc45281e-b1bc-47da-b231-6d8658b7d12e"}]'
```
:::::

::::::

