# Пачка API - Полная документация
> Сгенерировано: 2026-01-30 04:22:18
> Полная версия документации API в формате Markdown
## Содержание
### Руководства
- [Обзор](#обзор)
- [Исходящий Webhook](#исходящий-webhook)
- [Запросы и ответы](#запросы-и-ответы)
- [Ошибки и лимиты](#ошибки-и-лимиты)
- [Экспорт сообщений](#экспорт-сообщений)
- [Формы](#формы)
- [DLP-система](#dlp-система)
- [Журнал аудита событий](#журнал-аудита-событий)
- [Последние обновления](#последние-обновления)
### API Методы
- [Common](#api-common)
- [Profile](#api-profile)
- [Users](#api-users)
- [Group tags](#api-group-tags)
- [Chats](#api-chats)
- [Members](#api-members)
- [Thread](#api-thread)
- [Messages](#api-messages)
- [Read member](#api-read-member)
- [Reactions](#api-reactions)
- [Link Previews](#api-link-previews)
- [Tasks](#api-tasks)
- [Views](#api-views)
- [Bots](#api-bots)
- [Security](#api-security)
---
# Руководства
# Обзор
Администрирование состава участников пространства и их профилей через API · Интеграции на основе API для создания чатов и отправки сообщений в указанные чаты · Входящие вебхуки для упрощенной отправки сообщений без API · Получение информации в реальном времени при помощи исходящих вебхуков · [и многое другое](https://pachca.com/blog/kak-podklyuchit-lyubimye-servisy-k-pachke)
> Полезные форматы для работы с AI:
[**llms.txt**](/llms.txt) — краткая версия всей документации в markdown
[**llms-full.txt**](/llms-full.txt) — полный markdown-файл с оглавлением
_Также вы можете получить markdown-версию любой страницы, добавив .md к её адресу или используя кнопку «Скопировать как .md» в правом верхнем углу._
## Боты
Боты в Пачке являются основным способом создания автоматизаций. С помощью ботов вы можете использовать входящие и исходящие вебхуки, а также использовать API.
> О том, как создать бота, добавить его в чаты и получить `access_token`, вы можете прочитать в
статье [https://www.pachca.com/articles/webhook](https://www.pachca.com/articles/webhook)
## Webhook
### Входящий Webhook
Входящий вебхук позволяет вам от имени бота отправлять сообщения в чаты, в которых бот состоит. При этом вам не требуется использовать API, а гибкость работы с принимаемыми данными вы можете настроить с помощью шаблонизаторов [Liquid](https://shopify.github.io/liquid/) и [Mustache](https://mustache.github.io/). Это удобно, если вы используете бота только для получения каких-то простых внешних событий и сами указываете, в какие чаты бот добавлен (возможно, всего в один).
> **Внимание:** Входящий вебхук не дает возможности отправить личное сообщение или в указанный чат. Сообщение
будет отправлено во все групповые чаты, где состоит бот. Чтобы отправить личное сообщение или
указать конкретный чат - воспользуйтесь API методом [Новое сообщение](/messages/create).
> Подробнее о работе с шаблонизаторами вы можете прочитать в статье
[https://www.pachca.com/articles/kak-pravilno-zapolnit-shablon-webhook](https://www.pachca.com/articles/kak-pravilno-zapolnit-shablon-webhook)
### Исходящий Webhook
Исходящий вебхук позволяет вам получать уведомления о различных событиях на указанный вами URL.
Вы можете как получать события о всех новых сообщениях, так и только тех, которые начинаются с указанных команд.
> Подробнее об исходящих вебхуках вы можете прочитать по [ссылке](/guides/webhook)
## API
Каждый созданный бот имеет свой уникальный токен для работы с API. Если вам нужно создавать чаты, управлять составом участников чатов, отправлять сообщения в указанные чаты и создавать интерактивное взаимодействие пользователя с ботом - вам необходимо использовать API.
> Всю документацию по доступным методам и правилам работы с API вы можете найти в меню слева
## Формы
Формы в Пачке позволяют вам отображать пользователям представления с указанным вами набором полей. Представления отображаются в виде модального окна, а результат заполнения формы вы можете получить на свой сервер. Модальное окно может быть вызвано, например, через кнопки в сообщении бота.
> Подробнее о работе с формами вы можете прочитать в разделе [Формы](/guides/forms)
## Администрирование
Вы можете автоматизировать управление составом участников пространства и наполнением их профилей. Каждый сотрудник в компании с ролью «Администратор» и «Владелец» имеет свой уникальный токен, который позволяет ему использовать уникальные методы API, недоступные ботам.
Список уникальных методов API:
- [Новый сотрудник](/users/create)
- [Редактирование сотрудника](/users/update)
- [Удаление сотрудника](/users/delete)
- [Новый тег](/group-tags/create)
- [Редактирование тега](/group-tags/update)
- [Удаление тега](/group-tags/delete)
- [Удаление сообщения](/messages/delete)
> Получить access_token для работы с API вы можете в интерфейсе продукта, в разделе «Автоматизации»
→ «API» (данный раздел доступен только пользователям с ролью «Администратор» и «Владелец»)
## Аналитика
На тарифе «Корпорация» владелец пространства может запросить экспорт через API, тем самым автоматизировать выгрузку сообщений и построение аналитики (или регулярное создание личных бекапов сообщений пространства).
Дополнительно, на любом тарифе можно получить сообщения доступных чатов через метод [Список сообщений чата](/messages/list).
> Документация по работе с экспортом сообщений доступа по [ссылке](/guides/export)
## Unfurl
Дополнительным исходящим вебхуком является возможность отслеживать отправленные пользователями ссылки и дополнять их своими данными, полученными из других систем.
> Подробнее о разворачивании ссылок вы можете прочитать в статье
[https://www.pachca.com/articles/unfurling-ssylok-v-pachce](https://www.pachca.com/articles/unfurling-ssylok-v-pachce)
> Документация по работе с методом разворачивания ссылок доступа по
[ссылке](/link-previews/add-link-previews)
---
# Исходящий Webhook
Исходящие вебхуки позволяют вам получать информацию о событиях в вашем пространстве в реальном времени. Это могут быть новые сообщения, реакции, чаты, участники и тд.
Вебхук представляет собой `JSON` объект, отправляемый в момент наступления события на указанный в настройках бота `URL`, содержащий небольшое количество информации, которой достаточно для написания автоматизаций. Если требуется получить больше информации об объектах, указанных в `JSON` - вы можете воспользоваться `API` и получить полную информацию.
Каждый исходящий вебхук защищён с помощью подписи, основанной на хешировании содержимого. Подробнее об этом, а также о других методах проверки подлинности исходящего вебхука, вы можете прочитать в блоке [Безопасность](#безопасность).
## Как получать Webhook
Все настройки исходящих вебхуков находятся в чат-ботах. Создавая нового бота, вы получаете возможность указать `Webhook URL` и выбрать те события, которые вы хотите получать.
Большинство типов событий потребуют добавления бота в чаты. Именно по этим чатам и по отправленным ботом сообщениям вы будете получать события. Есть глобальные события (например, Изменение состава участников пространства), которые не требуют добавления бота в чат.
> О том, как создать бота и добавить его в чаты, вы можете прочитать в статье
[https://www.pachca.com/articles/webhook](https://www.pachca.com/articles/webhook)
## Новые сообщения
Данный вебхук отправляется при появлении нового сообщения в чате, где участвует бот.
Вы можете получать как все новые сообщения в чате, так и только те, которые начинаются с указанных команд. Это будет полезно, если вы не хотите получать поток событий, а вам нужно только по требованию пользователя вызвать какой-то сценарий.
#### MessageWebhookPayload
- `type` (string, **обязательный**): Тип объекта
- Пример: `message`
- **Возможные значения:**
- `message`: Для сообщений всегда message
- `id` (integer, int32, **обязательный**): Идентификатор сообщения
- Пример: `1245817`
- `event` (string, **обязательный**): Тип события
- **Возможные значения:**
- `new`: Создание
- `update`: Обновление
- `delete`: Удаление
- `entity_type` (string, **обязательный**): Тип сущности, к которой относится сообщение
- **Возможные значения:**
- `discussion`: Беседа или канал
- `thread`: Тред
- `user`: Пользователь
- `entity_id` (integer, int32, **обязательный**): Идентификатор сущности, к которой относится сообщение
- Пример: `5678`
- `content` (string, **обязательный**): Текст сообщения
- Пример: `Текст сообщения`
- `user_id` (integer, int32, **обязательный**): Идентификатор отправителя сообщения
- Пример: `2345`
- `created_at` (string, date-time, **обязательный**): Дата и время создания сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-05-15T14:30:00.000Z`
- `url` (string, **обязательный**): Прямая ссылка на сообщение
- Пример: `https://pachca.com/chats/1245817/messages/5678`
- `chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором находится сообщение
- Пример: `9012`
- `parent_message_id` (integer, int32, опциональный): Идентификатор сообщения, к которому написан ответ. Возвращается как null, если сообщение не является ответом.
- Пример: `3456`
- `thread` (object, опциональный): Объект с параметрами треда. Возвращается как null, если это сообщение не относится к треду.
- `message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому был создан тред
- Пример: `12345`
- `message_chat_id` (integer, int32, **обязательный**): Идентификатор чата сообщения, к которому был создан тред
- Пример: `67890`
- `webhook_timestamp` (integer, int32, **обязательный**): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1747574400`
## Добавление и удаление реакций
Данный вебхук отправляется при добавлении или удалении реакции на сообщение в чате, где участвует бот.
#### ReactionWebhookPayload
- `type` (string, **обязательный**): Тип объекта
- Пример: `reaction`
- **Возможные значения:**
- `reaction`: Для реакций всегда reaction
- `event` (string, **обязательный**): Тип события
- **Возможные значения:**
- `new`: Создание
- `delete`: Удаление
- `message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому относится реакция
- Пример: `1245817`
- `code` (string, **обязательный**): Emoji символ реакции
- Пример: `👍`
- `name` (string, **обязательный**): Название реакции
- Пример: `thumbsup`
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя, который добавил или удалил реакцию
- Пример: `2345`
- `created_at` (string, date-time, **обязательный**): Дата и время создания сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-05-15T14:30:00.000Z`
- `webhook_timestamp` (integer, int32, **обязательный**): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1747574400`
## Нажатие кнопок
Данный вебхук отправляется при нажатии `Data-кнопки` в сообщении от бота. После получения этого вебхука вы можете воспользоваться методом [Редактирование сообщения](PUT /messages/{id}) и изменить/удалить кнопки у сообщения или отправить [Новое сообщение](POST /messages) как реакцию пользователю.
Подробнее о работе с кнопками в ботах вы можете прочитать в статье [https://www.pachca.com/articles/knopki-v-chat-botah](https://www.pachca.com/articles/knopki-v-chat-botah)
#### ButtonWebhookPayload
- `type` (string, **обязательный**): Тип объекта
- Пример: `button`
- **Возможные значения:**
- `button`: Для кнопки всегда button
- `event` (string, **обязательный**): Тип события
- Пример: `click`
- **Возможные значения:**
- `click`: Нажатие кнопки
- `message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому относится кнопка
- Пример: `1245817`
- `trigger_id` (string, **обязательный**): Уникальный идентификатор события. Время жизни — 3 секунды. Может быть использован, например, для открытия представления пользователю
- Пример: `a1b2c3d4-5e6f-7g8h-9i10-j11k12l13m14`
- `data` (string, **обязательный**): Данные нажатой кнопки
- Пример: `button_data`
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя, который нажал кнопку
- Пример: `2345`
- `chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором была нажата кнопка
- Пример: `9012`
- `webhook_timestamp` (integer, int32, **обязательный**): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1747574400`
## Изменение состава участников чатов
Данный вебхук отправляется при изменении состава участников чатов, где состоит бот, и в тредах этих чатов.
#### ChatMemberWebhookPayload
- `type` (string, **обязательный**): Тип объекта
- Пример: `chat_member`
- **Возможные значения:**
- `chat_member`: Для участника чата всегда chat_member
- `event` (string, **обязательный**): Тип события
- **Возможные значения:**
- `add`: Добавление
- `remove`: Удаление
- `chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором изменился состав участников
- Пример: `9012`
- `thread_id` (integer, int32, опциональный): Идентификатор треда. Возвращается как null, если чат не относится к треду.
- Пример: `5678`
- `user_ids` (array[integer], **обязательный**): Массив идентификаторов пользователей, с которыми произошло событие
- Пример: `[2345,6789]`
- `created_at` (string, date-time, **обязательный**): Дата и время события (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-05-15T14:30:00.000Z`
- `webhook_timestamp` (integer, int32, **обязательный**): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1747574400`
## Изменение состава участников пространства
Данный вебхук отправляется при изменении состава участников пространства, включая изменение состояния участников (смотреть на значение поля event).
#### CompanyMemberWebhookPayload
- `type` (string, **обязательный**): Тип объекта
- Пример: `company_member`
- **Возможные значения:**
- `company_member`: Для участника пространства всегда company_member
- `event` (string, **обязательный**): Тип события
- **Возможные значения:**
- `invite`: Приглашение
- `confirm`: Подтверждение
- `update`: Обновление
- `suspend`: Приостановка
- `activate`: Активация
- `delete`: Удаление
- `user_ids` (array[integer], **обязательный**): Массив идентификаторов пользователей, с которыми произошло событие
- Пример: `[2345,6789]`
- `created_at` (string, date-time, **обязательный**): Дата и время события (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-05-15T14:30:00.000Z`
- `webhook_timestamp` (integer, int32, **обязательный**): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1747574400`
## Безопасность
Каждый исходящий вебхук защищён с помощью подписи, основанной на хешировании содержимого. Подпись `HMAC` с использованием алгоритма `SHA256` вычисляется из тела запроса и передаётся в заголовке `Pachca-Signature`.
В теле вебхука также содержится поле `webhook_timestamp` — метка времени в формате UNIX, указывающая момент отправки вебхука. Рекомендуется проверять, что это значение находится в пределах одной минуты от времени получения запроса, чтобы предотвратить атаки повторной отправки (replay attacks).
**Пример исходящего вебхука (новое сообщение)**
```http
{`POST https://yourweb.site/read HTTP/1.1
host: yourweb.site
content-Type: application/json
pachca-signature: a805d3470c263f4628cafc4ed66235d8fe2229891d1fcf4e400331adff5d8e5a
user-agent: Faraday v2.12.2
content-length: 358
{
"event": "new",
"type": "message",
"webhook_timestamp": 1744618734,
"chat_id": 918264,
"content": "Клиент просит поправить шапку, подробности в документе",
"user_id": 134412,
"id": 56431,
"created_at": "2025-04-14T08:18:54.000Z",
"parent_message_id": null,
"entity_type": "discussion",
"entity_id": 918264,
"thread": null,
"url": "https://app.pachca.com/chats/124511?message=56431"
}`}
```
Для проверки подписи необходимо вычислить её самостоятельно, используя секрет вебхука `Signing secret`, который доступен в настройках бота во вкладке «Исходящий webhook». Рекомендуется использовать сырой (raw) контент тела запроса для вычисления хеша, так как при JSON-парсинге содержимое может быть изменено.
**Вычисление и сравнение подписи**
```javascript
{`// WEBHOOK_SECRET - значение поля Signing secret во вкладке «Исходящий webhook» в настройках бота
const signature = crypto.createHmac("sha256", WEBHOOK_SECRET).update(rawBody).digest("hex");
if (signature !== request.headers['pachca-signature']) {
throw "Invalid signature"
}`}
```
Кроме проверки подписи, также рекомендуется валидировать IP-адреса отправителя.
IP-адрес Пачки: `37.200.70.177`
---
# Запросы и ответы
## Доступ
Для работы с методами API вам необходимо иметь действующий `access_token`.
`access_token` не имеет времени жизни. Если вы используете `access_token` «Администратора» или «Владельца» пространства, то в разделе «Автоматизации» → «API» вы можете воспользоваться функцией сброса токена. В таком случае вы увидите новый `Access token`, а предыдущий станет недействительным.
## Структура запроса метода API
При выполнении запроса, `access_token` необходимо поместить в заголовки (ключ `Authorization` с указанием типа `Bearer`), а в теле запроса указать все необходимые параметры метода. При этом не забудьте, что сервер ожидает перечисление параметров в формате `JSON`, кодировке `UTF-8` и по протоколу `HTTPS`.
**Базовый URL**
```http
{`https://api.pachca.com/api/shared/v1`}
```
**Пример запроса**
```http
{`POST /users HTTP/1.1
Authorization: Bearer Pm7gdycNeHV_F1y4_tjWWIutC0Aq0gwl9wRnX-KBuHw
Content-Type: application/json; charset=utf-8
Host: api.pachca.com
Connection: close
User-Agent: Paw/3.1.10 (Macintosh; OS X/10.15.3) GCDHTTPRequest
Content-Length: 219
{
"user": {
"first_name": "Олег",
"last_name": "Петров",
"email": "olegp@example.com",
"department": "Продукт",
"list_tags": ["Product", "Design"],
"custom_properties": [
{
"id": 1678,
"value": "Санкт-Петербург"
}
]
},
"skip_email_notify": true
}`}
```
## Обработка ответа метода API
Мы используем обычные коды ответов HTTP для обозначения результата выполнения запроса.
Ответ от сервера приходит в формате `JSON` и кодировке `UTF-8`.
При успешном ответе возвращаемый сервером результат будет представлен в теле ответа массивом `data`.
При ошибке выполнения запроса вы можете получить в теле ответа массив `errors` (подробнее об ошибках выполнения запросов вы можете прочитать в [следующем разделе](/guides/errors) документации).
**Пример ответа**
```http
{`HTTP/1.1 201 Created
Server: nginx/1.14.2
Date: Wed, 22 Apr 2020 12:32:29 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: close
ETag: W/"4d63aae1430a3bbd35e95e3db6b364df"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 12f8a05c-c5cf-4a79-8d2f-f82cc477c410
X-Runtime: 0.117503
Vary: Origin
X-Rack-CORS: miss; no-origin
{
"data": {
"id": 12,
"first_name": "Олег",
"last_name": "Петров",
"nickname": "",
"email": "olegp@example.com",
"phone_number": "",
"department": "Продукт",
"role": "admin",
"suspended": false,
"invite_status": "confirmed",
"list_tags": ["Product", "Design"],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Санкт-Петербург"
}
]
}
}`}
```
---
# Ошибки и лимиты
## Коды
Мы используем обычные коды ответов `HTTP` для обозначения результата выполнения запроса.
Коды группы `2**` указывают на успех. Коды группы `4**` указывают на ошибку запроса, который не удался с учетом предоставленной информации (например, обязательный параметр был пропущен, несуществующий идентификатор и др.). Коды группы `5**` указывают на ошибки на серверах Пачки (они редки).
### Коды ответов HTTP
| Код | Сообщение | Описание |
|-----|-----------|----------|
| 200 | OK | Запрос отработал как положено, без ошибок |
| 201 | Created | Запрос отработал успешно, сущность создана |
| 301 | Moved Permanently | Запрошенный ресурс был на постоянной основе перемещён в новое месторасположение (такой ответ вы можете получить если выполните запрос по протоколу HTTP, а не по HTTPS) |
| 400 | Bad Request | Неприемлемый запрос (часто из-за отсутствия обязательного параметра) |
| 401 | Unauthorized | Предоставлен недействительный токен доступа |
| 402 | Payment Required | Параметры действительны, но запрос не выполнен |
| 403 | Forbidden | Предоставленный токен доступа не имеет разрешений на выполнение запроса |
| 404 | Not Found | Запрашиваемый ресурс не существует |
| 409 | Conflict | Запрос конфликтует с другим запросом (возможно, из-за использования того же идемпотентного ключа) |
| 422 | Unprocessable Entity | С запросом все хорошо, но правила сервиса не позволяют его обработать (например, при попытке создания контакта с уже существующим номером телефона в базе) |
| 429 | Too Many Requests | Слишком много запросов слишком быстро попадают в API |
| 500, 502, 503, 504 | Server Errors | Что-то пошло не так на сервере Пачки (это редкость) |
## Пояснения ошибки
В зависимости от типа ошибки вы получите в теле ответа одну из следующих структур:
- **ApiError** — для кодов `400`, `403`, `404`, `409`, `410`, `422`. Содержит массив `errors` с детальной информацией об ошибках.
- **OAuthError** — для кода `401`. Содержит поля `error` и `error_description` с информацией об ошибке авторизации.
### ApiError (400, 403, 404, 409, 410, 422)
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### OAuthError (401)
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
## Лимиты
Мы следим за стабильностью API, поэтому есть лимиты на запросы (rate limiting). Они гибкие, зависят от нагрузки, но мы сделали их комфортными — должно хватить для любых ваших задач.
Если за секунду отправите больше 2 запросов на один идентификатор, лишние получат `429 Too Many Requests`. В заголовке `Retry-After` мы укажем, через сколько секунд можно попробовать снова.
### API
Если за секунду будет больше указанных запросов с одним токеном, API вернёт `429 Too Many Requests`. В заголовке `Retry-After` мы укажем, через сколько секунд можно попробовать снова.
- **Лимиты гибкие:** они ориентировочные и могут меняться, чтобы всё работало гладко;
- **Должно хватать на всё:** мы настроили их так, чтобы вам было комфортно в любых сценариях;
- **Если упёрлись в лимит:** при ошибке `429` смотрите заголовок `Retry-After` — он подскажет, через сколько секунд повторить запрос (или используйте экспоненциальный `backoff`, если хотите перестраховаться).
---
# Экспорт сообщений
#corporation_price_only #owner_access_token_required
Экспорт сообщений — это архив c файлами в формате `JSON`, где собраны все сообщения из всех чатов, которые были созданы в вашем пространстве.
В экспорте вам будут доступны все сообщения из открытых, закрытых и архивных чатов, в том числе треды. У каждого сообщения будет указан автор, время отправки, текст, список реакций на это сообщение.
Так же, в экспорте есть личные переписки, но в ограниченном формате. В них указан автор сообщения, время отправки, но нет контента сообщений и тредов. Эти данные полезны для оценки вовлеченность сотрудников их активности или оценке нагрузки на каждого из членов команды.
На основе выгрузки можно замерять количество сообщений и реакций в общих чатах. Так можно рассчитать Engagment Rate и улучшать корп. культуру/коммуникацию среди сотрудников. Ещё можно подсчитывать количество активных чатов и смотреть, насколько много в компании ведется обсуждений.
## Запрос экспорта
При запросе экспорта можно настроить период, за который вы хотите получить данные, но не более 45 дней. И можете добавить ID-чатов, из которых вы хотите получить экспорт. Если вам нужны данные за период дольше 45 дней, то по завершении одной выгрузки, можно запросить следующую с новым диапазоном дат.
При запросе экспорта важно учитывать следующие ограничения:
- выгружаются все чаты, в том числе архивные и личные без контента сообщений
- не выгружаются треды в личных сообщениях
- не учитываются вложения
- не отражаются пересланные сообщения
- максимальный период одной выгрузки: 45 дней (при запросе с указанием конкретных чатов - 366 дней)
- максимальный количество запрашиваемых чатов (при указании): 50
- новый запрос на экспорта вы сможете сделать после завершения текущего
Для запроса экспорта используйте метод [Экспорт сообщений](POST /chats/exports).
Экспорт выполняется асинхронно. На указанный `webhook_url` будет отправлен `JSON` с информацией о готовом экспорте.
**Пример JSON вебхука об успешном завершении экспорта**
```json
{`{
"type": "export",
"event": "ready",
"export_id": 22322,
"created_at": "2025-03-20T12:33:58Z"
}`}
```
## Скачивание готового архива
Получив `JSON` с информацией о готовом экспорте, вам необходимо взять значение поля `export_id` и выполнить запрос на скачивание архива сообщений, указав его в `URL` запроса.
Для скачивания архива используйте метод [Скачать архив экспорта](GET /chats/exports/{id}).
## Архив сообщений
Архив представляет собой папки, где каждая папка соответствует чату в вашем пространстве. Название папки состоит из имени чата и его `ID`, например: `Design_12925828`. Внутри папки будут `JSON`-файлы, которые соответствуют дате переписки. Каждый день — отдельный файл.
Дополнительно, рядом с папками будет находиться список чатов, которые попали в экспорт. Список чатов представлен файлом `chats.json`. Список не создается, если при запросе экспорта было указано `skip_chats_file` как `true`.
#### Структура данных в JSON-файлах сообщений
- `id` (integer, опциональный): Идентификатор сообщения
- Пример: `12345`
- `created_at` (string, date-time, опциональный): Дата и время создания сообщения (ISO-8601, UTC+0)
- Пример: `2024-01-15T10:30:00.000Z`
- `deleted_at` (string, date-time, опциональный): Дата и время удаления сообщения. Возвращается как null, если сообщение не удалено.
- `content` (string, опциональный): Текст сообщения
- Пример: `Привет! Как дела?`
- `thread_id` (integer, опциональный): Идентификатор треда сообщения. Возвращается как null, если у сообщения нет комментариев.
- `reactions` (array[object], опциональный): Массив списка реакций
- `user_id` (integer, опциональный): Идентификатор пользователя, который добавил реакцию
- `created_at` (string, опциональный): Дата и время добавления реакции (ISO-8601, UTC+0)
- `code` (string, опциональный): Emoji символ реакции
- Пример: `👍`
- `user` (object, опциональный): Информация об авторе сообщения
- `id` (integer, опциональный): Идентификатор пользователя
- `role` (string, опциональный): Тип автора
- **Возможные значения:**
- `member`: пользователь
- `bot`: бот
- `name` (string, опциональный): Имя
- `last_name` (string, опциональный): Фамилия
- `email` (string, опциональный): Электронная почта
- `tags` (array[string], опциональный): Массив тегов, привязанных к пользователю
- `chat` (object, опциональный): Информация о чате, в котором было написано сообщение
- `id` (integer, опциональный): Идентификатор чата
- `name` (string, опциональный): Название чата
- `personal` (boolean, опциональный): Тип чата
- **Возможные значения:**
- `true`: личный чат
- `false`: групповой чат
- `owner` (object, опциональный): Информация о владельце чата
- `id` (integer, опциональный): Идентификатор пользователя
- `role` (string, опциональный): Тип владельца
- **Возможные значения:**
- `member`: пользователь
- `bot`: бот
- `name` (string, опциональный): Имя
- `last_name` (string, опциональный): Фамилия
- `email` (string, опциональный): Электронная почта
- `tags` (array[string], опциональный): Массив тегов
- `tags` (array[string], опциональный): Массив тегов, привязанных к чату
- `thread` (object, опциональный): Тред, в котором находится сообщение. Возвращается как null, если сообщение находится не в треде.
- `id` (integer, опциональный): Идентификатор треда
- `message_id` (integer, опциональный): Идентификатор сообщения, под которым был начат тред
- `message_chat_id` (string, опциональный): Идентификатор чата, в котором был начат тред
Список в файле `chats.json` представляет собой массив объектов чатов. Структура каждого объекта чата описана ниже.
#### Структура объекта чата в массиве файла chats.json
- `id` (integer, опциональный): Идентификатор чата
- Пример: `67890`
- `personal` (boolean, опциональный): Тип чата
- **Возможные значения:**
- `true`: личный чат
- `false`: групповой чат
- `name` (string, опциональный): Название
- Пример: `Рабочий чат`
- `owner_id` (integer, опциональный): Идентификатор пользователя, создавшего чат
- Пример: `123`
- `members` (array[object], опциональный): Массив объектов участников чата
- `id` (integer, опциональный): Идентификатор пользователя
- `role` (string, опциональный): Роль в чате
- **Возможные значения:**
- `owner`: создатель
- `admin`: админ
- `editor`: редактор
- `member`: участник/подписчик
- `created_at` (string, date-time, опциональный): Дата и время создания чата (ISO-8601, UTC+0)
- Пример: `2024-01-10T08:00:00.000Z`
- `updated_at` (string, date-time, опциональный): Дата и время обновления чата (ISO-8601, UTC+0)
- Пример: `2024-01-15T12:00:00.000Z`
---
# Формы
Формы в Пачке позволяют вам отображать пользователям представления с указанным вами набором полей. Представления отображаются в виде модального окна, а результат заполнения формы вы можетет получить на свой сервер.
На текущий момент вызов модального окна с представлением возможен только через кнопки в сообщении бота.
## Модальное окно
Модальное окно состоит из стандартных элементов - заголовка, кнопки закрытия (отмены), набора полей (подзаголовки, текст, ввод текста, выбор, списки и тд.) и кнопки отправки.

## Жизненный цикл модального окна
Всё начинается с нажатия пользователем `Data-кнопки` кнопки в сообщении.
- В результате нажатия кнопки вашему приложению отправляется исходящий вебхук с уникальным `trigger_id`;
- Затем приложение фомирует представление и отправляет его, а пользователю отображается модальное окно;
- Далее пользователь заполняет поля и вашему приложению отправляется исходящий вебхук с данными заполненных пользователем полей в представлении;
- В ответе на вебхук ваше приложение может отправить список ошибок, которые необходимо отобразить пользателю в представлении, или ответить кодом 200 (после чего модальное окно будет закрыто).
## Блоки представления
Блоки - это компоненты представления, которые позволяют вам формировать необходимые поля ввода данных и отображать дополнительную пояснительную информацию. Они указываются в поле `view.blocks` при открытии представления. Вы можете добавить до **100 блоков** в одно представление.
### Заголовок (header)

#### ViewBlockHeader
- `type` (string, **обязательный**): Тип блока
- Пример: `header`
- **Возможные значения:**
- `header`: Для заголовков всегда header
- `text` (string, **обязательный**): Текст заголовка
- Пример: `Основная информация`
- Максимальная длина: 150 символов
### Обычный текст (plain_text)

#### ViewBlockPlainText
- `type` (string, **обязательный**): Тип блока
- Пример: `plain_text`
- **Возможные значения:**
- `plain_text`: Для обычного текста всегда plain_text
- `text` (string, **обязательный**): Текст
- Пример: `Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе.`
- Максимальная длина: 12000 символов
### Форматированный текст (markdown)

#### ViewBlockMarkdown
- `type` (string, **обязательный**): Тип блока
- Пример: `markdown`
- **Возможные значения:**
- `markdown`: Для форматированного текста всегда markdown
- `text` (string, **обязательный**): Текст
- Пример: `Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)`
- Максимальная длина: 12000 символов
В поле `text` вам необходимо прислать форматированный текст в синтаксисе `markdown`. Поддерживаются конструкции, указанные в таблице ниже.
| Элемент | Синтаксис | Результат |
|---------|-----------|----------|
| Жирный | `**текст**` или `__текст__` | **текст** |
| Курсив | `*текст*` или `_текст_` | *текст* |
| Ссылки | `[текст](url)` | [текст](url) |
| Маркированный список | `- пункт` | • пункт |
| Нумерованный список | `1. пункт` | 1. пункт |
| Зачеркнутый | `~~текст~~` | ~~текст~~ |
| Строчный код | `` `код` `` | `код` |
| Блок кода | ` ```код``` ` | код |
### Разделитель (divider)

#### ViewBlockDivider
- `type` (string, **обязательный**): Тип блока
- Пример: `divider`
- **Возможные значения:**
- `divider`: Для разделителя всегда divider
### Текстовое поле (input)

#### ViewBlockInput
- `type` (string, **обязательный**): Тип блока
- Пример: `input`
- **Возможные значения:**
- `input`: Для текстового поля всегда input
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем значения
- Пример: `info`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к полю
- Пример: `Описание отпуска`
- Максимальная длина: 150 символов
- `placeholder` (string, опциональный): Подсказка внутри поля ввода, пока оно пустое
- Пример: `Куда собираетесь и что будете делать`
- Максимальная длина: 150 символов
- `multiline` (boolean, опциональный): Многострочное поле. При значении true поле отображается многострочным.
- Пример: `true`
- `initial_value` (string, опциональный): Начальное значение в поле
- Максимальная длина: 3000 символов
- `min_length` (integer, int32, опциональный): Минимальная длина текста, который должен написать пользователь. Если пользователь напишет меньше, он получит ошибку.
- Минимум: 0
- Максимум: 3000
- `max_length` (integer, int32, опциональный): Максимальная длина текста, который должен написать пользователь. Если пользователь напишет больше, он получит ошибку.
- Минимум: 1
- Максимум: 3000
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- Пример: `true`
- `hint` (string, опциональный): Подсказка, которая отображается под полем серым цветом
- Пример: `Возможно вам подскаджут, какие места лучше посетить`
- Максимальная длина: 2000 символов
### Выпадающий список (select)

#### ViewBlockSelect
- `type` (string, **обязательный**): Тип блока
- Пример: `select`
- **Возможные значения:**
- `select`: Для выпадающего списка всегда select
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем выбора
- Пример: `team`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к выпадающему списку
- Пример: `Выберите команду`
- Максимальная длина: 150 символов
- `options` (array[object], опциональный): Массив доступных пунктов в выпадающем списке
- Максимум элементов: 100
- `text` (string, **обязательный**): Отображаемый текст
- Пример: `Ничего`
- Максимальная длина: 75 символов
- `value` (string, **обязательный**): Уникальное строковое значение, которое будет передано в ваше приложение при выборе этого пункта
- Пример: `nothing`
- Максимальная длина: 150 символов
- `description` (string, опциональный): Пояснение, которое будет указано серым цветом в этом пункте под отображаемым текстом
- Пример: `Каждый день бот будет присылать список новых задач в вашей команде`
- Максимальная длина: 75 символов
- `checked` (boolean, опциональный): Выбрано. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `selected` (boolean, опциональный): Начальный выбор. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- `hint` (string, опциональный): Подсказка, которая отображается под выпадающим списком серым цветом
- Максимальная длина: 2000 символов
### Радиокнопки (radio)

#### ViewBlockRadio
- `type` (string, **обязательный**): Тип блока
- Пример: `radio`
- **Возможные значения:**
- `radio`: Для радиокнопок всегда radio
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем выбора
- Пример: `accessibility`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к группе радиокнопок
- Пример: `Доступность`
- Максимальная длина: 150 символов
- `options` (array[object], опциональный): Массив радиокнопок
- Максимум элементов: 10
- `text` (string, **обязательный**): Отображаемый текст
- Пример: `Ничего`
- Максимальная длина: 75 символов
- `value` (string, **обязательный**): Уникальное строковое значение, которое будет передано в ваше приложение при выборе этого пункта
- Пример: `nothing`
- Максимальная длина: 150 символов
- `description` (string, опциональный): Пояснение, которое будет указано серым цветом в этом пункте под отображаемым текстом
- Пример: `Каждый день бот будет присылать список новых задач в вашей команде`
- Максимальная длина: 75 символов
- `checked` (boolean, опциональный): Выбрано. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `selected` (boolean, опциональный): Начальный выбор. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- Пример: `true`
- `hint` (string, опциональный): Подсказка, которая отображается под группой радиокнопок серым цветом
- Пример: `Если вы не планируете выходить на связь, то выберите вариант Ничего`
- Максимальная длина: 2000 символов
### Чекбоксы (checkbox)

#### ViewBlockCheckbox
- `type` (string, **обязательный**): Тип блока
- Пример: `checkbox`
- **Возможные значения:**
- `checkbox`: Для чекбоксов всегда checkbox
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем выбора
- Пример: `newsletters`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к группе чекбоксов
- Пример: `Рассылки`
- Максимальная длина: 150 символов
- `options` (array[object], опциональный): Массив чекбоксов
- Максимум элементов: 10
- `text` (string, **обязательный**): Отображаемый текст
- Пример: `Ничего`
- Максимальная длина: 75 символов
- `value` (string, **обязательный**): Уникальное строковое значение, которое будет передано в ваше приложение при выборе этого пункта
- Пример: `nothing`
- Максимальная длина: 150 символов
- `description` (string, опциональный): Пояснение, которое будет указано серым цветом в этом пункте под отображаемым текстом
- Пример: `Каждый день бот будет присылать список новых задач в вашей команде`
- Максимальная длина: 75 символов
- `checked` (boolean, опциональный): Выбрано. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `selected` (boolean, опциональный): Начальный выбор. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- `hint` (string, опциональный): Подсказка, которая отображается под группой чекбоксов серым цветом
- Максимальная длина: 2000 символов
### Выбор даты (date)

#### ViewBlockDate
- `type` (string, **обязательный**): Тип блока
- Пример: `date`
- **Возможные значения:**
- `date`: Для выбора даты всегда date
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем значения
- Пример: `date_start`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к полю
- Пример: `Дата начала отпуска`
- Максимальная длина: 150 символов
- `initial_date` (string, опциональный): Начальное значение в поле в формате YYYY-MM-DD
- Пример: `2025-07-01`
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- Пример: `true`
- `hint` (string, опциональный): Подсказка, которая отображается под полем серым цветом
- Максимальная длина: 2000 символов
### Выбор времени (time)

#### ViewBlockTime
- `type` (string, **обязательный**): Тип блока
- Пример: `time`
- **Возможные значения:**
- `time`: Для выбора времени всегда time
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем значения
- Пример: `newsletter_time`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к полю
- Пример: `Время рассылки`
- Максимальная длина: 150 символов
- `initial_time` (string, опциональный): Начальное значение в поле в формате HH:mm
- Пример: `11:00`
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- `hint` (string, опциональный): Подсказка, которая отображается под полем серым цветом
- Пример: `Укажите, в какое время присылать выбранные рассылки`
- Максимальная длина: 2000 символов
### Загрузка файлов (file_input)

#### ViewBlockFileInput
- `type` (string, **обязательный**): Тип блока
- Пример: `file_input`
- **Возможные значения:**
- `file_input`: Для загрузки файлов всегда file_input
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем значения
- Пример: `request_doc`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к полю
- Пример: `Заявление`
- Максимальная длина: 150 символов
- `filetypes` (array[string], опциональный): Массив допустимых расширений файлов, указанные в виде строк (например, ["png","jpg","gif"]). Если это поле не указано, все расширения файлов будут приняты.
- Пример: `["pdf","jpg","png"]`
- `max_files` (integer, int32, опциональный): Максимальное количество файлов, которое может загрузить пользователь в это поле.
- Пример: `1`
- По умолчанию: `10`
- Минимум: 1
- Максимум: 10
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- Пример: `true`
- `hint` (string, опциональный): Подсказка, которая отображается под полем серым цветом
- Пример: `Загрузите заполненное заявление с электронной подписью (в формате pdf, jpg или png)`
- Максимальная длина: 2000 символов
## Открытие представления
Чтобы открыть модальное окно с представлением, ваше приложение должно иметь действительный, неистекший `trigger_id`. Это требование связано с тем, чтобы приложение открывало модальное окно только с разрешения пользователя и делало это быстро.
Для открытия представления используйте метод [Открытие представления](POST /views/open).
> **Внимание:** С целью поддержания интерактивности и отзывчивости интерфейсов Пачки, срок жизни `trigger_id`
ограничен и составляет **3 секунды**
## Получение результатов
После заполнения пользователей полей в представлении и отправки их, в ваше приложение отправляется исходящий вебхук. Вебхук будет отправлен на `Webhook URL`, который вы указали в настройках бота во вкладке «Исходящий Webhook», от имени которого было отправлено сообщение с кнопкой (нажатие на которую и вызвало открытие представления).
Задача вашего приложения - обработать входяший вебхук в короткое время и дать ответ. Это может быть как успех и команда на закрытие представления пользователю в интерфейсе Пачки, так и набор ошибок, которые необходио отобразить пользователю в представлении.
Ваше приложение должно дать ответ на вебхук в течение **3 секунд**. В ином случае, пользователь получит ошибку отправки в интерфейсе Пачки. Все значения полей будут сохранены и **пользователь повторит попытку отправки формы**. О том, как закрыть представление или отобразить ошибки по конкретным полям, вы можете прочитать в разделе [Закрытие и отображение ошибок](#закрытие-и-отображение-ошибок).
Вебхук содержит информацию, которая была заложена при открытии представления пользователю (такие поля, как `private_metadata` и `callback_id`), и данные заполненных полей представления.
Каждый исходящий вебхук защищён с помощью подписи, основанной на хешировании содержимого. Подробнее об этом, а также о других методах проверки подлинности исходящего вебхука, вы можете прочитать в блоке Безопасность.
#### Структура исходящего вебхука о заполнении формы
- `type` (string, опциональный): Тип объекта (для представлений всегда view)
- **Возможные значения:**
- `view`: представление
- `event` (string, опциональный): Тип события (для отправки пользователем формы всегда submit)
- **Возможные значения:**
- `submit`: отправка формы
- `private_metadata` (string, опциональный): Строка, заданная при отправке представления
- Пример: `{"order_id": 123}`
- `callback_id` (string, опциональный): Идентификатор для распознавания этого представления, заданный при отправке представления
- Пример: `feedback_form`
- `user_id` (integer, опциональный): Идентификатор пользователя, который заполнил форму
- Пример: `456`
- `data` (object, опциональный): JSON карта заполненных полей представления, где каждый ключ - значение поля name.
- `name` (string | array of strings | array of objects | null | [], опциональный): Значение, которое указал пользователь в поле (или массив значений, если это был множественный выбор или загруженные пользователем файлы). Если пользователь не указал значение, тогда null (или пустой массив, если это поле файлов или чекбоксов)
- `webhook_timestamp` (integer, опциональный): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1705312200`
**Пример вебхука о заполнении формы**
```json
{`{
"type": "view",
"event": "submit",
"private_metadata": "{'timeoff_id':4378}",
"callback_id": "timeoff_reguest_form",
"user_id": 1235523,
"data": {
"date_start": "2025-07-01",
"date_end": "2025-07-14",
"request_doc": [{
"name": "request.png",
"size": 19153,
"url": ""
}],
"accessibility": "phone_only",
"info": "Поеду в сибирь на свадьбу лучшего друга",
"newsletters": ["new_tasks", "project_updates"],
"team": "success",
"time": "22:00"
},
"webhook_timestamp": 1755075544
}`}
```
> **Внимание:** Срок жизни прямых ссылкок на скачивание файлов ограничен и составляет **1 час**
## Закрытие и отображение ошибок
После заполнения пользователем полей в представлении в приложение будет отправлен исходящий вебхук. В этот момент вы можете сохранить полученные значения или провести валидацию правильности заполнения полей и отправить пользователю ошибки.
Вам необходимо оперативно ответить на вебхук (кодом `200` или `400` со списком ошибок). В ином случае, пользователь получит ошибку отправки в интерфейсе Пачки. Все значения полей будут сохранены и **пользователь повторит попытку отправки формы**.
> **Внимание:** С целью поддержания интерактивности и отзывчивости интерфейсов Пачки, время на ответ ограничего.
Ваше приложение должно дать ответ на вебхук в течение **3 секунд**.
### Закрытие представления
Если вы хотите просто закрыть пользователю представление (нет необходимости отображать ошибки), то ответ должен быть `HTTP 200 OK`. Никакое тело ответа не требуется.
**Пример ответа на вебхук для закрытия представления**
```http
{`HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Wed, 22 Apr 2025 12:32:29 GMT
Content-Type: text/plain; charset=utf-8`}
```
### Отображение ошибок
Если вы хотите отобразить пользователю ошибки заполнения конкретных полей представления, то ответ должен быть `HTTP 400 Bad Request`, а тело ответа содержать массив полей с указанием текста ошибки.
#### Тело ответа с указанием текста ошибки для каждого поля
- `errors` (object, опциональный): JSON карта ошибок для полей, где каждый ключ - name поля представления.
- `name` (string, опциональный): Текст ошибки, который отобразится под полем красным цветом
- Максимальная длина: 2000 символов
**Пример ответа на вебхук для отображения ошибок**
```http
{`HTTP/1.1 400 Bad Request
Server: nginx/1.14.2
Date: Wed, 22 Apr 2025 12:32:29 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: close
ETag: W/"4d63aae1430a3bbd35e95e3db6b364df"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 12f8a05c-c5cf-4a79-8d2f-f82cc477c410
X-Runtime: 0.117503
Vary: Origin
X-Rack-CORS: miss; no-origin
{"errors":{"date_end":"Дата окончания отпуска не может быть меньше даты начала","request_doc":"В заявлении не найдена электронная подпись"}}`}
```

---
# DLP-система
#corporation_price_only
Встроенная в Пачку DLP-система (Data Loss Prevention) позволяет вам построить защиту от утечек конфиденциальной информации без интеграции сторонних сервисов.
Управление правилами DLP-системы доступно в разделе «Настройки пространства» → «DLP». Вы можете изменять список правил, а также включать и отключать их.

## Создание правила
Чтобы внести новое правило нажмите на кнопку «Создать новое правило», укажите название правила (чтобы было проще его потом изменить или удалить), его приоритет и `JSON` объект условия.

Параметр «Приоритет» задает значение приоритета для политики, определяющее порядок её обработки. Меньшее целое число указывает на более высокий приоритет, значение 0 — на наивысший приоритет. Правила не могут иметь одинаковое значение приоритета.
`JSON` условие состоит из трёх полей: контекст применения правила (необязательное), условие срабатывания правила и действие при срабатывании правила. Параметры и пример условия вы можете посмотреть ниже.
## Структура правила
#### DlpRule
- `scope` (object, опциональный): Объект контекста применения правила
- `to_external` (boolean, опциональный): Применимость правила к внешним контактам. При значении true правило работает только при наличии гостей или мульти-гостей в чате.
- По умолчанию: `false`
- `channel_type` (array[string], опциональный): Массив типов чата, для которых будет работать правило
- `user_role` (array[string], опциональный): Массив ролей пользователя в чате, для которых будет работать правило
- `conditions` (object, **обязательный**): Объект условия срабатывания правила. Можно указать all, any или оба.
- `all` (array[object], опциональный): Массив условий (все должны совпасть)
- `type` (string, **обязательный**): Тип условия
- **Возможные значения:**
- `regex`: регулярное выражение
- `keyword`: ключевое слово
- `max_hits` (integer, опциональный): Максимальное количество совпадений
- `min_hits` (integer, опциональный): Минимальное количество совпадений
- По умолчанию: `1`
- `pattern` (string, опциональный): Регулярное выражение для поиска в тексте. Используется синтаксис Google RE2. Обязательно, если type указано как regex.
- `value` (string, опциональный): Ключевое слово для поиска в тексте. Обязательно, если type указано как keyword.
- `any` (array[object], опциональный): Массив условий (хотя бы одно должно совпасть)
- `type` (string, **обязательный**): Тип условия
- **Возможные значения:**
- `regex`: регулярное выражение
- `keyword`: ключевое слово
- `max_hits` (integer, опциональный): Максимальное количество совпадений
- `min_hits` (integer, опциональный): Минимальное количество совпадений
- По умолчанию: `1`
- `pattern` (string, опциональный): Регулярное выражение для поиска в тексте. Используется синтаксис Google RE2. Обязательно, если type указано как regex.
- `value` (string, опциональный): Ключевое слово для поиска в тексте. Обязательно, если type указано как keyword.
- `action` (object, **обязательный**): Объект действия при срабатывании правила
- `type` (string, **обязательный**): Тип действия
- **Возможные значения:**
- `BLOCK`: удалить текст сообщения
- `AUDIT_LOG`: добавить запись в журнал событий
- `message` (string, опциональный): Текст сообщения для пользователя
- Пример: `Сообщение заблокировано политикой безопасности`
**Пример правила #1**
```json
{`{
"conditions": {
"any": [
{
"type": "regex",
"pattern": "\\\\b(?:\\\\+7|7|8)\\\\s*\\\\(?\\\\d{3}\\\\)?\\\\s*\\\\d{3}[\\\\s-]*\\\\d{2}[\\\\s-]*\\\\d{2}\\\\b"
}
]
},
"action": {
"type": "AUDIT_LOG",
"message": "Обнаружен номер телефона в сообщении"
}
}`}
```
**Пример правила #2**
```json
{`{
"conditions": {
"all": [
{
"type": "keyword",
"value": "паспорт"
},
{
"type": "regex",
"pattern": "\\\\b\\\\d{4}\\\\s?\\\\d{6}\\\\b"
}
]
},
"action": {
"type": "BLOCK",
"message": "Нельзя отправлять паспортные данные"
}
}`}
```
---
# Пачка Audit Events API
#corporation_price_only #owner_access_token_required
`Audit events API` Пачки предоставляет командам безопасности доступ к логам о критически важных событиях в мессенджере. Это позволяет обеспечивать надежный мониторинг и соответствовать требованиям информационной безопасности и регуляторов.
Для получения логов событий на основе указанных фильтров используйте метод [Журнал аудита событий](GET /audit-events).
## Реализованные типы событий
В текущей версии API реализованы следующие типы событий:
### События аутентификации
- `user_login` - пользователь успешно вошел в систему
### События управления пользователями
- `user_created` - создана новая учетная запись пользователя
- `user_deleted` - учетная запись пользователя удалена
- `user_role_changed` - роль пользователя была изменена
### События управления тегами
- `tag_created` - создан новый тег
- `tag_deleted` - тег удален
- `user_added_to_tag` - пользователь добавлен в тег
- `user_removed_from_tag` - пользователь удален из тега
### События управления чатами
- `chat_created` - создан новый чат
- `chat_renamed` - чат переименован
- `chat_permission_changed` - изменены права доступа к чату
- `user_chat_join` - пользователь присоединился к чату
- `user_chat_leave` - пользователь покинул чат
- `tag_added_to_chat` - тег добавлен в чат
- `tag_removed_from_chat` - тег удален из чата
### События управления сообщениями
- `message_deleted` - сообщение удалено
### События безопасности
- `audit_events_accessed` - доступ к журналам аудита получен
- `dlp_violation_detected` - срабатывание правила [DLP-системы](/guides/dlp)
## Примеры использования
**Получение всех событий входа в систему за определенный период**
```bash
{`curl --location 'https://api.pachca.com/api/shared/v1/audit_events' \\
--header 'Authorization: ••••••' \\
--data-urlencode 'start_time=2025-05-01T00:00:00Z' \\
--data-urlencode 'end_time=2025-05-02T00:00:00Z' \\
--data-urlencode 'event_key=user_login' \\
--data-urlencode 'limit=50'`}
```
**Получение всех событий, связанных с конкретным пользователем**
```bash
{`curl --location 'https://api.pachca.com/api/shared/v1/audit_events' \\
--header 'Authorization: ••••••' \\
--data-urlencode 'actor_id=133321' \\
--data-urlencode 'actor_type=User' \\
--data-urlencode 'start_time=2025-05-01T00:00:00Z' \\
--data-urlencode 'end_time=2025-05-02T00:00:00Z'`}
```
**Получение всех изменений прав доступа к чатам**
```bash
{`curl --location 'https://api.pachca.com/api/shared/v1/audit_events' \\
--header 'Authorization: ••••••' \\
--data-urlencode 'event_key=chat_permission_changed' \\
--data-urlencode 'start_time=2025-05-01T00:00:00Z' \\
--data-urlencode 'end_time=2025-05-08T00:00:00Z'`}
```
## Хранение данных
Журналы аудита хранятся в течение 90 дней для баланса между требованиями соответствия и эффективностью хранения. Все журналы неизменяемы и хранятся в системе только для чтения, чтобы обеспечить целостность данных.
## Типичные сценарии использования
- Расследовать подозрительные попытки входа в систему
- Отслеживать изменения прав доступа
- Отслеживать действия по удалению сообщений
- Расследовать изменения ролей пользователей
- Отслеживать изменения в составе участников чатов
- Составлять отчеты о соответствии требованиям и во время аудита
## Ограничения
- Текущая версия API поддерживает только типы событий, указанные в документации
- Данные собираются только с 12 мая 2025 года
- За один запрос можно запросить только один тип события
- Список событий и фильтры планируется развивать в следующих версиях
---
# Последние обновления
Новые методы в API и дополнения в уже существующих
## Фильтрация тегов по названию
В запрос списка тегов было добавлено новое поле:
- `names`
С помощью этого поля вы можете отфильтровать список тегов по их названиям.
Был обновлен следующий метод:
- [Список тегов сотрудников](GET /group_tags)
## История событий бота
Были добавлены новые методы:
- [История событий](GET /webhooks/events)
- [Удаление события](DELETE /webhooks/events/{id})
С помощью этих методов вы можете получить список событий бота и удалить событие из этого списка.
## Новая пагинация в списке сотрудников
В запрос списка сотрудников были добавлены новые поля:
- `limit`
- `cursor`
Теперь этот запрос поддерживает курсорную пагинацию. Если вы использовали этот метод раньше — вам необходимо перейти на новый тип пагинации (постраничная пагинация будет поддерживаться ещё некоторое время).
Был обновлен следующий метод:
- [Список сотрудников](GET /users)
## Редактирование бота
Был добавлен новый метод:
- [Редактирование бота](PUT /bots/{id})
С помощью этого метода вы можете изменить параметры ботов, к которым у вас есть доступ.
## Обновленные лимиты запросов
Мы следим за стабильностью API, поэтому есть лимиты на запросы и мы вынуждены их менять, при этом оставляя их комфортными, чтобы вам хватало для любых задач.
С обновленными лимитами на запросы и входящие вебхуки вы можете ознакомиться на странице [Ошибки и лимиты](/guides/errors).
## Новая пагинация в списке чатов
В запрос списка чатов были добавлены новые поля:
- `limit`
- `cursor`
Теперь этот запрос поддерживает курсорную пагинацию. Если вы использовали этот метод раньше — вам необходимо перейти на новый тип пагинации (постраничная пагинация будет поддерживаться ещё некоторое время).
Был обновлен следующий метод:
- [Список чатов](GET /chats)
## Формы
Был добавлен новый раздел, посвященный работе с формами. Вы можете ознакомиться со следующими страницами:
- [Формы](/guides/forms)
- [Открытие представления](POST /views/open)
- [Получение результатов](/guides/webhook)
С помощью форм вы можете получать от пользователей данные через заданный вами набор полей и отображать дополнительную информацию в модальных окнах по запросу пользователей.
## Признак SSO авторизации
В объект `user` было добавлено новое поле:
- `sso`
Это поле позволяет узнать, используется ли для авторизации пользователя Single Sign-On.
Были обновлены следующие методы:
- [Новый сотрудник](POST /users)
- [Информация о сотруднике](GET /users/{id})
- [Список сотрудников](GET /users)
- [Редактирование сотрудника](PUT /users/{id})
- [Список сотрудников тега](GET /group_tags/{id}/users)
- [Список участников чата](GET /chats/{id}/members)
## Список участников чата
Был добавлен новый метод:
- [Список участников чата](GET /chats/{id}/members)
С помощью этого метода можно запросить список участников чата с фильтрацией по ролям в чате.
## Название реакции
В исходящий вебхук о добавлении и удалении реакций было добавлено новое поле:
- `name`
С помощью этого поля вы сможете получить точное название реакции. Актуальную документацию по исходящим вебхукам вы можете найти на странице [Исходящий Webhook](/guides/webhook).
## API Аудит Событий
Был добавлен новый раздел документации, посвященный API Аудит Событий. Этот раздел содержит подробную информацию о методах, которые позволяют отслеживать и получать данные о важных событиях, происходящих в вашем пространстве.
Новый раздел включает следующие методы:
- [Список событий аудита](GET /audit-events)
Эти методы предоставляют возможность контролировать активность пользователей и системные изменения, что критически важно для обеспечения безопасности и соответствия требованиям.
## Markdown версия документации
Мы добавили новые возможности для работы с документацией API, которые значительно упростят взаимодействие с AI-ассистентами:
- **Markdown-версия документации** — теперь вы можете получить markdown-версию любой страницы документации, добавив `.md` к URL или нажав на кнопку «Скопировать как .md» в правом верхнем углу страницы.
- **Полная документация в удобных форматах** — на главной странице документации вы найдете прямые ссылки для скачивания полной документации:
- `llms.txt` — краткая версия в формате markdown с сохранением ссылок
- `llms-full.txt` — полная версия в едином файле с оглавлением
## Сортировка сообщений
В запрос списка сообщений было добавлено новое поле:
- `sort[{field}]`
С помощью этого поля вы можете изменить порядок получаемых сообщений. На данный момент доступна сортировка по идентификатору сообщения (по возрастанию или по убыванию значения).
Был обновлен следующий метод:
- [Список сообщений чата](GET /chats/{id}/messages)
## Экспорт сообщений
Был добавлен новый метод:
- [Экспорт сообщений](POST /chats/exports)
С помощью этого метода Владелец пространства на тарифе «Корпорация» может запросить экспорт сообщений пространства в формате JSON файлов, упакованных в zip архив.
## Информация о профиле
Был добавлен новый метод:
- [Информация о профиле](GET /profile)
С помощью этого метода вы можете получить всю информацию о пользователе, `access_token` которого используется.
## Сортировка чатов
В поле `sort[{field}]` была добавлена поддержка нового значения:
- `last_message_at`
Это значение позволяет запрашивать список чатов, отсортированный по дате и времени создания последнего сообщения. При этом также поддерживаются сортировки по возрастанию и убыванию.
Был обновлен следующий метод:
- [Список чатов](GET /chats)
## Аватарки и имена отправителей
В объект `message` были добавлены новые поля:
- `display_avatar_url`
- `display_name`
Эти поля позволяют указать специальную аватарку и имя отправителя для сообщения. Доступно только при отправке и редактировании сообщения с использованием `access_token` бота.
## Ширина и высота изображения
В объекты файлов поля `message.files` были добавлены новые поля:
- `width`
- `height`
Эти поля позволяют указать ширину и высоту прикладываемого к сообщению изображения для корректного отображения предпросмотра.
## Ссылка на сообщение
В объект `message` было добавлено новое поле:
- `url`
Это поле позволяет получить прямую ссылку на сообщение.
## Дата последней активности пользователя
В объект `user` было добавлено новое поле:
- `last_activity_at`
Это поле позволяет получить дату последней активности пользователя.
---
# API Методы
## API: Common
# Экспорт сообщений
**Метод**: `POST`
**Путь**: `/chats/exports`
#corporation_price_only #owner_access_token_required
Метод для запрашивания экспорта сообщений за указанный период.
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `start_at` (string, date, **обязательный**): Дата начала для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD
- Пример: `2025-03-20`
- `end_at` (string, date, **обязательный**): Дата окончания для экспорта (ISO-8601, UTC+0) в формате YYYY-MM-DD
- Пример: `2025-03-20`
- `webhook_url` (string, **обязательный**): Адрес, на который будет отправлен вебхук по завершению экспорта
- Пример: `https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2`
- `chat_ids` (array[integer], опциональный): Массив идентификаторов чатов. Указывается, если нужно получить сообщения только некоторых чатов.
- Пример: `[1381521]`
- `skip_chats_file` (boolean, опциональный): Пропуск формирования файла со списком чатов (при значение true файл chats.json не будет создан)
- Пример: `false`
### Пример
```json
{
"start_at": "2025-03-20",
"end_at": "2025-03-20",
"webhook_url": "https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2",
"chat_ids": [
1381521
]
}
```
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/chats/exports" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"start_at": "2025-03-20",
"end_at": "2025-03-20",
"webhook_url": "https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2",
"chat_ids": [
1381521
]
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/exports', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"start_at": "2025-03-20",
"end_at": "2025-03-20",
"webhook_url": "https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2",
"chat_ids": [
1381521
]
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'start_at': '2025-03-20',
'end_at': '2025-03-20',
'webhook_url': 'https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2',
'chat_ids': [
1381521
]
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/chats/exports',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/exports',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"start_at": "2025-03-20",
"end_at": "2025-03-20",
"webhook_url": "https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2",
"chat_ids": [
1381521
]
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/exports')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'start_at' => '2025-03-20',
'end_at' => '2025-03-20',
'webhook_url' => 'https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2',
'chat_ids' => [
1381521
]
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/exports',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'start_at' => '2025-03-20',
'end_at' => '2025-03-20',
'webhook_url' => 'https://webhook.site/9227d3b8-6e82-4e64-bf5d-ad972ad270f2',
'chat_ids' => [
1381521
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 403: Access is forbidden.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Скачать архив экспорта
**Метод**: `GET`
**Путь**: `/chats/exports/{id}`
#corporation_price_only #owner_access_token_required
Метод для скачивания готового архива экспорта сообщений.
Для получения архива вам необходимо знать его `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор экспорта
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/chats/exports/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/exports/{id}', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/chats/exports/{id}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/exports/%7Bid%7D',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/exports/{id}')
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/exports/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 403: Access is forbidden.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Список дополнительных полей
**Метод**: `GET`
**Путь**: `/custom_properties`
#files_not_supported
Метод для получения актуального списка дополнительных полей участников и напоминаний в вашей компании.
По умолчанию в вашей компании все сущности имеют только базовые поля. Но администратор вашей компании может добавлять дополнительные поля, редактировать их и удалять. Если при создании сотрудников (или напоминаний) вы используете дополнительные поля, которые не являются актуальными (удалены или не существуют) - вы получите ошибку.
## Параметры
### Query параметры
- `entity_type` (string (enum: User, Task), **обязательный**): Тип сущности
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/custom_properties?entity_type=User" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/custom_properties?entity_type=User', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'entity_type': 'User',
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/custom_properties',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/custom_properties?entity_type=User',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/custom_properties')
params = {
'entity_type' => 'User',
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'User'];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/custom_properties?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (array[object], **обязательный**)
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `name` (string, **обязательный**): Название поля
- Пример: `Город`
- `data_type` (string, **обязательный**): Тип поля
- **Возможные значения:**
- `string`: Строковое значение
- `number`: Числовое значение
- `date`: Дата
- `link`: Ссылка
**Пример ответа:**
```json
{
"data": [
{
"id": 1487,
"name": "Адрес",
"data_type": "string"
},
{
"id": 1489,
"name": "Номер доступа",
"data_type": "number"
},
{
"id": 1572,
"name": "Дата рождения",
"data_type": "date"
}
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Загрузка файла
**Метод**: `POST`
**Путь**: `/direct_url`
#access_token_not_required
Для того чтобы прикрепить файл к сообщению или к другой сущности через API, требуется сначала загрузить файл на сервер (через метод получения подписи и ключа), а затем сформировать ссылку на него.
**Процесс загрузки состоит из трёх шагов:**
1. [Получение подписи, ключа и других параметров](POST /uploads) — сделать `POST`-запрос без тела запроса для получения параметров загрузки.
2. **Загрузка файла** — после получения всех параметров, нужно сделать `POST` запрос c форматом `multipart/form-data` на адрес `direct_url`, включая те же поля, что пришли (content-disposition, acl, policy, x-amz-credential, x-amz-algorithm, x-amz-date, x-amz-signature, key) и сам файл. При успешной загрузке — `HTTP` статус `204`, тело ответа отсутствует.
3. **Прикрепление файла к сообщению или другой сущности** — после загрузки файла, чтобы прикрепить его к сообщению или другой сущности API, необходимо сформировать путь файла. Для этого в поле `key`, полученном на этапе подписи, заменить шаблон `$filename` на фактическое имя файла. Пример: Если ваш файл называется `Логотип для сайта.png`, а в ответе на метод `/uploads` ключ был `attaches/files/93746/e354-...-5e6f/$filename`, итоговый ключ будет `attaches/files/93746/e354-...-5e6f/Логотип для сайта.png`.
## Тело запроса
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/direct_url" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/direct_url', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/direct_url',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/direct_url',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/direct_url')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/direct_url',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
---
# Получение подписи, ключа и других параметров
**Метод**: `POST`
**Путь**: `/uploads`
Метод для получения подписи, ключа и других параметров, необходимых для загрузки файла.
Данный метод необходимо использовать для загрузки каждого файла.
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/uploads" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/uploads', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/uploads',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/uploads',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/uploads')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/uploads',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `Content-Disposition` (string, **обязательный**): Используемый заголовок (в данном запросе — attachment)
- Пример: `attachment`
- `acl` (string, **обязательный**): Уровень безопасности (в данном запросе — private)
- Пример: `private`
- `policy` (string, **обязательный**): Уникальная policy для загрузки файла
- Пример: `eyJloNBpcmF0aW9uIjoiMjAyPi0xMi0wOFQwNjo1NzozNFHusCJjb82kaXRpb25zIjpbeyJidWNrZXQiOiJwYWNoY2EtcHJhYy11cGxvYWRzOu0sWyJzdGFydHMtd3l4aCIsIiRrZXkiLCJhdHRhY8hlcy9maWxlcy1xODUyMSJdLHsiQ29udGVudC1EaXNwb3NpdGlvbiI6ImF0dGFjaG1lbnQifSx2ImFjbCI3InByaXZhdGUifSx7IngtYW16LWNyZWRlbnRpYWwi2iIxNDIxNTVfc3RhcGx4LzIwMjIxMTI0L2J1LTFhL5MzL1F2czRfcmVxdWVzdCJ9LHsieC1hbXotYWxnb3JpdGhtIjytQVdTNC1ITUFDLVNIQTI1NiJ7LHsieC1hbXotZGF0ZSI6IjIwMjIxMTI0VDA2NTczNFoifV12`
- `x-amz-credential` (string, **обязательный**): x-amz-credential для загрузки файла
- Пример: `286471_server/20211122/kz-6x/s3/aws4_request`
- `x-amz-algorithm` (string, **обязательный**): Используемый алгоритм (в данном запросе — AWS4-HMAC-SHA256)
- Пример: `AWS4-HMAC-SHA256`
- `x-amz-date` (string, **обязательный**): Уникальный x-amz-date для загрузки файла
- Пример: `20211122T065734Z`
- `x-amz-signature` (string, **обязательный**): Уникальная подпись для загрузки файла
- Пример: `87e8f3ba4083c937c0e891d7a11tre932d8c33cg4bacf5380bf27624c1ok1475`
- `key` (string, **обязательный**): Уникальный ключ для загрузки файла
- Пример: `attaches/files/93746/e354fd79-4f3e-4b5a-9c8d-1a2b3c4d5e6f/$filename`
- `direct_url` (string, **обязательный**): Адрес для загрузки файла
- Пример: `https://api.pachca.com/api/v3/direct_upload`
**Пример ответа:**
```json
{
"Content-Disposition": "attachment",
"acl": "private",
"policy": "eyJloNBpcmF0aW9uIjoiMjAyPi0xMi0wOFQwNjo1NzozNFHusCJjb82kaXRpb25zIjpbeyJidWNrZXQiOiJwYWNoY2EtcHJhYy11cGxvYWRzOu0sWyJzdGFydHMtd3l4aCIsIiRrZXkiLCJhdHRhY8hlcy9maWxlcy1xODUyMSJdLHsiQ29udGVudC1EaXNwb3NpdGlvbiI6ImF0dGFjaG1lbnQifSx2ImFjbCI3InByaXZhdGUifSx7IngtYW16LWNyZWRlbnRpYWwi2iIxNDIxNTVfc3RhcGx4LzIwMjIxMTI0L2J1LTFhL5MzL1F2czRfcmVxdWVzdCJ9LHsieC1hbXotYWxnb3JpdGhtIjytQVdTNC1ITUFDLVNIQTI1NiJ7LHsieC1hbXotZGF0ZSI6IjIwMjIxMTI0VDA2NTczNFoifV12",
"x-amz-credential": "286471_server/20211122/kz-6x/s3/aws4_request",
"x-amz-algorithm": "AWS4-HMAC-SHA256",
"x-amz-date": "20211122T065734Z",
"x-amz-signature": "87e8f3ba4083c937c0e891d7a11tre932d8c33cg4bacf5380bf27624c1ok1475",
"key": "attaches/files/93746/e354fd79-9jh6-f2hd-fj83-709dae24c763/$filename",
"direct_url": "https://api.pachca.com/api/v3/direct_upload"
}
```
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
---
## API: Profile
# Информация о профиле
**Метод**: `GET`
**Путь**: `/profile`
Метод для получения информации о своем профиле.
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/profile" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/profile', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/profile',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/profile',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/profile')
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/profile',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Сотрудник
- `id` (integer, int32, **обязательный**): Идентификатор пользователя
- Пример: `12`
- `first_name` (string, **обязательный**): Имя
- Пример: `Олег`
- `last_name` (string, **обязательный**): Фамилия
- Пример: `Петров`
- `nickname` (string, **обязательный**): Имя пользователя
- Пример: ``
- `email` (string, **обязательный**): Электронная почта
- Пример: `olegp@example.com`
- `phone_number` (string, **обязательный**): Телефон
- Пример: ``
- `department` (string, **обязательный**): Департамент
- Пример: `Продукт`
- `title` (string, **обязательный**): Должность
- Пример: `CIO`
- `role` (string, **обязательный**): Уровень доступа
- **Возможные значения:**
- `admin`: Администратор
- `user`: Сотрудник
- `multi_guest`: Мульти-гость
- `suspended` (boolean, **обязательный**): Деактивация пользователя. При значении true пользователь является деактивированным.
- Пример: `false`
- `invite_status` (string, **обязательный**): Статус приглашения
- **Возможные значения:**
- `confirmed`: Принято
- `sent`: Отправлено
- `list_tags` (array[string], **обязательный**): Массив тегов, привязанных к сотруднику
- Пример: `["Product","Design"]`
- `custom_properties` (array[object], **обязательный**): Дополнительные поля сотрудника
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `name` (string, **обязательный**): Название поля
- Пример: `Город`
- `data_type` (string, **обязательный**): Тип поля
- **Возможные значения:**
- `string`: Строковое значение
- `number`: Числовое значение
- `date`: Дата
- `link`: Ссылка
- `value` (string, **обязательный**): Значение
- Пример: `Санкт-Петербург`
- `user_status` (object, **обязательный**): Статус. Возвращается как null, если статус не установлен.
- `emoji` (string, **обязательный**): Emoji символ статуса
- Пример: `🎮`
- `title` (string, **обязательный**): Текст статуса
- Пример: `Очень занят`
- `expires_at` (string, date-time, **обязательный**): Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ. Возвращается как null, если срок не установлен.
- Пример: `2024-04-08T10:00:00.000Z`
- `bot` (boolean, **обязательный**): Тип: пользователь (false) или бот (true)
- Пример: `false`
- `sso` (boolean, **обязательный**): Использует ли пользователь SSO
- Пример: `false`
- `created_at` (string, date-time, **обязательный**): Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2020-06-08T09:32:57.000Z`
- `last_activity_at` (string, date-time, **обязательный**): Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-01-20T13:40:07.000Z`
- `time_zone` (string, **обязательный**): Часовой пояс пользователя
- Пример: `Europe/Moscow`
- `image_url` (string, **обязательный**): Ссылка на скачивание аватарки пользователя
**Пример ответа:**
```json
{
"data": {
"id": 12,
"first_name": "Олег",
"last_name": "Петров",
"nickname": "",
"email": "olegp@example.com",
"phone_number": "",
"department": "Продукт",
"title": "CIO",
"role": "admin",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Product",
"Design"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Санкт-Петербург"
}
],
"user_status": null,
"bot": false,
"sso": false,
"created_at": "2020-06-08T09:32:57.000Z",
"last_activity_at": "2025-01-20T13:40:07.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
}
}
```
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
---
# Текущий статус
**Метод**: `GET`
**Путь**: `/profile/status`
Метод для получения информации о своем статусе.
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/profile/status" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/profile/status', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/profile/status',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/profile/status',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/profile/status')
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/profile/status',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Статус пользователя
- `emoji` (string, **обязательный**): Emoji символ статуса
- Пример: `🎮`
- `title` (string, **обязательный**): Текст статуса
- Пример: `Очень занят`
- `expires_at` (string, date-time, **обязательный**): Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ. Возвращается как null, если срок не установлен.
- Пример: `2024-04-08T10:00:00.000Z`
**Пример ответа:**
```json
{
"data": {
"emoji": "🎮",
"title": "Очень занят",
"expires_at": "2024-04-08T10:00:00.000Z"
}
}
```
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
---
# Новый статус
**Метод**: `PUT`
**Путь**: `/profile/status`
Метод для установки себе нового статуса.
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `status` (object, **обязательный**)
- `emoji` (string, **обязательный**): Emoji символ статуса
- `title` (string, **обязательный**): Текст статуса
- `expires_at` (string, date-time, опциональный): Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
### Пример
```json
{
"status": {
"emoji": "🎮",
"title": "Очень занят",
"expires_at": "2024-04-08T10:00:00.000Z"
}
}
```
## Примеры запроса
### cURL
```bash
curl -X PUT "https://api.pachca.com/api/shared/v1/profile/status" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"status": {
"emoji": "🎮",
"title": "Очень занят",
"expires_at": "2024-04-08T10:00:00.000Z"
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/profile/status', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"status": {
"emoji": "🎮",
"title": "Очень занят",
"expires_at": "2024-04-08T10:00:00.000Z"
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'status': {
'emoji': '🎮',
'title': 'Очень занят',
'expires_at': '2024-04-08T10:00:00.000Z'
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.put(
'https://api.pachca.com/api/shared/v1/profile/status',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/profile/status',
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"status": {
"emoji": "🎮",
"title": "Очень занят",
"expires_at": "2024-04-08T10:00:00.000Z"
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/profile/status')
request = Net::HTTP::Put.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'status' => {
'emoji' => '🎮',
'title' => 'Очень занят',
'expires_at' => '2024-04-08T10:00:00.000Z'
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/profile/status',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'status' => [
'emoji' => '🎮',
'title' => 'Очень занят',
'expires_at' => '2024-04-08T10:00:00.000Z'
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Статус пользователя
- `emoji` (string, **обязательный**): Emoji символ статуса
- Пример: `🎮`
- `title` (string, **обязательный**): Текст статуса
- Пример: `Очень занят`
- `expires_at` (string, date-time, **обязательный**): Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ. Возвращается как null, если срок не установлен.
- Пример: `2024-04-08T10:00:00.000Z`
**Пример ответа:**
```json
{
"data": {
"emoji": "🎮",
"title": "Очень занят",
"expires_at": "2024-04-08T10:00:00.000Z"
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Удаление статуса
**Метод**: `DELETE`
**Путь**: `/profile/status`
Метод для удаления своего статуса.
## Примеры запроса
### cURL
```bash
curl -X DELETE "https://api.pachca.com/api/shared/v1/profile/status" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/profile/status', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.delete(
'https://api.pachca.com/api/shared/v1/profile/status',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/profile/status',
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/profile/status')
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/profile/status',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
---
## API: Users
# Создать сотрудника
**Метод**: `POST`
**Путь**: `/users`
#admin_access_token_required
Метод для создания нового сотрудника в вашей компании.
Вы можете заполнять дополнительные поля сотрудника, которые созданы в вашей компании. Получить актуальный список идентификаторов дополнительных полей сотрудника вы можете в методе [Список дополнительных полей](GET /custom_properties).
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `user` (object, **обязательный**)
- `first_name` (string, **обязательный**): Имя
- Пример: `Олег`
- `last_name` (string, опциональный): Фамилия
- Пример: `Петров`
- `email` (string, **обязательный**): Электронная почта
- Пример: `olegp@example.com`
- `phone_number` (string, опциональный): Телефон
- `nickname` (string, опциональный): Имя пользователя
- `department` (string, опциональный): Департамент
- Пример: `Продукт`
- `title` (string, опциональный): Должность
- `role` (string, опциональный): Уровень доступа
- **Возможные значения:**
- `admin`: Администратор
- `user`: Сотрудник
- `multi_guest`: Мульти-гость
- `list_tags` (array[string], опциональный): Массив тегов, привязываемых к сотруднику
- Пример: `["Product","Design"]`
- `custom_properties` (array[object], опциональный): Задаваемые дополнительные поля
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `value` (string, **обязательный**): Устанавливаемое значение
- Пример: `Санкт-Петербург`
- `skip_email_notify` (boolean, опциональный): Пропуск этапа отправки приглашения сотруднику (при значении true сотруднику не будет отправлено письмо на электронную почту с приглашением создать аккаунт). Данный параметр полезен в случае предварительного создания аккаунтов сотрудникам перед их входом через SSO.
- Пример: `true`
### Пример
```json
{
"user": {
"first_name": "Олег",
"last_name": "Петров",
"email": "olegp@example.com",
"department": "Продукт",
"list_tags": [
"Product",
"Design"
],
"custom_properties": [
{
"id": 1678,
"value": "Санкт-Петербург"
}
]
},
"skip_email_notify": true
}
```
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/users" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"user": {
"first_name": "Олег",
"last_name": "Петров",
"email": "olegp@example.com",
"department": "Продукт",
"list_tags": [
"Product",
"Design"
],
"custom_properties": [
{
"id": 1678,
"value": "Санкт-Петербург"
}
]
},
"skip_email_notify": true
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/users', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"user": {
"first_name": "Олег",
"last_name": "Петров",
"email": "olegp@example.com",
"department": "Продукт",
"list_tags": [
"Product",
"Design"
],
"custom_properties": [
{
"id": 1678,
"value": "Санкт-Петербург"
}
]
},
"skip_email_notify": true
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'user': {
'first_name': 'Олег',
'last_name': 'Петров',
'email': 'olegp@example.com',
'department': 'Продукт',
'list_tags': [
'Product',
'Design'
],
'custom_properties': [
{
'id': 1678,
'value': 'Санкт-Петербург'
}
]
},
'skip_email_notify': True
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/users',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/users',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"user": {
"first_name": "Олег",
"last_name": "Петров",
"email": "olegp@example.com",
"department": "Продукт",
"list_tags": [
"Product",
"Design"
],
"custom_properties": [
{
"id": 1678,
"value": "Санкт-Петербург"
}
]
},
"skip_email_notify": true
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/users')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'user' => {
'first_name' => 'Олег',
'last_name' => 'Петров',
'email' => 'olegp@example.com',
'department' => 'Продукт',
'list_tags' => [
'Product',
'Design'
],
'custom_properties' => [
{
'id' => 1678,
'value' => 'Санкт-Петербург'
}
]
},
'skip_email_notify' => true
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/users',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'user' => [
'first_name' => 'Олег',
'last_name' => 'Петров',
'email' => 'olegp@example.com',
'department' => 'Продукт',
'list_tags' => [
'Product',
'Design'
],
'custom_properties' => [
[
'id' => 1678,
'value' => 'Санкт-Петербург'
]
]
],
'skip_email_notify' => true
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Сотрудник
- `id` (integer, int32, **обязательный**): Идентификатор пользователя
- Пример: `12`
- `first_name` (string, **обязательный**): Имя
- Пример: `Олег`
- `last_name` (string, **обязательный**): Фамилия
- Пример: `Петров`
- `nickname` (string, **обязательный**): Имя пользователя
- Пример: ``
- `email` (string, **обязательный**): Электронная почта
- Пример: `olegp@example.com`
- `phone_number` (string, **обязательный**): Телефон
- Пример: ``
- `department` (string, **обязательный**): Департамент
- Пример: `Продукт`
- `title` (string, **обязательный**): Должность
- Пример: `CIO`
- `role` (string, **обязательный**): Уровень доступа
- **Возможные значения:**
- `admin`: Администратор
- `user`: Сотрудник
- `multi_guest`: Мульти-гость
- `suspended` (boolean, **обязательный**): Деактивация пользователя. При значении true пользователь является деактивированным.
- Пример: `false`
- `invite_status` (string, **обязательный**): Статус приглашения
- **Возможные значения:**
- `confirmed`: Принято
- `sent`: Отправлено
- `list_tags` (array[string], **обязательный**): Массив тегов, привязанных к сотруднику
- Пример: `["Product","Design"]`
- `custom_properties` (array[object], **обязательный**): Дополнительные поля сотрудника
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `name` (string, **обязательный**): Название поля
- Пример: `Город`
- `data_type` (string, **обязательный**): Тип поля
- **Возможные значения:**
- `string`: Строковое значение
- `number`: Числовое значение
- `date`: Дата
- `link`: Ссылка
- `value` (string, **обязательный**): Значение
- Пример: `Санкт-Петербург`
- `user_status` (object, **обязательный**): Статус. Возвращается как null, если статус не установлен.
- `emoji` (string, **обязательный**): Emoji символ статуса
- Пример: `🎮`
- `title` (string, **обязательный**): Текст статуса
- Пример: `Очень занят`
- `expires_at` (string, date-time, **обязательный**): Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ. Возвращается как null, если срок не установлен.
- Пример: `2024-04-08T10:00:00.000Z`
- `bot` (boolean, **обязательный**): Тип: пользователь (false) или бот (true)
- Пример: `false`
- `sso` (boolean, **обязательный**): Использует ли пользователь SSO
- Пример: `false`
- `created_at` (string, date-time, **обязательный**): Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2020-06-08T09:32:57.000Z`
- `last_activity_at` (string, date-time, **обязательный**): Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-01-20T13:40:07.000Z`
- `time_zone` (string, **обязательный**): Часовой пояс пользователя
- Пример: `Europe/Moscow`
- `image_url` (string, **обязательный**): Ссылка на скачивание аватарки пользователя
**Пример ответа:**
```json
{
"data": {
"id": 12,
"first_name": "Олег",
"last_name": "Петров",
"nickname": "",
"email": "olegp@example.com",
"phone_number": "",
"department": "Продукт",
"title": "",
"role": "admin",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Product",
"Design"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Санкт-Петербург"
}
],
"user_status": null,
"bot": false,
"sso": false,
"created_at": "2023-06-08T09:31:17.000Z",
"last_activity_at": "2023-06-08T09:31:17.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Список сотрудников
**Метод**: `GET`
**Путь**: `/users`
Метод для получения актуального списка сотрудников вашей компании.
## Параметры
### Query параметры
- `query` (string, опциональный): Поисковая фраза для фильтрации результатов (поиск идет по полям first_name (имя), last_name (фамилия), email (электронная почта), phone_number (телефон) и nickname (никнейм))
- `limit` (integer, опциональный): Количество возвращаемых сущностей за один запрос
- По умолчанию: `50`
- `cursor` (string, опциональный): Курсор для пагинации (из meta.paginate.next_page)
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/users?query=user%40example.com&limit=50&cursor=string" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/users?query=user%40example.com&limit=50&cursor=string', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'query': 'user@example.com',
'limit': 50,
'cursor': 'string',
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/users',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/users?query=user%40example.com&limit=50&cursor=string',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/users')
params = {
'query' => 'user@example.com',
'limit' => 50,
'cursor' => 'string',
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'user@example.com', 'limit' => 50, 'cursor' => 'string'];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/users?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `meta` (object, опциональный): Метаданные пагинации
- `paginate` (object, опциональный): Вспомогательная информация
- `next_page` (string, опциональный): Курсор пагинации следующей страницы
- Пример: `eyJxZCO2MiwiZGlyIjomSNYjIn3`
- `data` (array[object], **обязательный**)
- `id` (integer, int32, **обязательный**): Идентификатор пользователя
- Пример: `12`
- `first_name` (string, **обязательный**): Имя
- Пример: `Олег`
- `last_name` (string, **обязательный**): Фамилия
- Пример: `Петров`
- `nickname` (string, **обязательный**): Имя пользователя
- Пример: ``
- `email` (string, **обязательный**): Электронная почта
- Пример: `olegp@example.com`
- `phone_number` (string, **обязательный**): Телефон
- Пример: ``
- `department` (string, **обязательный**): Департамент
- Пример: `Продукт`
- `title` (string, **обязательный**): Должность
- Пример: `CIO`
- `role` (string, **обязательный**): Уровень доступа
- **Возможные значения:**
- `admin`: Администратор
- `user`: Сотрудник
- `multi_guest`: Мульти-гость
- `suspended` (boolean, **обязательный**): Деактивация пользователя. При значении true пользователь является деактивированным.
- Пример: `false`
- `invite_status` (string, **обязательный**): Статус приглашения
- **Возможные значения:**
- `confirmed`: Принято
- `sent`: Отправлено
- `list_tags` (array[string], **обязательный**): Массив тегов, привязанных к сотруднику
- Пример: `["Product","Design"]`
- `custom_properties` (array[object], **обязательный**): Дополнительные поля сотрудника
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `name` (string, **обязательный**): Название поля
- Пример: `Город`
- `data_type` (string, **обязательный**): Тип поля
- **Возможные значения:**
- `string`: Строковое значение
- `number`: Числовое значение
- `date`: Дата
- `link`: Ссылка
- `value` (string, **обязательный**): Значение
- Пример: `Санкт-Петербург`
- `user_status` (object, **обязательный**): Статус. Возвращается как null, если статус не установлен.
- `emoji` (string, **обязательный**): Emoji символ статуса
- Пример: `🎮`
- `title` (string, **обязательный**): Текст статуса
- Пример: `Очень занят`
- `expires_at` (string, date-time, **обязательный**): Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ. Возвращается как null, если срок не установлен.
- Пример: `2024-04-08T10:00:00.000Z`
- `bot` (boolean, **обязательный**): Тип: пользователь (false) или бот (true)
- Пример: `false`
- `sso` (boolean, **обязательный**): Использует ли пользователь SSO
- Пример: `false`
- `created_at` (string, date-time, **обязательный**): Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2020-06-08T09:32:57.000Z`
- `last_activity_at` (string, date-time, **обязательный**): Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-01-20T13:40:07.000Z`
- `time_zone` (string, **обязательный**): Часовой пояс пользователя
- Пример: `Europe/Moscow`
- `image_url` (string, **обязательный**): Ссылка на скачивание аватарки пользователя
**Пример ответа:**
```json
{
"meta": {
"paginate": {
"next_page": "eyJxZCO2MiwiZGlyIjomSNYjIn3"
}
},
"data": [
{
"id": 12,
"first_name": "Олег",
"last_name": "Петров",
"nickname": "olegpetrov",
"email": "olegp@example.com",
"phone_number": "",
"department": "Продукт",
"title": "CIO",
"role": "admin",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Product",
"Design"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Санкт-Петербург"
}
],
"user_status": null,
"bot": false,
"sso": false,
"created_at": "2020-06-08T09:10:11.000Z",
"last_activity_at": "2025-01-20T13:40:07.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
},
{
"id": 13,
"first_name": "Сергей",
"last_name": "Кузнецов",
"nickname": "skuz",
"email": "sergkuzn@example.com",
"phone_number": "",
"department": "Разработка",
"title": "iOS Developer",
"role": "user",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Development",
"Android"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Москва"
}
],
"user_status": {
"emoji": "🎮",
"title": "Очень занят",
"expires_at": "2024-04-08T10:00:00.000Z"
},
"bot": false,
"sso": false,
"created_at": "2020-06-08T09:31:17.000Z",
"last_activity_at": "2025-01-20T07:00:32.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
},
{
"id": 14,
"first_name": "Дмитрий",
"last_name": "Смирнов",
"nickname": "dsmir",
"email": "ds@example.com",
"phone_number": "",
"department": "Разработка",
"title": "Android Developer",
"role": "user",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Development",
"Frontend"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Санкт-Петербург"
}
],
"user_status": {
"emoji": "🚀",
"title": "Лечу",
"expires_at": null
},
"bot": false,
"sso": false,
"created_at": "2020-06-08T09:32:57.000Z",
"last_activity_at": "2025-01-20T13:51:25.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
}
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Информация о сотруднике
**Метод**: `GET`
**Путь**: `/users/{id}`
Метод для получения информации о сотруднике.
Для получения сотрудника вам необходимо знать его `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор пользователя
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/users/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/users/{id}', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/users/{id}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/users/%7Bid%7D',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/users/{id}')
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/users/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Сотрудник
- `id` (integer, int32, **обязательный**): Идентификатор пользователя
- Пример: `12`
- `first_name` (string, **обязательный**): Имя
- Пример: `Олег`
- `last_name` (string, **обязательный**): Фамилия
- Пример: `Петров`
- `nickname` (string, **обязательный**): Имя пользователя
- Пример: ``
- `email` (string, **обязательный**): Электронная почта
- Пример: `olegp@example.com`
- `phone_number` (string, **обязательный**): Телефон
- Пример: ``
- `department` (string, **обязательный**): Департамент
- Пример: `Продукт`
- `title` (string, **обязательный**): Должность
- Пример: `CIO`
- `role` (string, **обязательный**): Уровень доступа
- **Возможные значения:**
- `admin`: Администратор
- `user`: Сотрудник
- `multi_guest`: Мульти-гость
- `suspended` (boolean, **обязательный**): Деактивация пользователя. При значении true пользователь является деактивированным.
- Пример: `false`
- `invite_status` (string, **обязательный**): Статус приглашения
- **Возможные значения:**
- `confirmed`: Принято
- `sent`: Отправлено
- `list_tags` (array[string], **обязательный**): Массив тегов, привязанных к сотруднику
- Пример: `["Product","Design"]`
- `custom_properties` (array[object], **обязательный**): Дополнительные поля сотрудника
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `name` (string, **обязательный**): Название поля
- Пример: `Город`
- `data_type` (string, **обязательный**): Тип поля
- **Возможные значения:**
- `string`: Строковое значение
- `number`: Числовое значение
- `date`: Дата
- `link`: Ссылка
- `value` (string, **обязательный**): Значение
- Пример: `Санкт-Петербург`
- `user_status` (object, **обязательный**): Статус. Возвращается как null, если статус не установлен.
- `emoji` (string, **обязательный**): Emoji символ статуса
- Пример: `🎮`
- `title` (string, **обязательный**): Текст статуса
- Пример: `Очень занят`
- `expires_at` (string, date-time, **обязательный**): Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ. Возвращается как null, если срок не установлен.
- Пример: `2024-04-08T10:00:00.000Z`
- `bot` (boolean, **обязательный**): Тип: пользователь (false) или бот (true)
- Пример: `false`
- `sso` (boolean, **обязательный**): Использует ли пользователь SSO
- Пример: `false`
- `created_at` (string, date-time, **обязательный**): Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2020-06-08T09:32:57.000Z`
- `last_activity_at` (string, date-time, **обязательный**): Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-01-20T13:40:07.000Z`
- `time_zone` (string, **обязательный**): Часовой пояс пользователя
- Пример: `Europe/Moscow`
- `image_url` (string, **обязательный**): Ссылка на скачивание аватарки пользователя
**Пример ответа:**
```json
{
"data": {
"id": 12,
"first_name": "Олег",
"last_name": "Петров",
"nickname": "",
"email": "olegp@example.com",
"phone_number": "",
"department": "Продукт",
"title": "CIO",
"role": "admin",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Product",
"Design"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Санкт-Петербург"
}
],
"user_status": null,
"bot": false,
"sso": false,
"created_at": "2020-06-08T09:32:57.000Z",
"last_activity_at": "2025-01-20T13:40:07.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
}
}
```
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Редактирование сотрудника
**Метод**: `PUT`
**Путь**: `/users/{id}`
#admin_access_token_required
Метод для редактирования сотрудника.
Для редактирования сотрудника вам необходимо знать его `id` и указать его в `URL` запроса. Все редактируемые параметры сотрудника указываются в теле запроса. Получить актуальный список идентификаторов дополнительных полей сотрудника вы можете в методе [Список дополнительных полей](GET /custom_properties).
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор пользователя
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `user` (object, **обязательный**): Собранный объект параметров редактируемого сотрудника
- `first_name` (string, опциональный): Имя
- Пример: `Олег`
- `last_name` (string, опциональный): Фамилия
- Пример: `Петров`
- `email` (string, опциональный): Электронная почта
- Пример: `olegpetrov@example.com`
- `phone_number` (string, опциональный): Телефон
- Пример: `+79001234567`
- `nickname` (string, опциональный): Имя пользователя
- Пример: `olegpetrov`
- `department` (string, опциональный): Департамент
- Пример: `Отдел разработки`
- `title` (string, опциональный): Должность
- Пример: `Старший разработчик`
- `role` (string, опциональный): Уровень доступа
- Пример: `user`
- **Возможные значения:**
- `admin`: Администратор
- `user`: Сотрудник
- `multi_guest`: Мульти-гость
- `suspended` (boolean, опциональный): Деактивация пользователя. При значении true пользователь является деактивированным.
- Пример: `false`
- `list_tags` (array[string], опциональный): Массив тегов, привязываемых к сотруднику
- Пример: `["Product"]`
- `custom_properties` (array[object], опциональный): Задаваемые дополнительные поля
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `value` (string, **обязательный**): Устанавливаемое значение
- Пример: `Санкт-Петербург`
### Пример
```json
{
"user": {
"nickname": "olegpetrov",
"role": "user",
"list_tags": [
"Product"
]
}
}
```
## Примеры запроса
### cURL
```bash
curl -X PUT "https://api.pachca.com/api/shared/v1/users/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"user": {
"nickname": "olegpetrov",
"role": "user",
"list_tags": [
"Product"
]
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/users/{id}', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"user": {
"nickname": "olegpetrov",
"role": "user",
"list_tags": [
"Product"
]
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'user': {
'nickname': 'olegpetrov',
'role': 'user',
'list_tags': [
'Product'
]
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.put(
'https://api.pachca.com/api/shared/v1/users/{id}',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/users/%7Bid%7D',
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"user": {
"nickname": "olegpetrov",
"role": "user",
"list_tags": [
"Product"
]
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/users/{id}')
request = Net::HTTP::Put.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'user' => {
'nickname' => 'olegpetrov',
'role' => 'user',
'list_tags' => [
'Product'
]
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/users/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'user' => [
'nickname' => 'olegpetrov',
'role' => 'user',
'list_tags' => [
'Product'
]
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Сотрудник
- `id` (integer, int32, **обязательный**): Идентификатор пользователя
- Пример: `12`
- `first_name` (string, **обязательный**): Имя
- Пример: `Олег`
- `last_name` (string, **обязательный**): Фамилия
- Пример: `Петров`
- `nickname` (string, **обязательный**): Имя пользователя
- Пример: ``
- `email` (string, **обязательный**): Электронная почта
- Пример: `olegp@example.com`
- `phone_number` (string, **обязательный**): Телефон
- Пример: ``
- `department` (string, **обязательный**): Департамент
- Пример: `Продукт`
- `title` (string, **обязательный**): Должность
- Пример: `CIO`
- `role` (string, **обязательный**): Уровень доступа
- **Возможные значения:**
- `admin`: Администратор
- `user`: Сотрудник
- `multi_guest`: Мульти-гость
- `suspended` (boolean, **обязательный**): Деактивация пользователя. При значении true пользователь является деактивированным.
- Пример: `false`
- `invite_status` (string, **обязательный**): Статус приглашения
- **Возможные значения:**
- `confirmed`: Принято
- `sent`: Отправлено
- `list_tags` (array[string], **обязательный**): Массив тегов, привязанных к сотруднику
- Пример: `["Product","Design"]`
- `custom_properties` (array[object], **обязательный**): Дополнительные поля сотрудника
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `name` (string, **обязательный**): Название поля
- Пример: `Город`
- `data_type` (string, **обязательный**): Тип поля
- **Возможные значения:**
- `string`: Строковое значение
- `number`: Числовое значение
- `date`: Дата
- `link`: Ссылка
- `value` (string, **обязательный**): Значение
- Пример: `Санкт-Петербург`
- `user_status` (object, **обязательный**): Статус. Возвращается как null, если статус не установлен.
- `emoji` (string, **обязательный**): Emoji символ статуса
- Пример: `🎮`
- `title` (string, **обязательный**): Текст статуса
- Пример: `Очень занят`
- `expires_at` (string, date-time, **обязательный**): Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ. Возвращается как null, если срок не установлен.
- Пример: `2024-04-08T10:00:00.000Z`
- `bot` (boolean, **обязательный**): Тип: пользователь (false) или бот (true)
- Пример: `false`
- `sso` (boolean, **обязательный**): Использует ли пользователь SSO
- Пример: `false`
- `created_at` (string, date-time, **обязательный**): Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2020-06-08T09:32:57.000Z`
- `last_activity_at` (string, date-time, **обязательный**): Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-01-20T13:40:07.000Z`
- `time_zone` (string, **обязательный**): Часовой пояс пользователя
- Пример: `Europe/Moscow`
- `image_url` (string, **обязательный**): Ссылка на скачивание аватарки пользователя
**Пример ответа:**
```json
{
"data": {
"id": 12,
"first_name": "Олег",
"last_name": "Петров",
"nickname": "olegpetrov",
"email": "olegp@example.com",
"phone_number": "",
"department": "Продукт",
"title": "CIO",
"role": "user",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Product"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Санкт-Петербург"
}
],
"user_status": null,
"bot": false,
"sso": false,
"created_at": "2023-07-08T09:31:17.000Z",
"last_activity_at": "2025-01-20T13:40:07.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Удаление сотрудника
**Метод**: `DELETE`
**Путь**: `/users/{id}`
#admin_access_token_required
Метод для удаления сотрудника.
Для удаления сотрудника вам необходимо знать его `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор пользователя
## Примеры запроса
### cURL
```bash
curl -X DELETE "https://api.pachca.com/api/shared/v1/users/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/users/{id}', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.delete(
'https://api.pachca.com/api/shared/v1/users/{id}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/users/%7Bid%7D',
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/users/{id}')
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/users/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Group tags
# Новый тег
**Метод**: `POST`
**Путь**: `/group_tags`
#admin_access_token_required
Метод для создания нового тега.
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `group_tag` (object, **обязательный**)
- `name` (string, **обязательный**): Название тега
- Пример: `Новое название тега`
### Пример
```json
{
"group_tag": {
"name": "Название тега"
}
}
```
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/group_tags" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"group_tag": {
"name": "Название тега"
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/group_tags', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"group_tag": {
"name": "Название тега"
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'group_tag': {
'name': 'Название тега'
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/group_tags',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/group_tags',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"group_tag": {
"name": "Название тега"
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/group_tags')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'group_tag' => {
'name' => 'Название тега'
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/group_tags',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'group_tag' => [
'name' => 'Название тега'
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 201: The request has succeeded and a new resource has been created as a result.
**Схема ответа:**
- `data` (object, **обязательный**): Тег
- `id` (integer, int32, **обязательный**): Идентификатор тега
- Пример: `9111`
- `name` (string, **обязательный**): Название тега
- Пример: `Design`
- `users_count` (integer, int32, **обязательный**): Количество сотрудников, которые имеют этот тег
- Пример: `6`
**Пример ответа:**
```json
{
"data": {
"id": 1,
"name": "Название тега",
"users_count": 0
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Список тегов сотрудников
**Метод**: `GET`
**Путь**: `/group_tags`
Метод для получения актуального списка тегов сотрудников. Названия тегов являются уникальными в компании.
## Параметры
### Query параметры
- `names` (array, опциональный): Массив названий тегов, по которым вы хотите отфильтровать список
- Пример: `Design,iOS`
- `per` (integer, опциональный): Количество возвращаемых сущностей за один запрос
- По умолчанию: `25`
- `page` (integer, опциональный): Страница выборки
- По умолчанию: `1`
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/group_tags?names[]=Design&names[]=iOS&per=25&page=1" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/group_tags?names[]=Design&names[]=iOS&per=25&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'names': [
'Design',
'iOS'
],
'per': 25,
'page': 1,
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/group_tags',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/group_tags?names[]=Design&names[]=iOS&per=25&page=1',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/group_tags')
params = {
'names' => [
'Design',
'iOS'
],
'per' => 25,
'page' => 1,
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
[
'Design',
'iOS'
], 'per' => 25, 'page' => 1];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/group_tags?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (array[object], **обязательный**)
- `id` (integer, int32, **обязательный**): Идентификатор тега
- Пример: `9111`
- `name` (string, **обязательный**): Название тега
- Пример: `Design`
- `users_count` (integer, int32, **обязательный**): Количество сотрудников, которые имеют этот тег
- Пример: `6`
**Пример ответа:**
```json
{
"data": [
{
"id": 9111,
"name": "Design",
"users_count": 6
},
{
"id": 9113,
"name": "iOS",
"users_count": 4
}
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Информация о теге
**Метод**: `GET`
**Путь**: `/group_tags/{id}`
Метод для получения информации о теге. Названия тегов являются уникальными в компании.
Для получения тега вам необходимо знать его `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор тега
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/group_tags/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/group_tags/{id}', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/group_tags/{id}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/group_tags/%7Bid%7D',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/group_tags/{id}')
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/group_tags/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Тег
- `id` (integer, int32, **обязательный**): Идентификатор тега
- Пример: `9111`
- `name` (string, **обязательный**): Название тега
- Пример: `Design`
- `users_count` (integer, int32, **обязательный**): Количество сотрудников, которые имеют этот тег
- Пример: `6`
**Пример ответа:**
```json
{
"data": {
"id": 9111,
"name": "Design",
"users_count": 6
}
}
```
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Редактирование тега
**Метод**: `PUT`
**Путь**: `/group_tags/{id}`
#admin_access_token_required
Метод для редактирования тега.
Для редактирования тега вам необходимо знать его `id` и указать его в `URL` запроса. Все редактируемые параметры тега указываются в теле запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор тега
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `group_tag` (object, **обязательный**)
- `name` (string, **обязательный**): Название тега
- Пример: `Новое название тега`
### Пример
```json
{
"group_tag": {
"name": "Новое название тега"
}
}
```
## Примеры запроса
### cURL
```bash
curl -X PUT "https://api.pachca.com/api/shared/v1/group_tags/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"group_tag": {
"name": "Новое название тега"
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/group_tags/{id}', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"group_tag": {
"name": "Новое название тега"
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'group_tag': {
'name': 'Новое название тега'
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.put(
'https://api.pachca.com/api/shared/v1/group_tags/{id}',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/group_tags/%7Bid%7D',
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"group_tag": {
"name": "Новое название тега"
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/group_tags/{id}')
request = Net::HTTP::Put.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'group_tag' => {
'name' => 'Новое название тега'
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/group_tags/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'group_tag' => [
'name' => 'Новое название тега'
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Тег
- `id` (integer, int32, **обязательный**): Идентификатор тега
- Пример: `9111`
- `name` (string, **обязательный**): Название тега
- Пример: `Design`
- `users_count` (integer, int32, **обязательный**): Количество сотрудников, которые имеют этот тег
- Пример: `6`
**Пример ответа:**
```json
{
"data": {
"id": 1,
"name": "Новое название тега",
"users_count": 0
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Удаление тега
**Метод**: `DELETE`
**Путь**: `/group_tags/{id}`
#admin_access_token_required
Метод для удаления тега.
Для удаления тега вам необходимо знать его `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор тега
## Примеры запроса
### cURL
```bash
curl -X DELETE "https://api.pachca.com/api/shared/v1/group_tags/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/group_tags/{id}', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.delete(
'https://api.pachca.com/api/shared/v1/group_tags/{id}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/group_tags/%7Bid%7D',
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/group_tags/{id}')
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/group_tags/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Список сотрудников тега
**Метод**: `GET`
**Путь**: `/group_tags/{id}/users`
Метод для получения актуального списка сотрудников тега.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор тега
### Query параметры
- `per` (integer, опциональный): Количество возвращаемых сущностей за один запрос
- По умолчанию: `25`
- `page` (integer, опциональный): Страница выборки
- По умолчанию: `1`
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/group_tags/{id}/users?per=25&page=1" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/group_tags/{id}/users?per=25&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'per': 25,
'page': 1,
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/group_tags/{id}/users',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/group_tags/%7Bid%7D/users?per=25&page=1',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/group_tags/{id}/users')
params = {
'per' => 25,
'page' => 1,
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
25, 'page' => 1];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/group_tags/{id}/users?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (array[object], **обязательный**)
- `id` (integer, int32, **обязательный**): Идентификатор пользователя
- Пример: `12`
- `first_name` (string, **обязательный**): Имя
- Пример: `Олег`
- `last_name` (string, **обязательный**): Фамилия
- Пример: `Петров`
- `nickname` (string, **обязательный**): Имя пользователя
- Пример: ``
- `email` (string, **обязательный**): Электронная почта
- Пример: `olegp@example.com`
- `phone_number` (string, **обязательный**): Телефон
- Пример: ``
- `department` (string, **обязательный**): Департамент
- Пример: `Продукт`
- `title` (string, **обязательный**): Должность
- Пример: `CIO`
- `role` (string, **обязательный**): Уровень доступа
- **Возможные значения:**
- `admin`: Администратор
- `user`: Сотрудник
- `multi_guest`: Мульти-гость
- `suspended` (boolean, **обязательный**): Деактивация пользователя. При значении true пользователь является деактивированным.
- Пример: `false`
- `invite_status` (string, **обязательный**): Статус приглашения
- **Возможные значения:**
- `confirmed`: Принято
- `sent`: Отправлено
- `list_tags` (array[string], **обязательный**): Массив тегов, привязанных к сотруднику
- Пример: `["Product","Design"]`
- `custom_properties` (array[object], **обязательный**): Дополнительные поля сотрудника
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `name` (string, **обязательный**): Название поля
- Пример: `Город`
- `data_type` (string, **обязательный**): Тип поля
- **Возможные значения:**
- `string`: Строковое значение
- `number`: Числовое значение
- `date`: Дата
- `link`: Ссылка
- `value` (string, **обязательный**): Значение
- Пример: `Санкт-Петербург`
- `user_status` (object, **обязательный**): Статус. Возвращается как null, если статус не установлен.
- `emoji` (string, **обязательный**): Emoji символ статуса
- Пример: `🎮`
- `title` (string, **обязательный**): Текст статуса
- Пример: `Очень занят`
- `expires_at` (string, date-time, **обязательный**): Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ. Возвращается как null, если срок не установлен.
- Пример: `2024-04-08T10:00:00.000Z`
- `bot` (boolean, **обязательный**): Тип: пользователь (false) или бот (true)
- Пример: `false`
- `sso` (boolean, **обязательный**): Использует ли пользователь SSO
- Пример: `false`
- `created_at` (string, date-time, **обязательный**): Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2020-06-08T09:32:57.000Z`
- `last_activity_at` (string, date-time, **обязательный**): Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-01-20T13:40:07.000Z`
- `time_zone` (string, **обязательный**): Часовой пояс пользователя
- Пример: `Europe/Moscow`
- `image_url` (string, **обязательный**): Ссылка на скачивание аватарки пользователя
**Пример ответа:**
```json
{
"data": [
{
"id": 12,
"first_name": "Олег",
"last_name": "Петров",
"nickname": "olegpetrov",
"email": "olegp@example.com",
"phone_number": "",
"department": "Продукт",
"title": "CIO",
"role": "admin",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Product",
"Design"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Санкт-Петербург"
}
],
"user_status": null,
"bot": false,
"sso": false,
"created_at": "2020-06-08T09:10:11.000Z",
"last_activity_at": "2025-01-20T13:40:07.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
},
{
"id": 13,
"first_name": "Сергей",
"last_name": "Кузнецов",
"nickname": "skuz",
"email": "sergkuzn@example.com",
"phone_number": "",
"department": "Разработка",
"title": "iOS Developer",
"role": "user",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Development",
"Android"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Москва"
}
],
"user_status": {
"emoji": "🎮",
"title": "Очень занят",
"expires_at": "2024-04-08T10:00:00.000Z"
},
"bot": false,
"sso": false,
"created_at": "2020-06-08T09:31:17.000Z",
"last_activity_at": "2025-01-20T07:00:32.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
},
{
"id": 14,
"first_name": "Дмитрий",
"last_name": "Смирнов",
"nickname": "dsmir",
"email": "ds@example.com",
"phone_number": "",
"department": "Разработка",
"title": "Android Developer",
"role": "user",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Development",
"Frontend"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Санкт-Петербург"
}
],
"user_status": {
"emoji": "🚀",
"title": "Лечу",
"expires_at": null
},
"bot": false,
"sso": false,
"created_at": "2020-06-08T09:32:57.000Z",
"last_activity_at": "2025-01-20T13:51:25.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
}
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Chats
# Новый чат
**Метод**: `POST`
**Путь**: `/chats`
Метод для создания нового чата.
Для создания личной переписки 1 на 1 с пользователем пользуйтесь методом [Новое сообщение](POST /messages).
При создании чата вы автоматически становитесь участником.
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `chat` (object, **обязательный**): Собранный объект параметров создаваемого чата
- `name` (string, **обязательный**): Название
- `member_ids` (array[integer], опциональный): Массив идентификаторов пользователей, которые станут участниками
- `group_tag_ids` (array[integer], опциональный): Массив идентификаторов тегов, которые станут участниками
- `channel` (boolean, опциональный): Тип: беседа (false) или канал (true)
- По умолчанию: `false`
- `public` (boolean, опциональный): Доступ: закрытый (false) или открытый (true)
- По умолчанию: `false`
### Пример
```json
{
"chat": {
"name": "🤿 aqua",
"member_ids": [
186,
187
],
"channel": true,
"public": false
}
}
```
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/chats" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"chat": {
"name": "🤿 aqua",
"member_ids": [
186,
187
],
"channel": true,
"public": false
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"chat": {
"name": "🤿 aqua",
"member_ids": [
186,
187
],
"channel": true,
"public": false
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'chat': {
'name': '🤿 aqua',
'member_ids': [
186,
187
],
'channel': True,
'public': False
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/chats',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"chat": {
"name": "🤿 aqua",
"member_ids": [
186,
187
],
"channel": true,
"public": false
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'chat' => {
'name' => '🤿 aqua',
'member_ids' => [
186,
187
],
'channel' => true,
'public' => false
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'chat' => [
'name' => '🤿 aqua',
'member_ids' => [
186,
187
],
'channel' => true,
'public' => false
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 201: The request has succeeded and a new resource has been created as a result.
**Схема ответа:**
- `data` (object, **обязательный**): Чат
- `id` (integer, int32, **обязательный**): Идентификатор созданного чата
- Пример: `334`
- `name` (string, **обязательный**): Название
- Пример: `🤿 aqua`
- `created_at` (string, date-time, **обязательный**): Дата и время создания чата (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:56:53.000Z`
- `owner_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего чат
- Пример: `185`
- `member_ids` (array[integer], **обязательный**): Массив идентификаторов пользователей, участников
- Пример: `[185,186,187]`
- `group_tag_ids` (array[integer], **обязательный**): Массив идентификаторов тегов, участников
- Пример: `[9111]`
- `channel` (boolean, **обязательный**): Тип: беседа (false) или канал (true)
- Пример: `true`
- `personal` (boolean, **обязательный**): Личный (true) или групповой (false) чат
- Пример: `false`
- `public` (boolean, **обязательный**): Доступ: закрытый (false) или открытый (true)
- Пример: `false`
- `last_message_at` (string, date-time, **обязательный**): Дата и время создания последнего сообщения в чате (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:56:53.000Z`
- `meet_room_url` (string, **обязательный**): Ссылка на Видеочат
- Пример: `https://meet.pachca.com/aqua-94bb21b5`
**Пример ответа:**
```json
{
"data": {
"id": 334,
"name": "🤿 aqua",
"created_at": "2021-08-28T15:56:53.000Z",
"owner_id": 185,
"member_ids": [
185,
186,
187
],
"group_tag_ids": [],
"channel": true,
"personal": false,
"public": false,
"last_message_at": "2021-08-28T15:56:53.000Z",
"meet_room_url": "https://meet.pachca.com/aqua-94bb21b5"
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Список чатов
**Метод**: `GET`
**Путь**: `/chats`
Метод для получения списка чатов по заданным параметрам.
## Параметры
### Query параметры
- `sort[{field}]` (string (enum: asc, desc), опциональный): Составной параметр сортировки сущностей выборки. На данный момент сортировка доступна по полям `id` (идентификатор чата) и `last_message_at` (дата и время создания последнего сообщения).
- `availability` (string (enum: is_member, public), опциональный): Параметр, который отвечает за доступность и выборку чатов для пользователя
- `last_message_at_after` (string, опциональный): Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не раньше чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).
- `last_message_at_before` (string, опциональный): Фильтрация по времени создания последнего сообщения. Будут возвращены те чаты, время последнего созданного сообщения в которых не позже чем указанное (в формате YYYY-MM-DDThh:mm:ss.sssZ).
- `personal` (boolean, опциональный): Фильтрация по личным (если указано как true) и групповым (если указано как false) чатам. Если параметр не указан, то возвращаются любые чаты.
- `limit` (integer, опциональный): Количество возвращаемых сущностей за один запрос
- По умолчанию: `50`
- `cursor` (string, опциональный): Курсор для пагинации (из meta.paginate.next_page)
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/chats?sort[{field}]=asc&availability=is_member&last_message_at_after=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82!%20%D0%AD%D1%82%D0%BE%20%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5.&last_message_at_before=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82!%20%D0%AD%D1%82%D0%BE%20%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5.&personal=true&limit=50&cursor=string" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats?sort[{field}]=asc&availability=is_member&last_message_at_after=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82!%20%D0%AD%D1%82%D0%BE%20%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5.&last_message_at_before=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82!%20%D0%AD%D1%82%D0%BE%20%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5.&personal=true&limit=50&cursor=string', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'sort[{field}]': 'asc',
'availability': 'is_member',
'last_message_at_after': 'Привет! Это тестовое сообщение.',
'last_message_at_before': 'Привет! Это тестовое сообщение.',
'personal': True,
'limit': 50,
'cursor': 'string',
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/chats',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats?sort[{field}]=asc&availability=is_member&last_message_at_after=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82!%20%D0%AD%D1%82%D0%BE%20%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5.&last_message_at_before=%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82!%20%D0%AD%D1%82%D0%BE%20%D1%82%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5%20%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B5.&personal=true&limit=50&cursor=string',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats')
params = {
'sort[{field}]' => 'asc',
'availability' => 'is_member',
'last_message_at_after' => 'Привет! Это тестовое сообщение.',
'last_message_at_before' => 'Привет! Это тестовое сообщение.',
'personal' => true,
'limit' => 50,
'cursor' => 'string',
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'asc', 'availability' => 'is_member', 'last_message_at_after' => 'Привет! Это тестовое сообщение.', 'last_message_at_before' => 'Привет! Это тестовое сообщение.', 'personal' => true, 'limit' => 50, 'cursor' => 'string'];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/chats?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `meta` (object, опциональный): Метаданные пагинации
- `paginate` (object, опциональный): Вспомогательная информация
- `next_page` (string, опциональный): Курсор пагинации следующей страницы
- Пример: `eyJxZCO2MiwiZGlyIjomSNYjIn3`
- `data` (array[object], **обязательный**)
- `id` (integer, int32, **обязательный**): Идентификатор созданного чата
- Пример: `334`
- `name` (string, **обязательный**): Название
- Пример: `🤿 aqua`
- `created_at` (string, date-time, **обязательный**): Дата и время создания чата (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:56:53.000Z`
- `owner_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего чат
- Пример: `185`
- `member_ids` (array[integer], **обязательный**): Массив идентификаторов пользователей, участников
- Пример: `[185,186,187]`
- `group_tag_ids` (array[integer], **обязательный**): Массив идентификаторов тегов, участников
- Пример: `[9111]`
- `channel` (boolean, **обязательный**): Тип: беседа (false) или канал (true)
- Пример: `true`
- `personal` (boolean, **обязательный**): Личный (true) или групповой (false) чат
- Пример: `false`
- `public` (boolean, **обязательный**): Доступ: закрытый (false) или открытый (true)
- Пример: `false`
- `last_message_at` (string, date-time, **обязательный**): Дата и время создания последнего сообщения в чате (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:56:53.000Z`
- `meet_room_url` (string, **обязательный**): Ссылка на Видеочат
- Пример: `https://meet.pachca.com/aqua-94bb21b5`
**Пример ответа:**
```json
{
"meta": {
"paginate": {
"next_page": "eyJpZCI6MTMsImRpciI6ImRlc2MifQ"
}
},
"data": [
{
"id": 334,
"name": "🤿 aqua",
"created_at": "2021-08-28T15:56:53.000Z",
"owner_id": 185,
"member_ids": [
185,
186,
187
],
"group_tag_ids": [],
"channel": true,
"personal": false,
"public": false,
"last_message_at": "2021-08-28T15:58:13.000Z",
"meet_room_url": "https://meet.pachca.com/aqua-94bb21b5"
},
{
"id": 333,
"name": "development",
"created_at": "2021-08-28T15:54:22.000Z",
"owner_id": 185,
"member_ids": [
185
],
"group_tag_ids": [
22,
24
],
"channel": false,
"personal": false,
"public": true,
"last_message_at": "2021-08-28T15:56:12.000Z",
"meet_room_url": "https://meet.pachca.com/development-43sz53n8"
}
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Информация о чате
**Метод**: `GET`
**Путь**: `/chats/{id}`
Метод для получения информации о чате.
Для получения чата вам необходимо знать его `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор чата
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/chats/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{id}', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/chats/{id}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7Bid%7D',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{id}')
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Чат
- `id` (integer, int32, **обязательный**): Идентификатор созданного чата
- Пример: `334`
- `name` (string, **обязательный**): Название
- Пример: `🤿 aqua`
- `created_at` (string, date-time, **обязательный**): Дата и время создания чата (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:56:53.000Z`
- `owner_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего чат
- Пример: `185`
- `member_ids` (array[integer], **обязательный**): Массив идентификаторов пользователей, участников
- Пример: `[185,186,187]`
- `group_tag_ids` (array[integer], **обязательный**): Массив идентификаторов тегов, участников
- Пример: `[9111]`
- `channel` (boolean, **обязательный**): Тип: беседа (false) или канал (true)
- Пример: `true`
- `personal` (boolean, **обязательный**): Личный (true) или групповой (false) чат
- Пример: `false`
- `public` (boolean, **обязательный**): Доступ: закрытый (false) или открытый (true)
- Пример: `false`
- `last_message_at` (string, date-time, **обязательный**): Дата и время создания последнего сообщения в чате (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:56:53.000Z`
- `meet_room_url` (string, **обязательный**): Ссылка на Видеочат
- Пример: `https://meet.pachca.com/aqua-94bb21b5`
**Пример ответа:**
```json
{
"data": {
"id": 334,
"name": "🤿 aqua",
"created_at": "2021-08-28T15:56:53.000Z",
"owner_id": 185,
"member_ids": [
185,
186,
187
],
"group_tag_ids": [],
"channel": true,
"personal": false,
"public": false,
"last_message_at": "2021-08-28T15:58:13.000Z",
"meet_room_url": "https://meet.pachca.com/aqua-94bb21b5"
}
}
```
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Обновление чата
**Метод**: `PUT`
**Путь**: `/chats/{id}`
Метод для обновления параметров чата.
Для обновления нужно знать `id` чата и указать его в `URL`. Все обновляемые поля передаются в теле запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор чата
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `chat` (object, **обязательный**): Собранный объект параметров обновляемого чата
- `name` (string, опциональный): Название
- `public` (boolean, опциональный): Доступ: закрытый (false) или открытый (true)
### Пример
```json
{
"chat": {
"name": "Бассейн",
"public": true
}
}
```
## Примеры запроса
### cURL
```bash
curl -X PUT "https://api.pachca.com/api/shared/v1/chats/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"chat": {
"name": "Бассейн",
"public": true
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{id}', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"chat": {
"name": "Бассейн",
"public": true
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'chat': {
'name': 'Бассейн',
'public': True
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.put(
'https://api.pachca.com/api/shared/v1/chats/{id}',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7Bid%7D',
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"chat": {
"name": "Бассейн",
"public": true
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{id}')
request = Net::HTTP::Put.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'chat' => {
'name' => 'Бассейн',
'public' => true
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'chat' => [
'name' => 'Бассейн',
'public' => true
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Чат
- `id` (integer, int32, **обязательный**): Идентификатор созданного чата
- Пример: `334`
- `name` (string, **обязательный**): Название
- Пример: `🤿 aqua`
- `created_at` (string, date-time, **обязательный**): Дата и время создания чата (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:56:53.000Z`
- `owner_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего чат
- Пример: `185`
- `member_ids` (array[integer], **обязательный**): Массив идентификаторов пользователей, участников
- Пример: `[185,186,187]`
- `group_tag_ids` (array[integer], **обязательный**): Массив идентификаторов тегов, участников
- Пример: `[9111]`
- `channel` (boolean, **обязательный**): Тип: беседа (false) или канал (true)
- Пример: `true`
- `personal` (boolean, **обязательный**): Личный (true) или групповой (false) чат
- Пример: `false`
- `public` (boolean, **обязательный**): Доступ: закрытый (false) или открытый (true)
- Пример: `false`
- `last_message_at` (string, date-time, **обязательный**): Дата и время создания последнего сообщения в чате (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:56:53.000Z`
- `meet_room_url` (string, **обязательный**): Ссылка на Видеочат
- Пример: `https://meet.pachca.com/aqua-94bb21b5`
**Пример ответа:**
```json
{
"data": {
"id": 334,
"name": "Бассейн",
"created_at": "2021-08-28T15:56:53.000Z",
"owner_id": 185,
"member_ids": [
185,
186,
187
],
"group_tag_ids": [],
"channel": true,
"personal": false,
"public": true,
"last_message_at": "2021-08-28T15:58:23.000Z",
"meet_room_url": "https://meet.pachca.com/aqua-94bb21b5"
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Архивация чата
**Метод**: `PUT`
**Путь**: `/chats/{id}/archive`
Метод для отправки чата в архив.
Для отправки чата в архив вам необходимо знать `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор чата
## Примеры запроса
### cURL
```bash
curl -X PUT "https://api.pachca.com/api/shared/v1/chats/{id}/archive" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{id}/archive', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.put(
'https://api.pachca.com/api/shared/v1/chats/{id}/archive',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7Bid%7D/archive',
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{id}/archive')
request = Net::HTTP::Put.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/{id}/archive',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Разархивация чата
**Метод**: `PUT`
**Путь**: `/chats/{id}/unarchive`
Метод для возвращения чата из архива.
Для разархивации чата вам необходимо знать её `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор чата
## Примеры запроса
### cURL
```bash
curl -X PUT "https://api.pachca.com/api/shared/v1/chats/{id}/unarchive" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{id}/unarchive', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.put(
'https://api.pachca.com/api/shared/v1/chats/{id}/unarchive',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7Bid%7D/unarchive',
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{id}/unarchive')
request = Net::HTTP::Put.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/{id}/unarchive',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Members
# Добавление тегов
**Метод**: `POST`
**Путь**: `/chats/{chatId}/group_tags`
Метод для добавления тегов в состав участников беседы или канала.
## Параметры
### Path параметры
- `chatId` (integer, **обязательный**): Идентификатор чата
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `group_tag_ids` (array[integer], **обязательный**): Массив идентификаторов тегов, которые станут участниками
- Пример: `[86,18]`
### Пример
```json
{
"group_tag_ids": [
86,
18
]
}
```
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/chats/{chatId}/group_tags" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"group_tag_ids": [
86,
18
]
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{chatId}/group_tags', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"group_tag_ids": [
86,
18
]
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'group_tag_ids': [
86,
18
]
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/chats/{chatId}/group_tags',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7BchatId%7D/group_tags',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"group_tag_ids": [
86,
18
]
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{chatId}/group_tags')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'group_tag_ids' => [
86,
18
]
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/{chatId}/group_tags',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'group_tag_ids' => [
86,
18
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Исключение тега
**Метод**: `DELETE`
**Путь**: `/chats/{chatId}/group_tags/{tagId}`
Метод для исключения тега из состава участников беседы или канала.
Для исключения тега вам необходимо знать его `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `chatId` (integer, **обязательный**): Идентификатор чата
- `tagId` (integer, **обязательный**): Идентификатор тега
## Примеры запроса
### cURL
```bash
curl -X DELETE "https://api.pachca.com/api/shared/v1/chats/{chatId}/group_tags/{tagId}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{chatId}/group_tags/{tagId}', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.delete(
'https://api.pachca.com/api/shared/v1/chats/{chatId}/group_tags/{tagId}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7BchatId%7D/group_tags/%7BtagId%7D',
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{chatId}/group_tags/{tagId}')
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/{chatId}/group_tags/{tagId}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Исключение пользователя
**Метод**: `DELETE`
**Путь**: `/chats/{chatId}/members/{userId}`
Метод для исключения пользователя из состава участников беседы или канала.
Если пользователь является владельцем чата, то исключить его нельзя. Он может только самостоятельно выйти из чата, воспользовавшись методом [Выход из беседы или канала](DELETE /chats/{id}/leave).
## Параметры
### Path параметры
- `chatId` (integer, **обязательный**): Идентификатор чата
- `userId` (integer, **обязательный**): Идентификатор пользователя
## Примеры запроса
### cURL
```bash
curl -X DELETE "https://api.pachca.com/api/shared/v1/chats/{chatId}/members/{userId}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{chatId}/members/{userId}', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.delete(
'https://api.pachca.com/api/shared/v1/chats/{chatId}/members/{userId}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7BchatId%7D/members/%7BuserId%7D',
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{chatId}/members/{userId}')
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/{chatId}/members/{userId}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Редактирование роли
**Метод**: `PUT`
**Путь**: `/chats/{chatId}/members/{userId}`
Метод для редактирования роли пользователя или бота в беседе или канале.
Для редактирования роли в беседе или канале вам необходимо знать `id` чата и пользователя (или бота) и указать их в `URL` запроса. Все редактируемые параметры роли указываются в теле запроса.
Владельцу чата роль изменить нельзя. Он всегда имеет права Админа в чате.
## Параметры
### Path параметры
- `chatId` (integer, **обязательный**): Идентификатор чата
- `userId` (integer, **обязательный**): Идентификатор пользователя
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `role` (string, **обязательный**): Роль
- **Возможные значения:**
- `admin`: Админ
- `editor`: Редактор (доступно только для каналов)
- `member`: Участник или подписчик
### Пример
```json
{
"role": "admin"
}
```
## Примеры запроса
### cURL
```bash
curl -X PUT "https://api.pachca.com/api/shared/v1/chats/{chatId}/members/{userId}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"role": "admin"
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{chatId}/members/{userId}', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"role": "admin"
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'role': 'admin'
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.put(
'https://api.pachca.com/api/shared/v1/chats/{chatId}/members/{userId}',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7BchatId%7D/members/%7BuserId%7D',
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"role": "admin"
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{chatId}/members/{userId}')
request = Net::HTTP::Put.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'role' => 'admin'
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/{chatId}/members/{userId}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'role' => 'admin'
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Выход из беседы или канала
**Метод**: `DELETE`
**Путь**: `/chats/{id}/leave`
Метод для самостоятельного выхода из беседы или канала.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор чата
## Примеры запроса
### cURL
```bash
curl -X DELETE "https://api.pachca.com/api/shared/v1/chats/{id}/leave" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{id}/leave', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.delete(
'https://api.pachca.com/api/shared/v1/chats/{id}/leave',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7Bid%7D/leave',
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{id}/leave')
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/{id}/leave',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Список участников чата
**Метод**: `GET`
**Путь**: `/chats/{id}/members`
Метод для получения актуального списка участников чата.
Владелец пространства может получить состав участников любого чата пространства. Администраторы и боты могут получить список участников только тех чатов, в которых состоят (или которые являются открытыми).
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор чата
### Query параметры
- `role` (string (enum: all, owner, admin, editor, member), опциональный): Роль в чате
- `limit` (integer, опциональный): Количество возвращаемых сущностей за один запрос
- По умолчанию: `50`
- `cursor` (string, опциональный): Курсор для пагинации (из meta.paginate.next_page)
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/chats/{id}/members?role=all&limit=50&cursor=string" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{id}/members?role=all&limit=50&cursor=string', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'role': 'all',
'limit': 50,
'cursor': 'string',
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/chats/{id}/members',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7Bid%7D/members?role=all&limit=50&cursor=string',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{id}/members')
params = {
'role' => 'all',
'limit' => 50,
'cursor' => 'string',
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'all', 'limit' => 50, 'cursor' => 'string'];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/chats/{id}/members?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `meta` (object, опциональный): Метаданные пагинации
- `paginate` (object, опциональный): Вспомогательная информация
- `next_page` (string, опциональный): Курсор пагинации следующей страницы
- Пример: `eyJxZCO2MiwiZGlyIjomSNYjIn3`
- `data` (array[object], **обязательный**)
- `id` (integer, int32, **обязательный**): Идентификатор пользователя
- Пример: `12`
- `first_name` (string, **обязательный**): Имя
- Пример: `Олег`
- `last_name` (string, **обязательный**): Фамилия
- Пример: `Петров`
- `nickname` (string, **обязательный**): Имя пользователя
- Пример: ``
- `email` (string, **обязательный**): Электронная почта
- Пример: `olegp@example.com`
- `phone_number` (string, **обязательный**): Телефон
- Пример: ``
- `department` (string, **обязательный**): Департамент
- Пример: `Продукт`
- `title` (string, **обязательный**): Должность
- Пример: `CIO`
- `role` (string, **обязательный**): Уровень доступа
- **Возможные значения:**
- `admin`: Администратор
- `user`: Сотрудник
- `multi_guest`: Мульти-гость
- `suspended` (boolean, **обязательный**): Деактивация пользователя. При значении true пользователь является деактивированным.
- Пример: `false`
- `invite_status` (string, **обязательный**): Статус приглашения
- **Возможные значения:**
- `confirmed`: Принято
- `sent`: Отправлено
- `list_tags` (array[string], **обязательный**): Массив тегов, привязанных к сотруднику
- Пример: `["Product","Design"]`
- `custom_properties` (array[object], **обязательный**): Дополнительные поля сотрудника
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `name` (string, **обязательный**): Название поля
- Пример: `Город`
- `data_type` (string, **обязательный**): Тип поля
- **Возможные значения:**
- `string`: Строковое значение
- `number`: Числовое значение
- `date`: Дата
- `link`: Ссылка
- `value` (string, **обязательный**): Значение
- Пример: `Санкт-Петербург`
- `user_status` (object, **обязательный**): Статус. Возвращается как null, если статус не установлен.
- `emoji` (string, **обязательный**): Emoji символ статуса
- Пример: `🎮`
- `title` (string, **обязательный**): Текст статуса
- Пример: `Очень занят`
- `expires_at` (string, date-time, **обязательный**): Срок жизни статуса (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ. Возвращается как null, если срок не установлен.
- Пример: `2024-04-08T10:00:00.000Z`
- `bot` (boolean, **обязательный**): Тип: пользователь (false) или бот (true)
- Пример: `false`
- `sso` (boolean, **обязательный**): Использует ли пользователь SSO
- Пример: `false`
- `created_at` (string, date-time, **обязательный**): Дата создания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2020-06-08T09:32:57.000Z`
- `last_activity_at` (string, date-time, **обязательный**): Дата последней активности пользователя (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-01-20T13:40:07.000Z`
- `time_zone` (string, **обязательный**): Часовой пояс пользователя
- Пример: `Europe/Moscow`
- `image_url` (string, **обязательный**): Ссылка на скачивание аватарки пользователя
**Пример ответа:**
```json
{
"meta": {
"paginate": {
"next_page": "eyJpZCI6MTIwiwiZGlyIjoiYXNjIn0"
}
},
"data": [
{
"id": 12,
"first_name": "Олег",
"last_name": "Петров",
"nickname": "olegpetrov",
"email": "olegp@example.com",
"phone_number": "",
"department": "Продукт",
"title": "CIO",
"role": "admin",
"suspended": false,
"invite_status": "confirmed",
"list_tags": [
"Product",
"Design"
],
"custom_properties": [
{
"id": 1678,
"name": "Город",
"data_type": "string",
"value": "Санкт-Петербург"
}
],
"user_status": null,
"bot": false,
"sso": false,
"created_at": "2020-06-08T09:10:11.000Z",
"last_activity_at": "2025-01-20T13:40:07.000Z",
"time_zone": "Europe/Moscow",
"image_url": null
}
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Добавление пользователей
**Метод**: `POST`
**Путь**: `/chats/{id}/members`
Метод для добавления пользователей в состав участников беседы или канала.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор чата
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `member_ids` (array[integer], **обязательный**): Массив идентификаторов пользователей, которые станут участниками
- Пример: `[186,187]`
- `silent` (boolean, опциональный): Не создавать в чате системное сообщение о добавлении участника
- Пример: `true`
### Пример
```json
{
"member_ids": [
186,
187
],
"silent": true
}
```
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/chats/{id}/members" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"member_ids": [
186,
187
],
"silent": true
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/chats/{id}/members', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"member_ids": [
186,
187
],
"silent": true
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'member_ids': [
186,
187
],
'silent': True
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/chats/{id}/members',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/chats/%7Bid%7D/members',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"member_ids": [
186,
187
],
"silent": true
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/chats/{id}/members')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'member_ids' => [
186,
187
],
'silent' => true
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/chats/{id}/members',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'member_ids' => [
186,
187
],
'silent' => true
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Thread
# Новый тред
**Метод**: `POST`
**Путь**: `/messages/{id}/thread`
Метод для создания нового треда к сообщению.
Если у сообщения уже был создан тред, то в ответе на запрос вернётся информация об уже созданном ранее треде.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/messages/{id}/thread" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}/thread', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/messages/{id}/thread',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D/thread',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}/thread')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/messages/{id}/thread',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Тред
- `id` (integer, int64, **обязательный**): Идентификатор созданного треда (используется для отправки [новых комментариев](POST /messages) в тред)
- Пример: `265142`
- `chat_id` (integer, int64, **обязательный**): Идентификатор чата треда (используется для отправки [новых комментариев](POST /messages) в тред и получения [списка комментариев](GET /chats/{id}/messages))
- Пример: `2637266155`
- `message_id` (integer, int64, **обязательный**): Идентификатор сообщения, к которому был создан тред
- Пример: `154332686`
- `message_chat_id` (integer, int64, **обязательный**): Идентификатор чата сообщения
- Пример: `2637266154`
- `updated_at` (string, date-time, **обязательный**): Дата и время обновления треда (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2023-02-01T19:20:47.204Z`
**Пример ответа:**
```json
{
"data": {
"id": 265142,
"chat_id": 2637266155,
"message_id": 154332686,
"message_chat_id": 2637266154,
"updated_at": "2023-02-01T19:20:47.204Z"
}
}
```
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Информация о треде
**Метод**: `GET`
**Путь**: `/threads/{id}`
Метод для получения информации о треде.
Для получения треда вам необходимо знать его `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор треда
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/threads/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/threads/{id}', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/threads/{id}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/threads/%7Bid%7D',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/threads/{id}')
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/threads/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Тред
- `id` (integer, int64, **обязательный**): Идентификатор созданного треда (используется для отправки [новых комментариев](POST /messages) в тред)
- Пример: `265142`
- `chat_id` (integer, int64, **обязательный**): Идентификатор чата треда (используется для отправки [новых комментариев](POST /messages) в тред и получения [списка комментариев](GET /chats/{id}/messages))
- Пример: `2637266155`
- `message_id` (integer, int64, **обязательный**): Идентификатор сообщения, к которому был создан тред
- Пример: `154332686`
- `message_chat_id` (integer, int64, **обязательный**): Идентификатор чата сообщения
- Пример: `2637266154`
- `updated_at` (string, date-time, **обязательный**): Дата и время обновления треда (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2023-02-01T19:20:47.204Z`
**Пример ответа:**
```json
{
"data": {
"id": 265142,
"chat_id": 2637266155,
"message_id": 154332686,
"message_chat_id": 2637266154,
"updated_at": "2023-02-01T19:20:47.204Z"
}
}
```
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Messages
# Новое сообщение
**Метод**: `POST`
**Путь**: `/messages`
Метод для отправки сообщения в беседу или канал, личного сообщения пользователю или комментария в тред.
При использовании `entity_type: "discussion"` (или просто без указания `entity_type`) допускается отправка любого `chat_id` в поле `entity_id`. То есть, сообщение можно отправить зная только идентификатор чата. При этом, вы имеете возможность отправить сообщение в тред по его идентификатору или личное сообщение по идентификатору пользователя.
Для отправки личного сообщения пользователю создавать чат не требуется. Достаточно указать `entity_type: "user"` и идентификатор пользователя. Чат будет создан автоматически, если между вами ещё не было переписки. Между двумя пользователями может быть только один личный чат.
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `message` (object, **обязательный**): Собранный объект параметров создаваемого сообщения
- `entity_type` (string, опциональный): Тип сущности
- **Возможные значения:**
- `discussion`: Беседа или канал
- `thread`: Тред
- `user`: Пользователь
- `entity_id` (integer, int32, **обязательный**): Идентификатор сущности
- Пример: `198`
- `content` (string, **обязательный**): Текст сообщения
- Пример: `Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)`
- `files` (array[object], опциональный): Прикрепляемые файлы
- `key` (string, **обязательный**): Путь к файлу, полученный в результате [загрузки файла](POST /direct_url)
- Пример: `attaches/files/93746/e354fd79-4f3e-4b5a-9c8d-1a2b3c4d5e6f/logo.png`
- `name` (string, **обязательный**): Название файла, которое вы хотите отображать пользователю (рекомендуется писать вместе с расширением)
- Пример: `logo.png`
- `file_type` (string, **обязательный**): Тип файла
- Пример: `image`
- **Возможные значения:**
- `file`: Файл
- `image`: Изображение
- `size` (integer, int32, **обязательный**): Размер файла в байтах, отображаемый пользователю
- Пример: `12345`
- `width` (integer, int32, опциональный): Ширина изображения в px (используется в случае, если file_type указан как image)
- Пример: `800`
- `height` (integer, int32, опциональный): Высота изображения в px (используется в случае, если file_type указан как image)
- Пример: `600`
- `buttons` (array[array], опциональный): Массив строк, каждая из которых представлена массивом кнопок.
- `parent_message_id` (integer, int32, опциональный): Идентификатор сообщения. Указывается в случае, если вы отправляете ответ на другое сообщение.
- Пример: `194270`
- `display_avatar_url` (string, опциональный): Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.
- Пример: `https://example.com/avatar.png`
- Максимальная длина: 255 символов
- `display_name` (string, опциональный): Полное специальное имя отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.
- Пример: `Бот Поддержки`
- Максимальная длина: 255 символов
- `skip_invite_mentions` (boolean, опциональный): [Этот параметр работает только при отправке сообщения в тред] Добавление в тред упоминаемых пользователей (при значении true упоминаемые пользователи не будут добавлены в тред).
- Пример: `false`
- По умолчанию: `false`
- `link_preview` (boolean, опциональный): Отображение предпросмотра ссылки у сообщения (при значении true у сообщения будет отображаться предпросмотр первой найденной в тексте сообщения ссылки).
- Пример: `false`
- По умолчанию: `false`
### Пример
```json
{
"message": {
"entity_type": "discussion",
"entity_id": 198,
"content": "Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)"
}
}
```
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/messages" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"message": {
"entity_type": "discussion",
"entity_id": 198,
"content": "Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)"
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"message": {
"entity_type": "discussion",
"entity_id": 198,
"content": "Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)"
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'message': {
'entity_type': 'discussion',
'entity_id': 198,
'content': 'Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)'
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/messages',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"message": {
"entity_type": "discussion",
"entity_id": 198,
"content": "Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)"
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'message' => {
'entity_type' => 'discussion',
'entity_id' => 198,
'content' => 'Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)'
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/messages',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'message' => [
'entity_type' => 'discussion',
'entity_id' => 198,
'content' => 'Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)'
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Сообщение
- `id` (integer, int32, **обязательный**): Идентификатор сообщения
- Пример: `194275`
- `entity_type` (string, **обязательный**): Тип сущности, к которой относится сообщение
- **Возможные значения:**
- `discussion`: Беседа или канал
- `thread`: Тред
- `user`: Пользователь
- `entity_id` (integer, int32, **обязательный**): Идентификатор сущности, к которой относится сообщение (беседы/канала, треда или пользователя)
- Пример: `334`
- `chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором находится сообщение
- Пример: `334`
- `content` (string, **обязательный**): Текст сообщения
- Пример: `Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)`
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего сообщение
- Пример: `185`
- `created_at` (string, date-time, **обязательный**): Дата и время создания сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:57:23.000Z`
- `url` (string, **обязательный**): Прямая ссылка на сообщение
- Пример: `https://app.pachca.com/chats/334?message=194275`
- `files` (array[object], **обязательный**): Прикрепленные файлы
- `id` (integer, int32, **обязательный**): Идентификатор файла
- Пример: `3560`
- `key` (string, **обязательный**): Путь к файлу
- Пример: `attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png`
- `name` (string, **обязательный**): Название файла с расширением
- Пример: `congrat.png`
- `file_type` (string, **обязательный**): Тип файла
- **Возможные значения:**
- `file`: Обычный файл
- `image`: Изображение
- `url` (string, **обязательный**): Прямая ссылка на скачивание файла
- Пример: `https://pachca-prod-uploads.s3.storage.selcloud.ru/attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png?response-cache-control=max-age%3D3600%3B&response-content-disposition=attachment&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=142155_staply%2F20231107%2Fru-1a%2Fs3%2Faws4_request&X-Amz-Date=20231107T160412&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=98765asgfadsfdSaDSd4sdfg35asdf67sadf8`
- `width` (integer, int32, опциональный): Ширина изображения в пикселях
- Пример: `1920`
- `height` (integer, int32, опциональный): Высота изображения в пикселях
- Пример: `1080`
- `buttons` (array[array], **обязательный**): Массив строк, каждая из которых представлена массивом кнопок
- `thread` (object, **обязательный**): Тред сообщения. Возвращается как null, если у сообщения нет комментариев.
- `id` (integer, int64, **обязательный**): Идентификатор созданного треда (используется для отправки [новых комментариев](POST /messages) в тред)
- Пример: `265142`
- `chat_id` (integer, int64, **обязательный**): Идентификатор чата треда (используется для отправки [новых комментариев](POST /messages) в тред и получения [списка комментариев](GET /chats/{id}/messages))
- Пример: `2637266155`
- `message_id` (integer, int64, **обязательный**): Идентификатор сообщения, к которому был создан тред
- Пример: `154332686`
- `message_chat_id` (integer, int64, **обязательный**): Идентификатор чата сообщения
- Пример: `2637266154`
- `updated_at` (string, date-time, **обязательный**): Дата и время обновления треда (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2023-02-01T19:20:47.204Z`
- `forwarding` (object, **обязательный**): Информация о пересланном сообщении. Возвращается как null, если сообщение не является пересланным автора.
- `original_message_id` (integer, int32, **обязательный**): Идентификатор оригинального сообщения
- `original_chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором находится оригинальное сообщение
- `author_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего оригинальное сообщение
- `original_created_at` (string, date-time, **обязательный**): Дата и время создания оригинального сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- `original_thread_id` (integer, int32, **обязательный**): Идентификатор треда, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `original_thread_message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому был создан тред, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `original_thread_parent_chat_id` (integer, int32, **обязательный**): Идентификатор чата сообщения, к которому был создан тред, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `parent_message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому написан ответ. Возвращается как null, если сообщение не является ответом.
- `display_avatar_url` (string, **обязательный**): Ссылка на аватарку отправителя сообщения. Возвращается как null, если для этого сообщения не была указана специальная аватарка.
- `display_name` (string, **обязательный**): Полное имя отправителя сообщения. Возвращается как null, если для этого сообщения не было указано специальное имя.
**Пример ответа:**
```json
{
"data": {
"id": 194275,
"entity_type": "discussion",
"entity_id": 334,
"chat_id": 334,
"content": "Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)",
"user_id": 185,
"created_at": "2021-08-28T15:57:23.000Z",
"url": "https://app.pachca.com/chats/334?message=194275",
"files": [],
"buttons": [],
"thread": null,
"forwarding": null,
"parent_message_id": null,
"display_avatar_url": null,
"display_name": null
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Список сообщений чата
**Метод**: `GET`
**Путь**: `/messages`
Метод для получения списка сообщений бесед, каналов, тредов и личных сообщений.
Для получения сообщений вам необходимо знать `chat_id` требуемой беседы, канала, треда или диалога, и указать его в `URL` запроса. Сообщения будут возвращены в порядке убывания даты отправки (то есть, сначала будут идти последние сообщения чата). Для получения более ранних сообщений чата доступны параметры `per` и `page`.
## Параметры
### Query параметры
- `chat_id` (integer, **обязательный**): Идентификатор чата (беседа, канал, диалог или чат треда)
- `per` (integer, опциональный): Количество возвращаемых сущностей за один запрос
- По умолчанию: `25`
- `page` (integer, опциональный): Страница выборки
- По умолчанию: `1`
- `sort[{field}]` (string (enum: asc, desc), опциональный): Составной параметр сортировки сущностей выборки. На данный момент сортировка доступна только по полю `id` (идентификатор сообщения).
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/messages?chat_id=12345&per=25&page=1&sort[{field}]=asc" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages?chat_id=12345&per=25&page=1&sort[{field}]=asc', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'chat_id': 12345,
'per': 25,
'page': 1,
'sort[{field}]': 'asc',
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/messages',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages?chat_id=12345&per=25&page=1&sort[{field}]=asc',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages')
params = {
'chat_id' => 12345,
'per' => 25,
'page' => 1,
'sort[{field}]' => 'asc',
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
12345, 'per' => 25, 'page' => 1, 'sort[{field}]' => 'asc'];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/messages?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (array[object], **обязательный**)
- `id` (integer, int32, **обязательный**): Идентификатор сообщения
- Пример: `194275`
- `entity_type` (string, **обязательный**): Тип сущности, к которой относится сообщение
- **Возможные значения:**
- `discussion`: Беседа или канал
- `thread`: Тред
- `user`: Пользователь
- `entity_id` (integer, int32, **обязательный**): Идентификатор сущности, к которой относится сообщение (беседы/канала, треда или пользователя)
- Пример: `334`
- `chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором находится сообщение
- Пример: `334`
- `content` (string, **обязательный**): Текст сообщения
- Пример: `Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)`
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего сообщение
- Пример: `185`
- `created_at` (string, date-time, **обязательный**): Дата и время создания сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:57:23.000Z`
- `url` (string, **обязательный**): Прямая ссылка на сообщение
- Пример: `https://app.pachca.com/chats/334?message=194275`
- `files` (array[object], **обязательный**): Прикрепленные файлы
- `id` (integer, int32, **обязательный**): Идентификатор файла
- Пример: `3560`
- `key` (string, **обязательный**): Путь к файлу
- Пример: `attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png`
- `name` (string, **обязательный**): Название файла с расширением
- Пример: `congrat.png`
- `file_type` (string, **обязательный**): Тип файла
- **Возможные значения:**
- `file`: Обычный файл
- `image`: Изображение
- `url` (string, **обязательный**): Прямая ссылка на скачивание файла
- Пример: `https://pachca-prod-uploads.s3.storage.selcloud.ru/attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png?response-cache-control=max-age%3D3600%3B&response-content-disposition=attachment&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=142155_staply%2F20231107%2Fru-1a%2Fs3%2Faws4_request&X-Amz-Date=20231107T160412&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=98765asgfadsfdSaDSd4sdfg35asdf67sadf8`
- `width` (integer, int32, опциональный): Ширина изображения в пикселях
- Пример: `1920`
- `height` (integer, int32, опциональный): Высота изображения в пикселях
- Пример: `1080`
- `buttons` (array[array], **обязательный**): Массив строк, каждая из которых представлена массивом кнопок
- `thread` (object, **обязательный**): Тред сообщения. Возвращается как null, если у сообщения нет комментариев.
- `id` (integer, int64, **обязательный**): Идентификатор созданного треда (используется для отправки [новых комментариев](POST /messages) в тред)
- Пример: `265142`
- `chat_id` (integer, int64, **обязательный**): Идентификатор чата треда (используется для отправки [новых комментариев](POST /messages) в тред и получения [списка комментариев](GET /chats/{id}/messages))
- Пример: `2637266155`
- `message_id` (integer, int64, **обязательный**): Идентификатор сообщения, к которому был создан тред
- Пример: `154332686`
- `message_chat_id` (integer, int64, **обязательный**): Идентификатор чата сообщения
- Пример: `2637266154`
- `updated_at` (string, date-time, **обязательный**): Дата и время обновления треда (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2023-02-01T19:20:47.204Z`
- `forwarding` (object, **обязательный**): Информация о пересланном сообщении. Возвращается как null, если сообщение не является пересланным автора.
- `original_message_id` (integer, int32, **обязательный**): Идентификатор оригинального сообщения
- `original_chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором находится оригинальное сообщение
- `author_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего оригинальное сообщение
- `original_created_at` (string, date-time, **обязательный**): Дата и время создания оригинального сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- `original_thread_id` (integer, int32, **обязательный**): Идентификатор треда, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `original_thread_message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому был создан тред, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `original_thread_parent_chat_id` (integer, int32, **обязательный**): Идентификатор чата сообщения, к которому был создан тред, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `parent_message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому написан ответ. Возвращается как null, если сообщение не является ответом.
- `display_avatar_url` (string, **обязательный**): Ссылка на аватарку отправителя сообщения. Возвращается как null, если для этого сообщения не была указана специальная аватарка.
- `display_name` (string, **обязательный**): Полное имя отправителя сообщения. Возвращается как null, если для этого сообщения не было указано специальное имя.
**Пример ответа:**
```json
{
"data": [
{
"id": 1194277,
"entity_type": "discussion",
"entity_id": 198,
"chat_id": 198,
"content": "Это сообщение тоже попадёт в экспорт",
"user_id": 12,
"created_at": "2023-09-18T13:43:32.000Z",
"url": "https://app.pachca.com/chats/198?message=1194277",
"files": [],
"buttons": [],
"thread": {
"id": 2633,
"chat_id": 44997,
"message_id": 1194277,
"message_chat_id": 198,
"updated_at": "2023-09-18T13:43:32.000Z"
},
"forwarding": null,
"parent_message_id": null,
"display_avatar_url": null,
"display_name": null
},
{
"id": 1194276,
"entity_type": "discussion",
"entity_id": 198,
"chat_id": 198,
"content": "**Andrew** добавил **Export bot** в беседу",
"user_id": 12,
"created_at": "2023-09-18T13:43:27.000Z",
"url": "https://app.pachca.com/chats/198?message=1194276",
"files": [],
"buttons": [],
"thread": null,
"forwarding": null,
"parent_message_id": null,
"display_avatar_url": null,
"display_name": null
},
{
"id": 1194275,
"entity_type": "discussion",
"entity_id": 198,
"chat_id": 198,
"content": "**Andrew** создал беседу",
"user_id": 12,
"created_at": "2023-09-18T13:43:19.000Z",
"url": "https://app.pachca.com/chats/198?message=1194275",
"files": [],
"buttons": [],
"thread": null,
"forwarding": null,
"parent_message_id": null,
"display_avatar_url": null,
"display_name": null
}
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Информация о сообщении
**Метод**: `GET`
**Путь**: `/messages/{id}`
Метод для получения информации о сообщении.
Для получения сообщения вам необходимо знать его `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/messages/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/messages/{id}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}')
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/messages/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Сообщение
- `id` (integer, int32, **обязательный**): Идентификатор сообщения
- Пример: `194275`
- `entity_type` (string, **обязательный**): Тип сущности, к которой относится сообщение
- **Возможные значения:**
- `discussion`: Беседа или канал
- `thread`: Тред
- `user`: Пользователь
- `entity_id` (integer, int32, **обязательный**): Идентификатор сущности, к которой относится сообщение (беседы/канала, треда или пользователя)
- Пример: `334`
- `chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором находится сообщение
- Пример: `334`
- `content` (string, **обязательный**): Текст сообщения
- Пример: `Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)`
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего сообщение
- Пример: `185`
- `created_at` (string, date-time, **обязательный**): Дата и время создания сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:57:23.000Z`
- `url` (string, **обязательный**): Прямая ссылка на сообщение
- Пример: `https://app.pachca.com/chats/334?message=194275`
- `files` (array[object], **обязательный**): Прикрепленные файлы
- `id` (integer, int32, **обязательный**): Идентификатор файла
- Пример: `3560`
- `key` (string, **обязательный**): Путь к файлу
- Пример: `attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png`
- `name` (string, **обязательный**): Название файла с расширением
- Пример: `congrat.png`
- `file_type` (string, **обязательный**): Тип файла
- **Возможные значения:**
- `file`: Обычный файл
- `image`: Изображение
- `url` (string, **обязательный**): Прямая ссылка на скачивание файла
- Пример: `https://pachca-prod-uploads.s3.storage.selcloud.ru/attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png?response-cache-control=max-age%3D3600%3B&response-content-disposition=attachment&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=142155_staply%2F20231107%2Fru-1a%2Fs3%2Faws4_request&X-Amz-Date=20231107T160412&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=98765asgfadsfdSaDSd4sdfg35asdf67sadf8`
- `width` (integer, int32, опциональный): Ширина изображения в пикселях
- Пример: `1920`
- `height` (integer, int32, опциональный): Высота изображения в пикселях
- Пример: `1080`
- `buttons` (array[array], **обязательный**): Массив строк, каждая из которых представлена массивом кнопок
- `thread` (object, **обязательный**): Тред сообщения. Возвращается как null, если у сообщения нет комментариев.
- `id` (integer, int64, **обязательный**): Идентификатор созданного треда (используется для отправки [новых комментариев](POST /messages) в тред)
- Пример: `265142`
- `chat_id` (integer, int64, **обязательный**): Идентификатор чата треда (используется для отправки [новых комментариев](POST /messages) в тред и получения [списка комментариев](GET /chats/{id}/messages))
- Пример: `2637266155`
- `message_id` (integer, int64, **обязательный**): Идентификатор сообщения, к которому был создан тред
- Пример: `154332686`
- `message_chat_id` (integer, int64, **обязательный**): Идентификатор чата сообщения
- Пример: `2637266154`
- `updated_at` (string, date-time, **обязательный**): Дата и время обновления треда (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2023-02-01T19:20:47.204Z`
- `forwarding` (object, **обязательный**): Информация о пересланном сообщении. Возвращается как null, если сообщение не является пересланным автора.
- `original_message_id` (integer, int32, **обязательный**): Идентификатор оригинального сообщения
- `original_chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором находится оригинальное сообщение
- `author_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего оригинальное сообщение
- `original_created_at` (string, date-time, **обязательный**): Дата и время создания оригинального сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- `original_thread_id` (integer, int32, **обязательный**): Идентификатор треда, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `original_thread_message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому был создан тред, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `original_thread_parent_chat_id` (integer, int32, **обязательный**): Идентификатор чата сообщения, к которому был создан тред, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `parent_message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому написан ответ. Возвращается как null, если сообщение не является ответом.
- `display_avatar_url` (string, **обязательный**): Ссылка на аватарку отправителя сообщения. Возвращается как null, если для этого сообщения не была указана специальная аватарка.
- `display_name` (string, **обязательный**): Полное имя отправителя сообщения. Возвращается как null, если для этого сообщения не было указано специальное имя.
**Пример ответа:**
```json
{
"data": {
"id": 194275,
"entity_type": "discussion",
"entity_id": 198,
"chat_id": 198,
"content": "Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)",
"user_id": 12,
"created_at": "2020-06-08T09:32:57.000Z",
"url": "https://app.pachca.com/chats/198?message=194275",
"files": [
{
"id": 3560,
"key": "attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png",
"name": "congrat.png",
"file_type": "image",
"url": "https://pachca-prod-uploads.s3.storage.selcloud.ru/attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png?response-cache-control=max-age%3D3600%3B&response-content-disposition=attachment&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=142155_staply%2F20231107%2Fru-1a%2Fs3%2Faws4_request&X-Amz-Date=20231107T160412&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=98765asgfadsfdSaDSd4sdfg35asdf67sadf8",
"width": 1920,
"height": 1080
}
],
"buttons": [],
"thread": {
"id": 29873,
"chat_id": 1949863,
"message_id": 194275,
"message_chat_id": 198,
"updated_at": "2020-06-08T09:32:57.000Z"
},
"forwarding": null,
"parent_message_id": 194274,
"display_avatar_url": null,
"display_name": null
}
}
```
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Редактирование сообщения
**Метод**: `PUT`
**Путь**: `/messages/{id}`
Метод для редактирования сообщения или комментария.
Для редактирования сообщения вам необходимо знать его `id` и указать его в `URL` запроса. Все редактируемые параметры сообщения указываются в теле запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `message` (object, **обязательный**): Собранный объект параметров редактируемого сообщения
- `content` (string, опциональный): Текст сообщения
- Пример: `Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.`
- `files` (array[object], опциональный): Прикрепляемые файлы
- `key` (string, **обязательный**): Путь к файлу, полученный в результате [загрузки файла](POST /direct_url)
- Пример: `attaches/files/93746/e354fd79-4f3e-4b5a-9c8d-1a2b3c4d5e6f/logo.png`
- `name` (string, **обязательный**): Название файла, которое вы хотите отображать пользователю (рекомендуется писать вместе с расширением)
- Пример: `logo.png`
- `file_type` (string, опциональный): Тип файла: файл (file), изображение (image)
- Пример: `image`
- `size` (integer, int32, опциональный): Размер файла в байтах, отображаемый пользователю
- Пример: `12345`
- `width` (integer, int32, опциональный): Ширина изображения в px (используется в случае, если file_type указан как image)
- Пример: `800`
- `height` (integer, int32, опциональный): Высота изображения в px (используется в случае, если file_type указан как image)
- Пример: `600`
- `buttons` (array[array], опциональный): Массив строк, каждая из которых представлена массивом кнопок. Для удаления кнопок у сообщения пришлите пустой массив.
- `display_avatar_url` (string, опциональный): Ссылка на специальную аватарку отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.
- Пример: `https://example.com/avatar.png`
- `display_name` (string, опциональный): Полное специальное имя отправителя для этого сообщения. Использование этого поля возможно только с access_token бота.
- Пример: `Бот Поддержки`
### Пример
```json
{
"message": {
"content": "Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.",
"files": []
}
}
```
## Примеры запроса
### cURL
```bash
curl -X PUT "https://api.pachca.com/api/shared/v1/messages/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"message": {
"content": "Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.",
"files": []
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"message": {
"content": "Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.",
"files": []
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'message': {
'content': 'Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.',
'files': []
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.put(
'https://api.pachca.com/api/shared/v1/messages/{id}',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D',
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"message": {
"content": "Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.",
"files": []
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}')
request = Net::HTTP::Put.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'message' => {
'content' => 'Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.',
'files' => []
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/messages/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'message' => [
'content' => 'Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.',
'files' => []
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Сообщение
- `id` (integer, int32, **обязательный**): Идентификатор сообщения
- Пример: `194275`
- `entity_type` (string, **обязательный**): Тип сущности, к которой относится сообщение
- **Возможные значения:**
- `discussion`: Беседа или канал
- `thread`: Тред
- `user`: Пользователь
- `entity_id` (integer, int32, **обязательный**): Идентификатор сущности, к которой относится сообщение (беседы/канала, треда или пользователя)
- Пример: `334`
- `chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором находится сообщение
- Пример: `334`
- `content` (string, **обязательный**): Текст сообщения
- Пример: `Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)`
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего сообщение
- Пример: `185`
- `created_at` (string, date-time, **обязательный**): Дата и время создания сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2021-08-28T15:57:23.000Z`
- `url` (string, **обязательный**): Прямая ссылка на сообщение
- Пример: `https://app.pachca.com/chats/334?message=194275`
- `files` (array[object], **обязательный**): Прикрепленные файлы
- `id` (integer, int32, **обязательный**): Идентификатор файла
- Пример: `3560`
- `key` (string, **обязательный**): Путь к файлу
- Пример: `attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png`
- `name` (string, **обязательный**): Название файла с расширением
- Пример: `congrat.png`
- `file_type` (string, **обязательный**): Тип файла
- **Возможные значения:**
- `file`: Обычный файл
- `image`: Изображение
- `url` (string, **обязательный**): Прямая ссылка на скачивание файла
- Пример: `https://pachca-prod-uploads.s3.storage.selcloud.ru/attaches/files/12/21zu7934-02e1-44d9-8df2-0f970c259796/congrat.png?response-cache-control=max-age%3D3600%3B&response-content-disposition=attachment&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=142155_staply%2F20231107%2Fru-1a%2Fs3%2Faws4_request&X-Amz-Date=20231107T160412&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=98765asgfadsfdSaDSd4sdfg35asdf67sadf8`
- `width` (integer, int32, опциональный): Ширина изображения в пикселях
- Пример: `1920`
- `height` (integer, int32, опциональный): Высота изображения в пикселях
- Пример: `1080`
- `buttons` (array[array], **обязательный**): Массив строк, каждая из которых представлена массивом кнопок
- `thread` (object, **обязательный**): Тред сообщения. Возвращается как null, если у сообщения нет комментариев.
- `id` (integer, int64, **обязательный**): Идентификатор созданного треда (используется для отправки [новых комментариев](POST /messages) в тред)
- Пример: `265142`
- `chat_id` (integer, int64, **обязательный**): Идентификатор чата треда (используется для отправки [новых комментариев](POST /messages) в тред и получения [списка комментариев](GET /chats/{id}/messages))
- Пример: `2637266155`
- `message_id` (integer, int64, **обязательный**): Идентификатор сообщения, к которому был создан тред
- Пример: `154332686`
- `message_chat_id` (integer, int64, **обязательный**): Идентификатор чата сообщения
- Пример: `2637266154`
- `updated_at` (string, date-time, **обязательный**): Дата и время обновления треда (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2023-02-01T19:20:47.204Z`
- `forwarding` (object, **обязательный**): Информация о пересланном сообщении. Возвращается как null, если сообщение не является пересланным автора.
- `original_message_id` (integer, int32, **обязательный**): Идентификатор оригинального сообщения
- `original_chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором находится оригинальное сообщение
- `author_id` (integer, int32, **обязательный**): Идентификатор пользователя, создавшего оригинальное сообщение
- `original_created_at` (string, date-time, **обязательный**): Дата и время создания оригинального сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- `original_thread_id` (integer, int32, **обязательный**): Идентификатор треда, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `original_thread_message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому был создан тред, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `original_thread_parent_chat_id` (integer, int32, **обязательный**): Идентификатор чата сообщения, к которому был создан тред, в котором находится оригинальное сообщение. Возвращается как null, если оригинальное сообщение не является комментарием в треде.
- `parent_message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому написан ответ. Возвращается как null, если сообщение не является ответом.
- `display_avatar_url` (string, **обязательный**): Ссылка на аватарку отправителя сообщения. Возвращается как null, если для этого сообщения не была указана специальная аватарка.
- `display_name` (string, **обязательный**): Полное имя отправителя сообщения. Возвращается как null, если для этого сообщения не было указано специальное имя.
**Пример ответа:**
```json
{
"data": {
"id": 7231942,
"entity_type": "discussion",
"entity_id": 17452,
"chat_id": 17452,
"content": "Вот попробуйте написать правильно это с первого раза: Будущий, Полощи, Прийти, Грейпфрут, Мозаика, Бюллетень, Дуршлаг, Винегрет.",
"user_id": 65,
"created_at": "2022-06-08T09:32:57.000Z",
"url": "https://app.pachca.com/chats/17452?message=7231942",
"files": [],
"buttons": [],
"thread": null,
"forwarding": null,
"parent_message_id": null,
"display_avatar_url": null,
"display_name": null
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Удаление сообщения
**Метод**: `DELETE`
**Путь**: `/messages/{id}`
#admin_access_token_required
Метод для удаления сообщения.
Удаление сообщения доступно отправителю, админам и редакторам в чате. В личных сообщениях оба пользователя являются редакторами. Ограничений по давности отправки сообщения нет.
Для удаления сообщения вам необходимо знать его `id` и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
## Примеры запроса
### cURL
```bash
curl -X DELETE "https://api.pachca.com/api/shared/v1/messages/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.delete(
'https://api.pachca.com/api/shared/v1/messages/{id}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D',
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}')
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/messages/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Закрепление сообщения
**Метод**: `POST`
**Путь**: `/messages/{id}/pin`
Метод для закрепления сообщения в чате.
Для закрепления сообщения вам необходимо знать `id` сообщения и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/messages/{id}/pin" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}/pin', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/messages/{id}/pin',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D/pin',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}/pin')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/messages/{id}/pin',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 201: The request has succeeded and a new resource has been created as a result.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 409: The request conflicts with the current state of the server.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Открепление сообщения
**Метод**: `DELETE`
**Путь**: `/messages/{id}/pin`
Метод для открепления сообщения из чата.
Для открепления сообщения вам необходимо знать `id` сообщения и указать его в `URL` запроса.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
## Примеры запроса
### cURL
```bash
curl -X DELETE "https://api.pachca.com/api/shared/v1/messages/{id}/pin" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}/pin', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.delete(
'https://api.pachca.com/api/shared/v1/messages/{id}/pin',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D/pin',
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}/pin')
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/messages/{id}/pin',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Read member
# Список прочитавших сообщение
**Метод**: `GET`
**Путь**: `/messages/{id}/read_member_ids`
Метод для получения актуального списка пользователей, прочитавших сообщение.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
### Query параметры
- `per` (integer, опциональный): Количество возвращаемых сущностей за один запрос
- По умолчанию: `300`
- `page` (integer, опциональный): Страница выборки
- По умолчанию: `1`
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/messages/{id}/read_member_ids?per=300&page=1" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}/read_member_ids?per=300&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'per': 300,
'page': 1,
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/messages/{id}/read_member_ids',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D/read_member_ids?per=300&page=1',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}/read_member_ids')
params = {
'per' => 300,
'page' => 1,
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
300, 'page' => 1];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/messages/{id}/read_member_ids?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (array[integer], **обязательный**)
**Пример ответа:**
```json
{
"data": [
12,
13,
14,
15,
16
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Reactions
# Добавление реакции
**Метод**: `POST`
**Путь**: `/messages/{id}/reactions`
Метод для добавления реакции на сообщение.
Для добавления реакции вам необходимо знать `id` сообщения и указать его в `URL` запроса. Реакции на сообщения отправляются в виде символов `Emoji`. Если пользователь уже ставил реакцию - повторно она установлена не будет. Для удаления реакции надо воспользоваться методом [Удаление реакции](DELETE /messages/{id}/reactions).
**Лимиты реакций:**
- Каждый пользователь может установить не более **20 уникальных** реакций
- Сообщение может иметь не более **30 уникальных** реакций
- Общее количество реакций на сообщение не может превышать **1000**
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `code` (string, **обязательный**): Emoji символ реакции
- Пример: `👍`
### Пример
```json
{
"code": "👍"
}
```
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/messages/{id}/reactions" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "👍"
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}/reactions', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"code": "👍"
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'code': '👍'
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/messages/{id}/reactions',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D/reactions',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"code": "👍"
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}/reactions')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'code' => '👍'
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/messages/{id}/reactions',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'code' => '👍'
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 201: The request has succeeded and a new resource has been created as a result.
**Схема ответа:**
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя, который добавил реакцию
- Пример: `12`
- `created_at` (string, date-time, **обязательный**): Дата и время добавления реакции (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2024-01-20T10:30:00.000Z`
- `code` (string, **обязательный**): Emoji символ реакции
- Пример: `👍`
- `name` (string, опциональный): Название emoji реакции
- Пример: `:+1::skin-tone-1:`
**Пример ответа:**
```json
{
"user_id": 355929,
"created_at": "2026-01-24T12:18:34.000Z",
"code": "👍",
"name": ":+1::skin-tone-1:"
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Удаление реакции
**Метод**: `DELETE`
**Путь**: `/messages/{id}/reactions`
Метод для удаления реакции на сообщение.
Для удаления реакции вам необходимо знать `id` сообщения и указать его в `URL` запроса. Реакции на сообщения хранятся в виде символов `Emoji`.
Удалять можно только те реакции, которые были поставлены авторизованным пользователем.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
### Query параметры
- `code` (string, **обязательный**): Emoji символ реакции
## Примеры запроса
### cURL
```bash
curl -X DELETE "https://api.pachca.com/api/shared/v1/messages/{id}/reactions?code=%F0%9F%91%8D" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}/reactions?code=%F0%9F%91%8D', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'code': '👍',
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.delete(
'https://api.pachca.com/api/shared/v1/messages/{id}/reactions',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D/reactions?code=%F0%9F%91%8D',
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}/reactions')
params = {
'code' => '👍',
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'👍'];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/messages/{id}/reactions?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Список реакций
**Метод**: `GET`
**Путь**: `/messages/{id}/reactions`
Метод для получения актуального списка реакций на сообщение.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
### Query параметры
- `per` (integer, опциональный): Количество записей на странице
- По умолчанию: `50`
- `page` (integer, опциональный): Номер страницы
- По умолчанию: `1`
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/messages/{id}/reactions?per=50&page=1" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}/reactions?per=50&page=1', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'per': 50,
'page': 1,
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/messages/{id}/reactions',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D/reactions?per=50&page=1',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}/reactions')
params = {
'per' => 50,
'page' => 1,
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
50, 'page' => 1];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/messages/{id}/reactions?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (array[object], **обязательный**)
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя, который добавил реакцию
- Пример: `12`
- `created_at` (string, date-time, **обязательный**): Дата и время добавления реакции (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2024-01-20T10:30:00.000Z`
- `code` (string, **обязательный**): Emoji символ реакции
- Пример: `👍`
- `name` (string, опциональный): Название emoji реакции
- Пример: `:+1::skin-tone-1:`
**Пример ответа:**
```json
{
"data": [
{
"user_id": 76243,
"created_at": "2023-09-11T14:59:35.000Z",
"code": "👍",
"name": ":+1:"
},
{
"user_id": 10764,
"created_at": "2023-09-11T15:00:31.000Z",
"code": "👍",
"name": ":+1:"
},
{
"user_id": 27494,
"created_at": "2023-09-11T15:01:27.000Z",
"code": "👍",
"name": ":+1:"
},
{
"user_id": 27494,
"created_at": "2023-09-11T15:01:47.000Z",
"code": "🔥",
"name": ":fire:"
},
{
"user_id": 11887,
"created_at": "2023-09-11T15:12:49.000Z",
"code": "👍",
"name": ":+1:"
},
{
"user_id": 11887,
"created_at": "2023-09-11T15:13:46.000Z",
"code": "⭐",
"name": ":star:"
},
{
"user_id": 11887,
"created_at": "2023-09-11T15:13:47.000Z",
"code": "🔥",
"name": ":fire:"
}
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Link Previews
# Unfurl (разворачивание ссылок)
**Метод**: `POST`
**Путь**: `/messages/{id}/link_previews`
#unfurling_bot_access_token_required
Метод для создания предпросмотров ссылок в сообщениях.
Для создания предпросмотров ссылок вам необходимо знать `id` сообщения и указать его в `URL` запроса.
Изображения вы можете предоставить как публичной ссылкой (параметром `image_url`), так и с помощью прямой загрузки файла на наш сервер (параметром `image`) через метод `Загрузка файлов`. Если вы указали оба параметра сразу, то `image` является более приоритетным.
Если среди присланных `URL`-ключей будет выявлена ошибка (такого `URL` нет в сообщении или боту не прописан в настройках домен указанного `URL`), то запрос не будет выполнен (не будет создано ни одного предпросмотра).
На данный момент поддерживается отображение только первого созданного предпросмотра ссылки к сообщению. Все присланные вами `link_previews` будут сохранены и появятся в сообщениях в ближайших обновлениях.
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор сообщения
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `link_previews` (Record, **обязательный**): `JSON` карта предпросмотров ссылок, где каждый ключ — `URL`, который был получен в исходящем вебхуке о новом сообщении.
**Структура значений Record:**
- `title` (string, **обязательный**): Заголовок
- Пример: `Статья: Отправка файлов`
- `description` (string, **обязательный**): Описание
- Пример: `Пример отправки файлов на удаленный сервер`
- `image_url` (string, опциональный): Публичная ссылка на изображение (если вы хотите загрузить файл изображения в Пачку, то используйте параметр image)
- Пример: `https://website.com/img/landing.png`
- `image` (object, опциональный): Изображение
- `key` (string, **обязательный**): Путь к изображению, полученный в результате [загрузки файла](POST /direct_url)
- Пример: `attaches/files/93746/e354fd79-9jh6-f2hd-fj83-709dae24c763/$filename`
- `name` (string, **обязательный**): Название изображения (рекомендуется писать вместе с расширением)
- Пример: `files-to-server.jpg`
- `size` (integer, int32, **обязательный**): Размер изображения в байтах
- Пример: `695604`
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/messages/{id}/link_previews" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"link_previews": {
"key": {
"title": "Статья: Отправка файлов",
"description": "Пример отправки файлов на удаленный сервер",
"image_url": "https://website.com/img/landing.png",
"image": {
"key": "attaches/files/93746/e354fd79-9jh6-f2hd-fj83-709dae24c763/$filename",
"name": "files-to-server.jpg",
"size": 695604
}
}
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/messages/{id}/link_previews', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"link_previews": {
"key": {
"title": "Статья: Отправка файлов",
"description": "Пример отправки файлов на удаленный сервер",
"image_url": "https://website.com/img/landing.png",
"image": {
"key": "attaches/files/93746/e354fd79-9jh6-f2hd-fj83-709dae24c763/$filename",
"name": "files-to-server.jpg",
"size": 695604
}
}
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'link_previews': {
'key': {
'title': 'Статья: Отправка файлов',
'description': 'Пример отправки файлов на удаленный сервер',
'image_url': 'https://website.com/img/landing.png',
'image': {
'key': 'attaches/files/93746/e354fd79-9jh6-f2hd-fj83-709dae24c763/$filename',
'name': 'files-to-server.jpg',
'size': 695604
}
}
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/messages/{id}/link_previews',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/messages/%7Bid%7D/link_previews',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"link_previews": {
"key": {
"title": "Статья: Отправка файлов",
"description": "Пример отправки файлов на удаленный сервер",
"image_url": "https://website.com/img/landing.png",
"image": {
"key": "attaches/files/93746/e354fd79-9jh6-f2hd-fj83-709dae24c763/$filename",
"name": "files-to-server.jpg",
"size": 695604
}
}
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/messages/{id}/link_previews')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'link_previews' => {
'key' => {
'title' => 'Статья: Отправка файлов',
'description' => 'Пример отправки файлов на удаленный сервер',
'image_url' => 'https://website.com/img/landing.png',
'image' => {
'key' => 'attaches/files/93746/e354fd79-9jh6-f2hd-fj83-709dae24c763/$filename',
'name' => 'files-to-server.jpg',
'size' => 695604
}
}
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/messages/{id}/link_previews',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'link_previews' => [
'key' => [
'title' => 'Статья: Отправка файлов',
'description' => 'Пример отправки файлов на удаленный сервер',
'image_url' => 'https://website.com/img/landing.png',
'image' => [
'key' => 'attaches/files/93746/e354fd79-9jh6-f2hd-fj83-709dae24c763/$filename',
'name' => 'files-to-server.jpg',
'size' => 695604
]
]
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Tasks
# Новое напоминание
**Метод**: `POST`
**Путь**: `/tasks`
Метод для создания нового напоминания.
При создании напоминания обязательным условием является указания типа напоминания: звонок, встреча, простое напоминание, событие или письмо. При этом не требуется дополнительное описание - вы просто создадите напоминание с соответствующим текстом. Если вы укажите описание напоминания - то именно оно и станет текстом напоминания.
У напоминания должны быть ответственные, если их не указывать - ответственным назначается вы.
Ответственным для напоминания без привязки к каким-либо сущностям может стать любой сотрудник компании. Актуальный состав сотрудников компании вы можете получить в методе [список сотрудников](GET /users).
На текущий момент данный метод поддерживает только создание напоминаний без привязки к каким-либо сущностям.
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `task` (object, **обязательный**): Собранный объект параметров создаваемого напоминания
- `kind` (string, **обязательный**): Тип
- **Возможные значения:**
- `call`: Позвонить контакту
- `meeting`: Встреча
- `reminder`: Простое напоминание
- `event`: Событие
- `email`: Написать письмо
- `content` (string, опциональный): Описание (по умолчанию — название типа)
- Пример: `Забрать со склада 21 заказ`
- `due_at` (string, date-time, **обязательный**): Срок выполнения напоминания (ISO-8601) в формате YYYY-MM-DDThh:mm:ss.sssTZD. Если указано время 23:59:59.000, то напоминание будет создано на весь день (без указания времени).
- Пример: `2020-06-05T12:00:00.000+03:00`
- `priority` (integer, int32, опциональный): Приоритет: 1, 2 (важно) или 3 (очень важно).
- Пример: `2`
- По умолчанию: `1`
- `performer_ids` (array[integer], опциональный): Массив идентификаторов пользователей, привязываемых к напоминанию как «ответственные» (по умолчанию ответственным назначается вы)
- `custom_properties` (array[object], опциональный): Задаваемые дополнительные поля
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `78`
- `value` (string, **обязательный**): Устанавливаемое значение
- Пример: `Синий склад`
### Пример
```json
{
"task": {
"kind": "reminder",
"content": "Забрать со склада 21 заказ",
"due_at": "2020-06-05T12:00:00.000+03:00",
"priority": 2,
"custom_properties": [
{
"id": 78,
"value": "Синий склад"
}
]
}
}
```
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/tasks" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"task": {
"kind": "reminder",
"content": "Забрать со склада 21 заказ",
"due_at": "2020-06-05T12:00:00.000+03:00",
"priority": 2,
"custom_properties": [
{
"id": 78,
"value": "Синий склад"
}
]
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/tasks', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"task": {
"kind": "reminder",
"content": "Забрать со склада 21 заказ",
"due_at": "2020-06-05T12:00:00.000+03:00",
"priority": 2,
"custom_properties": [
{
"id": 78,
"value": "Синий склад"
}
]
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'task': {
'kind': 'reminder',
'content': 'Забрать со склада 21 заказ',
'due_at': '2020-06-05T12:00:00.000+03:00',
'priority': 2,
'custom_properties': [
{
'id': 78,
'value': 'Синий склад'
}
]
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/tasks',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/tasks',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"task": {
"kind": "reminder",
"content": "Забрать со склада 21 заказ",
"due_at": "2020-06-05T12:00:00.000+03:00",
"priority": 2,
"custom_properties": [
{
"id": 78,
"value": "Синий склад"
}
]
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/tasks')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'task' => {
'kind' => 'reminder',
'content' => 'Забрать со склада 21 заказ',
'due_at' => '2020-06-05T12:00:00.000+03:00',
'priority' => 2,
'custom_properties' => [
{
'id' => 78,
'value' => 'Синий склад'
}
]
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/tasks',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'task' => [
'kind' => 'reminder',
'content' => 'Забрать со склада 21 заказ',
'due_at' => '2020-06-05T12:00:00.000+03:00',
'priority' => 2,
'custom_properties' => [
[
'id' => 78,
'value' => 'Синий склад'
]
]
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Напоминание
- `id` (integer, int32, **обязательный**): Идентификатор напоминания
- Пример: `22283`
- `kind` (string, **обязательный**): Тип
- **Возможные значения:**
- `call`: Позвонить контакту
- `meeting`: Встреча
- `reminder`: Простое напоминание
- `event`: Событие
- `email`: Написать письмо
- `content` (string, **обязательный**): Описание
- Пример: `Забрать со склада 21 заказ`
- `due_at` (string, date-time, **обязательный**): Срок выполнения напоминания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2020-06-05T09:00:00.000Z`
- `priority` (integer, int32, **обязательный**): Приоритет
- Пример: `2`
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя-создателя напоминания
- Пример: `12`
- `status` (string, **обязательный**): Статус напоминания
- Пример: `undone`
- **Возможные значения:**
- `undone`: Активная
- `created_at` (string, date-time, **обязательный**): Дата и время создания напоминания (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2020-06-04T10:37:57.000Z`
- `performer_ids` (array[integer], **обязательный**): Массив идентификаторов пользователей, привязанных к напоминанию как «ответственные»
- Пример: `[12]`
- `custom_properties` (array[object], **обязательный**): Дополнительные поля напоминания
- `id` (integer, int32, **обязательный**): Идентификатор поля
- Пример: `1678`
- `name` (string, **обязательный**): Название поля
- Пример: `Город`
- `data_type` (string, **обязательный**): Тип поля
- **Возможные значения:**
- `string`: Строковое значение
- `number`: Числовое значение
- `date`: Дата
- `link`: Ссылка
- `value` (string, **обязательный**): Значение
- Пример: `Санкт-Петербург`
**Пример ответа:**
```json
{
"data": {
"id": 22283,
"kind": "reminder",
"content": "Забрать со склада 21 заказ",
"due_at": "2020-06-05T09:00:00.000Z",
"priority": 2,
"user_id": 12,
"status": "undone",
"created_at": "2020-06-04T10:37:57.000Z",
"performer_ids": [
12
],
"custom_properties": [
{
"id": 78,
"name": "Место",
"data_type": "string",
"value": "Синий склад"
}
]
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Views
# Открытие представления
**Метод**: `POST`
**Путь**: `/views/open`
Метод для открытия модального окна с представлением для пользователя.
Чтобы открыть модальное окно с представлением, ваше приложение должно иметь действительный, неистекший `trigger_id`.
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `type` (string, **обязательный**): Способ открытия представления
- **Возможные значения:**
- `modal`: Модальное окно
- `trigger_id` (string, **обязательный**): Уникальный идентификатор события (полученный, например, в исходящем вебхуке о нажатии кнопки)
- `private_metadata` (string, опциональный): Необязательная строка, которая будет отправлена в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для передачи в формате `JSON` какой то дополнительной информации вместе с заполненной пользователем формой.
- Максимальная длина: 3000 символов
- `callback_id` (string, опциональный): Необязательный идентификатор для распознавания этого представления, который будет отправлен в ваше приложение при отправке пользователем заполненной формы. Используйте это поле, например, для понимания, какую форму должен был заполнить пользователь.
- Максимальная длина: 255 символов
- `view` (object, **обязательный**): Собранный объект представления
- `title` (string, **обязательный**): Заголовок представления
- Максимальная длина: 24 символов
- `close_text` (string, опциональный): Текст кнопки закрытия представления
- По умолчанию: `Отменить`
- Максимальная длина: 24 символов
- `submit_text` (string, опциональный): Текст кнопки отправки формы
- По умолчанию: `Отправить`
- Максимальная длина: 24 символов
- `blocks` (array (union), **обязательный**): Массив блоков представления
- Максимум элементов: 100
**Возможные типы элементов:**
- **ViewBlockHeader**: Блок header — заголовок
- `type` (string, **обязательный**): Тип блока
- Пример: `header`
- **Возможные значения:**
- `header`: Для заголовков всегда header
- `text` (string, **обязательный**): Текст заголовка
- Пример: `Основная информация`
- Максимальная длина: 150 символов
- **ViewBlockPlainText**: Блок plain_text — обычный текст
- `type` (string, **обязательный**): Тип блока
- Пример: `plain_text`
- **Возможные значения:**
- `plain_text`: Для обычного текста всегда plain_text
- `text` (string, **обязательный**): Текст
- Пример: `Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе.`
- Максимальная длина: 12000 символов
- **ViewBlockMarkdown**: Блок markdown — форматированный текст
- `type` (string, **обязательный**): Тип блока
- Пример: `markdown`
- **Возможные значения:**
- `markdown`: Для форматированного текста всегда markdown
- `text` (string, **обязательный**): Текст
- Пример: `Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)`
- Максимальная длина: 12000 символов
- **ViewBlockDivider**: Блок divider — разделитель
- `type` (string, **обязательный**): Тип блока
- Пример: `divider`
- **Возможные значения:**
- `divider`: Для разделителя всегда divider
- **ViewBlockInput**: Блок input — текстовое поле ввода
- `type` (string, **обязательный**): Тип блока
- Пример: `input`
- **Возможные значения:**
- `input`: Для текстового поля всегда input
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем значения
- Пример: `info`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к полю
- Пример: `Описание отпуска`
- Максимальная длина: 150 символов
- `placeholder` (string, опциональный): Подсказка внутри поля ввода, пока оно пустое
- Пример: `Куда собираетесь и что будете делать`
- Максимальная длина: 150 символов
- `multiline` (boolean, опциональный): Многострочное поле. При значении true поле отображается многострочным.
- Пример: `true`
- `initial_value` (string, опциональный): Начальное значение в поле
- Максимальная длина: 3000 символов
- `min_length` (integer, int32, опциональный): Минимальная длина текста, который должен написать пользователь. Если пользователь напишет меньше, он получит ошибку.
- Минимум: 0
- Максимум: 3000
- `max_length` (integer, int32, опциональный): Максимальная длина текста, который должен написать пользователь. Если пользователь напишет больше, он получит ошибку.
- Минимум: 1
- Максимум: 3000
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- Пример: `true`
- `hint` (string, опциональный): Подсказка, которая отображается под полем серым цветом
- Пример: `Возможно вам подскаджут, какие места лучше посетить`
- Максимальная длина: 2000 символов
- **ViewBlockSelect**: Блок select — выпадающий список
- `type` (string, **обязательный**): Тип блока
- Пример: `select`
- **Возможные значения:**
- `select`: Для выпадающего списка всегда select
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем выбора
- Пример: `team`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к выпадающему списку
- Пример: `Выберите команду`
- Максимальная длина: 150 символов
- `options` (array[object], опциональный): Массив доступных пунктов в выпадающем списке
- Максимум элементов: 100
- `text` (string, **обязательный**): Отображаемый текст
- Пример: `Ничего`
- Максимальная длина: 75 символов
- `value` (string, **обязательный**): Уникальное строковое значение, которое будет передано в ваше приложение при выборе этого пункта
- Пример: `nothing`
- Максимальная длина: 150 символов
- `description` (string, опциональный): Пояснение, которое будет указано серым цветом в этом пункте под отображаемым текстом
- Пример: `Каждый день бот будет присылать список новых задач в вашей команде`
- Максимальная длина: 75 символов
- `checked` (boolean, опциональный): Выбрано. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `selected` (boolean, опциональный): Начальный выбор. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- `hint` (string, опциональный): Подсказка, которая отображается под выпадающим списком серым цветом
- Максимальная длина: 2000 символов
- **ViewBlockRadio**: Блок radio — радиокнопки
- `type` (string, **обязательный**): Тип блока
- Пример: `radio`
- **Возможные значения:**
- `radio`: Для радиокнопок всегда radio
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем выбора
- Пример: `accessibility`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к группе радиокнопок
- Пример: `Доступность`
- Максимальная длина: 150 символов
- `options` (array[object], опциональный): Массив радиокнопок
- Максимум элементов: 10
- `text` (string, **обязательный**): Отображаемый текст
- Пример: `Ничего`
- Максимальная длина: 75 символов
- `value` (string, **обязательный**): Уникальное строковое значение, которое будет передано в ваше приложение при выборе этого пункта
- Пример: `nothing`
- Максимальная длина: 150 символов
- `description` (string, опциональный): Пояснение, которое будет указано серым цветом в этом пункте под отображаемым текстом
- Пример: `Каждый день бот будет присылать список новых задач в вашей команде`
- Максимальная длина: 75 символов
- `checked` (boolean, опциональный): Выбрано. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `selected` (boolean, опциональный): Начальный выбор. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- Пример: `true`
- `hint` (string, опциональный): Подсказка, которая отображается под группой радиокнопок серым цветом
- Пример: `Если вы не планируете выходить на связь, то выберите вариант Ничего`
- Максимальная длина: 2000 символов
- **ViewBlockCheckbox**: Блок checkbox — чекбоксы
- `type` (string, **обязательный**): Тип блока
- Пример: `checkbox`
- **Возможные значения:**
- `checkbox`: Для чекбоксов всегда checkbox
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем выбора
- Пример: `newsletters`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к группе чекбоксов
- Пример: `Рассылки`
- Максимальная длина: 150 символов
- `options` (array[object], опциональный): Массив чекбоксов
- Максимум элементов: 10
- `text` (string, **обязательный**): Отображаемый текст
- Пример: `Ничего`
- Максимальная длина: 75 символов
- `value` (string, **обязательный**): Уникальное строковое значение, которое будет передано в ваше приложение при выборе этого пункта
- Пример: `nothing`
- Максимальная длина: 150 символов
- `description` (string, опциональный): Пояснение, которое будет указано серым цветом в этом пункте под отображаемым текстом
- Пример: `Каждый день бот будет присылать список новых задач в вашей команде`
- Максимальная длина: 75 символов
- `checked` (boolean, опциональный): Выбрано. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `selected` (boolean, опциональный): Начальный выбор. При значении true этот пункт будет выбран изначально. Только один пункт может быть выбран.
- Пример: `true`
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- `hint` (string, опциональный): Подсказка, которая отображается под группой чекбоксов серым цветом
- Максимальная длина: 2000 символов
- **ViewBlockDate**: Блок date — выбор даты
- `type` (string, **обязательный**): Тип блока
- Пример: `date`
- **Возможные значения:**
- `date`: Для выбора даты всегда date
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем значения
- Пример: `date_start`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к полю
- Пример: `Дата начала отпуска`
- Максимальная длина: 150 символов
- `initial_date` (string, опциональный): Начальное значение в поле в формате YYYY-MM-DD
- Пример: `2025-07-01`
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- Пример: `true`
- `hint` (string, опциональный): Подсказка, которая отображается под полем серым цветом
- Максимальная длина: 2000 символов
- **ViewBlockTime**: Блок time — выбор времени
- `type` (string, **обязательный**): Тип блока
- Пример: `time`
- **Возможные значения:**
- `time`: Для выбора времени всегда time
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем значения
- Пример: `newsletter_time`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к полю
- Пример: `Время рассылки`
- Максимальная длина: 150 символов
- `initial_time` (string, опциональный): Начальное значение в поле в формате HH:mm
- Пример: `11:00`
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- `hint` (string, опциональный): Подсказка, которая отображается под полем серым цветом
- Пример: `Укажите, в какое время присылать выбранные рассылки`
- Максимальная длина: 2000 символов
- **ViewBlockFileInput**: Блок file_input — загрузка файлов
- `type` (string, **обязательный**): Тип блока
- Пример: `file_input`
- **Возможные значения:**
- `file_input`: Для загрузки файлов всегда file_input
- `name` (string, **обязательный**): Название, которое будет передано в ваше приложение как ключ указанного пользователем значения
- Пример: `request_doc`
- Максимальная длина: 255 символов
- `label` (string, **обязательный**): Подпись к полю
- Пример: `Заявление`
- Максимальная длина: 150 символов
- `filetypes` (array[string], опциональный): Массив допустимых расширений файлов, указанные в виде строк (например, ["png","jpg","gif"]). Если это поле не указано, все расширения файлов будут приняты.
- Пример: `["pdf","jpg","png"]`
- `max_files` (integer, int32, опциональный): Максимальное количество файлов, которое может загрузить пользователь в это поле.
- Пример: `1`
- По умолчанию: `10`
- Минимум: 1
- Максимум: 10
- `required` (boolean, опциональный): Обязательность. При значении true поле будет обязательным для заполнения и отмечено символом *.
- Пример: `true`
- `hint` (string, опциональный): Подсказка, которая отображается под полем серым цветом
- Пример: `Загрузите заполненное заявление с электронной подписью (в формате pdf, jpg или png)`
- Максимальная длина: 2000 символов
### Пример
```json
{
"trigger_id": "791a056b-006c-49dd-834b-c633fde52fe8",
"type": "modal",
"private_metadata": "{'timeoff_id':4378}",
"callback_id": "timeoff_reguest_form",
"view": {
"title": "Уведомление об отпуске",
"close_text": "Закрыть",
"submit_text": "Отправить заявку",
"blocks": [
{
"type": "plain_text",
"text": "Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе."
},
{
"type": "markdown",
"text": "Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)"
},
{
"type": "header",
"text": "Основная информация"
},
{
"type": "date",
"name": "date_start",
"label": "Дата начала отпуска",
"initial_date": "2025-07-01",
"required": true
},
{
"type": "date",
"name": "date_end",
"label": "Дата окончания отпуска",
"initial_date": "2025-07-28",
"required": true
},
{
"type": "file_input",
"name": "request_doc",
"label": "Заявление",
"filetypes": [
"pdf",
"jpg",
"png"
],
"max_files": 1,
"required": true,
"hint": "Загрузите заполненное заявление с электронной подписью (в формате pdf, jpg или png)"
},
{
"type": "radio",
"name": "accessibility",
"label": "Доступность",
"options": [
{
"text": "Ничего",
"value": "nothing",
"checked": true
},
{
"text": "Только телефон",
"value": "phone_only"
},
{
"text": "Телефон и ноутбук",
"value": "phone_notebook"
}
],
"required": true,
"hint": "Если вы не планируете выходить на связь, то выберите вариант Ничего"
},
{
"type": "divider"
},
{
"type": "header",
"text": "Дополнительно"
},
{
"type": "input",
"name": "info",
"label": "Описание отпуска",
"placeholder": "Куда собираетесь и что будете делать",
"multiline": true,
"hint": "Возможно вам подскаджут, какие места лучше посетить"
},
{
"type": "checkbox",
"name": "newsletters",
"label": "Рассылки",
"options": [
{
"text": "Получать уведомления о новых задачах в команде",
"value": "new_tasks",
"description": "Каждый день бот будет присылать список новых задач в вашей команде"
},
{
"text": "Получать уведомления об обновлениях в проектах",
"value": "project_updates",
"description": "Два раза в неделю бот будет присылать обновления по проектам"
}
]
},
{
"type": "select",
"name": "team",
"label": "Выберите команду",
"options": [
{
"text": "Все команды",
"value": "all"
},
{
"text": "Web",
"value": "web",
"selected": true
},
{
"text": "iOS",
"value": "ios"
},
{
"text": "Android",
"value": "android"
},
{
"text": "Back",
"value": "back"
},
{
"text": "Design",
"value": "design"
},
{
"text": "Success",
"value": "success"
}
]
},
{
"type": "time",
"name": "newsletter_time",
"label": "Время рассылки",
"initial_time": "11:00",
"hint": "Укажите, в какое время присылать выбранные рассылки"
}
]
}
}
```
## Примеры запроса
### cURL
```bash
curl -X POST "https://api.pachca.com/api/shared/v1/views/open" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"trigger_id": "791a056b-006c-49dd-834b-c633fde52fe8",
"type": "modal",
"private_metadata": "{'timeoff_id':4378}",
"callback_id": "timeoff_reguest_form",
"view": {
"title": "Уведомление об отпуске",
"close_text": "Закрыть",
"submit_text": "Отправить заявку",
"blocks": [
{
"type": "plain_text",
"text": "Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе."
},
{
"type": "markdown",
"text": "Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)"
},
{
"type": "header",
"text": "Основная информация"
},
{
"type": "date",
"name": "date_start",
"label": "Дата начала отпуска",
"initial_date": "2025-07-01",
"required": true
},
{
"type": "date",
"name": "date_end",
"label": "Дата окончания отпуска",
"initial_date": "2025-07-28",
"required": true
},
{
"type": "file_input",
"name": "request_doc",
"label": "Заявление",
"filetypes": [
"pdf",
"jpg",
"png"
],
"max_files": 1,
"required": true,
"hint": "Загрузите заполненное заявление с электронной подписью (в формате pdf, jpg или png)"
},
{
"type": "radio",
"name": "accessibility",
"label": "Доступность",
"options": [
{
"text": "Ничего",
"value": "nothing",
"checked": true
},
{
"text": "Только телефон",
"value": "phone_only"
},
{
"text": "Телефон и ноутбук",
"value": "phone_notebook"
}
],
"required": true,
"hint": "Если вы не планируете выходить на связь, то выберите вариант Ничего"
},
{
"type": "divider"
},
{
"type": "header",
"text": "Дополнительно"
},
{
"type": "input",
"name": "info",
"label": "Описание отпуска",
"placeholder": "Куда собираетесь и что будете делать",
"multiline": true,
"hint": "Возможно вам подскаджут, какие места лучше посетить"
},
{
"type": "checkbox",
"name": "newsletters",
"label": "Рассылки",
"options": [
{
"text": "Получать уведомления о новых задачах в команде",
"value": "new_tasks",
"description": "Каждый день бот будет присылать список новых задач в вашей команде"
},
{
"text": "Получать уведомления об обновлениях в проектах",
"value": "project_updates",
"description": "Два раза в неделю бот будет присылать обновления по проектам"
}
]
},
{
"type": "select",
"name": "team",
"label": "Выберите команду",
"options": [
{
"text": "Все команды",
"value": "all"
},
{
"text": "Web",
"value": "web",
"selected": true
},
{
"text": "iOS",
"value": "ios"
},
{
"text": "Android",
"value": "android"
},
{
"text": "Back",
"value": "back"
},
{
"text": "Design",
"value": "design"
},
{
"text": "Success",
"value": "success"
}
]
},
{
"type": "time",
"name": "newsletter_time",
"label": "Время рассылки",
"initial_time": "11:00",
"hint": "Укажите, в какое время присылать выбранные рассылки"
}
]
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/views/open', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"trigger_id": "791a056b-006c-49dd-834b-c633fde52fe8",
"type": "modal",
"private_metadata": "{'timeoff_id':4378}",
"callback_id": "timeoff_reguest_form",
"view": {
"title": "Уведомление об отпуске",
"close_text": "Закрыть",
"submit_text": "Отправить заявку",
"blocks": [
{
"type": "plain_text",
"text": "Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе."
},
{
"type": "markdown",
"text": "Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)"
},
{
"type": "header",
"text": "Основная информация"
},
{
"type": "date",
"name": "date_start",
"label": "Дата начала отпуска",
"initial_date": "2025-07-01",
"required": true
},
{
"type": "date",
"name": "date_end",
"label": "Дата окончания отпуска",
"initial_date": "2025-07-28",
"required": true
},
{
"type": "file_input",
"name": "request_doc",
"label": "Заявление",
"filetypes": [
"pdf",
"jpg",
"png"
],
"max_files": 1,
"required": true,
"hint": "Загрузите заполненное заявление с электронной подписью (в формате pdf, jpg или png)"
},
{
"type": "radio",
"name": "accessibility",
"label": "Доступность",
"options": [
{
"text": "Ничего",
"value": "nothing",
"checked": true
},
{
"text": "Только телефон",
"value": "phone_only"
},
{
"text": "Телефон и ноутбук",
"value": "phone_notebook"
}
],
"required": true,
"hint": "Если вы не планируете выходить на связь, то выберите вариант Ничего"
},
{
"type": "divider"
},
{
"type": "header",
"text": "Дополнительно"
},
{
"type": "input",
"name": "info",
"label": "Описание отпуска",
"placeholder": "Куда собираетесь и что будете делать",
"multiline": true,
"hint": "Возможно вам подскаджут, какие места лучше посетить"
},
{
"type": "checkbox",
"name": "newsletters",
"label": "Рассылки",
"options": [
{
"text": "Получать уведомления о новых задачах в команде",
"value": "new_tasks",
"description": "Каждый день бот будет присылать список новых задач в вашей команде"
},
{
"text": "Получать уведомления об обновлениях в проектах",
"value": "project_updates",
"description": "Два раза в неделю бот будет присылать обновления по проектам"
}
]
},
{
"type": "select",
"name": "team",
"label": "Выберите команду",
"options": [
{
"text": "Все команды",
"value": "all"
},
{
"text": "Web",
"value": "web",
"selected": true
},
{
"text": "iOS",
"value": "ios"
},
{
"text": "Android",
"value": "android"
},
{
"text": "Back",
"value": "back"
},
{
"text": "Design",
"value": "design"
},
{
"text": "Success",
"value": "success"
}
]
},
{
"type": "time",
"name": "newsletter_time",
"label": "Время рассылки",
"initial_time": "11:00",
"hint": "Укажите, в какое время присылать выбранные рассылки"
}
]
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'trigger_id': '791a056b-006c-49dd-834b-c633fde52fe8',
'type': 'modal',
'private_metadata': '{'timeoff_id':4378}',
'callback_id': 'timeoff_reguest_form',
'view': {
'title': 'Уведомление об отпуске',
'close_text': 'Закрыть',
'submit_text': 'Отправить заявку',
'blocks': [
{
'type': 'plain_text',
'text': 'Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе.'
},
{
'type': 'markdown',
'text': 'Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)'
},
{
'type': 'header',
'text': 'Основная информация'
},
{
'type': 'date',
'name': 'date_start',
'label': 'Дата начала отпуска',
'initial_date': '2025-07-01',
'required': True
},
{
'type': 'date',
'name': 'date_end',
'label': 'Дата окончания отпуска',
'initial_date': '2025-07-28',
'required': True
},
{
'type': 'file_input',
'name': 'request_doc',
'label': 'Заявление',
'filetypes': [
'pdf',
'jpg',
'png'
],
'max_files': 1,
'required': True,
'hint': 'Загрузите заполненное заявление с электронной подписью (в формате pdf, jpg или png)'
},
{
'type': 'radio',
'name': 'accessibility',
'label': 'Доступность',
'options': [
{
'text': 'Ничего',
'value': 'nothing',
'checked': True
},
{
'text': 'Только телефон',
'value': 'phone_only'
},
{
'text': 'Телефон и ноутбук',
'value': 'phone_notebook'
}
],
'required': True,
'hint': 'Если вы не планируете выходить на связь, то выберите вариант Ничего'
},
{
'type': 'divider'
},
{
'type': 'header',
'text': 'Дополнительно'
},
{
'type': 'input',
'name': 'info',
'label': 'Описание отпуска',
'placeholder': 'Куда собираетесь и что будете делать',
'multiline': True,
'hint': 'Возможно вам подскаджут, какие места лучше посетить'
},
{
'type': 'checkbox',
'name': 'newsletters',
'label': 'Рассылки',
'options': [
{
'text': 'Получать уведомления о новых задачах в команде',
'value': 'new_tasks',
'description': 'Каждый день бот будет присылать список новых задач в вашей команде'
},
{
'text': 'Получать уведомления об обновлениях в проектах',
'value': 'project_updates',
'description': 'Два раза в неделю бот будет присылать обновления по проектам'
}
]
},
{
'type': 'select',
'name': 'team',
'label': 'Выберите команду',
'options': [
{
'text': 'Все команды',
'value': 'all'
},
{
'text': 'Web',
'value': 'web',
'selected': True
},
{
'text': 'iOS',
'value': 'ios'
},
{
'text': 'Android',
'value': 'android'
},
{
'text': 'Back',
'value': 'back'
},
{
'text': 'Design',
'value': 'design'
},
{
'text': 'Success',
'value': 'success'
}
]
},
{
'type': 'time',
'name': 'newsletter_time',
'label': 'Время рассылки',
'initial_time': '11:00',
'hint': 'Укажите, в какое время присылать выбранные рассылки'
}
]
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.post(
'https://api.pachca.com/api/shared/v1/views/open',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/views/open',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"trigger_id": "791a056b-006c-49dd-834b-c633fde52fe8",
"type": "modal",
"private_metadata": "{'timeoff_id':4378}",
"callback_id": "timeoff_reguest_form",
"view": {
"title": "Уведомление об отпуске",
"close_text": "Закрыть",
"submit_text": "Отправить заявку",
"blocks": [
{
"type": "plain_text",
"text": "Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе."
},
{
"type": "markdown",
"text": "Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)"
},
{
"type": "header",
"text": "Основная информация"
},
{
"type": "date",
"name": "date_start",
"label": "Дата начала отпуска",
"initial_date": "2025-07-01",
"required": true
},
{
"type": "date",
"name": "date_end",
"label": "Дата окончания отпуска",
"initial_date": "2025-07-28",
"required": true
},
{
"type": "file_input",
"name": "request_doc",
"label": "Заявление",
"filetypes": [
"pdf",
"jpg",
"png"
],
"max_files": 1,
"required": true,
"hint": "Загрузите заполненное заявление с электронной подписью (в формате pdf, jpg или png)"
},
{
"type": "radio",
"name": "accessibility",
"label": "Доступность",
"options": [
{
"text": "Ничего",
"value": "nothing",
"checked": true
},
{
"text": "Только телефон",
"value": "phone_only"
},
{
"text": "Телефон и ноутбук",
"value": "phone_notebook"
}
],
"required": true,
"hint": "Если вы не планируете выходить на связь, то выберите вариант Ничего"
},
{
"type": "divider"
},
{
"type": "header",
"text": "Дополнительно"
},
{
"type": "input",
"name": "info",
"label": "Описание отпуска",
"placeholder": "Куда собираетесь и что будете делать",
"multiline": true,
"hint": "Возможно вам подскаджут, какие места лучше посетить"
},
{
"type": "checkbox",
"name": "newsletters",
"label": "Рассылки",
"options": [
{
"text": "Получать уведомления о новых задачах в команде",
"value": "new_tasks",
"description": "Каждый день бот будет присылать список новых задач в вашей команде"
},
{
"text": "Получать уведомления об обновлениях в проектах",
"value": "project_updates",
"description": "Два раза в неделю бот будет присылать обновления по проектам"
}
]
},
{
"type": "select",
"name": "team",
"label": "Выберите команду",
"options": [
{
"text": "Все команды",
"value": "all"
},
{
"text": "Web",
"value": "web",
"selected": true
},
{
"text": "iOS",
"value": "ios"
},
{
"text": "Android",
"value": "android"
},
{
"text": "Back",
"value": "back"
},
{
"text": "Design",
"value": "design"
},
{
"text": "Success",
"value": "success"
}
]
},
{
"type": "time",
"name": "newsletter_time",
"label": "Время рассылки",
"initial_time": "11:00",
"hint": "Укажите, в какое время присылать выбранные рассылки"
}
]
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/views/open')
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'trigger_id' => '791a056b-006c-49dd-834b-c633fde52fe8',
'type' => 'modal',
'private_metadata' => '{'timeoff_id':4378}',
'callback_id' => 'timeoff_reguest_form',
'view' => {
'title' => 'Уведомление об отпуске',
'close_text' => 'Закрыть',
'submit_text' => 'Отправить заявку',
'blocks' => [
{
'type' => 'plain_text',
'text' => 'Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе.'
},
{
'type' => 'markdown',
'text' => 'Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)'
},
{
'type' => 'header',
'text' => 'Основная информация'
},
{
'type' => 'date',
'name' => 'date_start',
'label' => 'Дата начала отпуска',
'initial_date' => '2025-07-01',
'required' => true
},
{
'type' => 'date',
'name' => 'date_end',
'label' => 'Дата окончания отпуска',
'initial_date' => '2025-07-28',
'required' => true
},
{
'type' => 'file_input',
'name' => 'request_doc',
'label' => 'Заявление',
'filetypes' => [
'pdf',
'jpg',
'png'
],
'max_files' => 1,
'required' => true,
'hint' => 'Загрузите заполненное заявление с электронной подписью (в формате pdf, jpg или png)'
},
{
'type' => 'radio',
'name' => 'accessibility',
'label' => 'Доступность',
'options' => [
{
'text' => 'Ничего',
'value' => 'nothing',
'checked' => true
},
{
'text' => 'Только телефон',
'value' => 'phone_only'
},
{
'text' => 'Телефон и ноутбук',
'value' => 'phone_notebook'
}
],
'required' => true,
'hint' => 'Если вы не планируете выходить на связь, то выберите вариант Ничего'
},
{
'type' => 'divider'
},
{
'type' => 'header',
'text' => 'Дополнительно'
},
{
'type' => 'input',
'name' => 'info',
'label' => 'Описание отпуска',
'placeholder' => 'Куда собираетесь и что будете делать',
'multiline' => true,
'hint' => 'Возможно вам подскаджут, какие места лучше посетить'
},
{
'type' => 'checkbox',
'name' => 'newsletters',
'label' => 'Рассылки',
'options' => [
{
'text' => 'Получать уведомления о новых задачах в команде',
'value' => 'new_tasks',
'description' => 'Каждый день бот будет присылать список новых задач в вашей команде'
},
{
'text' => 'Получать уведомления об обновлениях в проектах',
'value' => 'project_updates',
'description' => 'Два раза в неделю бот будет присылать обновления по проектам'
}
]
},
{
'type' => 'select',
'name' => 'team',
'label' => 'Выберите команду',
'options' => [
{
'text' => 'Все команды',
'value' => 'all'
},
{
'text' => 'Web',
'value' => 'web',
'selected' => true
},
{
'text' => 'iOS',
'value' => 'ios'
},
{
'text' => 'Android',
'value' => 'android'
},
{
'text' => 'Back',
'value' => 'back'
},
{
'text' => 'Design',
'value' => 'design'
},
{
'text' => 'Success',
'value' => 'success'
}
]
},
{
'type' => 'time',
'name' => 'newsletter_time',
'label' => 'Время рассылки',
'initial_time' => '11:00',
'hint' => 'Укажите, в какое время присылать выбранные рассылки'
}
]
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/views/open',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'trigger_id' => '791a056b-006c-49dd-834b-c633fde52fe8',
'type' => 'modal',
'private_metadata' => '{'timeoff_id':4378}',
'callback_id' => 'timeoff_reguest_form',
'view' => [
'title' => 'Уведомление об отпуске',
'close_text' => 'Закрыть',
'submit_text' => 'Отправить заявку',
'blocks' => [
[
'type' => 'plain_text',
'text' => 'Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе.'
],
[
'type' => 'markdown',
'text' => 'Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)'
],
[
'type' => 'header',
'text' => 'Основная информация'
],
[
'type' => 'date',
'name' => 'date_start',
'label' => 'Дата начала отпуска',
'initial_date' => '2025-07-01',
'required' => true
],
[
'type' => 'date',
'name' => 'date_end',
'label' => 'Дата окончания отпуска',
'initial_date' => '2025-07-28',
'required' => true
],
[
'type' => 'file_input',
'name' => 'request_doc',
'label' => 'Заявление',
'filetypes' => [
'pdf',
'jpg',
'png'
],
'max_files' => 1,
'required' => true,
'hint' => 'Загрузите заполненное заявление с электронной подписью (в формате pdf, jpg или png)'
],
[
'type' => 'radio',
'name' => 'accessibility',
'label' => 'Доступность',
'options' => [
[
'text' => 'Ничего',
'value' => 'nothing',
'checked' => true
],
[
'text' => 'Только телефон',
'value' => 'phone_only'
],
[
'text' => 'Телефон и ноутбук',
'value' => 'phone_notebook'
]
],
'required' => true,
'hint' => 'Если вы не планируете выходить на связь, то выберите вариант Ничего'
],
[
'type' => 'divider'
],
[
'type' => 'header',
'text' => 'Дополнительно'
],
[
'type' => 'input',
'name' => 'info',
'label' => 'Описание отпуска',
'placeholder' => 'Куда собираетесь и что будете делать',
'multiline' => true,
'hint' => 'Возможно вам подскаджут, какие места лучше посетить'
],
[
'type' => 'checkbox',
'name' => 'newsletters',
'label' => 'Рассылки',
'options' => [
[
'text' => 'Получать уведомления о новых задачах в команде',
'value' => 'new_tasks',
'description' => 'Каждый день бот будет присылать список новых задач в вашей команде'
],
[
'text' => 'Получать уведомления об обновлениях в проектах',
'value' => 'project_updates',
'description' => 'Два раза в неделю бот будет присылать обновления по проектам'
]
]
],
[
'type' => 'select',
'name' => 'team',
'label' => 'Выберите команду',
'options' => [
[
'text' => 'Все команды',
'value' => 'all'
],
[
'text' => 'Web',
'value' => 'web',
'selected' => true
],
[
'text' => 'iOS',
'value' => 'ios'
],
[
'text' => 'Android',
'value' => 'android'
],
[
'text' => 'Back',
'value' => 'back'
],
[
'text' => 'Design',
'value' => 'design'
],
[
'text' => 'Success',
'value' => 'success'
]
]
],
[
'type' => 'time',
'name' => 'newsletter_time',
'label' => 'Время рассылки',
'initial_time' => '11:00',
'hint' => 'Укажите, в какое время присылать выбранные рассылки'
]
]
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 201: The request has succeeded and a new resource has been created as a result.
**Схема ответа:**
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 410: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Bots
# Редактирование бота
**Метод**: `PUT`
**Путь**: `/bots/{id}`
Метод для редактирования бота.
Для редактирования бота вам необходимо знать его `user_id` и указать его в `URL` запроса. Все редактируемые параметры бота указываются в теле запроса. Узнать `user_id` бота можно в настройках бота во вкладке «API».
Вы не можете редактировать бота, настройки которого вам недоступны (поле «Кто может редактировать настройки бота» находится во вкладке «Основное» в настройках бота).
## Параметры
### Path параметры
- `id` (integer, **обязательный**): Идентификатор бота
## Тело запроса
**Обязательно**
Формат: `application/json`
### Схема
- `bot` (object, **обязательный**): Собранный объект параметров редактируемого бота
- `webhook` (object, **обязательный**): Объект параметров вебхука
- `outgoing_url` (string, **обязательный**): URL исходящего вебхука
- Пример: `https://www.website.com/tasks/new`
### Пример
```json
{
"bot": {
"webhook": {
"outgoing_url": "https://www.website.com/tasks/new"
}
}
}
```
## Примеры запроса
### cURL
```bash
curl -X PUT "https://api.pachca.com/api/shared/v1/bots/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"bot": {
"webhook": {
"outgoing_url": "https://www.website.com/tasks/new"
}
}
}'
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/bots/{id}', {
method: 'PUT',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"bot": {
"webhook": {
"outgoing_url": "https://www.website.com/tasks/new"
}
}
})
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
data = {
'bot': {
'webhook': {
'outgoing_url': 'https://www.website.com/tasks/new'
}
}
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.put(
'https://api.pachca.com/api/shared/v1/bots/{id}',
headers=headers,
json=data
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/bots/%7Bid%7D',
method: 'PUT',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.write(JSON.stringify({
"bot": {
"webhook": {
"outgoing_url": "https://www.website.com/tasks/new"
}
}
}));
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/bots/{id}')
request = Net::HTTP::Put.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
request.body = {
'bot' => {
'webhook' => {
'outgoing_url' => 'https://www.website.com/tasks/new'
}
}
}.to_json
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/bots/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'bot' => [
'webhook' => [
'outgoing_url' => 'https://www.website.com/tasks/new'
]
]
]),
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `data` (object, **обязательный**): Ответ с данными бота
- `id` (integer, int32, **обязательный**): Идентификатор бота
- Пример: `1738816`
- `webhook` (object, **обязательный**): Объект параметров вебхука
- `outgoing_url` (string, **обязательный**): URL исходящего вебхука
- Пример: `https://www.website.com/tasks/new`
**Пример ответа:**
```json
{
"data": {
"id": 1738816,
"webhook": {
"outgoing_url": "https://www.website.com/tasks/new"
}
}
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# История событий
**Метод**: `GET`
**Путь**: `/webhooks/events`
#bot_access_token_required
Метод для получения истории последних событий бота. Данный метод будет полезен, если вы не можете получать события в реальном времени на ваш `URL`, но вам требуется обрабатывать все события, на которые вы подписались.
История событий сохраняется только при активном пункте «Сохранять историю событий» во вкладке «Исходящий webhook» настроек бота. При этом указывать «Webhook `URL`» не требуется.
Для получения истории событий конкретного бота вам необходимо знать его `access_token` и использовать его при запросе. Каждое событие представляет `JSON` объект вебхука.
## Параметры
### Query параметры
- `limit` (integer, опциональный): Количество возвращаемых сущностей за один запрос
- По умолчанию: `50`
- `cursor` (string, опциональный): Курсор для пагинации (из meta.paginate.next_page)
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/webhooks/events?limit=50&cursor=string" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/webhooks/events?limit=50&cursor=string', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'limit': 50,
'cursor': 'string',
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/webhooks/events',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/webhooks/events?limit=50&cursor=string',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/webhooks/events')
params = {
'limit' => 50,
'cursor' => 'string',
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
50, 'cursor' => 'string'];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/webhooks/events?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `meta` (object, опциональный): Метаданные пагинации
- `paginate` (object, опциональный): Вспомогательная информация
- `next_page` (string, опциональный): Курсор пагинации следующей страницы
- Пример: `eyJxZCO2MiwiZGlyIjomSNYjIn3`
- `data` (array[object], **обязательный**)
- `id` (string, **обязательный**): Идентификатор события
- Пример: `a1b2c3d4-5e6f-7g8h-9i10-j11k12l13m14`
- `event_type` (string, **обязательный**): Тип события
- Пример: `message_new`
- `payload` (anyOf, **обязательный**): Объект вебхука
**Возможные варианты:**
- **MessageWebhookPayload**: Структура исходящего вебхука о сообщении
- `type` (string, **обязательный**): Тип объекта
- Пример: `message`
- **Возможные значения:**
- `message`: Для сообщений всегда message
- `id` (integer, int32, **обязательный**): Идентификатор сообщения
- Пример: `1245817`
- `event` (string, **обязательный**): Тип события
- **Возможные значения:**
- `new`: Создание
- `update`: Обновление
- `delete`: Удаление
- `entity_type` (string, **обязательный**): Тип сущности, к которой относится сообщение
- **Возможные значения:**
- `discussion`: Беседа или канал
- `thread`: Тред
- `user`: Пользователь
- `entity_id` (integer, int32, **обязательный**): Идентификатор сущности, к которой относится сообщение
- Пример: `5678`
- `content` (string, **обязательный**): Текст сообщения
- Пример: `Текст сообщения`
- `user_id` (integer, int32, **обязательный**): Идентификатор отправителя сообщения
- Пример: `2345`
- `created_at` (string, date-time, **обязательный**): Дата и время создания сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-05-15T14:30:00.000Z`
- `url` (string, **обязательный**): Прямая ссылка на сообщение
- Пример: `https://pachca.com/chats/1245817/messages/5678`
- `chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором находится сообщение
- Пример: `9012`
- `parent_message_id` (integer, int32, опциональный): Идентификатор сообщения, к которому написан ответ. Возвращается как null, если сообщение не является ответом.
- Пример: `3456`
- `thread` (object, опциональный): Объект с параметрами треда. Возвращается как null, если это сообщение не относится к треду.
- `message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому был создан тред
- Пример: `12345`
- `message_chat_id` (integer, int32, **обязательный**): Идентификатор чата сообщения, к которому был создан тред
- Пример: `67890`
- `webhook_timestamp` (integer, int32, **обязательный**): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1747574400`
- **ReactionWebhookPayload**: Структура исходящего вебхука о реакции
- `type` (string, **обязательный**): Тип объекта
- Пример: `reaction`
- **Возможные значения:**
- `reaction`: Для реакций всегда reaction
- `event` (string, **обязательный**): Тип события
- **Возможные значения:**
- `new`: Создание
- `delete`: Удаление
- `message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому относится реакция
- Пример: `1245817`
- `code` (string, **обязательный**): Emoji символ реакции
- Пример: `👍`
- `name` (string, **обязательный**): Название реакции
- Пример: `thumbsup`
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя, который добавил или удалил реакцию
- Пример: `2345`
- `created_at` (string, date-time, **обязательный**): Дата и время создания сообщения (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-05-15T14:30:00.000Z`
- `webhook_timestamp` (integer, int32, **обязательный**): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1747574400`
- **ButtonWebhookPayload**: Структура исходящего вебхука о нажатии кнопки
- `type` (string, **обязательный**): Тип объекта
- Пример: `button`
- **Возможные значения:**
- `button`: Для кнопки всегда button
- `event` (string, **обязательный**): Тип события
- Пример: `click`
- **Возможные значения:**
- `click`: Нажатие кнопки
- `message_id` (integer, int32, **обязательный**): Идентификатор сообщения, к которому относится кнопка
- Пример: `1245817`
- `trigger_id` (string, **обязательный**): Уникальный идентификатор события. Время жизни — 3 секунды. Может быть использован, например, для открытия представления пользователю
- Пример: `a1b2c3d4-5e6f-7g8h-9i10-j11k12l13m14`
- `data` (string, **обязательный**): Данные нажатой кнопки
- Пример: `button_data`
- `user_id` (integer, int32, **обязательный**): Идентификатор пользователя, который нажал кнопку
- Пример: `2345`
- `chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором была нажата кнопка
- Пример: `9012`
- `webhook_timestamp` (integer, int32, **обязательный**): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1747574400`
- **ChatMemberWebhookPayload**: Структура исходящего вебхука об участниках чата
- `type` (string, **обязательный**): Тип объекта
- Пример: `chat_member`
- **Возможные значения:**
- `chat_member`: Для участника чата всегда chat_member
- `event` (string, **обязательный**): Тип события
- **Возможные значения:**
- `add`: Добавление
- `remove`: Удаление
- `chat_id` (integer, int32, **обязательный**): Идентификатор чата, в котором изменился состав участников
- Пример: `9012`
- `thread_id` (integer, int32, опциональный): Идентификатор треда. Возвращается как null, если чат не относится к треду.
- Пример: `5678`
- `user_ids` (array[integer], **обязательный**): Массив идентификаторов пользователей, с которыми произошло событие
- Пример: `[2345,6789]`
- `created_at` (string, date-time, **обязательный**): Дата и время события (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-05-15T14:30:00.000Z`
- `webhook_timestamp` (integer, int32, **обязательный**): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1747574400`
- **CompanyMemberWebhookPayload**: Структура исходящего вебхука об участниках пространства
- `type` (string, **обязательный**): Тип объекта
- Пример: `company_member`
- **Возможные значения:**
- `company_member`: Для участника пространства всегда company_member
- `event` (string, **обязательный**): Тип события
- **Возможные значения:**
- `invite`: Приглашение
- `confirm`: Подтверждение
- `update`: Обновление
- `suspend`: Приостановка
- `activate`: Активация
- `delete`: Удаление
- `user_ids` (array[integer], **обязательный**): Массив идентификаторов пользователей, с которыми произошло событие
- Пример: `[2345,6789]`
- `created_at` (string, date-time, **обязательный**): Дата и время события (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-05-15T14:30:00.000Z`
- `webhook_timestamp` (integer, int32, **обязательный**): Дата и время отправки вебхука (UTC+0) в формате UNIX
- Пример: `1747574400`
- `created_at` (string, date-time, **обязательный**): Дата и время создания события (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-05-15T14:30:00.000Z`
**Пример ответа:**
```json
{
"meta": {
"paginate": {
"next_page": "eyMxFCO2MiwiZGlyIjpiSNYjIn1"
}
},
"data": [
{
"id": "01KAJZ2XDSS2S3DSW9EXJZ0TBV",
"event_type": "company_member_update",
"payload": {
"event": "update",
"type": "company_member",
"webhook_timestamp": 1763635376,
"user_ids": [
13
],
"created_at": "2025-11-20T10:42:56Z"
},
"created_at": "2025-11-20T10:42:56Z"
},
{
"id": "01KAJZ5CMZFVK4FSZQOISFBZCS",
"event_type": "message_new",
"payload": {
"event": "new",
"type": "message",
"webhook_timestamp": 1763637142,
"chat_id": 43,
"user_id": 13,
"id": 4432345,
"created_at": "2025-11-20T11:12:22.000Z",
"parent_message_id": null,
"content": "Проверьте последнюю задачу",
"entity_type": "discussion",
"entity_id": 43,
"thread": null,
"url": "https://app.pachca.com/chats/43?message=4432345"
},
"created_at": "2025-11-20T11:12:22.000Z"
},
{
"id": "01KAJP5CMZFPA5FSZQOCHKBOIW",
"event_type": "chat_member_add",
"payload": {
"event": "add",
"type": "chat_member",
"webhook_timestamp": 1763637574,
"chat_id": 43,
"thread_id": null,
"user_ids": [
14
],
"created_at": "2025-11-20T11:19:34Z"
},
"created_at": "2025-11-20T11:19:34Z"
}
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
# Удаление события
**Метод**: `DELETE`
**Путь**: `/webhooks/events/{id}`
Данный метод доступен для работы только с `access_token` бота
Метод для удаления события из истории событий бота.
Для удаления события вам необходимо знать `access_token` бота, которому принадлежит событие, и `id` события.
## Параметры
### Path параметры
- `id` (string, **обязательный**): Идентификатор события
## Примеры запроса
### cURL
```bash
curl -X DELETE "https://api.pachca.com/api/shared/v1/webhooks/events/{id}" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/webhooks/events/{id}', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.delete(
'https://api.pachca.com/api/shared/v1/webhooks/events/{id}',
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/webhooks/events/%7Bid%7D',
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/webhooks/events/{id}')
request = Net::HTTP::Delete.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'https://api.pachca.com/api/shared/v1/webhooks/events/{id}',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 204: There is no content to send for this request, but the headers may be useful.
**Схема ответа:**
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 404: The server cannot find the requested resource.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## API: Security
# Журнал аудита событий
**Метод**: `GET`
**Путь**: `/audit-events`
#corporation_price_only
Метод для получения логов событий на основе указанных фильтров.
## Параметры
### Query параметры
- `start_time` (string, **обязательный**): Начальная метка времени (включительно)
- `end_time` (string, **обязательный**): Конечная метка времени (исключительно)
- `event_key` (string, опциональный): Фильтр по конкретному типу события
- `actor_id` (integer, опциональный): Идентификатор пользователя, выполнившего действие
- `actor_type` (string, опциональный): Тип актора
- `entity_id` (integer, опциональный): Идентификатор затронутой сущности
- `entity_type` (string, опциональный): Тип сущности
- `limit` (integer, опциональный): Количество записей для возврата
- По умолчанию: `50`
- `cursor` (string, опциональный): Курсор для пагинации из meta.paginate.next_page
## Примеры запроса
### cURL
```bash
curl -X GET "https://api.pachca.com/api/shared/v1/audit-events?start_time=2024-04-08T10%3A00%3A00.000Z&end_time=2024-04-08T10%3A00%3A00.000Z&event_key=string&actor_id=12345&actor_type=string&entity_id=12345&entity_type=string&limit=50&cursor=string" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json"
```
### JavaScript
```javascript
const response = await fetch('https://api.pachca.com/api/shared/v1/audit-events?start_time=2024-04-08T10%3A00%3A00.000Z&end_time=2024-04-08T10%3A00%3A00.000Z&event_key=string&actor_id=12345&actor_type=string&entity_id=12345&entity_type=string&limit=50&cursor=string', {
method: 'GET',
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);
```
### Python
```python
import requests
params = {
'start_time': '2024-04-08T10:00:00.000Z',
'end_time': '2024-04-08T10:00:00.000Z',
'event_key': 'string',
'actor_id': 12345,
'actor_type': 'string',
'entity_id': 12345,
'entity_type': 'string',
'limit': 50,
'cursor': 'string',
}
headers = {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Content-Type': 'application/json'
}
response = requests.get(
'https://api.pachca.com/api/shared/v1/audit-events',
params=params,
headers=headers
)
print(response.json())
```
### Node.js
```javascript
const https = require('https');
const options = {
hostname: 'api.pachca.com',
port: 443,
path: '/api/shared/v1/audit-events?start_time=2024-04-08T10%3A00%3A00.000Z&end_time=2024-04-08T10%3A00%3A00.000Z&event_key=string&actor_id=12345&actor_type=string&entity_id=12345&entity_type=string&limit=50&cursor=string',
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_ACCESS_TOKEN'
}
};
const req = https.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(JSON.parse(data));
});
});
req.on('error', (error) => {
console.error(error);
});
req.end();
```
### Ruby
```ruby
require 'net/http'
require 'json'
uri = URI('https://api.pachca.com/api/shared/v1/audit-events')
params = {
'start_time' => '2024-04-08T10:00:00.000Z',
'end_time' => '2024-04-08T10:00:00.000Z',
'event_key' => 'string',
'actor_id' => 12345,
'actor_type' => 'string',
'entity_id' => 12345,
'entity_type' => 'string',
'limit' => 50,
'cursor' => 'string',
}
uri.query = URI.encode_www_form(params)
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer YOUR_ACCESS_TOKEN'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts JSON.parse(response.body)
```
### PHP
```php
'2024-04-08T10:00:00.000Z', 'end_time' => '2024-04-08T10:00:00.000Z', 'event_key' => 'string', 'actor_id' => 12345, 'actor_type' => 'string', 'entity_id' => 12345, 'entity_type' => 'string', 'limit' => 50, 'cursor' => 'string'];
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.pachca.com/api/shared/v1/audit-events?' . http_build_query($params)',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => [
'Authorization: Bearer YOUR_ACCESS_TOKEN',
'Content-Type: application/json',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
```
## Ответы
### 200: The request has succeeded.
**Схема ответа:**
- `meta` (object, опциональный): Метаданные пагинации
- `paginate` (object, опциональный): Вспомогательная информация
- `next_page` (string, опциональный): Курсор пагинации следующей страницы
- Пример: `eyJxZCO2MiwiZGlyIjomSNYjIn3`
- `data` (array[object], **обязательный**)
- `id` (string, **обязательный**): Уникальный идентификатор события
- Пример: `a1b2c3d4-5e6f-7g8h-9i10-j11k12l13m14`
- `created_at` (string, date-time, **обязательный**): Дата и время создания события (ISO-8601, UTC+0) в формате YYYY-MM-DDThh:mm:ss.sssZ
- Пример: `2025-05-15T14:30:00.000Z`
- `event_key` (string, **обязательный**): Ключ типа события
- Пример: `user_chat_join`
- `entity_id` (string, **обязательный**): Идентификатор затронутой сущности
- Пример: `12345678`
- `entity_type` (string, **обязательный**): Тип затронутой сущности
- Пример: `Chat`
- `actor_id` (string, **обязательный**): Идентификатор пользователя, выполнившего действие
- Пример: `98765`
- `actor_type` (string, **обязательный**): Тип актора
- Пример: `User`
- `details` (Record, **обязательный**): Дополнительные детали события
- Пример: `{"inviter_id":"45678"}`
**Структура значений Record:**
- Тип значения: `any`
- `ip_address` (string, **обязательный**): IP-адрес, с которого было выполнено действие
- Пример: `192.168.1.100`
- `user_agent` (string, **обязательный**): User agent клиента
- Пример: `Pachca/3.60.0 (co.staply.pachca; build:15; iOS 18.5.0) Alamofire/5.0.0`
**Пример ответа:**
```json
{
"meta": {
"paginate": {
"next_page": "eyJfa2QiOiJuIiwiY3JlYXRlZF9hdCI6IjIwMjUtMDUtMTUgMTQ6MzA6MDAuMDAwWiJ9"
}
},
"data": [
{
"id": "a1b2c3d4-5e6f-7g8h-9i10-j11k12l13m14",
"created_at": "2025-05-15T14:30:00.000Z",
"event_key": "user_chat_join",
"entity_id": "12345678",
"entity_type": "Chat",
"actor_id": "98765",
"actor_type": "User",
"details": {
"inviter_id": "45678"
},
"ip_address": "192.168.1.100",
"user_agent": "Pachca/3.60.0 (co.staply.pachca; build:15; iOS 18.5.0) Alamofire/5.0.0"
}
]
}
```
### 400: The server could not understand the request due to invalid syntax.
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
### 401: Access is unauthorized.
**Схема ответа при ошибке:**
- `error` (string, **обязательный**): Код ошибки
- Пример: `invalid_token`
- `error_description` (string, **обязательный**): Описание ошибки
- Пример: `Access token is missing`
### 422: Client error
**Схема ответа при ошибке:**
- `errors` (array[object], **обязательный**): Массив ошибок
- `key` (string, **обязательный**): Ключ поля с ошибкой
- Пример: `field.name`
- `value` (string, **обязательный**): Значение поля, которое вызвало ошибку
- Пример: `invalid_value`
- `message` (string, **обязательный**): Сообщение об ошибке
- Пример: `Поле не может быть пустым`
- `code` (string, **обязательный**): Код ошибки
- **Возможные значения:**
- `blank`: Обязательное поле (не может быть пустым)
- `too_long`: Слишком длинное значение (пояснения вы получите в поле message)
- `invalid`: Поле не соответствует правилам (пояснения вы получите в поле message)
- `inclusion`: Поле имеет непредусмотренное значение
- `exclusion`: Поле имеет недопустимое значение
- `taken`: Название для этого поля уже существует
- `wrong_emoji`: Emoji статуса не может содержать значения отличные от Emoji символа
- `not_found`: Объект не найден
- `already_exists`: Объект уже существует (пояснения вы получите в поле message)
- `personal_chat`: Ошибка личного чата (пояснения вы получите в поле message)
- `displayed_error`: Отображаемая ошибка (пояснения вы получите в поле message)
- `not_authorized`: Действие запрещено
- `invalid_date_range`: Выбран слишком большой диапазон дат
- `invalid_webhook_url`: Некорректный URL вебхука
- `rate_limit`: Достигнут лимит запросов
- `licenses_limit`: Превышен лимит активных сотрудников (пояснения вы получите в поле message)
- `user_limit`: Превышен лимит количества реакций, которые может добавить пользователь (20 уникальных реакций)
- `unique_limit`: Превышен лимит количества уникальных реакций, которые можно добавить на сообщение (30 уникальных реакций)
- `general_limit`: Превышен лимит количества реакций, которые можно добавить на сообщение (1000 реакций)
- `unhandled`: Ошибка выполнения запроса (пояснения вы получите в поле message)
- `trigger_not_found`: Не удалось найти идентификатор события
- `trigger_expired`: Время жизни идентификатора события истекло
- `payload` (string, **обязательный**): Дополнительные данные об ошибке
---
## Дополнительная информация
- **Веб-сайт**: https://pachca.com/
- **Получить помощь**: team@pachca.com
---
_Документация автоматически сгенерирована из OpenAPI спецификации_