# Пачка API: Отвечать на сообщения через вебхук бота

Сценарий из mcp-everything. Актуально на 2026-10-24.

Бот слушает канал и реагирует: подтверждает получение, отвечает в треде.

1. В настройках бота включи исходящий вебхук и укажи адрес своего обработчика. Пачка присылает события POST-запросом.
2. Проверяй подпись: заголовок Pachca-Signature — HMAC-SHA256 от тела запроса с ключом Signing secret бота, в hex. Поле webhook_timestamp должно отличаться от текущего времени не больше чем на минуту.
3. Отметь сообщение реакцией: POST /messages/{id}/reactions с code — символом эмодзи (записи вида :+1: отклоняются).
4. Ответь в треде: POST /messages с message.entity_type = thread и entity_id треда (тред создаётся через POST /threads) или ответом в ленте через message.parent_message_id.

```javascript
import crypto from "node:crypto";

// Express: app.post("/pachca/webhook", express.raw({ type: "*/*" }), handler)
function isValid(rawBody, headers, secret) {
  const signature = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  if (signature !== headers["pachca-signature"]) return false;
  const { webhook_timestamp } = JSON.parse(rawBody);
  return Math.abs(Date.now() / 1000 - webhook_timestamp) < 60;
}
```

## Базовые URL

- Боевой: `https://api.pachca.com/api/shared/v1`

## Авторизация

Тип: Bearer-токен

Токен передаётся в заголовке `Authorization: Bearer <token>`. Два типа токенов:

- **Персональный** — действует от имени пользователя и видит те же чаты, что он в интерфейсе. Выпускается в разделе «Автоматизации» > «API» (бессрочный, показывается один раз) или выдаётся при входе через CLI `pachca auth login` (живёт час и продлевается автоматически).
- **Токен бота** — действует от имени бота: все открытые каналы плюс закрытые чаты и треды, куда бот добавлен.

Почти каждый метод требует определённого скоупа токена; скоупы не расширяют круг доступных данных. Владелец пространства может ограничить, кто создаёт токены.

```
curl "https://api.pachca.com/api/shared/v1/messages" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "message": {
    "entity_id": 334,
    "content": "Вчера мы продали 756 футболок (что на 10% больше, чем в прошлое воскресенье)"
  }
}'
```

## Методы сценария

### POST /messages — Новое сообщение

Отправляет сообщение в беседу или канал, личное сообщение сотруднику или комментарий в тред.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `message.entity_type` | body | string | нет | discussion (беседа или канал, по умолчанию), thread (тред), user (пользователь) |
| `message.entity_id` | body | integer | да | ID беседы/канала, треда или сотрудника |
| `message.content` | body | string | да | Текст; упоминания @nickname или <@user_id> |
| `message.files` | body | array | нет | Прикрепляемые файлы |
| `message.buttons` | body | array | нет | Строки кнопок: до 100 кнопок, до 8 в строке |
| `message.parent_message_id` | body | integer | нет | Ответ на сообщение в ленте чата (не в треде) |
| `message.display_avatar_url` | body | string | нет | Аватар отправителя для этого сообщения (только токен бота) |
| `message.display_name` | body | string | нет | Имя отправителя для этого сообщения (только токен бота) |
| `message.skip_invite_mentions` | body | boolean | нет | Не добавлять упомянутых в тред |
| `link_preview` | body | boolean | нет | Показывать предпросмотр первой ссылки |

### POST /messages/{id}/reactions — Добавить реакцию

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `id` | path | integer | да | ID сообщения |
| `code` | body | string | да | Символ эмодзи; записи вроде +1 или :+1: отклоняются |
| `name` | body | string | нет | Имя кастомного эмодзи |

### POST /threads — Новый самостоятельный тред

Создаёт тред, не привязанный к сообщению.

Пример ответа:

```json
{"data": {"id": 265142, "chat_id": 2637266155, "message_id": null, "message_chat_id": null, "updated_at": "2023-02-01T19:20:47.204Z"}}
```

## Нюансы

- Ответы на создание оборачиваются в объект `data`; пагинация — курсорная, курсор в `meta.paginate.next_page`.
- Лимиты частоты возвращают `429` с текстом `text/plain`, а не JSON, и заголовком `Retry-After` — ждать нужно не меньше указанного.
- Превышение суточного предела сообщений в один чат приостанавливает отправку на час, и каждая попытка во время паузы удваивает её (до 24 часов).
- При частых `429` без паузы токен может быть заблокирован на час (порог около 22 000 отправок в час).
- `403` может прийти в двух видах: `OAuthError` с `insufficient_scope` (у токена нет скоупа) или `ApiError` (запрет бизнес-логики).
- Исходящие вебхуки подписываются HMAC-SHA256 от тела запроса в заголовке `Pachca-Signature` (ключ — Signing secret бота); поле `webhook_timestamp` стоит проверять на расхождение не больше минуты. IP Пачки: `37.200.70.177`.
- Документация доступна для LLM: `https://dev.pachca.com/llms.txt` и `llms-full.txt`.

## Другие сценарии

- [Отправить уведомление в канал от бота](https://mcp-everything.ru/integrations/pachca/scenarios/otpravit-uvedomlenie-v-kanal-ot-bota.md)
- [Написать сотруднику в личные сообщения](https://mcp-everything.ru/integrations/pachca/scenarios/napisat-sotrudniku-v-lichnye.md)
- [Создать канал и добавить участников](https://mcp-everything.ru/integrations/pachca/scenarios/sozdat-kanal-i-dobavit-uchastnikov.md)
- [Поставить напоминание сотруднику](https://mcp-everything.ru/integrations/pachca/scenarios/postavit-napominanie-sotrudniku.md)

---

Если этого недостаточно — официальная документация: https://dev.pachca.com/
Вся интеграция одним документом: https://mcp-everything.ru/integrations/pachca.md
