# Пачка 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` --- # Формы Формы в Пачке позволяют вам отображать пользователям представления с указанным вами набором полей. Представления отображаются в виде модального окна, а результат заполнения формы вы можетет получить на свой сервер. На текущий момент вызов модального окна с представлением возможен только через кнопки в сообщении бота. ## Модальное окно Модальное окно состоит из стандартных элементов - заголовка, кнопки закрытия (отмены), набора полей (подзаголовки, текст, ввод текста, выбор, списки и тд.) и кнопки отправки. ![Модальное окно](/images/forms/modal-window.png) ## Жизненный цикл модального окна Всё начинается с нажатия пользователем `Data-кнопки` кнопки в сообщении. - В результате нажатия кнопки вашему приложению отправляется исходящий вебхук с уникальным `trigger_id`; - Затем приложение фомирует представление и отправляет его, а пользователю отображается модальное окно; - Далее пользователь заполняет поля и вашему приложению отправляется исходящий вебхук с данными заполненных пользователем полей в представлении; - В ответе на вебхук ваше приложение может отправить список ошибок, которые необходимо отобразить пользателю в представлении, или ответить кодом 200 (после чего модальное окно будет закрыто). ## Блоки представления Блоки - это компоненты представления, которые позволяют вам формировать необходимые поля ввода данных и отображать дополнительную пояснительную информацию. Они указываются в поле `view.blocks` при открытии представления. Вы можете добавить до **100 блоков** в одно представление. ### Заголовок (header) ![Заголовок](/images/forms/header.png) #### ViewBlockHeader - `type` (string, **обязательный**): Тип блока - Пример: `header` - **Возможные значения:** - `header`: Для заголовков всегда header - `text` (string, **обязательный**): Текст заголовка - Пример: `Основная информация` - Максимальная длина: 150 символов ### Обычный текст (plain_text) ![Обычный текст](/images/forms/plaintext.png) #### ViewBlockPlainText - `type` (string, **обязательный**): Тип блока - Пример: `plain_text` - **Возможные значения:** - `plain_text`: Для обычного текста всегда plain_text - `text` (string, **обязательный**): Текст - Пример: `Заполните форму. После отправки формы в общий чат будет отправлено текстовое уведомление, а ваш отпуск будет сохранен в базе.` - Максимальная длина: 12000 символов ### Форматированный текст (markdown) ![Форматированный текст](/images/forms/markdown.png) #### ViewBlockMarkdown - `type` (string, **обязательный**): Тип блока - Пример: `markdown` - **Возможные значения:** - `markdown`: Для форматированного текста всегда markdown - `text` (string, **обязательный**): Текст - Пример: `Информацию о доступных вам днях отпуска вы можете прочитать по [ссылке](https://www.website.com/timeoff)` - Максимальная длина: 12000 символов В поле `text` вам необходимо прислать форматированный текст в синтаксисе `markdown`. Поддерживаются конструкции, указанные в таблице ниже. | Элемент | Синтаксис | Результат | |---------|-----------|----------| | Жирный | `**текст**` или `__текст__` | **текст** | | Курсив | `*текст*` или `_текст_` | *текст* | | Ссылки | `[текст](url)` | [текст](url) | | Маркированный список | `- пункт` | • пункт | | Нумерованный список | `1. пункт` | 1. пункт | | Зачеркнутый | `~~текст~~` | ~~текст~~ | | Строчный код | `` `код` `` | `код` | | Блок кода | ` ```код``` ` | код | ### Разделитель (divider) ![Разделитель](/images/forms/divider.png) #### ViewBlockDivider - `type` (string, **обязательный**): Тип блока - Пример: `divider` - **Возможные значения:** - `divider`: Для разделителя всегда divider ### Текстовое поле (input) ![Текстовое поле](/images/forms/input.png) #### 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) ![Выпадающий список](/images/forms/select.png) #### 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) ![Радиокнопки](/images/forms/radio.png) #### 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) ![Чекбоксы](/images/forms/checkbox.png) #### 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) ![Выбор даты](/images/forms/date.png) #### 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) ![Выбор времени](/images/forms/time.png) #### 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) ![Загрузка файлов](/images/forms/file.png) #### 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":"В заявлении не найдена электронная подпись"}}`} ``` ![Пример отображения ошибок в интерфейсе представления](/images/forms/errors.png) --- # DLP-система #corporation_price_only Встроенная в Пачку DLP-система (Data Loss Prevention) позволяет вам построить защиту от утечек конфиденциальной информации без интеграции сторонних сервисов. Управление правилами DLP-системы доступно в разделе «Настройки пространства» → «DLP». Вы можете изменять список правил, а также включать и отключать их. ![Список правил DLP-системы](/images/dlp/dlp-page.png) ## Создание правила Чтобы внести новое правило нажмите на кнопку «Создать новое правило», укажите название правила (чтобы было проще его потом изменить или удалить), его приоритет и `JSON` объект условия. ![Новое правило](/images/dlp/new-rule.png) Параметр «Приоритет» задает значение приоритета для политики, определяющее порядок её обработки. Меньшее целое число указывает на более высокий приоритет, значение 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 спецификации_