Обзор Обзор Новости Новости
Поделиться

Вебхуки

Вебхуки и события События в реальном времени

Получайте уведомления в реальном времени по всем событиям. Документы обработаны, OCR завершён, классификация выполнена.

Доступные события

22 типа событий, сгруппированных по сущностям

Подпишитесь на отдельные события или используйте подстановочный знак * для всего.

Документы

14
  • document.uploaded Новый документ загружен в рабочее пространство
  • document.created Псевдоним для document.uploaded (совместимость)
  • document.processed Конвейер OCR/AI-IDP успешно завершен
  • document.updated Метаданные, теги или содержимое обновлены
  • document.deleted Документ перемещен в корзину
  • document.restored Документ восстановлен из корзины
  • document.moved Документ перемещен между рабочими пространствами
  • document.version_created Новая версия добавлена к существующему документу
  • document.lifecycle_changed Статус хранения / архивирования изменен
  • document.comment_added Комментарий опубликован на документе
  • document.note_added Прикреплена внутренняя заметка
  • document.tag_added Тег назначен документу
  • document.legal_hold_placed Юридический запрет активирован (неизменяемый)
  • document.legal_hold_released Юридический запрет снят

Задания

3
  • job.completed Асинхронное задание успешно завершено
  • job.failed Асинхронное задание окончательно не выполнено
  • job.progress Обновление прогресса во время длительных заданий

Workspaces

2
  • workspace.shared Workspace предоставлено пользователю или команде
  • workspace.unshared доступ к Workspace отозван

Задачи

3
  • task.created Создана новая задача
  • task.completed Задача отмечена как выполненная
  • task.overdue Задача просрочена
Видео

Вебхуки в действии

Увидите, как PaperOffice Webhooks работают на практике — в видео.

Вебхуки в действии
Полезная нагрузка и заголовки

Каждая доставка следует одной схеме

Предсказуемое тело JSON, пять подписанных HTTP-заголовков, метки времени ISO-8601 UTC.

Тело запроса (JSON)
{
  "event_type": "document.processed",
  "event_id": "a3b7f9c1d4e8b2a6c9f1d4e7b2a5c8f1",
  "timestamp": "2026-04-17T14:23:11Z",
  "subscription_id": 42,
  "data": {
    "pofid": "doc_01HZY8K3M7P2Q9R5T1V6W4X2Y8",
    "workspace_id": 17,
    "filename": "invoice-2026-04-17.pdf",
    "mime_type": "application/pdf",
    "size_bytes": 284521,
    "processing_result": {
      "ocr_done": true,
      "classification": "invoice",
      "confidence": 0.98
    }
  }
}
Заголовки HTTP-запроса
Content-Type application/json Всегда JSON, кодировка UTF-8
User-Agent PaperOffice-Webhook/1.0 Фиксированный идентификатор для списков разрешения брандмауэра
X-PaperOffice-Event document.processed Тип доставляемого события
X-PaperOffice-Event-ID a3b7f9c1… Уникальный 128-битный ID. Используйте для идемпотентности.
X-PaperOffice-Subscription-ID 42 ID подписки, получающей событие
X-PaperOffice-Signature sha256=… HMAC-SHA256 необработанного тела, в шестнадцатеричном формате
Проверка подписи

Проверяйте каждую доставку с помощью HMAC-SHA256

Вычислите HMAC-SHA256 для необработанного тела запроса, используя ваш общий секрет, затем сравните с X-PaperOffice-Signature, используя сравнение с постоянным временем (hash_equals, crypto.timingSafeEqual).

import crypto from 'crypto';
import express from 'express';

const app = express();

const WEBHOOK_SECRET = process.env.PAPEROFFICE_WEBHOOK_SECRET;

app.post('/webhooks/paperoffice', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = req.header('X-PaperOffice-Signature'); // "sha256=..."
  const eventId   = req.header('X-PaperOffice-Event-ID');
  const eventType = req.header('X-PaperOffice-Event');

  const expected = 'sha256=' + crypto
    .createHmac('sha256', WEBHOOK_SECRET)
    .update(req.body)
    .digest('hex');

  if (!signature || !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
    return res.status(401).send('invalid signature');
  }

  const event = JSON.parse(req.body.toString());
  // store eventId as idempotency key -> never process the same ID twice
  console.log(eventType, event.data);
  res.status(200).send('ok');
});
Повтор и доставка

Три стратегии повторных попыток, до 10 попыток

Выберите политику для каждой подписки. Каждая попытка регистрируется с кодом состояния, телом ответа и временем.

linear

Линейная

Фиксированный рост: 30 с, 60 с, 90 с, 120 с, 150 с…

none

Отсутствует

Отправил и забыл. Повторные попытки не выполняются даже при ошибках 5xx. Полезно для тестовых хуков.

Успех HTTP 2xx в пределах вашего тайм-аута
Макс. повторных попыток 0–10 попыток (по умолчанию 5)
Тайм-аут 1 000–30 000 мс на попытку (по умолчанию 10 000)
Журнал доставки Каждая попытка сохраняется в webhook_deliveries для аудита
API управления

9 конечных точек в разделе /latest/webhooks/

Полный CRUD для подписок, журналов доставки, одноразовых подписок на задачи и тестовой конечной точки — всё с использованием OAuth2 Bearer, готово к MCP.

POST /webhooks/subscribe Создать новую подписку (неограниченно на аккаунт) po-webhooks-subscribe
GET /webhooks/list Список всех подписок аккаунта po-webhooks-list
POST /webhooks/update Обновить существующую подписку po-webhooks-update
POST /webhooks/delete Мягкое удаление подписки (журнал доставки сохраняется) po-webhooks-delete
POST /webhooks/test Получить журнал доставки с фильтрами (event_type, success_only) po-webhooks-test
POST /webhooks/test Отправить событие test.ping для проверки доставки po_webhooks_test
POST /webhooks/subscribe-job Одноразовый вебхук для конкретного job_id po_webhooks_subscribe_job
GET /webhooks/job-subscriptions Список подписок, ограниченных задачами po_webhooks_job_subscriptions
GET /webhooks/info Доступные события, конечные точки, политики повторных попыток, информация о подписи po_webhooks_info
Безопасность Enterprise

Защита по дизайну

HMAC-SHA256

Каждая полезная нагрузка подписана вашим секретным ключом. Обязательно сравнение за постоянное время.

Защита от SSRF

Частные / внутренние IP-адреса, localhost и конечные точки метаданных облака блокируются при подписке и отправке.

Безопасность от DNS-ребайдинга

IP-адрес повторно проверяется во время отправки, закрепляется через CURLOPT_RESOLVE.

HTTPS настоятельно рекомендуется

Принимаются http и https. Для производства рекомендуется HTTPS.

Идемпотентность Event-ID

Каждая доставка содержит уникальный X-PaperOffice-Event-ID. Дедупликация на вашей стороне.

Полный аудиторский след

Все попытки логируются: код состояния, тело ответа, время, сообщение об ошибке.

Лимиты

Неограниченные подписки, поведение доставки полностью настраиваемо

Подписок на аккаунт
Активные подписки на задачи
10 000 мс
Тайм-аут по умолчанию
5
Макс. повторных попыток по умолчанию

Доступно на всех тарифах. Оплата за использование: 1 кредит за успешную доставку (HTTP 2xx). Повторные попытки, тестовые события и неудачные доставки бесплатны.

Начать сейчас

Получать события?

Настройте webhooks.

HMAC-SHA256 Экспоненциальная задержка Полный аудиторский след

Где вы хотите протестировать PaperOffice?

Компьютер и смартфон связаны: рабочее пространство на компьютере, захват на телефоне.

Ваша пробная версия готова

Где вы хотите начать?

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

app.paperoffice.ai

Начать на компьютере

Мы отправим вашу личную ссылку для доступа на ваш адрес электронной почты.

Зарегистрироваться бесплатно Открыть приложение Приложение PaperOffice Полный продукт: веб, компьютер и мобильные устройства. Захватывайте, организуйте, ищите документы и работайте с ними вместе с командой. Требуется бесплатная учётная запись Открыть Playground Playground Выбранные функции сразу — с ограниченным демо-ключом API. С ограниченным демо-ключом API