Pager API · v2

Документація API

Отримуйте розмови, повідомлення й клієнтів у свої системи, дізнавайтеся про нові повідомлення й коментарі через вебхуки, надсилайте клієнтам повідомлення й файли, відповідайте на коментарі та керуйте розмовами, доступом менеджерів і довідниками Pager.

Початок роботи

Вступ

Pager API дає вашим системам доступ до даних організації. Через нього можна читати розмови, повідомлення й клієнтів, надсилати клієнтам повідомлення й файли, відповідати на коментарі в Instagram, змінювати статус, відповідального й групу розмови, заповнювати картку клієнта, керувати доступом менеджерів до каналів, а також довідниками, якими користуються менеджери в кабінеті: статусами, групами клієнтів, папками й шаблонами відповідей. Про нові повідомлення й коментарі Pager може повідомляти ваш сервер сам — через вебхуки.

Базова адреса
https://api.pager.co.ua/v2
  • Запити й відповіді — JSON у кодуванні UTF-8, дати — ISO 8601 в UTC.
  • Усі списки повертаються в однаковій обгортці { data, hasMore, nextCursor }, тож цикл обходу сторінок пишеться один раз — див. Пагінація.
  • Невідомі поля в тілі чи в query не ігноруються, а повертають 400 unknown_parameter, щоб друкарська помилка в назві поля не загубилася непомітно.
  • Машиночитний опис API — специфікація OpenAPI: для Postman, генерації клієнтів і AI-асистентів.
  • Кожна відповідь містить заголовок X-Request-Id. Вкажіть його, коли звертаєтеся в підтримку.
  • Кожен запит підписується API-ключем — див. Автентифікація.

Початок роботи

Автентифікація

Передавайте API-ключ організації в заголовку Authorization у форматі Bearer <ключ>. Ключ прив'язаний до організації: API читає й змінює дані лише тієї організації, якій він належить.

API приймає запити з будь-якого домену, але ключ дає доступ до даних усієї організації. Зберігайте його на сервері — у змінних оточення чи менеджері секретів — і не додавайте в код, що виконується в браузері або мобільному застосунку.

Ключ має вигляд pgr_live_ і 40 символів після нього. Якщо ключ не передано, він недійсний, відкликаний або прострочений, API відповідає однаково: 401 invalid_api_key.

Почніть інтеграцію із запиту GET /me: він підтверджує, що ключ робочий, і повертає організацію, тариф і ліміти запитів.

curl "https://api.pager.co.ua/v2/me" \
  -H "Authorization: Bearer $PAGER_API_KEY"

Початок роботи

Пагінація

Розмови, повідомлення, клієнти та історія розмови повертаються сторінками. Кожна сторінка — обгортка { data, hasMore, nextCursor }.

  • limit — розмір сторінки, від 1 до 100, за замовчуванням 50.
  • Якщо hasMore дорівнює true, передайте nextCursor у параметрі cursor, щоб отримати наступну сторінку. Решту параметрів залиште без змін.
  • Записи йдуть від нових до старих. Сторінки не дублюються й нічого не пропускають, навіть коли в кількох записів однаковий час.
  • Курсор непрозорий: не розбирайте й не складайте його самі. Пошкоджений курсор повертає 400 invalid_cursor.
  • Довідники (статуси, групи, папки, шаблони) і замовлення розмови віддаються цілком: hasMore у них завжди false.
# Перша сторінка
curl "https://api.pager.co.ua/v2/conversations?limit=100" \
  -H "Authorization: Bearer $PAGER_API_KEY"

# Наступна: nextCursor із попередньої відповіді
curl "https://api.pager.co.ua/v2/conversations?limit=100&cursor=WyIyMDI2LTA5LTIzVDE2OjAyOjExLjg0MFoiLCIyYjljNGQ2ZS04ZjBhLTRjMmUtOWI0ZC02ZjhhMGMyZTRiNmQiXQ" \
  -H "Authorization: Bearer $PAGER_API_KEY"

Синхронізація

Для регулярної синхронізації використовуйте updatedSince, а не повний обхід. Список розмов відсортовано за lastMessageAt: розмова з новим повідомленням переміщується на початок, тож під час обходу сторінками її можна пропустити. Запам'ятовуйте найбільший updatedAt з отриманих об'єктів і наступного разу передавайте його в updatedSince. Межа включна, тож останні об'єкти прийдуть ще раз — оновлюйте записи за id, а не додавайте нові.

Початок роботи

Фільтри та expand

Списки приймають фільтри в рядку запиту. Різні фільтри поєднуються через «і»: запис має відповідати кожному з них.

  • Кілька значень одного фільтра: ?statusId=a,b або ?statusId=a&statusId=b. Підходить будь-яке зі значень.
  • null означає порожнє поле, як у кабінеті: ?responsibleUserId=null — розмови без відповідального, ?statusId=a,null — зі статусом a або без статусу. Працює для statusId, responsibleUserId і clientGroupId.
  • q шукає без урахування регістру по тих самих полях, що й пошук у кабінеті. Поля для кожного ресурсу вказано в описі параметра.
  • Ідентифікатор іншої організації у фільтрі не дає помилки — список просто буде порожнім.
  • Невідомий параметр повертає 400 unknown_parameter.

expand

Без expand розмова містить лише ідентифікатори пов'язаних об'єктів (clientId, statusId тощо), тож список не тягне зайвих даних. Параметр expand додає самі об'єкти: client, channel, status, clientGroup, responsibleUser — через кому. Невідоме значення повертає 400 з param: "expand". Токени й ключі каналів у відповідь не потрапляють ніколи.

curl "https://api.pager.co.ua/v2/conversations?statusId=5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e,null&responsibleUserId=null&expand=client,status" \
  -H "Authorization: Bearer $PAGER_API_KEY"

Початок роботи

Помилки

Помилка повертається з відповідним HTTP-кодом і об'єктом error. Обробляйте її за полем type — широкою категорією; code уточнює причину, param вказує на поле запиту, а requestId збігається із заголовком X-Request-Id.

Відповідь · 400
{
  "error": {
    "type": "invalid_request",
    "code": "invalid_parameter",
    "message": "Color must be #rrggbb",
    "param": "color",
    "requestId": "req_4f1c9a2e7b3d4c6e9a0f1d2e3f4a5b6c"
  }
}
HTTPtypeКоли виникає
400invalid_requestПоле не пройшло перевірку (invalid_parameter), передано невідоме поле (unknown_parameter), тіло не є валідним JSON (invalid_body) або ідентифікатор із тіла не належить організації. Для вебхуків також invalid_webhook_url і webhook_limit_reached — див. Обмеження.
401authentication_errorКлюч не передано, він недійсний, відкликаний або прострочений (invalid_api_key).
402quota_exceededПлан закінчився або вичерпано баланс повідомлень (message_limit_reached). Повертається під час відправки повідомлення.
403permission_errorКлючу бракує прав на цю дію.
404not_foundОб'єкта немає у вашій організації (status_not_found тощо) або такого маршруту не існує (route_not_found).
409conflictЗапит конфліктує з поточним станом: externalId уже зайнятий іншим клієнтом (external_id_taken), ключ ідемпотентності вже використано (idempotency_key_reused, idempotency_request_in_progress), на коментар уже є приватна відповідь (private_reply_exists) або доставку вимкненого вебхука не можна повторити (webhook_disabled).
422channel_errorПовідомлення не вдалося надіслати в канал: месенджер відмовив (channel_rejected), канал не підтримує відправку (channel_unsupported) або не налаштований — див. Надіслати повідомлення.
429rate_limit_exceededПеревищено ліміт запитів — див. Ліміти запитів.
500api_errorВнутрішня помилка Pager. Повторіть запит пізніше, а звертаючись у підтримку, вкажіть requestId.

Об'єкт іншої організації дає ту саму відповідь 404, що й неіснуючий, — API не підтверджує, що він існує.

Тип permission_error поки зарезервований на майбутнє. Орієнтуйтеся на type і code, а не на текст message: він може змінюватися.

Початок роботи

Ліміти запитів

Ліміти рахуються окремо для кожного ключа за принципом «дірявого відра». Кожен запит додає у відро свою вагу, а відро рівномірно спорожнюється. Поки вага вміщається, запит проходить; коли ні — API відповідає 429 rate_limit_exceeded.

ВідроМісткістьСпорожнюється
general6010 за секундуУсі запити.
outbound301 за секундуЗапити, що йдуть у месенджери: кожне надіслане повідомлення, відповідь на коментар і видалення коментаря додатково займають 1. Тобто до 30 таких запитів поспіль, далі — один на секунду.

Вага запиту: 1 — отримання, створення, зміна й видалення об'єкта, 2 — сторінка списку, 5 — пошук повідомлень по всій організації й підрахунок розмов. Вагу кожної операції вказано поруч із нею. Тобто можна зробити до 60 одиничних запитів поспіль, а далі — стабільно 10 на секунду.

Поточні ліміти ключа повертає GET /me у полі rateLimits.

ЗаголовокКоли виникає
RateLimit-LimitМісткість відра.
RateLimit-RemainingСкільки одиниць ще вміщається у відро.
RateLimit-ResetЧерез скільки секунд відро повністю спорожніє.
RateLimit-PolicyПолітика у форматі 60;w=6: місткість і за скільки секунд спорожнюється повне відро.
Retry-AfterЛише у відповіді 429: через скільки секунд повторити запит.
Відповідь · 429
HTTP/1.1 429 Too Many Requests
RateLimit-Limit: 60
RateLimit-Remaining: 0
RateLimit-Reset: 6
RateLimit-Policy: 60;w=6
Retry-After: 1
Отримавши 429, зачекайте стільки секунд, скільки вказано в Retry-After, і повторіть запит. Повтор без паузи знову впреться в ліміт.

Початок роботи

Ідемпотентність

Запити з побічним ефектом приймають заголовок Idempotency-Key. Якщо з'єднання обірвалося й ви не знаєте, чи дійшов запит, повторіть його з тим самим ключем — Pager не виконає дію вдруге, а поверне збережену відповідь.

curl -X POST "https://api.pager.co.ua/v2/conversations/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d/messages" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Idempotency-Key: a3f1c9e2-5b7d-4e8a-9c0b-1d2e3f4a5b6c" \
  -H "Content-Type: application/json" \
  -d '{"text":"Дякуємо за замовлення! Номер ТТН: 20450000012345"}'
  • Зараз заголовок приймають відправка повідомлення, відповідь на коментар і створення підписки на вебхуки, для інших запитів він ігнорується. Заголовок необов'язковий: без нього запит виконується як звичайно.
  • Ключ — будь-який рядок до 255 символів, свій для кожної нової дії. Найпростіше — UUID. Порожній чи задовгий ключ повертає 400 invalid_idempotency_key.
  • Ключ діє в межах організації 24 години. Повтор із тим самим ключем і тим самим тілом отримує збережену відповідь із заголовком Idempotent-Replayed: true.
  • Зберігаються лише успішні відповіді (2xx). Після помилки ключ звільняється, тож виправлений запит можна надіслати з тим самим ключем.
  • Той самий ключ з іншим тілом чи шляхом повертає 409 idempotency_key_reused. Поки перший запит ще виконується — 409 idempotency_request_in_progress: зачекайте й повторіть.

Початок роботи

Надсилання файлів

Файл надсилається клієнту у три кроки: отримайте посилання на завантаження, завантажте файл у сховище Pager і надішліть повідомлення з готовим вкладенням. Файл іде у сховище напряму, повз API, тож ліміти запитів на його розмір не впливають.

  1. 1

    POST /files з conversationId, назвою, MIME-типом і розміром файлу. У відповіді — uploadUrl, заголовки headers і готовий об'єкт attachment.

  2. 2

    Протягом 5 хвилин завантажте файл запитом PUT на uploadUrl із заголовками з headers. Authorization тут не потрібен: доступ дає підпис у посиланні.

  3. 3

    Надішліть повідомлення з attachments: [attachment] — об'єктом із першого кроку без змін.

# 1. Посилання на завантаження
curl -X POST "https://api.pager.co.ua/v2/files" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d", "name": "invoice-184502.pdf", "mime": "application/pdf", "size": 248193}'

# 2. Файл — напряму у сховище, без Authorization
curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: application/pdf" \
  --data-binary @invoice-184502.pdf

# 3. Повідомлення з вкладенням
curl -X POST "https://api.pager.co.ua/v2/conversations/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d/messages" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"attachments": [ATTACHMENT]}'

В одному повідомленні — або текст, або один файл: більшість месенджерів губить текст поруч із файлом. Щоб надіслати файл із підписом, надішліть два повідомлення.

До 20 МБ. Дозволені зображення, відео, аудіо, PDF, ZIP, документи Office, TXT і CSV — див. Файли. Якщо файл не завантажено, API поверне 400 attachment_not_uploaded; якщо завантажено більший, ніж дозволено, — 400 attachment_too_large.

Початок роботи

OpenAPI

Повний опис API доступний у форматі OpenAPI 3.1. Специфікація генерується з тих самих схем, якими API перевіряє запити, тож завжди відповідає поточній версії. Її можна імпортувати в Postman чи Insomnia або згенерувати з неї клієнт для своєї мови.

OpenAPI
https://api.pager.co.ua/v2/openapi.json
https://api.pager.co.ua/v2/docs
  • GET /v2/openapi.json — специфікація: усі ендпоінти, параметри, схеми об'єктів і помилок, вага кожного запиту, а також формати подій вебхуків у розділі webhooks.
  • GET /v2/docs — інтерактивна документація на основі специфікації: там можна переглянути схеми й надіслати запит зі своїм ключем просто з браузера.
  • Обидві адреси відкриті: API-ключ не потрібен, і запити до них не враховуються в лімітах. Відповідь кешується на 5 хвилин.
  • Описи в специфікації — англійською.
# Завантажити специфікацію
curl -o pager-openapi.json https://api.pager.co.ua/v2/openapi.json

API-ключі

Створення ключа

Ключ створює адміністратор організації в кабінеті Pager. В організації може бути лише один активний ключ.

  1. 1

    Відкрийте Налаштування → API.

  2. 2

    Натисніть Створити ключ і дайте йому назву, наприклад «Інтеграція з CRM». Назва потрібна лише вам, щоб згадати, де використовується ключ.

  3. 3

    Скопіюйте ключ і збережіть його в надійному місці. Повністю ключ показується лише один раз: Pager зберігає тільки його хеш, тому відновити ключ неможливо — лише перевипустити.

Створювати, перевипускати й відкликати ключ можуть лише адміністратори. Інші учасники бачать тільки назву ключа, його маску та дату останнього використання.

API-ключі

Перевипуск ключа

Перевипустіть ключ, якщо він міг потрапити до сторонніх, або якщо з команди пішла людина, яка мала до нього доступ.

  1. 1

    У Налаштування → API натисніть Перевипустити.

  2. 2

    За потреби змініть назву й підтвердьте.

  3. 3

    Збережіть новий ключ і замініть його в усіх інтеграціях.

Старий ключ перестає працювати в ту ж мить, коли створено новий, — перехідного періоду немає. Запити зі старим ключем отримуватимуть 401, тож оновіть ключ в інтеграціях одразу після перевипуску.

Якщо двоє адміністраторів перевипускають ключ одночасно, один із запитів буде відхилено. Оновіть сторінку й перевірте, який ключ зараз активний.

API-ключі

Відкликання ключа

Відкличте ключ, якщо інтеграція більше не потрібна. Після цього в організації не лишається активного ключа, доки ви не створите новий.

  1. 1

    У Налаштування → API натисніть кнопку з кошиком поруч із ключем.

  2. 2

    Підтвердьте відкликання.

Відкликання не можна скасувати. Усі запити з цим ключем одразу отримуватимуть 401 invalid_api_key.

Вебхуки

Огляд

Вебхуки повідомляють вашу систему про події в Pager, щойно вони стаються: Pager надсилає POST-запит із подією на ваш URL. Опитувати API, щоб дізнатися про нові повідомлення, не потрібно.

  • Підписка — це URL і список подій, які на нього надсилати. В організації може бути до 10 підписок, наприклад окремо для CRM і для аналітики.
  • Кожен запит підписано секретом підписки, тож ваш сервер може переконатися, що подію надіслав саме Pager, — див. Перевірка підпису.
  • Якщо ваш сервер недоступний, Pager повторює доставку протягом приблизно 10 годин — див. Доставка й повтори.
  • Підписками можна керувати в кабінеті або через API — див. ресурс Підписки на вебхуки. Підписка, створена в кабінеті, видна через API, і навпаки.

Вебхуки

Підключення

Спершу підготуйте на своєму сервері публічний HTTPS-ендпоінт, який приймає POST-запити з JSON. Далі підписку створює адміністратор організації в кабінеті.

  1. 1

    Відкрийте Налаштування → API → Вебхуки й натисніть Додати вебхук.

  2. 2

    Вкажіть URL ендпоінта й позначте події, на які підписуєтеся. Опис необов'язковий: він потрібен лише вам, щоб згадати, куди йдуть події.

  3. 3

    Скопіюйте секрет підпису (whsec_…) і збережіть його на сервері, наприклад у змінній оточення PAGER_WEBHOOK_SECRET. Секрет показується лише один раз: відновити його не вийде, лише перевипустити.

  4. 4

    У меню підписки відкрийте Доставки й тест і натисніть Надіслати тест. Pager одразу надішле подію webhook.test і покаже, що відповів ваш сервер.

Через API підписку створює POST /webhooks: секрет приходить у полі secret відповіді. Перевірити ендпоінт можна запитом POST /webhooks/{id}/test.

Нова підписка отримує лише події, що стаються після її створення. Історію повідомлень вона не отримує: щоб завантажити наявні дані, пройдіться по списках API — див. Пагінація.

У кабінеті вебхуками можуть керувати лише адміністратори організації. Через API — будь-яка система з API-ключем організації.

Вебхуки

Події

Кожна подія приходить окремим запитом. Тіло запиту — JSON-конверт однакової форми для всіх типів подій, а самі дані події лежать у полі data.

ПодіяКоли виникає
message.receivedКлієнт надіслав повідомлення в будь-який канал організації.
message.sentОрганізація надіслала повідомлення клієнту: менеджер у кабінеті, ваша система через API, розсилка чи автоматика.
comment.receivedКлієнт залишив коментар під постом в Instagram — новий або відповідь у гілці. Відповіді від імені сторінки подією не є.
webhook.testТестова подія з кнопки Надіслати тест або з POST /webhooks/{id}/test. Підписатися на неї не можна: вона приходить лише на запит. У data.message — рядок.

Конверт події

ПолеКоли виникає
idІдентифікатор події, evt_…. Не змінюється між повторами й збігається із заголовком Pager-Event-Id, тож за ним зручно відкидати дублікати.
typeТип події — див. таблицю вище.
createdAtКоли подія сталася, ISO 8601 в UTC.
organizationIdОрганізація, у якій сталася подія.
dataДані події. Для подій про повідомлення — message, conversation, client і channel; для comment.received — comment замість message.
Тіло запиту · message.received
{
  "id": "evt_6c1f0e9d8b7a45c3a2e1f0d9c8b7a6e5",
  "type": "message.received",
  "createdAt": "2026-09-24T08:31:40.582Z",
  "organizationId": "org_2rRfXLYNflNpMgzPBX1MU18z39C",
  "data": {
    "message": {
      "id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "direction": "incoming",
      "text": "А доставка у Львів скільки йде?",
      "attachments": [],
      "authorId": null,
      "replyToMessageId": null,
      "externalId": "aWdfZAG1faXRlbTo…",
      "reaction": null,
      "isRead": false,
      "isEdited": false,
      "isDelivered": null,
      "errorMessage": null,
      "ad": null,
      "storyReplyUrl": null,
      "createdAt": "2026-09-24T08:31:40.117Z",
      "updatedAt": "2026-09-24T08:31:40.117Z"
    },
    "conversation": {
      "id": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
      "clientId": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
      "statusId": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
      "responsibleUserId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
      "clientGroupId": "1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e",
      "state": "unread",
      "lastMessageDirection": "incoming",
      "lastMessageAt": "2026-09-24T08:31:40.117Z",
      "snippet": "А доставка у Львів скільки йде?",
      "createdAt": "2026-08-14T09:21:37.512Z",
      "updatedAt": "2026-09-24T08:31:40.117Z"
    },
    "client": {
      "id": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
      "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "externalId": null,
      "name": "Олена Коваль",
      "username": "olena.koval",
      "imageUrl": "https://files.pager.co.ua/…/avatar.jpg",
      "phone": null,
      "infoName": "Олена",
      "infoLastName": "Коваль",
      "infoPhone": "+380671234567",
      "infoEmail": "olena@example.com",
      "infoAddress": "Київ, НП №52",
      "infoNote": "Цікавиться оптовими цінами",
      "createdAt": "2026-08-14T09:21:37.512Z",
      "updatedAt": "2026-09-23T15:02:11.840Z"
    },
    "channel": {
      "id": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
      "name": "Instagram магазину",
      "channelSource": "Instagram",
      "username": "kvitka.shop",
      "imageUrl": "https://files.pager.co.ua/…/channel.jpg"
    }
  }
}
Тіло запиту · comment.received
{
  "id": "evt_3e2d1c0b9a8f47e6d5c4b3a2f1e0d9c8",
  "type": "comment.received",
  "createdAt": "2026-09-24T10:02:16.204Z",
  "organizationId": "org_2rRfXLYNflNpMgzPBX1MU18z39C",
  "data": {
    "comment": {
      "id": "6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "parentId": null,
      "direction": "incoming",
      "text": "Скільки коштує доставка у Львів?",
      "username": "olena.koval",
      "authorId": null,
      "media": {
        "id": "18045678901234567",
        "url": "https://www.instagram.com/p/C9xYz1AbCdE/"
      },
      "hasPrivateReply": false,
      "createdAt": "2026-09-24T10:02:15.000Z",
      "updatedAt": "2026-09-24T10:02:15.000Z"
    },
    "conversation": {
      "id": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
      "clientId": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
      "statusId": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
      "responsibleUserId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
      "clientGroupId": "1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e",
      "state": "unread",
      "lastMessageDirection": "incoming",
      "lastMessageAt": "2026-09-24T08:31:40.117Z",
      "snippet": "А доставка у Львів скільки йде?",
      "createdAt": "2026-08-14T09:21:37.512Z",
      "updatedAt": "2026-09-24T08:31:40.117Z"
    },
    "client": {
      "id": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
      "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "externalId": null,
      "name": "Олена Коваль",
      "username": "olena.koval",
      "imageUrl": "https://files.pager.co.ua/…/avatar.jpg",
      "phone": null,
      "infoName": "Олена",
      "infoLastName": "Коваль",
      "infoPhone": "+380671234567",
      "infoEmail": "olena@example.com",
      "infoAddress": "Київ, НП №52",
      "infoNote": "Цікавиться оптовими цінами",
      "createdAt": "2026-08-14T09:21:37.512Z",
      "updatedAt": "2026-09-23T15:02:11.840Z"
    },
    "channel": {
      "id": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
      "name": "Instagram магазину",
      "channelSource": "Instagram",
      "username": "kvitka.shop",
      "imageUrl": "https://files.pager.co.ua/…/channel.jpg"
    }
  }
}

У подіях message.* об'єкти мають ті самі формати, що й у REST: повідомлення, розмова без expand і клієнт. channel — канал: id, name, channelSource, username, imageUrl. Об'єкти — знімок на момент події.

У comment.received data.comment — коментар без replies. Для відповіді клієнта в гілці parentId вказує на корінь гілки. Відповісти можна через POST /conversations/{id}/comments.

Посилання у message.attachments[].url тимчасові: вони підписуються в момент кожної спроби доставки, термін дії — у expiresAt. Якщо файл вам потрібен, завантажте його одразу.

Порядок доставки не гарантований: події надсилаються паралельно, а повтори зсувають їх у часі. Щоб упорядкувати повідомлення, використовуйте message.createdAt.

Закладайте, що в об'єктах можуть з'явитися нові поля: не відкидайте подію через невідоме поле.

Вебхуки

Перевірка підпису

Кожен запит Pager підписує секретом підписки. Перевіряйте підпис, перш ніж довіряти події: URL вебхука не є секретом, і надіслати на нього запит може будь-хто.

Запит від Pager
POST /pager/webhook HTTP/1.1
Host: crm.example.com
Content-Type: application/json
User-Agent: Pager-Webhooks/1.0
Pager-Event-Id: evt_6c1f0e9d8b7a45c3a2e1f0d9c8b7a6e5
Pager-Event-Type: message.received
Pager-Delivery: dlv_4b7e1f0a-9c2d-4e8b-a6f3-5d1c0b9e8a72
Pager-Attempt: 1
Pager-Signature: t=1758702700,v1=5f0c8a1e2b7d4c9f3a6e1b8d0c7f2a5e9b4d1c8f7a2e6b3d0c9f5a8e1b4d7c2a
ЗаголовокКоли виникає
Pager-Signaturet=<unix-час>,v1=<підпис>, де v1 — HMAC-SHA256 у hex від рядка <t>.<тіло запиту>, а ключ — секрет підписки. t — час конкретної спроби, тож у повторі він новий.
Pager-Event-Idid події. Однаковий у всіх повторах.
Pager-Event-TypeТип події, як type у тілі.
Pager-DeliveryІдентифікатор доставки, dlv_…, — той самий id, що в журналі доставок.
Pager-AttemptНомер спроби, від 1.
  1. 1

    Візьміть із заголовка Pager-Signature значення t і v1.

  2. 2

    Обчисліть HMAC-SHA256 від рядка <t>.<тіло> своїм секретом. Тіло беріть сирим, байт у байт як воно прийшло: після розбору й повторної серіалізації JSON підпис не зійдеться.

  3. 3

    Порівняйте результат із v1 функцією порівняння за сталий час (crypto.timingSafeEqual, hmac.compare_digest).

  4. 4

    Відкидайте запити, у яких t відрізняється від поточного часу більш ніж на 5 хвилин: так перехоплений запит не вийде відтворити пізніше.

Обробник вебхука
import crypto from "node:crypto"
import express from "express"

const app = express()
const seen = new Set()

// Підпис рахується від сирого тіла: не розбирайте JSON до перевірки
app.post("/pager/webhook", express.raw({ type: "application/json" }), (req, res) => {
  const header = req.get("Pager-Signature") ?? ""
  const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")))

  // 1. Очікуваний підпис: HMAC-SHA256 від «t.тіло»
  const expected = crypto
    .createHmac("sha256", process.env.PAGER_WEBHOOK_SECRET)
    .update(`${t}.${req.body}`)
    .digest("hex")

  // 2. Порівняння за сталий час
  const valid =
    typeof v1 === "string" &&
    v1.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected))

  // 3. Не старіше 5 хвилин
  const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 5 * 60

  if (!valid || !fresh) return res.status(400).end()

  const event = JSON.parse(req.body)

  // 4. Повтори мають той самий event.id: обробляйте подію один раз
  if (!seen.has(event.id)) {
    seen.add(event.id)
    queue.push(event)
  }

  // 5. Відповідайте 2xx одразу, а обробляйте подію у фоні
  res.status(200).send("ok")
})
Після перевипуску секрету старий секрет перестає діяти одразу, перехідного періоду немає. Доставки, що вже стоять у черзі, теж підписуються новим. Оновіть секрет на сервері відразу після перевипуску, інакше перевірка підпису не проходитиме.

Вебхуки

Доставка й повтори

Доставка успішна, якщо ваш сервер відповів будь-яким кодом 2xx протягом 10 секунд. Тіло відповіді Pager не аналізує, лише зберігає його початок у журналі.

  • Будь-що інше — невдача: інший код, 3xx (редиректи не виконуються), таймаут чи помилка з'єднання. Pager повторить запит за розкладом нижче.
  • Відповідайте якнайшвидше: збережіть подію в чергу, поверніть 200, а обробляйте потім. Довга обробка всередині запиту веде до таймаутів і зайвих повторів.
  • Подія доставляється щонайменше один раз: та сама подія може прийти двічі, наприклад якщо ваша відповідь загубилася в мережі. Відкидайте дублікати за id події (Pager-Event-Id).
  • Після останньої невдалої спроби доставка отримує статус dead і більше не повторюється автоматично. Її можна повторити вручну — у кабінеті або через API.

Розклад повторів

СпробаКоли
1одразу після події
2+10 с
3+30 с
4+1 хв
5+5 хв
6+15 хв
7+1 год
8+3 год
9+6 год

Пауза відраховується від попередньої спроби й має розкид ±20%, щоб підписки, які впали разом, не поверталися однією хвилею. Разом — до 9 спроб протягом приблизно 10 годин.

Автоматичне вимкнення

Якщо на URL підписки 7 діб поспіль не проходить жодна доставка, Pager вимикає підписку: enabled стає false, а disabledReason — delivery_failures. Листа про це Pager не надсилає: стан видно в кабінеті й через GET /webhooks/{id}.

Поки серія невдач триває, failingSince показує її початок, а consecutiveFailures — кількість невдалих спроб поспіль. Перша успішна доставка обнуляє обидва поля. Тестові події в серію не рахуються.

Щоб увімкнути підписку знову, натисніть Увімкнути в кабінеті або передайте enabled: true у PATCH /webhooks/{id}. Серія невдач обнуляється, а доставки, що лишилися в черзі, продовжаться.

Кожна доставка записується в журнал: статус, номер спроби, код і перші 2 КБ відповіді, тривалість. Журнал зберігається 30 діб; у кабінеті він відкривається з меню підписки, пункт Доставки й тест.

Вебхуки

Обмеження

Обмеження захищають і ваш сервер, і Pager: від зайвого навантаження та від запитів у внутрішню мережу.

  • До 10 підписок на організацію. Спроба створити ще одну повертає 400 webhook_limit_reached.
  • Лише https://. URL до 2000 символів, без логіна й пароля в адресі.
  • URL має вести на публічну адресу. Локальні й приватні адреси (localhost, 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 тощо) відхиляються з 400 invalid_webhook_url. Адреса перевіряється під час збереження й ще раз перед кожною доставкою, тож підмінити DNS-запис після створення підписки не вийде.
  • Редиректи не виконуються: відповідь 3xx вважається невдачею. Вказуйте кінцевий URL.
  • Таймаут — 10 секунд на весь запит, включно з читанням відповіді.
  • У журнал потрапляють лише перші 2 КБ тіла відповіді.
  • Опис підписки — до 500 символів.
  • Доступні події: message.received, message.sent і comment.received.

Ресурси

Організація

Дані про організацію й ключ, яким підписано запит: тариф, залишок повідомлень, маска ключа й ліміти запитів.

Поля відповіді

  • organizationobject

    id, name і timezone організації. Часовий пояс за замовчуванням — Europe/Kyiv.

  • planobject | null

    Поточний тариф: name, maxUsers, maxChannels і endDate — дата, до якої його оплачено. null, якщо тарифу немає.

  • messagesobject | null

    Залишок повідомлень: included — із тарифу, extra — докуплених; resetAt — коли оновиться пакет тарифу.

  • apiKeyobject

    Ключ запиту: name, маска (prefix + last4), scopes, createdAt і expiresAt. Повністю ключ ніколи не повертається.

  • rateLimitsobject

    Місткість і швидкість спорожнення кожного відра — див. Ліміти запитів.

Отримати дані організації

GET/v2/meвага 1

Найкращий перший запит інтеграції: якщо він повернув 200, ключ робочий.

curl "https://api.pager.co.ua/v2/me" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "organization": {
    "id": "org_2rRfXLYNflNpMgzPBX1MU18z39C",
    "name": "Магазин «Квітка»",
    "timezone": "Europe/Kyiv"
  },
  "plan": {
    "id": "b1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f",
    "name": "Business",
    "maxUsers": 10,
    "maxChannels": 5,
    "endDate": "2026-10-24T00:00:00.000Z"
  },
  "messages": {
    "included": 18240,
    "extra": 1500,
    "resetAt": "2026-10-01T00:00:00.000Z"
  },
  "apiKey": {
    "name": "Інтеграція з CRM",
    "prefix": "pgr_live_",
    "last4": "1JgQ",
    "scopes": [
      "*"
    ],
    "createdAt": "2026-09-12T09:03:44.000Z",
    "expiresAt": null
  },
  "rateLimits": {
    "general": {
      "capacity": 60,
      "ratePerSecond": 10
    },
    "outbound": {
      "capacity": 30,
      "ratePerSecond": 1
    }
  }
}

Ресурси

Розмови

Розмова — листування з одним клієнтом в одному каналі. Список відсортовано за lastMessageAt, від нових до старих. Розмову можна не лише читати, а й змінювати її статус, відповідального, групу й прочитаність, а також надсилати в неї повідомлення.

  • Розмови зі статусом SPAM не приховуються, на відміну від кабінету. Якщо вони вам не потрібні, передайте в statusId потрібні статуси (і null для розмов без статусу).
  • Розмова з новим повідомленням переміщується на початок списку. Для синхронізації використовуйте updatedSince — див. Пагінація.

Об'єкт розмови

  • idstring

    Ідентифікатор розмови.

  • channelIdstring

    Канал, у якому йде розмова.

  • clientIdstring

    Клієнт розмови — див. Клієнти.

  • statusIdstring | null

    Статус або null, якщо його не задано.

  • responsibleUserIdstring | null

    Відповідальний менеджер або null.

  • clientGroupIdstring | null

    Група клієнта або null.

  • stateenum

    unread — є непрочитані вхідні повідомлення, read — усе прочитано.

  • lastMessageDirectionenum | null

    Хто написав останнім: incoming — клієнт, outgoing — організація.

  • lastMessageAtISO 8601

    Час останнього повідомлення.

  • snippetstring

    Текст останнього повідомлення для прев'ю.

  • createdAtISO 8601

    Коли розмову створено.

  • updatedAtISO 8601

    Коли розмову востаннє змінено.

  • clientobject · expand

    Об'єкт клієнта. Лише з expand=client.

  • channelobject · expand

    Канал: id, name, channelSource, username, imageUrl. Лише з expand=channel.

  • statusobject · expand

    Об'єкт статусу. Лише з expand=status.

  • clientGroupobject · expand

    Об'єкт групи. Лише з expand=clientGroup.

  • responsibleUserobject · expand

    Менеджер: id, firstName, lastName, imageUrl. Лише з expand=responsibleUser.

Об'єкт розмови
{
  "id": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
  "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
  "clientId": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
  "statusId": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
  "responsibleUserId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
  "clientGroupId": "1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e",
  "state": "unread",
  "lastMessageDirection": "incoming",
  "lastMessageAt": "2026-09-24T08:31:40.117Z",
  "snippet": "А доставка у Львів скільки йде?",
  "createdAt": "2026-08-14T09:21:37.512Z",
  "updatedAt": "2026-09-24T08:31:40.117Z"
}

Список розмов

GET/v2/conversationsвага 2

Повертає розмови сторінками. Приклад нижче — непрочитані розмови без відповідального, разом із клієнтом.

Параметри

  • channelIdstring[]queryнеобов'язковий

    Лише розмови з цих каналів.

  • statusIdstring[]queryнеобов'язковий

    Лише розмови з цими статусами. null — розмови без статусу.

  • responsibleUserIdstring[]queryнеобов'язковий

    Лише розмови цих менеджерів. null — розмови без відповідального.

  • clientGroupIdstring[]queryнеобов'язковий

    Лише розмови цих груп. null — розмови без групи.

  • stateenumqueryнеобов'язковий

    read або unread.

  • directionenumqueryнеобов'язковий

    Хто написав останнім: incoming — клієнт (чекає на відповідь), outgoing — організація.

  • updatedSinceISO 8601queryнеобов'язковий

    Лише розмови, змінені від цього моменту. ISO 8601 з часовим поясом.

  • qstringqueryнеобов'язковий

    Пошук за ідентифікатором розмови, текстом останнього повідомлення, іменем, username, телефоном, email і нотаткою клієнта, а також Zoho ID.

  • limitintegerqueryнеобов'язковий

    Розмір сторінки, від 1 до 100. За замовчуванням 50.

  • cursorstringqueryнеобов'язковий

    nextCursor із попередньої сторінки.

  • expandstringqueryнеобов'язковий

    Пов'язані об'єкти через кому: client, channel, status, clientGroup, responsibleUser.

curl "https://api.pager.co.ua/v2/conversations?state=unread&responsibleUserId=null&limit=20&expand=client" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
      "clientId": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
      "statusId": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
      "responsibleUserId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
      "clientGroupId": "1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e",
      "state": "unread",
      "lastMessageDirection": "incoming",
      "lastMessageAt": "2026-09-24T08:31:40.117Z",
      "snippet": "А доставка у Львів скільки йде?",
      "createdAt": "2026-08-14T09:21:37.512Z",
      "updatedAt": "2026-09-24T08:31:40.117Z",
      "client": {
        "id": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
        "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
        "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
        "externalId": null,
        "name": "Олена Коваль",
        "username": "olena.koval",
        "imageUrl": "https://files.pager.co.ua/…/avatar.jpg",
        "phone": null,
        "infoName": "Олена",
        "infoLastName": "Коваль",
        "infoPhone": "+380671234567",
        "infoEmail": "olena@example.com",
        "infoAddress": "Київ, НП №52",
        "infoNote": "Цікавиться оптовими цінами",
        "createdAt": "2026-08-14T09:21:37.512Z",
        "updatedAt": "2026-09-23T15:02:11.840Z"
      }
    }
  ],
  "hasMore": true,
  "nextCursor": "WyIyMDI2LTA5LTIzVDE2OjAyOjExLjg0MFoiLCIyYjljNGQ2ZS04ZjBhLTRjMmUtOWI0ZC02ZjhhMGMyZTRiNmQiXQ"
}

Кількість розмов

GET/v2/conversations/countвага 5

Приймає ті самі фільтри, що й список, і повертає лише { count } — наприклад, для лічильника непрочитаних на дашборді.

Параметри

  • channelIdstring[]queryнеобов'язковий

    Лише розмови з цих каналів.

  • statusIdstring[]queryнеобов'язковий

    Лише розмови з цими статусами. null — розмови без статусу.

  • responsibleUserIdstring[]queryнеобов'язковий

    Лише розмови цих менеджерів. null — розмови без відповідального.

  • clientGroupIdstring[]queryнеобов'язковий

    Лише розмови цих груп. null — розмови без групи.

  • stateenumqueryнеобов'язковий

    read або unread.

  • directionenumqueryнеобов'язковий

    Хто написав останнім: incoming — клієнт (чекає на відповідь), outgoing — організація.

  • updatedSinceISO 8601queryнеобов'язковий

    Лише розмови, змінені від цього моменту. ISO 8601 з часовим поясом.

  • qstringqueryнеобов'язковий

    Пошук за ідентифікатором розмови, текстом останнього повідомлення, іменем, username, телефоном, email і нотаткою клієнта, а також Zoho ID.

curl "https://api.pager.co.ua/v2/conversations/count?state=unread&responsibleUserId=null" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "count": 17
}

Отримати розмову

GET/v2/conversations/{id}вага 1

Повертає одну розмову. Приймає expand.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор розмови.

  • expandstringqueryнеобов'язковий

    Пов'язані об'єкти через кому: client, channel, status, clientGroup, responsibleUser.

curl "https://api.pager.co.ua/v2/conversations/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d?expand=client,status,responsibleUser" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "id": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
  "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
  "clientId": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
  "statusId": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
  "responsibleUserId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
  "clientGroupId": "1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e",
  "state": "unread",
  "lastMessageDirection": "incoming",
  "lastMessageAt": "2026-09-24T08:31:40.117Z",
  "snippet": "А доставка у Львів скільки йде?",
  "createdAt": "2026-08-14T09:21:37.512Z",
  "updatedAt": "2026-09-24T08:31:40.117Z",
  "client": {
    "id": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
    "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
    "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
    "externalId": null,
    "name": "Олена Коваль",
    "username": "olena.koval",
    "imageUrl": "https://files.pager.co.ua/…/avatar.jpg",
    "phone": null,
    "infoName": "Олена",
    "infoLastName": "Коваль",
    "infoPhone": "+380671234567",
    "infoEmail": "olena@example.com",
    "infoAddress": "Київ, НП №52",
    "infoNote": "Цікавиться оптовими цінами",
    "createdAt": "2026-08-14T09:21:37.512Z",
    "updatedAt": "2026-09-23T15:02:11.840Z"
  },
  "status": {
    "id": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
    "name": "В роботі",
    "sortIndex": 0,
    "systemStatus": "IN_PROGRESS"
  },
  "responsibleUser": {
    "id": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
    "firstName": "Ірина",
    "lastName": "Шевчук",
    "imageUrl": null
  }
}

Оновити розмову

PATCH/v2/conversations/{id}вага 1

Змінює статус, відповідального, групу чи прочитаність розмови. Змінюються лише передані поля; null очищає поле. Приймає expand, як і отримання розмови.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор розмови.

  • expandstringqueryнеобов'язковий

    Пов'язані об'єкти через кому: client, channel, status, clientGroup, responsibleUser.

  • statusIdstring | nullтілонеобов'язковий

    Новий статус або null, щоб прибрати статус.

  • responsibleUserIdstring | nullтілонеобов'язковий

    Новий відповідальний — учасник організації — або null, щоб зняти відповідального. Ідентифікатори менеджерів є в responsibleUserId розмов і в expand=responsibleUser.

  • clientGroupIdstring | nullтілонеобов'язковий

    Нова група або null, щоб прибрати групу.

  • stateenumтілонеобов'язковий

    read — позначити прочитаною, unread — непрочитаною.

  • Ідентифікатори статусу, групи й менеджера мають належати вашій організації, інакше API поверне 400 з відповідним param.
  • Зміни статусу й відповідального потрапляють в історію розмови з userId: null.
  • Тіло без жодного поля повертає 400.
curl -X PATCH "https://api.pager.co.ua/v2/conversations/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d?expand=status" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"statusId":"7c9e1a3b-5d7f-4a2c-8e6b-0d2f4a6c8e1b","state":"read"}'
Відповідь · 200
{
  "id": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
  "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
  "clientId": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
  "statusId": "7c9e1a3b-5d7f-4a2c-8e6b-0d2f4a6c8e1b",
  "responsibleUserId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
  "clientGroupId": "1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e",
  "state": "read",
  "lastMessageDirection": "incoming",
  "lastMessageAt": "2026-09-24T08:31:40.117Z",
  "snippet": "А доставка у Львів скільки йде?",
  "createdAt": "2026-08-14T09:21:37.512Z",
  "updatedAt": "2026-09-24T09:02:17.408Z",
  "status": {
    "id": "7c9e1a3b-5d7f-4a2c-8e6b-0d2f4a6c8e1b",
    "name": "Оплачено",
    "sortIndex": 3,
    "systemStatus": "COMPLETED"
  }
}

Історія розмови

GET/v2/conversations/{id}/historyвага 2

Зміни статусу й відповідального однією стрічкою, від нових до старих, сторінками.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор розмови.

  • limitintegerqueryнеобов'язковий

    Розмір сторінки, від 1 до 100. За замовчуванням 50.

  • cursorstringqueryнеобов'язковий

    nextCursor із попередньої сторінки.

  • type — status_changed (поля oldStatusId, newStatusId) або responsible_changed (поля oldResponsibleUserId, newResponsibleUserId).
  • userId — хто зробив зміну. null означає, що зміну зроблено через API або автоматикою (наприклад, розсилкою), а не менеджером у кабінеті.
curl "https://api.pager.co.ua/v2/conversations/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d/history" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "f0e1d2c3-b4a5-4968-8776-655443322110",
      "type": "status_changed",
      "userId": null,
      "oldStatusId": "7c9e1a3b-5d7f-4a2c-8e6b-0d2f4a6c8e1b",
      "newStatusId": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
      "createdAt": "2026-09-24T08:40:03.221Z"
    },
    {
      "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
      "type": "responsible_changed",
      "userId": "user_2rRfXLYNflNpMgzPBX1MU18z39C",
      "oldResponsibleUserId": null,
      "newResponsibleUserId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
      "createdAt": "2026-09-23T16:01:12.650Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Замовлення розмови

GET/v2/conversations/{id}/ordersвага 2

Замовлення, створені з цієї розмови, від нових до старих. Повертаються цілком, без пагінації.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор розмови.

  • amount — сума замовлення, ціле число.
  • crm — куди передано замовлення: LP_CRM, ZOHO або null; externalId — номер замовлення в цій CRM.
  • userId — менеджер, який оформив замовлення.
curl "https://api.pager.co.ua/v2/conversations/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d/orders" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "0c1d2e3f-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "userId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
      "amount": 1450,
      "externalId": "184502",
      "crm": "LP_CRM",
      "createdAt": "2026-09-23T16:20:31.000Z",
      "updatedAt": "2026-09-23T16:20:31.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Повідомлення розмови

GET/v2/conversations/{id}/messagesвага 2

Повідомлення однієї розмови сторінками, від нових до старих. Формат — об'єкт повідомлення.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор розмови.

  • limitintegerqueryнеобов'язковий

    Розмір сторінки, від 1 до 100. За замовчуванням 50.

  • cursorstringqueryнеобов'язковий

    nextCursor із попередньої сторінки.

  • updatedSinceISO 8601queryнеобов'язковий

    Лише повідомлення, змінені від цього моменту (нові, відредаговані, зі зміненим статусом доставки чи реакцією).

curl "https://api.pager.co.ua/v2/conversations/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d/messages?limit=2" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "direction": "incoming",
      "text": "А доставка у Львів скільки йде?",
      "attachments": [],
      "authorId": null,
      "replyToMessageId": null,
      "externalId": "aWdfZAG1faXRlbTo…",
      "reaction": null,
      "isRead": false,
      "isEdited": false,
      "isDelivered": null,
      "errorMessage": null,
      "ad": null,
      "storyReplyUrl": null,
      "createdAt": "2026-09-24T08:31:40.117Z",
      "updatedAt": "2026-09-24T08:31:40.117Z"
    },
    {
      "id": "c9d8e7f6-a5b4-4c3d-9e2f-1a0b9c8d7e6f",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "direction": "outgoing",
      "text": "Відправляємо Новою поштою по всій Україні, доставка 1–2 дні.",
      "attachments": [],
      "authorId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
      "replyToMessageId": null,
      "externalId": "aWdfZAG1faXRlbTo…",
      "reaction": null,
      "isRead": true,
      "isEdited": false,
      "isDelivered": true,
      "errorMessage": null,
      "ad": null,
      "storyReplyUrl": null,
      "createdAt": "2026-09-23T16:05:02.004Z",
      "updatedAt": "2026-09-23T16:05:02.004Z"
    }
  ],
  "hasMore": true,
  "nextCursor": "WyIyMDI2LTA5LTI0VDA4OjMxOjQwLjExN1oiLCJkMWUyZjNhNC1iNWM2LTRkN2UtOGY5YS0wYjFjMmQzZTRmNWEiXQ"
}

Надіслати повідомлення

POST/v2/conversations/{id}/messagesвага 1outbound 1

Надсилає клієнту текст або файл від імені організації — через канал розмови, так само як менеджер із кабінету. Повертає збережене повідомлення з кодом 201.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор розмови.

  • Idempotency-Keystringзаголовокнеобов'язковий

    Ключ, з яким повтор запиту не надішле повідомлення вдруге — див. Ідемпотентність.

  • textstringтілонеобов'язковий

    Текст повідомлення, від 1 до 4096 символів. Не передається разом з attachments.

  • attachmentsobject[]тілонеобов'язковий

    Масив з одним вкладенням — об'єкт attachment з POST /files без змін. Вкладення іншої розмови чи власний URL файлу повертають 400 invalid_attachment.

  • replyToMessageIdstringтілонеобов'язковий

    Повідомлення цієї розмови, на яке ви відповідаєте. Повідомлення з іншої розмови повертає 400.

  • Передайте або text, або attachments з одним файлом — не обидва разом, інакше 400. Як завантажити файл — див. Надсилання файлів.
  • Текст — до 4096 символів. У деяких месенджерів ліміт менший — тоді відмова прийде як 422.
  • authorId у відповіді — null: повідомлення надіслано через API, а не менеджером.
  • Передавайте Idempotency-Key: якщо відповідь не дійшла через таймаут, повтор із тим самим ключем не надішле клієнту повідомлення вдруге.
  • Перед відправкою перевіряється тариф: якщо план закінчився або вичерпано баланс повідомлень — 402 message_limit_reached. Надіслане повідомлення враховується в ліміті.
  • Відправка працює для Instagram, Facebook Messenger, Telegram-бота, особистого Telegram, Viber і WhatsApp через e-chat, вебчату й кастомних каналів. Для інших каналів — 422 channel_unsupported.
  • Якщо месенджер відмовив (наприклад, з останнього повідомлення клієнта в Instagram чи Facebook минуло забагато часу), API поверне 422 channel_rejected. Повідомлення при цьому збережене як недоставлене — менеджер побачить його в кабінеті, а його id є в тексті помилки.
  • Після відправки розмова стає прочитаною й піднімається вгору списку.
  • Окрім ваги 1 у відрі general, займає 1 у відрі outbound — див. Ліміти запитів.
curl -X POST "https://api.pager.co.ua/v2/conversations/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d/messages" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Idempotency-Key: a3f1c9e2-5b7d-4e8a-9c0b-1d2e3f4a5b6c" \
  -H "Content-Type: application/json" \
  -d '{"text":"Доставка у Львів — 1–2 дні, від 80 грн. Оформити замовлення?","replyToMessageId":"d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a"}'
Відповідь · 201
{
  "id": "e5f6a7b8-c9d0-4e1f-a2b3-c4d5e6f7a8b9",
  "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
  "direction": "outgoing",
  "text": "Доставка у Львів — 1–2 дні, від 80 грн. Оформити замовлення?",
  "attachments": [],
  "authorId": null,
  "replyToMessageId": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
  "externalId": "aWdfZAG1faXRlbTo…",
  "reaction": null,
  "isRead": false,
  "isEdited": false,
  "isDelivered": true,
  "errorMessage": null,
  "ad": null,
  "storyReplyUrl": null,
  "createdAt": "2026-09-24T08:34:02.771Z",
  "updatedAt": "2026-09-24T08:34:02.771Z"
}

Ресурси

Повідомлення

Повідомлення розмов. Щоб прочитати листування, використовуйте повідомлення розмови; цей ресурс — для пошуку по всій організації й отримання одного повідомлення.

  • Пошук по всій організації важчий за читання однієї розмови, тому його вага — 5. Якщо знаєте розмову, читайте її повідомлення.
  • Посилання у attachments[].url тимчасові, термін дії — у expiresAt.

Об'єкт повідомлення

  • idstring

    Ідентифікатор повідомлення.

  • conversationIdstring

    Розмова, до якої належить повідомлення.

  • directionenum

    incoming — від клієнта, outgoing — від організації.

  • textstring | null

    Текст або null, якщо в повідомленні лише вкладення.

  • attachmentsobject[]

    Вкладення: type (image, video, audio або document), url, name, mime, size у байтах і expiresAt.

  • authorIdstring | null

    Менеджер, який надіслав повідомлення. null у вхідних, а також у вихідних, надісланих через API, розсилкою чи автоматикою.

  • replyToMessageIdstring | null

    Повідомлення, на яке це є відповіддю, або null.

  • externalIdstring | null

    Ідентифікатор повідомлення в месенджері.

  • reactionstring | null

    Реакція на повідомлення, наприклад емодзі, або null.

  • isReadboolean

    Чи прочитано повідомлення.

  • isEditedboolean

    Чи редагувалося повідомлення.

  • isDeliveredboolean | null

    true / false — відповідь месенджера про доставку. null — месенджер статусу не повертає (Viber і WhatsApp через e-chat) або повідомлення вхідне.

  • errorMessagestring | null

    Чому повідомлення не доставлено, або null.

  • adobject | null

    Реклама, з якої клієнт написав: id, url, text. null, якщо повідомлення не з реклами.

  • storyReplyUrlstring | null

    Сторіз, на яку відповів клієнт, або null.

  • createdAtISO 8601

    Коли повідомлення надіслано.

  • updatedAtISO 8601

    Коли повідомлення востаннє змінено.

Об'єкт повідомлення
{
  "id": "c9d8e7f6-a5b4-4c3d-9e2f-1a0b9c8d7e6f",
  "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
  "direction": "outgoing",
  "text": "Відправляємо Новою поштою по всій Україні, доставка 1–2 дні.",
  "attachments": [],
  "authorId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
  "replyToMessageId": null,
  "externalId": "aWdfZAG1faXRlbTo…",
  "reaction": null,
  "isRead": true,
  "isEdited": false,
  "isDelivered": true,
  "errorMessage": null,
  "ad": null,
  "storyReplyUrl": null,
  "createdAt": "2026-09-23T16:05:02.004Z",
  "updatedAt": "2026-09-23T16:05:02.004Z"
}

Пошук повідомлень

GET/v2/messagesвага 5

Шукає повідомлення по всіх розмовах організації, від нових до старих. Приклад нижче — вхідні повідомлення з вересня, де згадується «розмір».

Параметри

  • qstringqueryнеобов'язковий

    Пошук за текстом повідомлення, без урахування регістру.

  • channelIdstring[]queryнеобов'язковий

    Лише повідомлення з розмов цих каналів.

  • directionenumqueryнеобов'язковий

    incoming — від клієнтів, outgoing — від організації.

  • fromISO 8601queryнеобов'язковий

    Початок періоду за createdAt, включно. ISO 8601.

  • toISO 8601queryнеобов'язковий

    Кінець періоду за createdAt, включно. ISO 8601.

  • updatedSinceISO 8601queryнеобов'язковий

    Лише повідомлення, змінені від цього моменту.

  • limitintegerqueryнеобов'язковий

    Розмір сторінки, від 1 до 100. За замовчуванням 50.

  • cursorstringqueryнеобов'язковий

    nextCursor із попередньої сторінки.

curl "https://api.pager.co.ua/v2/messages?q=розмір&direction=incoming&from=2026-09-01T00:00:00Z" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "7a6b5c4d-3e2f-4a1b-8c9d-0e1f2a3b4c5d",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "direction": "incoming",
      "text": "Доброго дня! Чи є в наявності розмір M?",
      "attachments": [],
      "authorId": null,
      "replyToMessageId": null,
      "externalId": "aWdfZAG1faXRlbTo…",
      "reaction": null,
      "isRead": false,
      "isEdited": false,
      "isDelivered": null,
      "errorMessage": null,
      "ad": {
        "id": "120214567890123456",
        "url": "https://fb.me/…",
        "text": "Осіння колекція −20%"
      },
      "storyReplyUrl": null,
      "createdAt": "2026-09-23T15:58:44.910Z",
      "updatedAt": "2026-09-23T15:58:44.910Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Отримати повідомлення

GET/v2/messages/{id}вага 1

Повертає одне повідомлення.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор повідомлення.

curl "https://api.pager.co.ua/v2/messages/d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "id": "d1e2f3a4-b5c6-4d7e-8f9a-0b1c2d3e4f5a",
  "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
  "direction": "incoming",
  "text": "А доставка у Львів скільки йде?",
  "attachments": [],
  "authorId": null,
  "replyToMessageId": null,
  "externalId": "aWdfZAG1faXRlbTo…",
  "reaction": null,
  "isRead": false,
  "isEdited": false,
  "isDelivered": null,
  "errorMessage": null,
  "ad": null,
  "storyReplyUrl": null,
  "createdAt": "2026-09-24T08:31:40.117Z",
  "updatedAt": "2026-09-24T08:31:40.117Z"
}

Ресурси

Коментарі

Коментарі клієнтів під постами Instagram і відповіді на них. Кожен коментар належить розмові з його автором, тож коментарі читаються й пишуться в межах розмови. Дерево дворівневе: гілка — коментар клієнта під постом, replies — відповіді в ній від старих до нових. Гілки йдуть від нових до старих.

  • Зараз Pager збирає коментарі з Instagram. Для розмов інших каналів список порожній, а відповідь повертає 422 channel_unsupported.
  • Про нові коментарі клієнтів Pager може повідомляти подією вебхука `comment.received`.

Об'єкт гілки

  • idstring

    Ідентифікатор коментаря в Pager.

  • conversationIdstring

    Розмова з автором коментаря.

  • parentIdstring | null

    Корінь гілки для відповіді або null для самого кореня.

  • directionenum

    incoming — коментар клієнта, outgoing — відповідь від імені сторінки.

  • textstring

    Текст коментаря.

  • usernamestring

    Хто написав: username клієнта або назва каналу для відповідей сторінки.

  • authorIdstring | null

    Менеджер, який відповів. null у коментарів клієнтів і у відповідей, надісланих через API.

  • mediaobject | null

    Пост, під яким коментар: id і url. null, якщо невідомо.

  • hasPrivateReplyboolean

    Чи вже надіслано автору приватну відповідь у директ. Meta дозволяє це лише раз на коментар.

  • createdAtISO 8601

    Коли коментар написано.

  • updatedAtISO 8601

    Коли коментар востаннє змінено.

  • repliesobject[]

    Лише в гілці: відповіді на коментар — ті самі поля, від старих до нових.

Об'єкт гілки
{
  "id": "6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a",
  "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
  "parentId": null,
  "direction": "incoming",
  "text": "Скільки коштує доставка у Львів?",
  "username": "olena.koval",
  "authorId": null,
  "media": {
    "id": "18045678901234567",
    "url": "https://www.instagram.com/p/C9xYz1AbCdE/"
  },
  "hasPrivateReply": false,
  "createdAt": "2026-09-24T10:02:15.000Z",
  "updatedAt": "2026-09-24T10:02:15.000Z",
  "replies": [
    {
      "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "parentId": "6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a",
      "direction": "outgoing",
      "text": "Доставка у Львів — від 80 грн, 1–2 дні. Написали вам у директ 🙌",
      "username": "kvitka.shop",
      "authorId": null,
      "media": {
        "id": "18045678901234567",
        "url": "https://www.instagram.com/p/C9xYz1AbCdE/"
      },
      "hasPrivateReply": false,
      "createdAt": "2026-09-24T10:05:41.000Z",
      "updatedAt": "2026-09-24T10:05:41.000Z"
    }
  ]
}

Коментарі розмови

GET/v2/conversations/{id}/commentsвага 2

Повертає всі гілки коментарів розмови з відповідями, без пагінації.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор розмови.

curl "https://api.pager.co.ua/v2/conversations/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d/comments" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "parentId": null,
      "direction": "incoming",
      "text": "Скільки коштує доставка у Львів?",
      "username": "olena.koval",
      "authorId": null,
      "media": {
        "id": "18045678901234567",
        "url": "https://www.instagram.com/p/C9xYz1AbCdE/"
      },
      "hasPrivateReply": false,
      "createdAt": "2026-09-24T10:02:15.000Z",
      "updatedAt": "2026-09-24T10:02:15.000Z",
      "replies": [
        {
          "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
          "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
          "parentId": "6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a",
          "direction": "outgoing",
          "text": "Доставка у Львів — від 80 грн, 1–2 дні. Написали вам у директ 🙌",
          "username": "kvitka.shop",
          "authorId": null,
          "media": {
            "id": "18045678901234567",
            "url": "https://www.instagram.com/p/C9xYz1AbCdE/"
          },
          "hasPrivateReply": false,
          "createdAt": "2026-09-24T10:05:41.000Z",
          "updatedAt": "2026-09-24T10:05:41.000Z"
        }
      ]
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Відповісти на коментар

POST/v2/conversations/{id}/commentsвага 1outbound 1

Відповідає на коментар публічно під постом або приватно в директ його автору. Відповідає 201 з полем visibility: для public — нова відповідь у comment, для private — надіслане повідомлення в message і оновлений коментар у comment (hasPrivateReply: true).

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор розмови.

  • Idempotency-Keystringзаголовокнеобов'язковий

    Ключ, з яким повтор запиту не надішле відповідь удруге — див. Ідемпотентність.

  • replyToCommentIdstringтілообов'язковий

    id коментаря цієї розмови, на який ви відповідаєте.

  • visibilityenumтілообов'язковий

    public — публічна відповідь під постом від імені сторінки, private — приватне повідомлення в директ автору коментаря.

  • textstringтілообов'язковий

    Текст відповіді, від 1 до 2000 символів.

  • Публічна відповідь завжди йде в корінь гілки: Instagram не дозволяє відповідати на відповідь. Якщо replyToCommentId — відповідь, Pager відповість на її корінь.
  • Приватна відповідь можлива лише на коментар клієнта (інакше 400 not_a_client_comment) і лише один раз: повторна повертає 409 private_reply_exists. Вона з'являється в розмові як звичайне вихідне повідомлення й приходить у вебхук `message.sent`.
  • Перевіряється тариф, як і для відправки повідомлення: план закінчився — 402 message_limit_reached.
  • Якщо Meta відмовила, API поверне 422 channel_rejected з причиною. Невдала приватна відповідь зберігається як недоставлене повідомлення, його id є в тексті помилки.
  • Приймає Idempotency-Key. Окрім ваги 1 у відрі general, займає 1 у відрі outbound.
curl -X POST "https://api.pager.co.ua/v2/conversations/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d/comments" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Idempotency-Key: a3f1c9e2-5b7d-4e8a-9c0b-1d2e3f4a5b6c" \
  -H "Content-Type: application/json" \
  -d '{"replyToCommentId":"6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a","visibility":"private","text":"Вітаємо! Доставка у Львів — 1–2 дні, від 80 грн. Оформити замовлення?"}'
Відповідь · 201
{
  "visibility": "private",
  "message": {
    "id": "0a9b8c7d-6e5f-4a3b-9c2d-1e0f2a3b4c5d",
    "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
    "direction": "outgoing",
    "text": "Вітаємо! Доставка у Львів — 1–2 дні, від 80 грн. Оформити замовлення?",
    "attachments": [],
    "authorId": null,
    "replyToMessageId": null,
    "externalId": "aWdfZAG1faXRlbTo…",
    "reaction": null,
    "isRead": false,
    "isEdited": false,
    "isDelivered": true,
    "errorMessage": null,
    "ad": null,
    "storyReplyUrl": null,
    "createdAt": "2026-09-24T10:06:02.114Z",
    "updatedAt": "2026-09-24T10:06:02.114Z"
  },
  "comment": {
    "id": "6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a",
    "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
    "parentId": null,
    "direction": "incoming",
    "text": "Скільки коштує доставка у Львів?",
    "username": "olena.koval",
    "authorId": null,
    "media": {
      "id": "18045678901234567",
      "url": "https://www.instagram.com/p/C9xYz1AbCdE/"
    },
    "hasPrivateReply": true,
    "createdAt": "2026-09-24T10:02:15.000Z",
    "updatedAt": "2026-09-24T10:06:02.530Z"
  }
}

Видалити коментар

DELETE/v2/comments/{id}вага 1outbound 1

Видаляє коментар в Instagram і в Pager разом з усіма відповідями на нього й відповідає 204.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор розмови.

  • Спершу коментар видаляється в Meta. Якщо Meta відмовила — 422 channel_rejected, і в Pager нічого не видаляється.
  • Займає 1 у відрі outbound, як і відповідь.
curl -X DELETE "https://api.pager.co.ua/v2/comments/6d5c4b3a-2f1e-4d0c-9b8a-7f6e5d4c3b2a" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 204· Тіла у відповіді немає

Ресурси

Файли

Завантаження файлу в сховище Pager, щоб надіслати його клієнту. API не приймає файл напряму: POST /files видає тимчасове посилання, на яке ви завантажуєте файл, і готовий об'єкт вкладення для повідомлення. Покроково — див. Надсилання файлів.

  • До 20 МБ. Дозволені зображення, відео, аудіо (крім SVG), а також PDF, ZIP, DOC/DOCX, XLS/XLSX, PPT/PPTX, TXT і CSV. Інший тип повертає 400 з param: "mime".
  • Файл прив'язаний до розмови з conversationId: надіслати його можна лише в цю розмову.

Поля відповіді

  • uploadUrlstring

    Тимчасове посилання для завантаження файлу.

  • methodstring

    HTTP-метод завантаження — PUT.

  • headersobject

    Заголовки, які треба передати під час завантаження, дослівно. Content-Type входить у підпис посилання.

  • expiresIninteger

    Скільки секунд діє посилання — 300.

  • expiresAtISO 8601

    До якого моменту треба почати завантаження.

  • maxBytesinteger

    Максимальний розмір файлу в байтах.

  • attachmentobject

    Готове вкладення: після завантаження передайте цей об'єкт без змін у attachments відправки повідомлення.

Отримати посилання для завантаження

POST/v2/filesвага 1

Повертає посилання для завантаження й готовий об'єкт вкладення з кодом 201.

Параметри

  • conversationIdstringтілообов'язковий

    Розмова, у яку ви надішлете файл.

  • namestringтілообов'язковий

    Назва файлу, до 255 символів. Клієнт побачить її в месенджері.

  • mimestringтілообов'язковий

    MIME-тип файлу, наприклад application/pdf чи image/jpeg.

  • sizeintegerтілообов'язковий

    Розмір файлу в байтах, до 20 МБ.

  • Посилання діє 5 хвилин — стільки є, щоб почати завантаження. Повільне завантаження великого файлу не перерветься.
  • Завантажуйте запитом PUT на uploadUrl із заголовками з headers, без Authorization. Тіло запиту — сам файл.
  • Розмір і тип перевіряються ще раз під час відправки повідомлення — за фактично завантаженим файлом.
curl -X POST "https://api.pager.co.ua/v2/files" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"conversationId":"2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d","name":"invoice-184502.pdf","mime":"application/pdf","size":248193}'
Відповідь · 201
{
  "uploadUrl": "https://files.pager.co.ua/…/7f3e2d1c-0b9a-4c8d-9e7f-6a5b4c3d2e1f?X-Amz-Expires=300&X-Amz-Signature=…",
  "method": "PUT",
  "headers": {
    "Content-Type": "application/pdf"
  },
  "expiresIn": 300,
  "maxBytes": 20971520,
  "attachment": {
    "type": "document",
    "payload": {
      "key": "org_2rRfXLYNflNpMgzPBX1MU18z39C/2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d/7f3e2d1c-0b9a-4c8d-9e7f-6a5b4c3d2e1f",
      "name": "invoice-184502.pdf",
      "mime": "application/pdf",
      "size": 248193
    }
  },
  "expiresAt": "2026-09-24T08:44:12.000Z"
}

Ресурси

Клієнти

Клієнт — людина, яка написала в один із каналів організації. У кожного клієнта одна розмова. Список відсортовано за датою створення, від нових до старих. Картку клієнта можна заповнювати через API.

  • phone — номер клієнта в месенджері (Telegram, Viber, WhatsApp). Поля info* — картка клієнта, яку заповнює менеджер або CRM.
  • Внутрішні ідентифікатори платформ (PSID, Telegram ID) не повертаються.

Об'єкт клієнта

  • idstring

    Ідентифікатор клієнта.

  • channelIdstring

    Канал, у який написав клієнт.

  • conversationIdstring | null

    Розмова з клієнтом.

  • externalIdstring | null

    Ідентифікатор клієнта у зовнішній системі, або null.

  • namestring | null

    Ім'я з профілю месенджера.

  • usernamestring | null

    Username у месенджері.

  • imageUrlstring | null

    Аватар.

  • phonestring | null

    Номер у месенджері, якщо він відомий.

  • infoNamestring | null

    Ім'я в картці клієнта.

  • infoLastNamestring | null

    Прізвище в картці клієнта.

  • infoPhonestring | null

    Телефон у картці клієнта.

  • infoEmailstring | null

    Email у картці клієнта.

  • infoAddressstring | null

    Адреса в картці клієнта.

  • infoNotestring | null

    Нотатка менеджера.

  • createdAtISO 8601

    Коли клієнт уперше написав.

  • updatedAtISO 8601

    Коли дані клієнта востаннє змінено.

Об'єкт клієнта
{
  "id": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
  "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
  "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
  "externalId": null,
  "name": "Олена Коваль",
  "username": "olena.koval",
  "imageUrl": "https://files.pager.co.ua/…/avatar.jpg",
  "phone": null,
  "infoName": "Олена",
  "infoLastName": "Коваль",
  "infoPhone": "+380671234567",
  "infoEmail": "olena@example.com",
  "infoAddress": "Київ, НП №52",
  "infoNote": "Цікавиться оптовими цінами",
  "createdAt": "2026-08-14T09:21:37.512Z",
  "updatedAt": "2026-09-23T15:02:11.840Z"
}

Список клієнтів

GET/v2/clientsвага 2

Повертає клієнтів сторінками. Приклад нижче — пошук за номером телефону.

Параметри

  • channelIdstring[]queryнеобов'язковий

    Лише клієнти з цих каналів.

  • clientGroupIdstring[]queryнеобов'язковий

    Лише клієнти, чия розмова в цих групах. null — клієнти без групи.

  • updatedSinceISO 8601queryнеобов'язковий

    Лише клієнти, змінені від цього моменту.

  • qstringqueryнеобов'язковий

    Пошук за іменем, username, зовнішнім ID, телефонами в месенджерах і полями картки: ім'ям, прізвищем, телефоном, email.

  • limitintegerqueryнеобов'язковий

    Розмір сторінки, від 1 до 100. За замовчуванням 50.

  • cursorstringqueryнеобов'язковий

    nextCursor із попередньої сторінки.

curl "https://api.pager.co.ua/v2/clients?q=0671234567" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
      "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
      "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
      "externalId": null,
      "name": "Олена Коваль",
      "username": "olena.koval",
      "imageUrl": "https://files.pager.co.ua/…/avatar.jpg",
      "phone": null,
      "infoName": "Олена",
      "infoLastName": "Коваль",
      "infoPhone": "+380671234567",
      "infoEmail": "olena@example.com",
      "infoAddress": "Київ, НП №52",
      "infoNote": "Цікавиться оптовими цінами",
      "createdAt": "2026-08-14T09:21:37.512Z",
      "updatedAt": "2026-09-23T15:02:11.840Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Отримати клієнта

GET/v2/clients/{id}вага 1

Повертає одного клієнта.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор клієнта.

curl "https://api.pager.co.ua/v2/clients/3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "id": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
  "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
  "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
  "externalId": null,
  "name": "Олена Коваль",
  "username": "olena.koval",
  "imageUrl": "https://files.pager.co.ua/…/avatar.jpg",
  "phone": null,
  "infoName": "Олена",
  "infoLastName": "Коваль",
  "infoPhone": "+380671234567",
  "infoEmail": "olena@example.com",
  "infoAddress": "Київ, НП №52",
  "infoNote": "Цікавиться оптовими цінами",
  "createdAt": "2026-08-14T09:21:37.512Z",
  "updatedAt": "2026-09-23T15:02:11.840Z"
}

Оновити клієнта

PATCH/v2/clients/{id}вага 1

Заповнює картку клієнта. Змінюються лише передані поля; null очищає поле, пробіли на краях обрізаються.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор клієнта.

  • infoNamestring | nullтілонеобов'язковий

    Ім'я в картці, до 255 символів.

  • infoLastNamestring | nullтілонеобов'язковий

    Прізвище в картці, до 255 символів.

  • infoPhonestring | nullтілонеобов'язковий

    Телефон у картці, до 50 символів.

  • infoEmailstring | nullтілонеобов'язковий

    Email у картці. Має бути коректною адресою, інакше 400.

  • infoAddressstring | nullтілонеобов'язковий

    Адреса в картці, до 500 символів.

  • infoNotestring | nullтілонеобов'язковий

    Нотатка, до 8000 символів.

  • externalIdstring | nullтілонеобов'язковий

    Ідентифікатор клієнта у вашій системі, до 255 символів, унікальний у межах каналу.

  • Якщо підключено інтеграцію з Zoho CRM і змінено ім'я, прізвище, телефон чи email, картка синхронізується в Zoho — так само, як після зміни в кабінеті.
  • externalId, зайнятий іншим клієнтом цього каналу, повертає 409 external_id_taken.
  • Для клієнтів кастомного каналу externalId — це ідентифікатор, за яким Pager знаходить клієнта й надсилає йому відповіді. Змінюйте його, лише якщо змінився ідентифікатор на вашій платформі.
  • Тіло без жодного поля повертає 400.
curl -X PATCH "https://api.pager.co.ua/v2/clients/3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"infoAddress":"Львів, НП №12","infoNote":"Оптовий клієнт, знижка 10%","externalId":"crm-10482"}'
Відповідь · 200
{
  "id": "3b0f6c1e-5d2a-4f7e-9c41-2a8e7d9b1f03",
  "channelId": "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
  "conversationId": "2b9c4d6e-8f0a-4c2e-9b4d-6f8a0c2e4b6d",
  "externalId": "crm-10482",
  "name": "Олена Коваль",
  "username": "olena.koval",
  "imageUrl": "https://files.pager.co.ua/…/avatar.jpg",
  "phone": null,
  "infoName": "Олена",
  "infoLastName": "Коваль",
  "infoPhone": "+380671234567",
  "infoEmail": "olena@example.com",
  "infoAddress": "Львів, НП №12",
  "infoNote": "Оптовий клієнт, знижка 10%",
  "createdAt": "2026-08-14T09:21:37.512Z",
  "updatedAt": "2026-09-24T09:05:41.132Z"
}

Ресурси

Учасники

Менеджери й адміністратори організації. userId — той самий ідентифікатор, що в responsibleUserId розмов, authorId повідомлень і userId історії. Через API можна читати учасників і змінювати, які канали вони бачать.

  • Запросити чи видалити учасника й змінити його роль можна лише в кабінеті. Поле role у PATCH повертає 400 unknown_parameter.
  • Повертаються цілком, без пагінації, у порядку приєднання до організації.

Об'єкт учасника

  • userIdstring

    Ідентифікатор користувача, user_….

  • firstNamestring | null

    Ім'я або null.

  • lastNamestring | null

    Прізвище або null.

  • emailsstring[]

    Email-адреси користувача.

  • imageUrlstring | null

    Аватар або null.

  • rolestring

    Роль в організації: org:admin — адміністратор, org:member — менеджер.

  • accessibleChannelsstring[]

    Канали, розмови яких учасник бачить у кабінеті. Розмови інших каналів для нього приховані.

  • createdAtISO 8601

    Коли користувач зареєструвався в Pager.

Об'єкт учасника
{
  "userId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
  "firstName": "Ірина",
  "lastName": "Шевчук",
  "emails": [
    "iryna@kvitka.shop"
  ],
  "imageUrl": null,
  "role": "org:member",
  "accessibleChannels": [
    "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a"
  ],
  "createdAt": "2026-08-02T09:40:11.000Z"
}

Список учасників

GET/v2/membersвага 2

Повертає всіх учасників організації.

curl "https://api.pager.co.ua/v2/members" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "userId": "user_2rRfXLYNflNpMgzPBX1MU18z39C",
      "firstName": "Андрій",
      "lastName": "Мельник",
      "emails": [
        "owner@kvitka.shop"
      ],
      "imageUrl": "https://img.clerk.com/…",
      "role": "org:admin",
      "accessibleChannels": [
        "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
        "a7b8c9d0-e1f2-4a3b-8c4d-5e6f7a8b9c0d"
      ],
      "createdAt": "2026-07-18T12:03:27.000Z"
    },
    {
      "userId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
      "firstName": "Ірина",
      "lastName": "Шевчук",
      "emails": [
        "iryna@kvitka.shop"
      ],
      "imageUrl": null,
      "role": "org:member",
      "accessibleChannels": [
        "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a"
      ],
      "createdAt": "2026-08-02T09:40:11.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Отримати учасника

GET/v2/members/{userId}вага 1

Повертає одного учасника.

Параметри

  • userIdstringшляхобов'язковий

    Ідентифікатор користувача, user_….

curl "https://api.pager.co.ua/v2/members/user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "userId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
  "firstName": "Ірина",
  "lastName": "Шевчук",
  "emails": [
    "iryna@kvitka.shop"
  ],
  "imageUrl": null,
  "role": "org:member",
  "accessibleChannels": [
    "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a"
  ],
  "createdAt": "2026-08-02T09:40:11.000Z"
}

Змінити доступ до каналів

PATCH/v2/members/{userId}вага 1

Замінює список каналів, які бачить учасник, і повертає оновленого учасника.

Параметри

  • userIdstringшляхобов'язковий

    Ідентифікатор користувача, user_….

  • accessibleChannelsstring[]тілообов'язковий

    Повний новий список каналів, до 500. Канали, яких немає в списку, учасник бачити перестане; порожній масив приховує всі канали.

  • Це повна заміна, а не додавання: щоб відкрити ще один канал, передайте поточний список разом із ним.
  • Кожен канал має належати вашій організації, інакше 400 channel_not_found з param: "accessibleChannels". Повтори в масиві прибираються.
  • Ідентифікатори каналів є в channelId розмов і клієнтів.
curl -X PATCH "https://api.pager.co.ua/v2/members/user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"accessibleChannels":["e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a","a7b8c9d0-e1f2-4a3b-8c4d-5e6f7a8b9c0d"]}'
Відповідь · 200
{
  "userId": "user_2sKq8vB3nT1mZ7wYcR4dF6hJ9pL",
  "firstName": "Ірина",
  "lastName": "Шевчук",
  "emails": [
    "iryna@kvitka.shop"
  ],
  "imageUrl": null,
  "role": "org:member",
  "accessibleChannels": [
    "e4b2a1c9-6d8f-4e3a-b7c5-0f9e8d7c6b5a",
    "a7b8c9d0-e1f2-4a3b-8c4d-5e6f7a8b9c0d"
  ],
  "createdAt": "2026-08-02T09:40:11.000Z"
}

Ресурси

Статуси

Статуси розмов — етапи, якими менеджери позначають розмови в кабінеті. Повертаються в порядку sortIndex, як у кабінеті.

  • Видалення статусу не видаляє розмови: вони лишаються без статусу, як і після видалення в кабінеті.

Об'єкт статусу

  • idstring

    Ідентифікатор статусу.

  • namestring

    Назва, до 100 символів.

  • sortIndexinteger

    Позиція в списку, від 0.

  • systemStatusenum | null

    Системна категорія: IN_PROGRESS, CONSIDERING, COMPLETED, DECLINED, SPAM або null для звичайного статусу.

Об'єкт статусу
{
  "id": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
  "name": "В роботі",
  "sortIndex": 0,
  "systemStatus": "IN_PROGRESS"
}

Список статусів

GET/v2/statusesвага 2

Повертає всі статуси організації.

curl "https://api.pager.co.ua/v2/statuses" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
      "name": "В роботі",
      "sortIndex": 0,
      "systemStatus": "IN_PROGRESS"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Створити статус

POST/v2/statusesвага 1

Створює статус і повертає його з кодом 201.

Параметри

  • namestringтілообов'язковий

    Назва статусу, від 1 до 100 символів.

  • sortIndexintegerтілонеобов'язковий

    Позиція в списку, від 0. Якщо не передати під час створення, статус стане останнім.

  • systemStatusenum | nullтілонеобов'язковий

    Системна категорія (IN_PROGRESS, CONSIDERING, COMPLETED, DECLINED, SPAM) або null.

curl -X POST "https://api.pager.co.ua/v2/statuses" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Чекає на оплату","systemStatus":"CONSIDERING"}'
Відповідь · 201
{
  "id": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
  "name": "Чекає на оплату",
  "sortIndex": 0,
  "systemStatus": "CONSIDERING"
}

Оновити статус

PATCH/v2/statuses/{id}вага 1

Змінює лише передані поля. Тіло без жодного поля повертає 400.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор статусу.

  • namestringтілонеобов'язковий

    Назва статусу, від 1 до 100 символів.

  • sortIndexintegerтілонеобов'язковий

    Позиція в списку, від 0. Якщо не передати під час створення, статус стане останнім.

  • systemStatusenum | nullтілонеобов'язковий

    Системна категорія (IN_PROGRESS, CONSIDERING, COMPLETED, DECLINED, SPAM) або null.

curl -X PATCH "https://api.pager.co.ua/v2/statuses/5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Оплачено","systemStatus":"COMPLETED"}'
Відповідь · 200
{
  "id": "5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e",
  "name": "Оплачено",
  "sortIndex": 0,
  "systemStatus": "COMPLETED"
}

Видалити статус

DELETE/v2/statuses/{id}вага 1

Видаляє статус і відповідає 204. Розмови з цим статусом лишаються без статусу.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор статусу.

curl -X DELETE "https://api.pager.co.ua/v2/statuses/5a7e9c1d-3f2b-4d8a-b6e0-9c1f2a3b4d5e" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 204· Тіла у відповіді немає

Ресурси

Групи клієнтів

Групи, якими менеджери позначають клієнтів у кабінеті, — наприклад, «Опт» чи «VIP». Повертаються в порядку sortIndex.

  • Видалення групи не видаляє розмови: вони лишаються без групи, як і після видалення в кабінеті.

Об'єкт групи

  • idstring

    Ідентифікатор групи.

  • namestring

    Назва, до 100 символів.

  • colorstring

    Колір у форматі #rrggbb — саме так його зберігає кабінет.

  • sortIndexinteger

    Позиція в списку, від 0.

Об'єкт групи
{
  "id": "1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e",
  "name": "Опт",
  "color": "#7c5cff",
  "sortIndex": 0
}

Список груп

GET/v2/client-groupsвага 2

Повертає всі групи клієнтів організації.

curl "https://api.pager.co.ua/v2/client-groups" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e",
      "name": "Опт",
      "color": "#7c5cff",
      "sortIndex": 0
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Створити групу

POST/v2/client-groupsвага 1

Створює групу й повертає її з кодом 201.

Параметри

  • namestringтілообов'язковий

    Назва групи, від 1 до 100 символів.

  • colorstringтілообов'язковий

    Колір у форматі #rrggbb, наприклад #7c5cff. Інші формати (red, #fff, rgb(…)) повертають 400.

  • sortIndexintegerтілонеобов'язковий

    Позиція в списку, від 0. Якщо не передати під час створення, група стане останньою.

curl -X POST "https://api.pager.co.ua/v2/client-groups" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"VIP","color":"#f59e0b"}'
Відповідь · 201
{
  "id": "1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e",
  "name": "VIP",
  "color": "#f59e0b",
  "sortIndex": 0
}

Оновити групу

PATCH/v2/client-groups/{id}вага 1

Змінює лише передані поля. Тіло без жодного поля повертає 400.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор групи.

  • namestringтілонеобов'язковий

    Назва групи, від 1 до 100 символів.

  • colorstringтілонеобов'язковий

    Колір у форматі #rrggbb, наприклад #7c5cff. Інші формати (red, #fff, rgb(…)) повертають 400.

  • sortIndexintegerтілонеобов'язковий

    Позиція в списку, від 0. Якщо не передати під час створення, група стане останньою.

curl -X PATCH "https://api.pager.co.ua/v2/client-groups/1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"color":"#16a34a"}'
Відповідь · 200
{
  "id": "1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e",
  "name": "Опт",
  "color": "#16a34a",
  "sortIndex": 0
}

Видалити групу

DELETE/v2/client-groups/{id}вага 1

Видаляє групу й відповідає 204. Розмови цієї групи лишаються без групи.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор групи.

curl -X DELETE "https://api.pager.co.ua/v2/client-groups/1c3e5a7b-9d2f-4b6c-8e0a-2f4d6b8a0c1e" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 204· Тіла у відповіді немає

Ресурси

Папки шаблонів

Папки, у яких згруповано шаблони відповідей. Повертаються в порядку sortIndex.

  • Видалення папки видаляє й усі її шаблони, як у кабінеті. Відновити їх не вийде.
  • updatedSince повертає лише папки, змінені від указаного моменту, — зручно для синхронізації. Видалених папок у відповіді немає: звіряйте повний список, щоб їх помітити.

Об'єкт папки

  • idstring

    Ідентифікатор папки.

  • namestring

    Назва, до 100 символів.

  • sortIndexinteger

    Позиція в списку, від 0.

  • createdAtISO 8601

    Коли папку створено.

  • updatedAtISO 8601

    Коли папку востаннє змінено.

Об'єкт папки
{
  "id": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
  "name": "Доставка",
  "sortIndex": 0,
  "createdAt": "2026-08-02T10:15:00.000Z",
  "updatedAt": "2026-09-20T08:41:27.000Z"
}

Список папок

GET/v2/saved-reply-foldersвага 2

Повертає папки шаблонів організації.

Параметри

  • updatedSinceISO 8601queryнеобов'язковий

    Повернути лише папки, оновлені від цього моменту. ISO 8601 з часовим поясом, наприклад 2026-09-01T00:00:00Z.

curl "https://api.pager.co.ua/v2/saved-reply-folders?updatedSince=2026-09-01T00:00:00Z" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
      "name": "Доставка",
      "sortIndex": 0,
      "createdAt": "2026-08-02T10:15:00.000Z",
      "updatedAt": "2026-09-20T08:41:27.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Створити папку

POST/v2/saved-reply-foldersвага 1

Створює порожню папку й повертає її з кодом 201.

Параметри

  • namestringтілообов'язковий

    Назва папки, від 1 до 100 символів.

  • sortIndexintegerтілонеобов'язковий

    Позиція в списку, від 0. Якщо не передати під час створення, папка стане останньою.

curl -X POST "https://api.pager.co.ua/v2/saved-reply-folders" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Оплата"}'
Відповідь · 201
{
  "id": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
  "name": "Оплата",
  "sortIndex": 0,
  "createdAt": "2026-08-02T10:15:00.000Z",
  "updatedAt": "2026-09-20T08:41:27.000Z"
}

Оновити папку

PATCH/v2/saved-reply-folders/{id}вага 1

Змінює лише передані поля. Тіло без жодного поля повертає 400.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор папки.

  • namestringтілонеобов'язковий

    Назва папки, від 1 до 100 символів.

  • sortIndexintegerтілонеобов'язковий

    Позиція в списку, від 0. Якщо не передати під час створення, папка стане останньою.

curl -X PATCH "https://api.pager.co.ua/v2/saved-reply-folders/9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Доставка й оплата"}'
Відповідь · 200
{
  "id": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
  "name": "Доставка й оплата",
  "sortIndex": 0,
  "createdAt": "2026-08-02T10:15:00.000Z",
  "updatedAt": "2026-09-20T08:41:27.000Z"
}

Видалити папку

DELETE/v2/saved-reply-folders/{id}вага 1

Видаляє папку разом з усіма її шаблонами й відповідає 204.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор папки.

curl -X DELETE "https://api.pager.co.ua/v2/saved-reply-folders/9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 204· Тіла у відповіді немає

Ресурси

Шаблони відповідей

Готові відповіді, які менеджери вставляють у розмову в один клік. Повертаються згруповані за папками, у порядку sortIndex.

  • folderId має належати вашій організації, інакше API поверне 400 з param: "folderId".
  • Вкладення шаблонів поки доступні лише для читання: додати чи змінити їх через API не можна.
  • Посилання attachments[].url тимчасові, термін дії — у expiresAt. Не зберігайте їх, а запитуйте шаблон повторно.

Об'єкт шаблону

  • idstring

    Ідентифікатор шаблону.

  • folderIdstring

    Папка, у якій лежить шаблон.

  • textstring

    Текст шаблону, до 8000 символів.

  • sortIndexinteger

    Позиція в папці, від 0.

  • attachmentsobject[]

    Вкладення: type (image, video, audio або document), url, name, mime, size у байтах і expiresAt.

  • createdAtISO 8601

    Коли шаблон створено.

  • updatedAtISO 8601

    Коли шаблон востаннє змінено.

Об'єкт шаблону
{
  "id": "3f2e1d0c-9b8a-4f7e-a6d5-c4b3a2f1e0d9",
  "folderId": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
  "text": "Відправляємо Новою поштою по всій Україні, доставка 1–2 дні.",
  "sortIndex": 0,
  "attachments": [
    {
      "type": "image",
      "url": "https://files.pager.co.ua/…/tariffs.png?X-Amz-Expires=3600&…",
      "name": "tariffs.png",
      "mime": "image/png",
      "size": 184320,
      "expiresAt": "2026-09-24T13:00:00.000Z"
    }
  ],
  "createdAt": "2026-08-02T10:16:12.000Z",
  "updatedAt": "2026-09-20T08:41:27.000Z"
}

Список шаблонів

GET/v2/saved-repliesвага 2

Повертає шаблони відповідей організації.

Параметри

  • folderIdstringqueryнеобов'язковий

    Повернути шаблони лише з цієї папки.

  • updatedSinceISO 8601queryнеобов'язковий

    Повернути лише шаблони, оновлені від цього моменту. ISO 8601 з часовим поясом.

curl "https://api.pager.co.ua/v2/saved-replies?folderId=9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "3f2e1d0c-9b8a-4f7e-a6d5-c4b3a2f1e0d9",
      "folderId": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
      "text": "Відправляємо Новою поштою по всій Україні, доставка 1–2 дні.",
      "sortIndex": 0,
      "attachments": [
        {
          "type": "image",
          "url": "https://files.pager.co.ua/…/tariffs.png?X-Amz-Expires=3600&…",
          "name": "tariffs.png",
          "mime": "image/png",
          "size": 184320,
          "expiresAt": "2026-09-24T13:00:00.000Z"
        }
      ],
      "createdAt": "2026-08-02T10:16:12.000Z",
      "updatedAt": "2026-09-20T08:41:27.000Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Створити шаблон

POST/v2/saved-repliesвага 1

Створює шаблон у папці й повертає його з кодом 201.

Параметри

  • folderIdstringтілообов'язковий

    Папка шаблону. Під час оновлення переносить шаблон в іншу папку.

  • textstringтілообов'язковий

    Текст шаблону, від 1 до 8000 символів.

  • sortIndexintegerтілонеобов'язковий

    Позиція в папці, від 0. Якщо не передати під час створення, шаблон стане останнім у папці.

curl -X POST "https://api.pager.co.ua/v2/saved-replies" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"folderId":"9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b","text":"Оплата при отриманні або на картку ФОП."}'
Відповідь · 201
{
  "id": "3f2e1d0c-9b8a-4f7e-a6d5-c4b3a2f1e0d9",
  "folderId": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
  "text": "Оплата при отриманні або на картку ФОП.",
  "sortIndex": 0,
  "attachments": [],
  "createdAt": "2026-08-02T10:16:12.000Z",
  "updatedAt": "2026-09-20T08:41:27.000Z"
}

Оновити шаблон

PATCH/v2/saved-replies/{id}вага 1

Змінює лише передані поля. Щоб перенести шаблон в іншу папку, передайте новий folderId.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор шаблону.

  • folderIdstringтілонеобов'язковий

    Папка шаблону. Під час оновлення переносить шаблон в іншу папку.

  • textstringтілонеобов'язковий

    Текст шаблону, від 1 до 8000 символів.

  • sortIndexintegerтілонеобов'язковий

    Позиція в папці, від 0. Якщо не передати під час створення, шаблон стане останнім у папці.

curl -X PATCH "https://api.pager.co.ua/v2/saved-replies/3f2e1d0c-9b8a-4f7e-a6d5-c4b3a2f1e0d9" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"Оплата при отриманні, на картку ФОП або через Apple Pay."}'
Відповідь · 200
{
  "id": "3f2e1d0c-9b8a-4f7e-a6d5-c4b3a2f1e0d9",
  "folderId": "9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b",
  "text": "Оплата при отриманні, на картку ФОП або через Apple Pay.",
  "sortIndex": 0,
  "attachments": [
    {
      "type": "image",
      "url": "https://files.pager.co.ua/…/tariffs.png?X-Amz-Expires=3600&…",
      "name": "tariffs.png",
      "mime": "image/png",
      "size": 184320,
      "expiresAt": "2026-09-24T13:00:00.000Z"
    }
  ],
  "createdAt": "2026-08-02T10:16:12.000Z",
  "updatedAt": "2026-09-20T08:41:27.000Z"
}

Видалити шаблон

DELETE/v2/saved-replies/{id}вага 1

Видаляє шаблон і відповідає 204.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор шаблону.

curl -X DELETE "https://api.pager.co.ua/v2/saved-replies/3f2e1d0c-9b8a-4f7e-a6d5-c4b3a2f1e0d9" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 204· Тіла у відповіді немає

Ресурси

Підписки на вебхуки

Підписки, на які Pager надсилає події, і журнал їхніх доставок. Це той самий список, що й у Налаштування → API → Вебхуки в кабінеті. Як приймати й перевіряти події — див. Вебхуки.

  • Секрет підпису повертається лише у відповідях на створення й перевипуск секрету. В інших відповідях його немає.
  • Підписка іншої організації дає 404 webhook_not_found, як і неіснуюча.

Об'єкт підписки

  • idstring

    Ідентифікатор підписки.

  • urlstring

    Адреса, на яку надсилаються події.

  • eventsenum[]

    Події, на які оформлено підписку: message.received, message.sent, comment.received.

  • descriptionstring | null

    Опис для себе або null.

  • enabledboolean

    Чи надсилаються події на цю підписку.

  • consecutiveFailuresinteger

    Невдалих спроб доставки поспіль. Обнуляється першою успішною доставкою.

  • failingSinceISO 8601 | null

    Початок поточної серії невдач або null. Через 7 діб серії підписка вимикається автоматично — див. Доставка й повтори.

  • disabledAtISO 8601 | null

    Коли підписку вимкнено, або null, якщо вона увімкнена.

  • disabledReasonenum | null

    manual — вимкнено вручну в кабінеті чи через API, delivery_failures — автоматично після 7 діб невдач, null — підписка увімкнена.

  • createdAtISO 8601

    Коли підписку створено.

  • updatedAtISO 8601

    Коли підписку востаннє змінено.

Об'єкт підписки
{
  "id": "8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b",
  "url": "https://crm.example.com/pager/webhook",
  "events": [
    "message.received",
    "message.sent"
  ],
  "description": "Синхронізація з CRM",
  "enabled": true,
  "consecutiveFailures": 0,
  "failingSince": null,
  "disabledAt": null,
  "disabledReason": null,
  "createdAt": "2026-09-24T09:12:05.301Z",
  "updatedAt": "2026-09-24T09:12:05.301Z"
}

Список підписок

GET/v2/webhooksвага 2

Повертає всі підписки організації цілком, без пагінації.

curl "https://api.pager.co.ua/v2/webhooks" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b",
      "url": "https://crm.example.com/pager/webhook",
      "events": [
        "message.received",
        "message.sent"
      ],
      "description": "Синхронізація з CRM",
      "enabled": true,
      "consecutiveFailures": 0,
      "failingSince": null,
      "disabledAt": null,
      "disabledReason": null,
      "createdAt": "2026-09-24T09:12:05.301Z",
      "updatedAt": "2026-09-24T09:12:05.301Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}

Створити підписку

POST/v2/webhooksвага 1

Створює підписку й повертає її з кодом 201 разом із секретом підпису в полі secret. Збережіть секрет одразу: більше API його не поверне.

Параметри

  • Idempotency-Keystringзаголовокнеобов'язковий

    Ключ, з яким повтор запиту не створить другу підписку — див. Ідемпотентність.

  • urlstringтілообов'язковий

    Публічний https:// URL, до 2000 символів — див. Обмеження.

  • eventsenum[]тілообов'язковий

    Непорожній масив подій: message.received, message.sent, comment.received. Повтори в масиві прибираються.

  • descriptionstring | nullтілонеобов'язковий

    Опис до 500 символів або null.

  • enabledbooleanтілонеобов'язковий

    false — підписка існує, але події не надсилаються. За замовчуванням true.

  • URL перевіряється під час створення. Не-https, приватна адреса чи домен, який не резолвиться, повертають 400 invalid_webhook_url з param: "url"; причина — у message.
  • Передавайте Idempotency-Key: якщо відповідь загубилася, повтор із тим самим ключем поверне ту саму підписку з тим самим секретом, а не створить другу.
  • Після створення перевірте ендпоінт тестовою подією.
curl -X POST "https://api.pager.co.ua/v2/webhooks" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Idempotency-Key: a3f1c9e2-5b7d-4e8a-9c0b-1d2e3f4a5b6c" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://crm.example.com/pager/webhook","events":["message.received","message.sent"],"description":"Синхронізація з CRM"}'
Відповідь · 201
{
  "id": "8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b",
  "url": "https://crm.example.com/pager/webhook",
  "events": [
    "message.received",
    "message.sent"
  ],
  "description": "Синхронізація з CRM",
  "enabled": true,
  "consecutiveFailures": 0,
  "failingSince": null,
  "disabledAt": null,
  "disabledReason": null,
  "createdAt": "2026-09-24T09:12:05.301Z",
  "updatedAt": "2026-09-24T09:12:05.301Z",
  "secret": "whsec_2Xk9vQ7mB4nR1tY8wZ3cL6pF0hJ5sD2gA9eU4iO7qWx"
}

Отримати підписку

GET/v2/webhooks/{id}вага 1

Повертає підписку й статистику доставок за останні 30 днів у полі stats: delivered — доставлено, pending — у черзі або чекають на повтор, dead — не доставлено після всіх спроб.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор підписки.

curl "https://api.pager.co.ua/v2/webhooks/8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "id": "8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b",
  "url": "https://crm.example.com/pager/webhook",
  "events": [
    "message.received",
    "message.sent"
  ],
  "description": "Синхронізація з CRM",
  "enabled": true,
  "consecutiveFailures": 0,
  "failingSince": null,
  "disabledAt": null,
  "disabledReason": null,
  "createdAt": "2026-09-24T09:12:05.301Z",
  "updatedAt": "2026-09-24T09:12:05.301Z",
  "stats": {
    "periodDays": 30,
    "delivered": 1284,
    "pending": 1,
    "dead": 3
  }
}

Оновити підписку

PATCH/v2/webhooks/{id}вага 1

Змінює лише передані поля. Тіло без жодного поля повертає 400.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор підписки.

  • urlstringтілонеобов'язковий

    Публічний https:// URL, до 2000 символів — див. Обмеження.

  • eventsenum[]тілонеобов'язковий

    Непорожній масив подій: message.received, message.sent, comment.received. Повтори в масиві прибираються.

  • descriptionstring | nullтілонеобов'язковий

    Опис до 500 символів або null.

  • enabledbooleanтілонеобов'язковий

    false — вимкнути підписку (disabledReason: "manual"). true — увімкнути з чистого аркуша: consecutiveFailures, failingSince, disabledAt і disabledReason обнуляються.

  • Новий url перевіряється так само, як під час створення. Секрет підпису при зміні URL лишається тим самим.
  • Увімкнення після автоматичного вимкнення — це саме enabled: true.
curl -X PATCH "https://api.pager.co.ua/v2/webhooks/8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b" \
  -H "Authorization: Bearer $PAGER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"events":["message.received"]}'
Відповідь · 200
{
  "id": "8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b",
  "url": "https://crm.example.com/pager/webhook",
  "events": [
    "message.received"
  ],
  "description": "Синхронізація з CRM",
  "enabled": true,
  "consecutiveFailures": 0,
  "failingSince": null,
  "disabledAt": null,
  "disabledReason": null,
  "createdAt": "2026-09-24T09:12:05.301Z",
  "updatedAt": "2026-09-24T12:05:17.640Z"
}

Видалити підписку

DELETE/v2/webhooks/{id}вага 1

Видаляє підписку разом із журналом доставок і відповідає 204. Доставки, що стояли в черзі, не надсилаються.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор підписки.

curl -X DELETE "https://api.pager.co.ua/v2/webhooks/8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 204· Тіла у відповіді немає

Перевипустити секрет

POST/v2/webhooks/{id}/rotate-secretвага 1

Створює новий секрет підпису й повертає підписку з ним у полі secret.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор підписки.

  • Старий секрет перестає діяти одразу, перехідного періоду немає. Доставки, що вже стоять у черзі, будуть підписані новим секретом.
curl -X POST "https://api.pager.co.ua/v2/webhooks/8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b/rotate-secret" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "id": "8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b",
  "url": "https://crm.example.com/pager/webhook",
  "events": [
    "message.received",
    "message.sent"
  ],
  "description": "Синхронізація з CRM",
  "enabled": true,
  "consecutiveFailures": 0,
  "failingSince": null,
  "disabledAt": null,
  "disabledReason": null,
  "createdAt": "2026-09-24T09:12:05.301Z",
  "updatedAt": "2026-09-24T12:10:48.093Z",
  "secret": "whsec_Hn4tE8rW1qZ6xC3vB9mK2pL7sD5fG0jA4yU8iO1eRtN"
}

Надіслати тестову подію

POST/v2/webhooks/{id}/testвага 1

Синхронно надсилає на URL підписки подію webhook.test і повертає запис доставки з результатом: статус delivered чи dead, код і тіло відповіді вашого сервера, тривалість.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор підписки.

  • Тестова подія не повторюється при невдачі й не впливає на серію невдач підписки. У журнал вона потрапляє.
  • Працює й для вимкненої підписки: зручно перевірити виправлений ендпоінт, перш ніж увімкнути її.
  • У data.message тестової події — рядок, а не об'єкт повідомлення.
curl -X POST "https://api.pager.co.ua/v2/webhooks/8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b/test" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "id": "dlv_0f1e2d3c-4b5a-4968-8776-5a4b3c2d1e0f",
  "eventId": "evt_a0b1c2d3e4f5460718293a4b5c6d7e8f",
  "eventType": "webhook.test",
  "status": "delivered",
  "attempt": 1,
  "nextAttemptAt": null,
  "responseStatus": 200,
  "responseBody": "ok",
  "durationMs": 184,
  "createdAt": "2026-09-24T09:13:40.210Z",
  "deliveredAt": "2026-09-24T09:13:40.402Z"
}

Журнал доставок

GET/v2/webhooks/{id}/deliveriesвага 2

Доставки підписки сторінками, від нових до старих. Один запис — одна подія: attempt показує, скільки спроб уже зроблено, а responseStatus, responseBody і durationMs — результат останньої.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор підписки.

  • statusenumqueryнеобов'язковий

    pending, failed, delivered або dead.

  • eventTypestringqueryнеобов'язковий

    Лише доставки цього типу події, наприклад webhook.test.

  • limitintegerqueryнеобов'язковий

    Розмір сторінки, від 1 до 100. За замовчуванням 50.

  • cursorstringqueryнеобов'язковий

    nextCursor із попередньої сторінки.

  • status: pending — чекає на відправку, failed — остання спроба невдала, наступна о nextAttemptAt, delivered — доставлено о deliveredAt, dead — усі спроби вичерпано.
  • responseStatus дорівнює null, якщо відповіді не було (таймаут, помилка з'єднання); причина тоді в responseBody.
  • Тіло самої події журнал не повертає. Записи зберігаються 30 діб.
curl "https://api.pager.co.ua/v2/webhooks/8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b/deliveries?limit=2" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 200
{
  "data": [
    {
      "id": "dlv_4b7e1f0a-9c2d-4e8b-a6f3-5d1c0b9e8a72",
      "eventId": "evt_6c1f0e9d8b7a45c3a2e1f0d9c8b7a6e5",
      "eventType": "message.received",
      "status": "delivered",
      "attempt": 1,
      "nextAttemptAt": null,
      "responseStatus": 200,
      "responseBody": "ok",
      "durationMs": 184,
      "createdAt": "2026-09-24T08:31:40.582Z",
      "deliveredAt": "2026-09-24T08:31:40.771Z"
    },
    {
      "id": "dlv_9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
      "eventId": "evt_1d2c3b4a5f6e47d8a9b0c1d2e3f4a5b6",
      "eventType": "message.received",
      "status": "failed",
      "attempt": 3,
      "nextAttemptAt": "2026-09-24T08:36:12.004Z",
      "responseStatus": 503,
      "responseBody": "Service Unavailable",
      "durationMs": 91,
      "createdAt": "2026-09-24T08:29:03.117Z",
      "deliveredAt": null
    }
  ],
  "hasMore": true,
  "nextCursor": "WyIyMDI2LTA5LTI0VDA4OjMxOjQwLjU4MloiLCI0YjdlMWYwYS05YzJkLTRlOGItYTZmMy01ZDFjMGI5ZThhNzIiXQ"
}

Повторити доставку

POST/v2/webhooks/{id}/deliveries/{deliveryId}/retryвага 1

Ставить доставку в чергу на негайну відправку й відповідає 202 із записом у статусі pending. Результат з'явиться в журналі за кілька секунд.

Параметри

  • idstringшляхобов'язковий

    Ідентифікатор підписки.

  • deliveryIdstringшляхобов'язковий

    id доставки з журналу, dlv_….

  • Працює для будь-якого статусу, зокрема dead. Для dead це одна додаткова спроба: якщо вона невдала, доставка знову стає dead.
  • Вимкнену підписку спершу увімкніть: повтор для неї ніколи б не надіслався, тому API повертає 409 webhook_disabled.
  • Подія йде з тим самим id, тож якщо ваш сервер її вже обробив, він відкине її як дублікат.
curl -X POST "https://api.pager.co.ua/v2/webhooks/8f3a2c1e-7b6d-4e5f-9a0b-1c2d3e4f5a6b/deliveries/dlv_9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d/retry" \
  -H "Authorization: Bearer $PAGER_API_KEY"
Відповідь · 202
{
  "id": "dlv_9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "eventId": "evt_1d2c3b4a5f6e47d8a9b0c1d2e3f4a5b6",
  "eventType": "message.received",
  "status": "pending",
  "attempt": 3,
  "nextAttemptAt": "2026-09-24T08:33:20.518Z",
  "responseStatus": 503,
  "responseBody": "Service Unavailable",
  "durationMs": 91,
  "createdAt": "2026-09-24T08:29:03.117Z",
  "deliveredAt": null
}
Не знайшли відповіді?Напишіть нам
Документація API — Pager