Масовий підпис (bulk signing)¶
Масовий підпис — це задача, яка дозволяє надіслати один документ на підпис багатьом співробітникам-отримувачам одночасно. Кожен отримувач підписує документ у Вчасно.ЕДО незалежно від інших. Це зручно для ситуацій, коли один і той самий документ (наприклад, наказ, ознайомлення з політикою чи інструкцією з охорони праці) має підписати велика кількість співробітників.
На відміну від задачі «Універсальний документ», де ви формуєте довільний набір документів і додаєте підписантів до кожного, у масовому підписі документ один, а список підписантів — це отримувачі задачі (initiator_ids).
Особливості публічного API¶
- Усі запити авторизуються заголовком
X-Vchasno-Public-Token(див. Початок роботи). Компанія визначається з токена — передаватиcompany_idне потрібно. - Шаблон задачі автоматично береться зі стандартного шаблону масового підпису компанії — передавати ідентифікатор шаблону не потрібно.
- Список підписантів задається лише при створенні задачі через
initiator_ids. Окремих ендпоінтів для додавання/видалення підписантів немає. - Задача містить рівно один документ. Завантаження документа одночасно і зберігає файл, і будує маршрут підписання — окремого кроку налаштування маршруту немає.
- Надсилання відбувається асинхронно: запит одразу повертає задачу зі статусом
sending(HTTP202 Accepted), а фактична відправка документів до ЕДО виконується у фоні. Результат слід відстежувати опитуванням (GET .../{task_id},.../signers,.../signers/counts). - Успішні відповіді (окрім скачування файлів та нагадування одному підписанту) загорнуті в об'єкт
{"detail": ...}. Списки додатково містять поля пагінації (total,page,size,items).
Перелік ендпоінтів¶
Усі шляхи мають префікс /api/public/v1/bulk-signing.
| Метод | Шлях | Призначення | Код |
|---|---|---|---|
POST |
/ |
Створити задачу | 201 |
POST |
/{task_id}/document |
Завантажити документ і побудувати маршрут | 201 |
POST |
/{task_id}/send |
Надіслати на підпис (асинхронно) | 202 |
GET |
/ |
Список задач (з фільтрами) | 200 |
GET |
/{task_id} |
Отримати задачу за ID | 200 |
POST |
/{task_id}/complete |
Завершити задачу вручну | 200 |
POST |
/{task_id}/cancel |
Скасувати задачу | 200 |
GET |
/{task_id}/signers |
Список підписантів-отримувачів | 200 |
GET |
/{task_id}/signers/counts |
Лічильники підписантів | 200 |
POST |
/{task_id}/signer/{employee_id}/remind |
Нагадати одному підписанту | 200 |
POST |
/{task_id}/signers/remind-all |
Нагадати всім, хто ще не підписав | 200 |
GET |
/{task_id}/document/{document_id}/download |
Скачати документ за ID документа | 200 |
GET |
/{task_id}/document/download?initiator_id=… |
Скачати документ за отримувачем | 200 |
Статуси та їх переходи (Status flows)¶
Статуси задачі (Task statuses)¶
| Статус | Опис |
|---|---|
new |
Задача створена; можна завантажити документ |
sending |
Виконується асинхронне надсилання документів; задача заблокована |
in_progress |
Документ надіслано на підпис отримувачам |
completed |
Задачу завершено (усі підписали або завершено вручну) |
canceled |
Задачу скасовано |
Переходи статусів: new → sending → in_progress → completed або canceled
Статуси маршруту документа (Document route statuses)¶
| Статус | Опис |
|---|---|
new |
Маршрут підписання створено, але документ ще не надіслано |
in_progress |
Документ надіслано на підпис, очікується підписання отримувачами |
completed |
Усі отримувачі підписали документ |
canceled |
Процес підписання скасовано |
error |
Не вдалося надіслати документ до ЕДО (деталі в document_info.details) |
Переходи статусів: new → in_progress → completed / canceled, або new → error
Статуси підписантів-отримувачів (Signer action statuses)¶
Повертаються у полі status кожного підписанта (GET .../signers).
| Статус | Опис |
|---|---|
new |
Отримувача додано; документ ще не надіслано або підпис ще очікується |
completed |
Отримувач підписав документ |
declined |
Отримувач відхилив підписання (причина — у полі decline_reason) |
delete_request |
Отримувач подав у ЕДО запит на видалення документа |
Переходи статусів: new → completed / declined / delete_request
Довідник полів (Field reference)¶
Створення задачі (POST /bulk-signing)¶
| Поле | Тип | Обов'язкове | Опис |
|---|---|---|---|
name |
string | так | Назва задачі |
initiator_ids |
array<UUID> |
так | ID співробітників-отримувачів, які підписуватимуть документ (мінімум 1; дублікати ігноруються зі збереженням порядку) |
description |
string | ні | Опис задачі (до 1000 символів) |
end_date |
date | ні | Кінцева дата задачі (YYYY-MM-DD) |
Завантаження документа (POST /bulk-signing/{task_id}/document)¶
multipart/form-data, поле file — файл документа. Тіла у форматі JSON немає.
Скасування задачі (POST /bulk-signing/{task_id}/cancel)¶
| Поле | Тип | Обов'язкове | Опис |
|---|---|---|---|
cancellation_reason |
string | так | Причина скасування (до 500 символів) |
Об'єкт задачі у відповіді (PublicApiBulkSigningRetrieveSerializer)¶
| Поле | Тип | Опис |
|---|---|---|
id |
UUID | Ідентифікатор задачі |
name |
string / null | Назва задачі |
status |
string | Статус задачі (див. таблицю вище) |
end_date |
date / null | Кінцева дата задачі |
initiator_ids |
array<UUID> |
ID отримувачів-підписантів |
Об'єкт підписанта у відповіді (BulkSigningSignerSerializer)¶
| Поле | Тип | Опис |
|---|---|---|
action_id |
UUID | ID дії підписання |
route_id |
UUID | ID маршруту підписання (використовується для завантаження документа) |
employee_id |
UUID / null | ID співробітника-отримувача |
full_name |
string / null | ПІБ |
position |
string / null | Посада |
department_id |
UUID / null | ID підрозділу |
department_name |
string / null | Назва підрозділу |
status |
string | Статус підписанта (див. таблицю статусів) |
task_route_status |
string | Статус маршруту: new — ще відправляється до ЕДО, in_progress — доставлено, очікує підпису |
can_remind |
bool | Чи можна надіслати нагадування цьому підписанту |
decline_reason |
string / null | Причина відхилення (для статусу declined) |
ipn |
string / null | ІПН |
phone |
string / null | Телефон |
email |
string / null | |
sign_type |
string / null | Тип підпису співробітника |
edo_document_id |
string / null | ID документа у Вчасно.ЕДО |
Лічильники підписантів (SignerCountsSerializer)¶
| Поле | Тип | Опис |
|---|---|---|
all |
int | Загальна кількість отримувачів |
signed |
int | Скільки підписали (completed) |
awaiting |
int | Скільки очікують підпису (new) |
rejected |
int | Скільки відхилили (declined) |
delete_requested |
int | Скільки подали запит на видалення (delete_request); входить до all |
Створення задачі «Масовий підпис»¶
Ендпоінт POST /api/public/v1/bulk-signing. Передайте назву задачі (name) та список ID отримувачів (initiator_ids). Компанія та шаблон визначаються автоматично з токена.
Приклад запиту:
curl -X POST 'https://kadry.vchasno.ua/api/public/v1/bulk-signing' \
-H 'X-Vchasno-Public-Token: <ваш_токен>' \
-H 'Content-Type: application/json' \
-d '{
"name": "Ознайомлення з наказом №42",
"initiator_ids": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6",
"b2c3d4e5-6f70-4a1b-8c2d-3e4f5a6b7c8d"
],
"description": "Ознайомлення всіх працівників відділу з новим наказом",
"end_date": "2026-08-15"
}'
Приклад відповіді (201):
{
"detail": {
"id": "9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b",
"name": "Ознайомлення з наказом №42",
"status": "new",
"end_date": "2026-08-15",
"initiator_ids": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6",
"b2c3d4e5-6f70-4a1b-8c2d-3e4f5a6b7c8d"
]
}
}
Завантаження документа¶
Ендпоінт POST /api/public/v1/bulk-signing/{task_id}/document (multipart/form-data, поле file).
Цей крок робить одразу дві речі: зберігає файл і будує маршрут підписання з отримувачів (initiator_ids). Окремого ендпоінта для налаштування маршруту немає — підписантів задавати не потрібно, вони беруться зі списку отримувачів задачі.
Особливості:
- Задача містить рівно один документ. Повторне завантаження замінює попередній документ і його маршрут.
- Замінити (або завантажити) документ можна лише поки задача ще не почала надсилатися: статус має бути
newчиin_progress, і жоден крок підписання не має вийти за межі статусуnew. Після початку надсилання спроба завантаження поверне помилку (Document cannot be replaced after sending has started), щоб не знищити вже наявні підписи.
У відповіді повертається id та name збереженого документа.
curl -X POST 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b/document' \
-H 'X-Vchasno-Public-Token: <ваш_токен>' \
-F '[email protected]'
{
"detail": {
"id": "d1e2f3a4-5b6c-4d7e-8f90-1a2b3c4d5e6f",
"name": "order-42.pdf"
}
}
Надсилання на підпис¶
Ендпоінт POST /api/public/v1/bulk-signing/{task_id}/send. Тіло запиту не потрібне.
Надсилання асинхронне: запит одразу повертає задачу зі статусом sending та кодом 202 Accepted, а фактична відправка документів до ЕДО виконується у фоні. Поки задача в статусі sending, вона заблокована (повторне надсилання чи завантаження недоступні). Результат слід відстежувати через GET .../{task_id}, .../signers та .../signers/counts: після успішної відправки задача переходить у in_progress, а маршрут — у in_progress; у разі помилки маршрут переходить у error.
curl -X POST 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b/send' \
-H 'X-Vchasno-Public-Token: <ваш_токен>'
{
"detail": {
"id": "9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b",
"name": "Ознайомлення з наказом №42",
"status": "sending",
"end_date": "2026-08-15",
"initiator_ids": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6",
"b2c3d4e5-6f70-4a1b-8c2d-3e4f5a6b7c8d"
]
}
}
Перегляд задач¶
Список задач¶
Ендпоінт GET /api/public/v1/bulk-signing. Повертає посторінковий список задач масового підпису компанії. Тип задачі фіксується сервером, тому у вибірку потрапляють лише задачі масового підпису.
Корисні параметри фільтрації (query): status__in, initiator__in, search, external_id__in, date_created__gte / date_created__lte, date_updated__gte / date_updated__lte, а також пагінація (page, size). Наприклад, лише незавершені задачі:
curl 'https://kadry.vchasno.ua/api/public/v1/bulk-signing?status__in=new&status__in=in_progress&page=1&size=20' \
-H 'X-Vchasno-Public-Token: <ваш_токен>'
Отримання деталей задачі¶
Ендпоінт GET /api/public/v1/bulk-signing/{task_id}.
curl 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b' \
-H 'X-Vchasno-Public-Token: <ваш_токен>'
Перегляд підписантів¶
Список підписантів-отримувачів¶
Ендпоінт GET /api/public/v1/bulk-signing/{task_id}/signers — посторінковий список отримувачів та їх статусів підписання.
Параметри фільтрації (query): status__in (за статусом підписанта), position__in, group__in, social_status_type__in, search, плюс пагінація. Наприклад, лише ті, хто ще не підписав:
curl 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b/signers?status__in=new' \
-H 'X-Vchasno-Public-Token: <ваш_токен>'
Лічильники підписантів¶
Ендпоінт GET /api/public/v1/bulk-signing/{task_id}/signers/counts — зведені лічильники (скільки підписали, очікують, відхилили тощо). Приймає ті самі фільтри, що й список підписантів.
curl 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b/signers/counts' \
-H 'X-Vchasno-Public-Token: <ваш_токен>'
{
"detail": {
"all": 120,
"signed": 87,
"awaiting": 30,
"rejected": 2,
"delete_requested": 1
}
}
Нагадування про підписання¶
Нагадати одному підписанту¶
Ендпоінт POST /api/public/v1/bulk-signing/{task_id}/signer/{employee_id}/remind. Надсилає нагадування конкретному отримувачу, який ще не підписав. Діє обмеження частоти (як і для кнопки нагадування у вебінтерфейсі). Відповідь повертається без обгортки detail:
curl -X POST 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b/signer/3fa85f64-5717-4562-b3fc-2c963f66afa6/remind' \
-H 'X-Vchasno-Public-Token: <ваш_токен>'
{ "status": true }
Нагадати всім, хто ще не підписав¶
Ендпоінт POST /api/public/v1/bulk-signing/{task_id}/signers/remind-all. Ставить нагадування в чергу для всіх отримувачів, які ще не підписали. Обробка асинхронна — відповідь лише підтверджує, що нагадування поставлені в чергу:
curl -X POST 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b/signers/remind-all' \
-H 'X-Vchasno-Public-Token: <ваш_токен>'
{ "detail": { "enqueued": true } }
Завантаження документів¶
Відповіддю цих ендпоінтів є сам файл (attachment), а не JSON.
За ID документа¶
Ендпоінт GET /api/public/v1/bulk-signing/{task_id}/document/{document_id}/download. Значення document_id — це route_id конкретного підписанта зі списку .../signers.
curl 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b/document/7c8d9e0f-1a2b-4c3d-8e4f-5a6b7c8d9e0f/download' \
-H 'X-Vchasno-Public-Token: <ваш_токен>' \
-o signed.pdf
За отримувачем¶
Ендпоінт GET /api/public/v1/bulk-signing/{task_id}/document/download?initiator_id=…. Зручний, коли ви знаєте лише ID отримувача, а не ID документа. Співробітник має бути отримувачем саме цієї задачі; якщо задачу ще не надіслано, повертається 404.
curl 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b/document/download?initiator_id=3fa85f64-5717-4562-b3fc-2c963f66afa6' \
-H 'X-Vchasno-Public-Token: <ваш_токен>' \
-o signed.pdf
Завершення та скасування задачі¶
Завершити задачу¶
Ендпоінт POST /api/public/v1/bulk-signing/{task_id}/complete. Завершує задачу вручну. Спроба завершити вже завершену чи скасовану задачу поверне помилку.
curl -X POST 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b/complete' \
-H 'X-Vchasno-Public-Token: <ваш_токен>'
Скасувати задачу¶
Ендпоінт POST /api/public/v1/bulk-signing/{task_id}/cancel. Потребує причини скасування (cancellation_reason, до 500 символів).
curl -X POST 'https://kadry.vchasno.ua/api/public/v1/bulk-signing/9a1b2c3d-4e5f-4061-8a2b-3c4d5e6f7a8b/cancel' \
-H 'X-Vchasno-Public-Token: <ваш_токен>' \
-H 'Content-Type: application/json' \
-d '{ "cancellation_reason": "Наказ відкликано" }'
Очікувана послідовність дій¶
-
Створити задачу «Масовий підпис», передавши назву та список отримувачів (
initiator_ids). -
Завантажити документ для підпису — цей крок одночасно будує маршрут підписання з отримувачів.
-
Надіслати документ на підпис отримувачам (асинхронно, задача переходить у
sending). -
Відстежувати статус задачі та лічильники підписантів, за потреби надсилати нагадування.
-
Завантажити підписані документи та, за потреби, завершити або скасувати задачу.
Приклади сценаріїв використання¶
- Ознайомлення з наказом. Створіть задачу з отримувачами-працівниками, завантажте PDF наказу, надішліть на підпис. Опитуйте
.../signers/counts, покиsignedне дорівнюватимеall; тим, хто зволікає, надсилайте.../remind-all. - Періодичне ознайомлення з політиками (інтеграція з ERP). З боку ERP створюйте задачу масового підпису з актуальним списком співробітників за розкладом, зберігайте
task_id, а статуси синхронізуйте черезGET /bulk-signing/{task_id}і.../signers. Підписані файли для архіву забирайте через.../document/download?initiator_id=…. - Контроль відхилень. Відфільтруйте підписантів за
status__in=declined, щоб отримати перелік тих, хто відхилив, разом ізdecline_reason, і обробіть їх окремо. Запити на видалення документа видно якstatus=delete_requestта у лічильникуdelete_requested.