# АТИ Мессенджер

«АТИ Мессенджер» (далее **Мессенджер**) — сервис для обмена сообщениями, документами, файлами между пользователями ATI.SU. С помощью мессенджера можно договориться о перевозке, отправить фото, электронные документы.

## Возможности Мессенджера

- Создание диалогов между пользователями ATI.SU
- Создание диалогов из приложения [АТИ Водитель](https://help.ati.su/ati-voditel)
- Отправка текстовых сообщений
- Отправка файлов, изображений, документов ATI.SU, геометок
- Общение в открытых и закрытых групповых чатах
- Общение с подписчиками в каналах

## Типичные сценарии использования мессенджера

### Диалог

- Создать диалог по конкретному грузу или из интерфейса мессенджера с определенным пользователем
- Отправить сообщение
- Закрепить диалог
- Заблокировать/разблокировать пользователя
- Скрыть диалог

### Групповой чат и канал

- Создать групповой чат или канал
- Отправить приглашения участникам ATI.SU
- Вступить в чат по приглашению
- Исключить участника

## API для работы с АТИ Мессенджером

API Мессенджера предоставляет набор методов, необходимых для получения списка чатов пользователя ATI.SU, получения сообщений в чате, отправки сообщения в чат и другие. Благодаря этому API можно организовать интеграцию между мессенджером и сторонней системой.

### Используемые термины

**Чат** - абстрактная сущность чата в мессенджере, любой чат имеет одну или более подписку.

**Подписка** - связка пользователя и конкретного канала. Диалог, например, состоит из 2-х подписок, групповой чат - из N подписок. Список чатов, отображающийся в интерфейсе, есть список подписок. Подписка так же содержит опции пользователя относительно этого чата (скрыт, заблокирован, закреплен и т.п.).

**Диалог** - чат между двумя участниками; диалог нельзя удалить, только скрыть.

**Групповой чат** - чат между группой участников, пользователи вступают чат по приглашению; в закрытых чатах приглашать могут только администраторы, в открытых - все участники.

**Администратор** - создатель и владелец группового чата. В закрытых группах только администратор может приглашать пользователей в чат.

**Канал** - групповой чат, писать в который может только администратор.

**История** - список сообщений чата.

**Хвост** - последнее сообщение в истории (отображается в каждом чате из списка).

**Пользователь ATI.SU** - участник ATI.SU, обладающий лицензией и имеющий доступ ко всем сервисам ATI.SU.

**Псевдопользователь(АТИ Водитель)** - пользователь чата, не являющийся полноценным участником ATI.SU, но имеющий возможность быть участником как диалога, так и группового чата в мессенджере.

**ID аккаунта ATI.SU** - уникальный идентификатор аккаунта в ATI.SU, для АТИ водителя имеет формат `driver_{номер телефона}`.

**User ID** - `{ID аккаунта ATI.SU}.{ID контакта}`, у АТИ водителя контакт ID контакта всегда `0`.

**АТИ код** - код участника ATI.SU отображающийся в шапке сайта и в профиле участника, может совпадать с ID аккаунта. Код АТИ Водителя совпадает с ID.

### Структура подписки

Подписка является ключевой сущностью в чате, большинство АПИ методов так или иначе отдают объект подписки в качестве ответа. Некоторые поля в теле подписки могут дублироваться или казаться избыточными, так же типы некоторых полей могут вызывать вопросы - все это связано с поддержкой старых версий, в новых версиях эти рудименты исчезнут.

Подписки диалогов и групповых чатов выглядят похоже, но имеют некоторые отличия.

|     Имя поля     |                           Описание                            |   Тип   |            Пример            | Диалог | Группа | Обязательное поле |
| :--------------: | :-----------------------------------------------------------: | :-----: | :--------------------------: | :----: | :----: | :---------------: |
|        id        |                            ID чата                            | string  |    28ba1e3b16974c32989b1а    |   да   |   да   |        да         |
|   channel_type   |                           Тип чата                            | string  |            group             |   да   |   да   |        да         |
|       name       |                         Название чата                         | string  |       my awesome group       |   да   |   да   |        да         |
|   description    |                         Описание чата                         | string  | my awesome group description |   да   |   да   |        да         |
|      owner       |                    User ID владельца чата                     | string  |           890386.0           |   да   |   да   |        да         |
|       user       |                  User ID владельца подписки                   | string  |          1423414.0           |   да   |   да   |        да         |
|      ctime       |              Дата и время создания чата (GMT+3)               | string  |  2021-01-22T11:25:15+00:00   |   да   |   да   |        да         |
|      utime       |      Дата и время последнего обновления подписки (GMT+3)      | string  |  2021-03-24T08:51:53+00:00   |   да   |   да   |        да         |
|       dts        | UTC Timestamp последнего прочитанного пользователем сообщения | integer |       1611314906749707       |   да   |  нет   |        да         |
|       uts        |         UTC Timestamp последнего обновления подписки          | integer |       1622639302000000       |   да   |   да   |        да         |
|      del_ts      |            UTC Timestamp последней очистки истории            | integer |       1622639302000000       |   да   |  нет   |        нет        |
|        ts        |              UTC Timestamp последнего сообщения               | integer |       1622639302435456       |   да   |   да   |        да         |
|      unread      |           Количество непрочитанных сообщений в чате           | string  |              0               |   да   |   да   |        да         |
|     partner      |                       АТИ Код партнера                        | string  |             777              |   да   |  нет   |        да         |
|   partner_full   |                АТИ Код партнера с ID контакта                 | string  |            777.0             |   да   |  нет   |        да         |
|    partner_id    |                   ID Аккаунта АТИ партнера                    | string  |           2716044            |   да   |  нет   |        да         |
|      users       |       Список \{АТИ код}.\{ID контакта} участников чвтв        |  list   |   ["14234140.0", "777.0"]    |   да   |  нет   |        да         |
|      count       |                       Кол-во участников                       | integer |              3               |  нет   |   да   |        да         |
|      invite      |                 Флаг подписки с приглашением                  |  bool   |             true             |  нет   |   да   |        нет        |
|     removed      |               Флаг подписки на удаленный канал                |  bool   |             true             |  нет   |   да   |        нет        |
|     excluded     |                   Флаг исключенной подписки                   |  bool   |             true             |  нет   |   да   |        нет        |
|      pinned      |                  Флаг прикрепленной подписки                  | string  |              1               |   да   |   да   |        нет        |
|      locked      |            Флаг подписки с заблокированным юзером             | string  |              1               |   да   |  нет   |        нет        |
|    complaint     |                ID пожаловавшегося пользователя                | string  |          1423414.0           |   да   |  нет   |        нет        |
| complaint_reason |                      Причина блокировки                       | string  |             spam             |   да   |  нет   |        нет        |
|       tail       |                          Хвост чата                           |  dict   |            \{...}            |   да   |   да   |        нет        |

## Описание методов

### Чаты

<a id="post-1.1-chats-"></a>

Создание чата

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/' \
  -X 'POST' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "channel_type": "group",
  "name": "Моя группа",
  "is_open": true,
  "description": "Описание моей группы"
}'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Описание полей запроса**
- `channel_type` — тип чата
- `name` — имя групп.чата/собеседника
- `is_open` — открытый/закрытый (только для типов channel, group)
- `description` — описание

**Пример ответа (200)**

```json
{
  "id": "string",
  "channel_type": "string",
  "name": "string",
  "ctime": "string",
  "utime": "string",
  "owner": "string",
  "tail": {
    "any-key": {
      "text": "string",
      "ts": 0,
      "user": "string",
      "from": "string",
      "file_name": "string",
      "image_name": "string"
    }
  },
  "description": "string",
  "users": [
    "string"
  ],
  "partner": "string",
  "partner_id": "string",
  "partner_full": "string",
  "count": 0,
  "dts": 0,
  "unread": "string",
  "user": "string",
  "uts": 0,
  "short_url": "string"
}
```

**Описание полей ответа**
- `id` — id чата
- `channel_type` — тип чата
- `name` — Название чата (имя собеседника)
- `ctime` — время создания чата (iso)
- `utime` — время последнего изменения (iso)
- `owner` — создатель чата
- `tail.any-key.text` — текст сообщения (в случае картинки или файла - название объекта)
- `tail.any-key.ts` — таймстемп (unix) сообщения
- `tail.any-key.user` — id отправителя, отстутствует в системных событиях
- `tail.any-key.from` — имя отправителя сообщения
- `tail.any-key.file_name` — имя файла (если есть)
- `tail.any-key.image_name` — имя картинки (если есть)
- `description` — описание чата (для диалогов - название фирмы)
- `partner` — id партнера (без contact_id)
- `partner_id` — id партнера (c contact_id)
- `partner_full` — alias партнера (c contact_id)
- `count` — количество учасчтников группового чата (для диалогов - null)
- `dts` — timestamp последней очистки сообщений
- `unread` — количество непрочитанных сообщений
- `user` — id юзера (c contact_id)
- `uts` — timestamp последнего изменения
- `short_url` — короткий хэш для группового чата, используется в ссылке для приглашения, содерижтся только в подписке админа


Для создания диалогов и групповых чатов используется общий метод.

Диалог:

- При добавлении диалога создастся 2 подписки, но подписка собеседника будет скрыта пока в нее не напишут.
- Между двумя одинаковыми пользователями возможен только один диалог, при повторном создании будет возвращена та же самая подписка.
- Диалог можно создать двумя способами: используя ID аккаунта либо АТИ код, в зависимости от способа необходимо использовать поля id и ati_id соответственно. Не стоит указывать оба поля при запросе.

Группа, канал:

- По умолчанию при добавлении группы создастся чат с одним юзером в качестве участника (в ответ вернется его подписка).
- Можно создать чат и одновременно пригласить нескольких пользователей указав их списком в поле `members`.

<a id="put-1.1-chats-{chat_id}-"></a>

Обновление мета-данных группового чата

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/string/' \
  -X 'PUT' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "name": "Новое название группы",
  "description": "Новое описание моей группы"
}'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Описание полей запроса**
- `name` — имя групп.чата
- `description` — описание

**Пример ответа (200)**

```json
{
  "id": "string",
  "channel_type": "string",
  "name": "string",
  "ctime": "string",
  "utime": "string",
  "owner": "string",
  "tail": {
    "any-key": {
      "text": "string",
      "ts": 0,
      "user": "string",
      "from": "string",
      "file_name": "string",
      "image_name": "string"
    }
  },
  "description": "string",
  "users": [
    "string"
  ],
  "partner": "string",
  "partner_id": "string",
  "partner_full": "string",
  "count": 0,
  "dts": 0,
  "unread": "string",
  "user": "string",
  "uts": 0,
  "short_url": "string"
}
```

**Описание полей ответа**
- `id` — id чата
- `channel_type` — тип чата
- `name` — Название чата (имя собеседника)
- `ctime` — время создания чата (iso)
- `utime` — время последнего изменения (iso)
- `owner` — создатель чата
- `tail.any-key.text` — текст сообщения (в случае картинки или файла - название объекта)
- `tail.any-key.ts` — таймстемп (unix) сообщения
- `tail.any-key.user` — id отправителя, отстутствует в системных событиях
- `tail.any-key.from` — имя отправителя сообщения
- `tail.any-key.file_name` — имя файла (если есть)
- `tail.any-key.image_name` — имя картинки (если есть)
- `description` — описание чата (для диалогов - название фирмы)
- `partner` — id партнера (без contact_id)
- `partner_id` — id партнера (c contact_id)
- `partner_full` — alias партнера (c contact_id)
- `count` — количество учасчтников группового чата (для диалогов - null)
- `dts` — timestamp последней очистки сообщений
- `unread` — количество непрочитанных сообщений
- `user` — id юзера (c contact_id)
- `uts` — timestamp последнего изменения
- `short_url` — короткий хэш для группового чата, используется в ссылке для приглашения, содерижтся только в подписке админа


Метод используется для изменения имени или описания группового чата администратором.

<a id="delete-1.1-chats-{chat_id}-"></a>

Удаление группового чата владельцем

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/string/' \
  -X 'DELETE' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)


При удалении канала или группы все подписки участников будут помечены флагом `removed`.

### Подписки

<a id="get-1.2-subscriptions-"></a>

Получение всех подписок пользователя

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.2/subscriptions/?type=channel&limit=0&before=0&after=0' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
[
  {
    "id": "string",
    "channel_type": "string",
    "name": "string",
    "ctime": "string",
    "utime": "string",
    "owner": "string",
    "tail": {
      "any-key": {
        "text": "string",
        "ts": 0,
        "user": "string",
        "from": "string",
        "file_name": "string",
        "image_name": "string"
      }
    },
    "description": "string",
    "users": [
      "string"
    ],
    "partner": "string",
    "partner_id": "string",
    "partner_full": "string",
    "count": 0,
    "dts": 0,
    "unread": "string",
    "user": "string",
    "uts": 0,
    "short_url": "string"
  }
]
```

**Описание полей ответа**
- `[].id` — id чата
- `[].channel_type` — тип чата
- `[].name` — Название чата (имя собеседника)
- `[].ctime` — время создания чата (iso)
- `[].utime` — время последнего изменения (iso)
- `[].owner` — создатель чата
- `[].tail.any-key.text` — текст сообщения (в случае картинки или файла - название объекта)
- `[].tail.any-key.ts` — таймстемп (unix) сообщения
- `[].tail.any-key.user` — id отправителя, отстутствует в системных событиях
- `[].tail.any-key.from` — имя отправителя сообщения
- `[].tail.any-key.file_name` — имя файла (если есть)
- `[].tail.any-key.image_name` — имя картинки (если есть)
- `[].description` — описание чата (для диалогов - название фирмы)
- `[].partner` — id партнера (без contact_id)
- `[].partner_id` — id партнера (c contact_id)
- `[].partner_full` — alias партнера (c contact_id)
- `[].count` — количество учасчтников группового чата (для диалогов - null)
- `[].dts` — timestamp последней очистки сообщений
- `[].unread` — количество непрочитанных сообщений
- `[].user` — id юзера (c contact_id)
- `[].uts` — timestamp последнего изменения
- `[].short_url` — короткий хэш для группового чата, используется в ссылке для приглашения, содерижтся только в подписке админа


Метод возвращает постраничный список подписок. 

:::caution
Обратите внимание, используется новая версия метода - 1.2
:::

<a id="get-1.1-subscriptions-{chat_id}-"></a>

Получение информации о подписке

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/subscriptions/string/' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
{
  "id": "string",
  "channel_type": "string",
  "name": "string",
  "ctime": "string",
  "utime": "string",
  "owner": "string",
  "tail": {
    "any-key": {
      "text": "string",
      "ts": 0,
      "user": "string",
      "from": "string",
      "file_name": "string",
      "image_name": "string"
    }
  },
  "description": "string",
  "users": [
    "string"
  ],
  "partner": "string",
  "partner_id": "string",
  "partner_full": "string",
  "count": 0,
  "dts": 0,
  "unread": "string",
  "user": "string",
  "uts": 0,
  "short_url": "string"
}
```

**Описание полей ответа**
- `id` — id чата
- `channel_type` — тип чата
- `name` — Название чата (имя собеседника)
- `ctime` — время создания чата (iso)
- `utime` — время последнего изменения (iso)
- `owner` — создатель чата
- `tail.any-key.text` — текст сообщения (в случае картинки или файла - название объекта)
- `tail.any-key.ts` — таймстемп (unix) сообщения
- `tail.any-key.user` — id отправителя, отстутствует в системных событиях
- `tail.any-key.from` — имя отправителя сообщения
- `tail.any-key.file_name` — имя файла (если есть)
- `tail.any-key.image_name` — имя картинки (если есть)
- `description` — описание чата (для диалогов - название фирмы)
- `partner` — id партнера (без contact_id)
- `partner_id` — id партнера (c contact_id)
- `partner_full` — alias партнера (c contact_id)
- `count` — количество учасчтников группового чата (для диалогов - null)
- `dts` — timestamp последней очистки сообщений
- `unread` — количество непрочитанных сообщений
- `user` — id юзера (c contact_id)
- `uts` — timestamp последнего изменения
- `short_url` — короткий хэш для группового чата, используется в ссылке для приглашения, содерижтся только в подписке админа


### Участники групповых чатов

<a id="get-1.1-chats-{chat_id}-users-"></a>

Получение списка участников

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/string/users/?start=0&end=0&with_invite=false&invited=false' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
[
  {
    "id": "string",
    "code": "string",
    "name": "string",
    "company": "string",
    "email": "string",
    "fax": "string",
    "icq": "string",
    "mobile": "string",
    "phone": "string",
    "skype": "string"
  }
]
```

**Описание полей ответа**
- `[].id` — id юзера (c contact_id)
- `[].code` — alias юзера (без contact_id)
- `[].name` — имя юзера
- `[].company` — название компании
- `[].email` — email юзера
- `[].fax` — факс юзера
- `[].icq` — icq юзера
- `[].mobile` — номер мобильного телефона юзера
- `[].phone` — номер телефона юзера
- `[].skype` — skype юзера


С помощью параметров метода можно запрашивать как приглашенных так и текущих участников группового чата.

<a id="post-1.1-chats-{chat_id}-users-{user_id}-"></a>

Приглашение пользователя в групповой чат

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/string/users/string/?ati_id=false' \
  -X 'POST' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
{
  "id": "string",
  "channel_type": "string",
  "name": "string",
  "ctime": "string",
  "utime": "string",
  "owner": "string",
  "tail": {
    "any-key": {
      "text": "string",
      "ts": 0,
      "user": "string",
      "from": "string",
      "file_name": "string",
      "image_name": "string"
    }
  },
  "description": "string",
  "users": [
    "string"
  ],
  "partner": "string",
  "partner_id": "string",
  "partner_full": "string",
  "count": 0,
  "dts": 0,
  "unread": "string",
  "user": "string",
  "uts": 0,
  "short_url": "string"
}
```

**Описание полей ответа**
- `id` — id чата
- `channel_type` — тип чата
- `name` — Название чата (имя собеседника)
- `ctime` — время создания чата (iso)
- `utime` — время последнего изменения (iso)
- `owner` — создатель чата
- `tail.any-key.text` — текст сообщения (в случае картинки или файла - название объекта)
- `tail.any-key.ts` — таймстемп (unix) сообщения
- `tail.any-key.user` — id отправителя, отстутствует в системных событиях
- `tail.any-key.from` — имя отправителя сообщения
- `tail.any-key.file_name` — имя файла (если есть)
- `tail.any-key.image_name` — имя картинки (если есть)
- `description` — описание чата (для диалогов - название фирмы)
- `partner` — id партнера (без contact_id)
- `partner_id` — id партнера (c contact_id)
- `partner_full` — alias партнера (c contact_id)
- `count` — количество учасчтников группового чата (для диалогов - null)
- `dts` — timestamp последней очистки сообщений
- `unread` — количество непрочитанных сообщений
- `user` — id юзера (c contact_id)
- `uts` — timestamp последнего изменения
- `short_url` — короткий хэш для группового чата, используется в ссылке для приглашения, содерижтся только в подписке админа


При вызове метода у приглашенного пользователя создастся подписка с флагом `invite`.

<a id="delete-1.1-chats-{chat_id}-users-{user_id}-"></a>

Исключение участника из группового чата

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/string/users/string/?ati_id=false' \
  -X 'DELETE' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)


При вызове метода у исключенного пользователя в подписку добавится флаг `excluded`.

<a id="patch-1.1-subscriptions-{chat_id}-"></a>

Принятие приглашения в групповой чат

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/subscriptions/string/' \
  -X 'PATCH' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)


После принятия приглашения флаг `invite` должен пропасть из подписки.

<a id="delete-1.1-subscriptions-{chat_id}-"></a>

Удаление себя из группового чата или удаление приглашения

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/subscriptions/string/' \
  -X 'DELETE' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)


При вызове метода подписка удалится из базы данных.

### Сообщения

<a id="get-1.1-chats-{chat_id}-history-"></a>

Получение истории сообщений

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/string/history/?before=0&num=0&since=0&with_ts=false' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
[
  {
    "channel": "string",
    "delivered": false,
    "stamp": "string",
    "text": "string",
    "ts": 0,
    "id": "string",
    "user": "string",
    "event": "join",
    "from": "string",
    "document": "/document/07a940594fdb4866aa9f8f48c192632d/",
    "document_mimetype": "string",
    "document_size": 0,
    "file_id": "string",
    "file_mimetype": "string",
    "file_name": "string",
    "file_size": 0
  }
]
```

**Описание полей ответа**
- `[].channel` — id чата
- `[].delivered` — доставлено/недоставлено
- `[].stamp` — таймстемп (isoformat) сообщения
- `[].text` — текст сообщения
- `[].ts` — таймстемп (unix) сообщения
- `[].id` — id сообщения
- `[].user` — id отправителя, отстутствует в системных событиях
- `[].event` — тип системного события
- `[].from` — Имя отправителя сообщения
- `[].document` — ссылка на документ в атидоках
- `[].file_id` — id загруженного в filestorage файла


Метод возвращает постраничный список сообщений.

<a id="post-1.2-chats-{chat_id}-messages"></a>

Отправка сообщения

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.2/chats/string/messages' \
  -X 'POST' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: multipart/form-data; boundary=boundary'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
{
  "channel": "string",
  "delivered": false,
  "stamp": "string",
  "text": "string",
  "ts": 0,
  "id": "string",
  "user": "string",
  "event": "join",
  "from": "string",
  "document": "/document/07a940594fdb4866aa9f8f48c192632d/",
  "document_mimetype": "string",
  "document_size": 0,
  "file_id": "string",
  "file_mimetype": "string",
  "file_name": "string",
  "file_size": 0
}
```

**Описание полей ответа**
- `channel` — id чата
- `delivered` — доставлено/недоставлено
- `stamp` — таймстемп (isoformat) сообщения
- `text` — текст сообщения
- `ts` — таймстемп (unix) сообщения
- `id` — id сообщения
- `user` — id отправителя, отстутствует в системных событиях
- `event` — тип системного события
- `from` — Имя отправителя сообщения
- `document` — ссылка на документ в атидоках
- `file_id` — id загруженного в filestorage файла


Метод отправки сообщения. Поддерживаются текстовые сообщения, сообщения с картинкой или файлом, а также сообщения с геометкой. Одно сообщение должно содержать либо текст, либо одно вложение (картинку или файл), либо геометку.

Для отправки картинки обязательно прислать одновременно `image`, `image_height` и `image_width`.

Для отправки геометки обязательно прислать одновременно `geo_longitude` и `geo_latitude`.

<a id="get-1.2-messages-{message_id}-image"></a>

Получение прикреплённого к сообщению изображения

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.2/messages/string/image?height=0&width=0&biggest_side=0' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)


Получение изображения, прикреплённого к сообщению. Работает только для сообщений, у которых `image_id` не равен `null`. Использовать `image_id` не нужно: достаточно передать идентификатор сообщения `message_id`.

<a id="get-1.2-messages-{message_id}-file"></a>

Получение прикреплённого к сообщению файла

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.2/messages/string/file' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)


Получение файла, прикреплённого к сообщению. Работает только для сообщений, у которых `file_id` не равен `null`. Использовать `file_id` не нужно: достаточно передать идентификатор сообщения `message_id`.

### Прочие методы

<a id="post-1.1-chats-{chat_id}-settings-"></a>

Изменение настроек подписки

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/string/settings/' \
  -X 'POST' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "pin": true,
  "hidden": false
}'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
{
  "id": "string",
  "channel_type": "string",
  "name": "string",
  "ctime": "string",
  "utime": "string",
  "owner": "string",
  "tail": {
    "any-key": {
      "text": "string",
      "ts": 0,
      "user": "string",
      "from": "string",
      "file_name": "string",
      "image_name": "string"
    }
  },
  "description": "string",
  "users": [
    "string"
  ],
  "partner": "string",
  "partner_id": "string",
  "partner_full": "string",
  "count": 0,
  "dts": 0,
  "unread": "string",
  "user": "string",
  "uts": 0,
  "short_url": "string"
}
```

**Описание полей ответа**
- `id` — id чата
- `channel_type` — тип чата
- `name` — Название чата (имя собеседника)
- `ctime` — время создания чата (iso)
- `utime` — время последнего изменения (iso)
- `owner` — создатель чата
- `tail.any-key.text` — текст сообщения (в случае картинки или файла - название объекта)
- `tail.any-key.ts` — таймстемп (unix) сообщения
- `tail.any-key.user` — id отправителя, отстутствует в системных событиях
- `tail.any-key.from` — имя отправителя сообщения
- `tail.any-key.file_name` — имя файла (если есть)
- `tail.any-key.image_name` — имя картинки (если есть)
- `description` — описание чата (для диалогов - название фирмы)
- `partner` — id партнера (без contact_id)
- `partner_id` — id партнера (c contact_id)
- `partner_full` — alias партнера (c contact_id)
- `count` — количество учасчтников группового чата (для диалогов - null)
- `dts` — timestamp последней очистки сообщений
- `unread` — количество непрочитанных сообщений
- `user` — id юзера (c contact_id)
- `uts` — timestamp последнего изменения
- `short_url` — короткий хэш для группового чата, используется в ссылке для приглашения, содерижтся только в подписке админа


Изменение настроек подписки (скрыть/закрепить).

<a id="post-1.1-chats-{chat_id}-users-"></a>

Приглашение нескольких пользователей в групповой чат

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/string/users/?ati_id=false' \
  -X 'POST' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "members": [
    "string"
  ]
}'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
{
  "id": "string",
  "channel_type": "string",
  "name": "string",
  "ctime": "string",
  "utime": "string",
  "owner": "string",
  "tail": {
    "any-key": {
      "text": "string",
      "ts": 0,
      "user": "string",
      "from": "string",
      "file_name": "string",
      "image_name": "string"
    }
  },
  "description": "string",
  "users": [
    "string"
  ],
  "partner": "string",
  "partner_id": "string",
  "partner_full": "string",
  "count": 0,
  "dts": 0,
  "unread": "string",
  "user": "string",
  "uts": 0,
  "short_url": "string"
}
```

**Описание полей ответа**
- `id` — id чата
- `channel_type` — тип чата
- `name` — Название чата (имя собеседника)
- `ctime` — время создания чата (iso)
- `utime` — время последнего изменения (iso)
- `owner` — создатель чата
- `tail.any-key.text` — текст сообщения (в случае картинки или файла - название объекта)
- `tail.any-key.ts` — таймстемп (unix) сообщения
- `tail.any-key.user` — id отправителя, отстутствует в системных событиях
- `tail.any-key.from` — имя отправителя сообщения
- `tail.any-key.file_name` — имя файла (если есть)
- `tail.any-key.image_name` — имя картинки (если есть)
- `description` — описание чата (для диалогов - название фирмы)
- `partner` — id партнера (без contact_id)
- `partner_id` — id партнера (c contact_id)
- `partner_full` — alias партнера (c contact_id)
- `count` — количество учасчтников группового чата (для диалогов - null)
- `dts` — timestamp последней очистки сообщений
- `unread` — количество непрочитанных сообщений
- `user` — id юзера (c contact_id)
- `uts` — timestamp последнего изменения
- `short_url` — короткий хэш для группового чата, используется в ссылке для приглашения, содерижтся только в подписке админа


По умолчанию используются id-шники аккаунтов, но если флаг `ati_id` выставлен в true, будут использованы именно коды.

<a id="delete-1.1-chats-{chat_id}-messages-{ts_or_id}-"></a>

Удаление сообщения из диалога

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/string/messages/1553154991842130,5b42d88fea1cb745d23db8d7b9de11da5473ad61/' \
  -X 'DELETE' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
{
  "id": "string",
  "channel_type": "string",
  "name": "string",
  "ctime": "string",
  "utime": "string",
  "owner": "string",
  "tail": {
    "any-key": {
      "text": "string",
      "ts": 0,
      "user": "string",
      "from": "string",
      "file_name": "string",
      "image_name": "string"
    }
  },
  "description": "string",
  "users": [
    "string"
  ],
  "partner": "string",
  "partner_id": "string",
  "partner_full": "string",
  "count": 0,
  "dts": 0,
  "unread": "string",
  "user": "string",
  "uts": 0,
  "short_url": "string"
}
```

**Описание полей ответа**
- `id` — id чата
- `channel_type` — тип чата
- `name` — Название чата (имя собеседника)
- `ctime` — время создания чата (iso)
- `utime` — время последнего изменения (iso)
- `owner` — создатель чата
- `tail.any-key.text` — текст сообщения (в случае картинки или файла - название объекта)
- `tail.any-key.ts` — таймстемп (unix) сообщения
- `tail.any-key.user` — id отправителя, отстутствует в системных событиях
- `tail.any-key.from` — имя отправителя сообщения
- `tail.any-key.file_name` — имя файла (если есть)
- `tail.any-key.image_name` — имя картинки (если есть)
- `description` — описание чата (для диалогов - название фирмы)
- `partner` — id партнера (без contact_id)
- `partner_id` — id партнера (c contact_id)
- `partner_full` — alias партнера (c contact_id)
- `count` — количество учасчтников группового чата (для диалогов - null)
- `dts` — timestamp последней очистки сообщений
- `unread` — количество непрочитанных сообщений
- `user` — id юзера (c contact_id)
- `uts` — timestamp последнего изменения
- `short_url` — короткий хэш для группового чата, используется в ссылке для приглашения, содерижтся только в подписке админа


Удалять сообщения можно в диалогах и только если они не прочитаны собеседником. В качестве идентификатора можно использовать как непосредственно id сообщения так и его временную метку в UTC.

<a id="delete-1.1-chats-{chat_id}-history-"></a>

Очистка истории

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/chats/string/history/' \
  -X 'DELETE' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
{
  "id": "string",
  "channel_type": "string",
  "name": "string",
  "ctime": "string",
  "utime": "string",
  "owner": "string",
  "tail": {
    "any-key": {
      "text": "string",
      "ts": 0,
      "user": "string",
      "from": "string",
      "file_name": "string",
      "image_name": "string"
    }
  },
  "description": "string",
  "users": [
    "string"
  ],
  "partner": "string",
  "partner_id": "string",
  "partner_full": "string",
  "count": 0,
  "dts": 0,
  "unread": "string",
  "user": "string",
  "uts": 0,
  "short_url": "string"
}
```

**Описание полей ответа**
- `id` — id чата
- `channel_type` — тип чата
- `name` — Название чата (имя собеседника)
- `ctime` — время создания чата (iso)
- `utime` — время последнего изменения (iso)
- `owner` — создатель чата
- `tail.any-key.text` — текст сообщения (в случае картинки или файла - название объекта)
- `tail.any-key.ts` — таймстемп (unix) сообщения
- `tail.any-key.user` — id отправителя, отстутствует в системных событиях
- `tail.any-key.from` — имя отправителя сообщения
- `tail.any-key.file_name` — имя файла (если есть)
- `tail.any-key.image_name` — имя картинки (если есть)
- `description` — описание чата (для диалогов - название фирмы)
- `partner` — id партнера (без contact_id)
- `partner_id` — id партнера (c contact_id)
- `partner_full` — alias партнера (c contact_id)
- `count` — количество учасчтников группового чата (для диалогов - null)
- `dts` — timestamp последней очистки сообщений
- `unread` — количество непрочитанных сообщений
- `user` — id юзера (c contact_id)
- `uts` — timestamp последнего изменения
- `short_url` — короткий хэш для группового чата, используется в ссылке для приглашения, содерижтся только в подписке админа


Очистить переписку можно только в диалогах, причем история изменится лишь для владельца подписки, у собеседника все останется как есть. При вызове метода в подписку добавится поле `del_ts`, содержащее временную метку, начиная с которой сообщения не будут возвращаться в методе `history`.

<a id="get-1.1-inbox-"></a>

Получение счетчика чатов с непрочитанными сообщениями

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/inbox/' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
{
  "unread": 0
}
```


Метод вернет количество чатов с непрочитанными сообщениями.

<a id="get-1.1-subscriptions-unread-"></a>

Получение количества непрочитанных чатов по типам (все/диалоги/групповые чаты)

**Пример запроса (curl):**

```bash
curl 'https://api.ati.su/messenger/1.1/subscriptions/unread/?with_messages=string' \
  -X 'GET' \
  -H 'Authorization: Bearer {authorizationToken}' \
  -H 'Content-Type: application/json'
```

**OpenAPI схема:** [JSON](https://ati.su/developers/raw/api/messenger.openapi.json)

**Пример ответа (200)**

```json
{
  "all": 0,
  "dialogs": 0,
  "groups": 0
}
```


Метод аналогичный `inbox`, но счетчики будут разбиты по типам чатов.
