Перейти к документации
PROChatДокументация для разработчиковКак получить доступ (откроется в новой вкладке)К API-ключам

Версия 1 · чтение данных

PROChat API

Получайте сохранённые обращения, переписку, теги и поля через ключ с ограниченным доступом.

Скачать OpenAPI

OpenAPI 3.1. Схемы ответов формируются из общих контрактов PROChat.

Быстрый старт

  1. Владелец или администратор создаёт ключ в Интеграции → API-ключи и выбирает подключения, разрешения и срок.
  2. После создания токен показывается один раз. Сохраните его в хранилище секретов своей серверной программы.
  3. Задайте PROCHAT_API_ORIGIN — origin сервера (домен без пути), и PROCHAT_API_TOKEN — выданный токен.

Базовый путь: /api/integration/v1. Для внешнего доступа используйте HTTPS. Локальный backend по умолчанию работает на http://localhost:4000; создание ключа само по себе не публикует сервер.

Первый запрос cURL
curl --fail-with-body \
  --header "Authorization: Bearer ${PROCHAT_API_TOKEN}" \
  --header "Accept: application/json" \
  "${PROCHAT_API_ORIGIN}/api/integration/v1/conversations?limit=50"

Переменные в примерах заполняются вашей программой. Имена, UUID и даты в ответах ниже вымышлены.

Авторизация и разрешения

Каждый запрос использует Authorization: Bearer <токен>. Формат токена: pc_api_ и 43 символа base64url, всего 50 символов. Это непрозрачный токен. Передача ключа в URL или cookie не заменяет заголовок.

Независимые разрешения ключа
ScopeДанные
connections:readПодключения
conversations:readОбращения
messages:readТекст сообщений
cards:readТеги и поля карточки

Данные обращений ограничены выбранными подключениями. Например, messages:read позволяет прочитать сообщения известного обращения без conversations:read; поиск его ID в списке требует отдельного разрешения.

Разрешение cards:read также открывает активный каталог определений тегов и полей всего рабочего пространства. Значения карточек выдаются только для доступных обращений.

Срок — 7, 30, 90 или 365 дней. Отзыв ключа, изменение роли или версии доступа автора, а также удаление любого выбранного подключения прекращают доступ всего ключа. Отключённое подключение сохраняет доступ к уже записанной истории.

Сохраняйте ключ на сервере получателя. Доступ администратора к управлению ключами использует сессию PROChat; этот bearer-токен предназначен для методов чтения ниже.

Методы API

Все шесть методов используют GET. Неизвестные параметры, workspaceId и произвольные фильтры отклоняются.

Пути ниже добавляются к /api/integration/v1. В примерах cURL замените <ID_обращения> на UUID доступного обращения, полученный из списка или вебхука.

GET/connections

Подключения

Возвращает метаданные выбранных подключений без ключей и данных адаптера. Отключённый канал остаётся доступен для чтения сохранённой истории. Параметры запроса не принимаются.

Разрешение: connections:read

Параметры отсутствуют.

cURL: Подключения
curl --fail-with-body \
  --header "Authorization: Bearer ${PROCHAT_API_TOKEN}" \
  "${PROCHAT_API_ORIGIN}/api/integration/v1/connections"
Пример ответа 200: Подключения
JSON: Подключения
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000001",
      "name": "Авито — вымышленный пример",
      "provider": "AVITO",
      "mode": "MOCK",
      "status": "CONNECTED"
    }
  ]
}
GET/conversations

Список обращений

Читает локальные обращения выбранных подключений. Порядок lastMessageAt DESC, id DESC. Имя клиента входит в метаданные; текст сообщений и заметки отсутствуют. nextCursor=null означает конец текущей выборки.

Разрешение: conversations:read

Параметры: Список обращений
ПараметрТип и расположениеОписание
limitНеобязательныйinteger · queryМаксимальное число записей на странице. По умолчанию: 50. Диапазон: 1–100.
cursorНеобязательныйstring · queryUUID из nextCursor предыдущей страницы. Используйте те же фильтры; курсор должен принадлежать доступной выборке.
connectionIdНеобязательныйstring · queryUUID одного из подключений, выбранных при выдаче ключа.
statusНеобязательныйstring · queryФильтр по текущему статусу обращения. Значения: OPEN, CLOSED.
cURL: Список обращений
curl --fail-with-body \
  --header "Authorization: Bearer ${PROCHAT_API_TOKEN}" \
  "${PROCHAT_API_ORIGIN}/api/integration/v1/conversations"
Пример ответа 200: Список обращений
JSON: Список обращений
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000002",
      "connectionId": "00000000-0000-4000-8000-000000000001",
      "customerName": "Покупатель из вымышленного примера",
      "status": "OPEN",
      "handlingMode": "AUTOMATION",
      "assignedUserId": null,
      "assignmentVersion": 0,
      "cardVersion": 0,
      "lastMessageAt": "2026-10-14T12:00:00.000Z",
      "createdAt": "2026-10-14T12:00:00.000Z"
    }
  ],
  "nextCursor": null
}
GET/conversations/{conversationId}

Одно обращение

Возвращает метаданные доступного обращения напрямую, без обёртки items. UUID объекта не заменяет права ключа. Параметры запроса не принимаются.

Разрешение: conversations:read

Параметры: Одно обращение
ПараметрТип и расположениеОписание
conversationIdОбязательныйstring · pathUUID обращения PROChat из выбранного подключения.
cURL: Одно обращение
curl --fail-with-body \
  --header "Authorization: Bearer ${PROCHAT_API_TOKEN}" \
  "${PROCHAT_API_ORIGIN}/api/integration/v1/conversations/<ID_обращения>"
Пример ответа 200: Одно обращение
JSON: Одно обращение
{
  "id": "00000000-0000-4000-8000-000000000002",
  "connectionId": "00000000-0000-4000-8000-000000000001",
  "customerName": "Покупатель из вымышленного примера",
  "status": "OPEN",
  "handlingMode": "AUTOMATION",
  "assignedUserId": null,
  "assignmentVersion": 0,
  "cardVersion": 0,
  "lastMessageAt": "2026-10-14T12:00:00.000Z",
  "createdAt": "2026-10-14T12:00:00.000Z"
}
GET/conversations/{conversationId}/messages

История сообщений

Читает сохранённые сообщения от ранних к поздним: sentAt ASC, sequence ASC, id ASC. Текст до 16000 символов; вложения и их URL не выдаются. PENDING/SENDING/FAILED не подтверждают доставку. Курсор принадлежит тому же обращению; чтение не отмечает сообщения прочитанными.

Разрешение: messages:read

Параметры: История сообщений
ПараметрТип и расположениеОписание
conversationIdОбязательныйstring · pathUUID обращения PROChat из выбранного подключения.
limitНеобязательныйinteger · queryМаксимальное число записей на странице. По умолчанию: 50. Диапазон: 1–100.
cursorНеобязательныйstring · queryUUID из nextCursor предыдущей страницы. Используйте те же фильтры; курсор должен принадлежать доступной выборке.
cURL: История сообщений
curl --fail-with-body \
  --header "Authorization: Bearer ${PROCHAT_API_TOKEN}" \
  "${PROCHAT_API_ORIGIN}/api/integration/v1/conversations/<ID_обращения>/messages"
Пример ответа 200: История сообщений
JSON: История сообщений
{
  "items": [
    {
      "id": "00000000-0000-4000-8000-000000000005",
      "conversationId": "00000000-0000-4000-8000-000000000002",
      "connectionId": "00000000-0000-4000-8000-000000000001",
      "type": "text",
      "direction": "INBOUND",
      "senderType": "CUSTOMER",
      "status": "SENT",
      "text": "Сообщение из вымышленного примера",
      "sequence": 1,
      "sentAt": "2026-10-14T12:00:00.000Z",
      "createdAt": "2026-10-14T12:00:00.000Z"
    }
  ],
  "nextCursor": null
}
GET/conversations/{conversationId}/card

Карточка обращения

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

Разрешение: cards:read

Параметры: Карточка обращения
ПараметрТип и расположениеОписание
conversationIdОбязательныйstring · pathUUID обращения PROChat из выбранного подключения.
cURL: Карточка обращения
curl --fail-with-body \
  --header "Authorization: Bearer ${PROCHAT_API_TOKEN}" \
  "${PROCHAT_API_ORIGIN}/api/integration/v1/conversations/<ID_обращения>/card"
Пример ответа 200: Карточка обращения
JSON: Карточка обращения
{
  "conversationId": "00000000-0000-4000-8000-000000000002",
  "version": 0,
  "tags": [
    {
      "name": "Тег из примера",
      "color": "#6366f1",
      "id": "00000000-0000-4000-8000-000000000003",
      "revision": 0,
      "archivedAt": null
    }
  ],
  "fieldDefinitions": [
    {
      "id": "00000000-0000-4000-8000-000000000004",
      "name": "Сумма из примера",
      "type": "NUMBER",
      "options": [],
      "revision": 0,
      "archivedAt": null
    }
  ],
  "fieldValues": [
    {
      "fieldId": "00000000-0000-4000-8000-000000000004",
      "value": 1000
    }
  ]
}
GET/card-catalog

Каталог тегов и полей

Возвращает активные определения тегов и полей всего рабочего пространства. Значения карточек и архивные определения в каталог не входят. Требуется cards:read; параметры запроса не принимаются.

Разрешение: cards:read

Параметры отсутствуют.

cURL: Каталог тегов и полей
curl --fail-with-body \
  --header "Authorization: Bearer ${PROCHAT_API_TOKEN}" \
  "${PROCHAT_API_ORIGIN}/api/integration/v1/card-catalog"
Пример ответа 200: Каталог тегов и полей
JSON: Каталог тегов и полей
{
  "tags": [
    {
      "name": "Тег из примера",
      "color": "#6366f1",
      "id": "00000000-0000-4000-8000-000000000003",
      "revision": 0,
      "archivedAt": null
    }
  ],
  "fields": [
    {
      "id": "00000000-0000-4000-8000-000000000004",
      "name": "Сумма из примера",
      "type": "NUMBER",
      "options": [],
      "revision": 0,
      "archivedAt": null
    }
  ]
}

Пагинация и данные

Списки обращений и сообщений возвращают items и nextCursor. Передавайте полученный курсор с теми же фильтрами. Значение null означает конец выборки. Лимит страницы — от 1 до 100, по умолчанию 50.

Обращения отсортированы по lastMessageAt DESC, id DESC. Сообщения — по sentAt ASC, sequence ASC, id ASC. Курсор должен принадлежать доступной выборке; удаление записи или смена фильтров могут потребовать начать обход заново.

Обход страниц JavaScript
const origin = process.env.PROCHAT_API_ORIGIN; // Только origin, без пути
const token = process.env.PROCHAT_API_TOKEN;  // Из хранилища секретов
if (!origin || !token) throw new Error("Настройте адрес и API-ключ");

let cursor = null;
const seen = new Set();
do {
  const url = new URL("/api/integration/v1/conversations", origin);
  url.searchParams.set("limit", "50");
  if (cursor) url.searchParams.set("cursor", cursor);
  const response = await fetch(url, {
    headers: { Authorization: `Bearer ${token}`, Accept: "application/json" },
  });
  if (!response.ok) throw new Error(`PROChat API: HTTP ${response.status}`);
  const page = await response.json();
  for (const conversation of page.items) {
    if (!seen.has(conversation.id)) {
      seen.add(conversation.id);
      // Сохраните или обновите запись во внешней системе.
    }
  }
  cursor = page.nextCursor;
} while (cursor !== null);

Пример прекращает обход при HTTP-ошибке. Для 429 дождитесь Retry-After и повторите ту же страницу. Экспорт не является замороженным снимком: во внешней системе исключайте дубли по ID и обновляйте существующие записи при повторной загрузке.

Как читать ответы

  • Служебные даты передаются в ISO 8601 UTC. Версии — неотрицательные целые числа.
  • У сообщения PENDING или SENDING не подтверждает доставку. Учитывайте status вместе с sentAt; порядок при совпадающем времени уточняет sequence.
  • В карточке fieldValues содержит только установленные значения: строку, конечное число или boolean. Значения 0 и false сохраняются. Тип и варианты берутся из fieldDefinitions.
  • Карточка сохраняет назначенные архивные теги и архивные поля со значением. Общий каталог содержит активные определения рабочего пространства.
  • Внутренние заметки, файлы и их URL, секреты каналов и телефоны из данных контакта исключены. Чтение не отмечает сообщения прочитанными и не обращается к API провайдера.

Квоты и ошибки

Лимит — 60 запросов на ключ и 600 на рабочее пространство в фиксированном минутном окне. Окно определяется UTC-временем сервера. Авторизованные попытки с неверным scope или параметрами также учитываются.

Дополнительно действует предел 1200 попыток за 60 секунд на IP до проверки токена. При HTTP 429 соблюдайте заголовок Retry-After в секундах. При недоступности обязательного ограничителя запрос получит 503. Ответы имеют Cache-Control: no-store.

Коды ошибок методов чтения
HTTPКодДействие
400VALIDATION_ERRORНеверный UUID, лимит, фильтр или неизвестный параметр запроса.
400INVALID_CURSORЗапись курсора отсутствует либо не входит в разрешённую выборку.
401INTEGRATION_API_UNAUTHENTICATEDКлюч отсутствует, неверен, отозван, истёк или утратил актуальные права.
403INTEGRATION_API_SCOPE_REQUIREDДействующий ключ не содержит нужного разрешения.
404CONNECTION_NOT_FOUNDПодключение фильтра отсутствует либо не выбрано для ключа.
404CONVERSATION_NOT_FOUNDОбращение отсутствует либо выходит за область ключа.
409INTEGRATION_API_RESULT_TOO_LARGEКарточка или каталог превышает 1000 элементов одного списка; данные не обрезаются молча.
429INTEGRATION_API_RATE_LIMITEDПревышен лимит IP, ключа или рабочего пространства. Соблюдайте Retry-After.
500INTERNAL_ERRORВнутренняя ошибка без раскрытия SQL, секретов и stack traces.
503INTEGRATION_API_UNAVAILABLEОбязательный ограничитель временно недоступен. Повторите запрос позднее.
Пример ошибки 403
{
  "code": "INTEGRATION_API_SCOPE_REQUIRED"
}

Не кешируйте секреты и ответы с перепиской. Последнее использование ключа в интерфейсе обновляется примерно раз в минуту и служит ориентиром активности.

Работа с вебхуками

  1. Настройте подписку на события нужного подключения во вкладке «Исходящие вебхуки».
  2. Проверьте HMAC-подпись исходных байтов запроса и исключите повторную обработку по ID события.
  3. Для события conversation.card_changed получите conversation.id, затем прочитайте актуальную карточку через GET /conversations/{conversationId}/card с разрешением cards:read.

Секрет подписи вебхука и API-ключ — отдельные секреты. Вебхук содержит снимок на момент события, API возвращает актуальные сохранённые данные. Пауза рабочих отправок удерживает исходящие вебхуки; чтение API остаётся доступным.

В этой версии доступны сохранённые данные PROChat. Методы записи, провайдерская аналитика, объявления, файлы и готовые CRM-коннекторы расширяются отдельными задачами.

Настроить API-ключ