Головна API документація

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

Повна документація з використання API
Serhii
Від Serhii
15 статті

Як отримати access token

Access token потрібен для авторизації наступних API-запитів у LMS Smart Way. Після отримання токена ви передаєте його в заголовку Authorization з типом Bearer і використовуєте для звернення до доступних endpoint’ів відповідно до scope, які вкладені в токен. Ця стаття показує, як отримати токен, що саме повертає API у відповіді та на що звернути увагу перед інтеграцією. Якщо ви лише починаєте налаштування інтеграції, спочатку переконайтеся, що у вас є дійсний company_api_key. Передумови - У вас має бути дійсний company_api_key вашої компанії. - Запит на отримання токена потрібно виконувати на endpoint /api/v1/auth/token. - API key передається в заголовку X-API-Key. - Отриманий access token використовується лише для наступних викликів API і не замінює собою API key. Запит curl -X POST 'https://smartway.pro/api/v1/auth/token' \ -H 'X-API-Key: <company_api_key>' Успішна відповідь { "access_token": "<short_lived_jwt>", "token_type": "Bearer", "expires_in": 900, "scope": "academy.read academy.write employees.read employees.write tests.read tests.write files.read" } Зафіксовані правила відповіді - access_token — короткоживучий JWT для наступних викликів public API - token_type — завжди Bearer - expires_in — TTL у секундах - scope — space-delimited список scope-ів, вкладених у токен Що всередині access token - JWT містить claim companyId для tenant isolation. - JWT також містить claim hrEmail — email HRADMIN, який створив або ротував поточний активний API key компанії. - Якщо API key згенерує або ротуватиме інший HRADMIN, то нові токени вже міститимуть інший hrEmail, і саме він буде використовуватися для наступних employee write-операцій. Як використовувати access token у наступних запитах Після успішного отримання токена передавайте його в заголовку Authorization у форматі Bearer <access_token>. Саме цей токен використовується для авторизації подальших запитів до public API. Перед виконанням запиту перевіряйте, що токен ще не втратив чинність. Якщо строк дії завершився, отримайте новий access token повторним викликом endpoint’а авторизації.

Востаннє оновлено Mar 28, 2026

Правила поточної реалізації API LMS

Public API використовує схему: company API key -> short-lived Bearer token Правила поточної реалізації: - API key належить компанії, а не окремому користувачу. - Для v1 дозволено один активний API key на компанію. - Керує ключем тільки користувач із роллю HRADMIN у cab > Settings > Company. - Повний секрет показується лише один раз — одразу після генерації або ротації. - Після ротації попередній ключ стає невалідним одразу. - Інтегратор отримує access token через POST /v1/auth/token і далі використовує Authorization: Bearer <token>. - Refresh token для інтегратора у v1 не використовується: після завершення TTL access token інтегратор повторно викликає POST /v1/auth/token. Base URL і загальні правила виклику 1. Base URL Поточний base URL: - https://smartway.pro/api 2. Загальні правила - Формат бізнес-відповідей: application/json - Формат помилок: application/problem+json - Версіонування: major-версія в URI (/v1/...) - Для кореляції запитів рекомендовано передавати traceparent

Востаннє оновлено Mar 28, 2026

Як отримати список співробітників через API?

GET /v1/employees повертає сторінку співробітників. Якщо query-параметри не передати, API застосовує page = 0 і size = 50. Endpoint | Параметр | Значення | | -------------- | ---------------------- | | Method | GET | | Path | /api/v1/employees | | Base URL | https://smartway.pro | | Auth | Bearer token | | Required scope | employees.read | Призначення Endpoint використовується для отримання сторінкового списку співробітників у межах компанії з Bearer token. Endpoint підтримує пагінацію, пошук за ПІБ і фільтри за департаментом та посадою. Передумови - Клієнт має передати валідний Bearer token. - Token має містити company context. - Token має містити scope employees.read. - idCompany не передається зовнішнім клієнтом. BFF бере companyId тільки з Bearer token. - Текстові query-параметри підтримують UTF-8 і мають передаватися як стандартний URL-encoded query string. Запит Query parameters | Параметр | Тип | Обов’язковий | Опис | | ------------ | ------- | ---------------- | ----------------------------------------------------------------------- | | page | int32 | ні | Номер сторінки. Значення за замовчуванням: 0. | | size | int32 | ні | Розмір сторінки. Значення за замовчуванням: 50. | | q | string | ні | Пошук за ПІБ з частковим співпадінням. Пошук за email не підтримується. | | department | string | ні | Фільтр за департаментом. | | jobTitle | string | ні | Фільтр за посадою. | curl приклад Виклик без параметрів curl -X GET 'https://smartway.pro/api/v1/employees' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Виклик з кількома параметрами curl -G 'https://smartway.pro/api/v1/employees' \ --data-urlencode 'page=0' \ --data-urlencode 'size=20' \ --data-urlencode 'q=Іван' \ --data-urlencode 'department=Управління' \ --data-urlencode 'jobTitle=Менеджер' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Відповідь Успішна відповідь: 200 OK. Повертає EmployeeListResponse. { "data": [ { "employeeId": 4329, "candidateId": 10602, "email": "employee@example.com", "fullName": "Ім'я Прізвище", "name": "Ім'я", "surname": "Прізвище", "gender": "Female", "department": "КЛ", "departments": [ "КЛ" ], "jobTitle": "Менеджер", "jobTitles": [ "Менеджер" ], "phone": "+380000000000", "active": true } ], "meta": { "page": 0, "size": 50, "totalElements": 385, "totalPages": 8, "hasNext": true } } Поля відповіді EmployeeListResponse | Поле | Тип | Опис | | -------- | ---------- | --------------------- | | data | Employee[] | Масив співробітників. | | meta | object | Метадані пагінації. | meta | Поле | Тип | Опис | | ------------- | ------- | ------------------------------------ | | page | integer | Поточна сторінка. Нумерація 0-based. | | size | integer | Розмір сторінки. | | totalElements | integer | Загальна кількість записів. | | totalPages | integer | Загальна кількість сторінок. | | hasNext | boolean | Ознака наявності наступної сторінки. | Employee | Поле | Тип | Опис | | ----------- | -------- | ----------------------------------------------- | | employeeId | int64 | ID співробітника. | | candidateId | int64 | ID пов’язаного кандидата. | | email | string | Email співробітника. | | fullName | string | Повне ім’я, яке сервер формує з name + surname. | | name | string | Ім’я. | | surname | string | Прізвище. | | gender | string | Стать. | | department | string | Основний департамент. | | departments | string[] | Набір департаментів. | | jobTitle | string | Основна посада. | | jobTitles | string[] | Набір посад. | | phone | string | Телефон. | | active | boolean | Ознака активності. | Бізнес-логіка - Параметр page є 0-based: page=0 — перша сторінка, page=1 — друга сторінка. - Якщо page і size не передані, API застосовує page = 0 і size = 50. - q шукає лише за ПІБ з частковим співпадінням. Пошук за email не підтримується. - department і jobTitle звужують вибірку за відповідними значеннями. - Параметри можна комбінувати між собою; сукупність параметрів застосовується через логіку AND. - Доступ до даних обмежений tenant-контекстом із Bearer token. Edge cases Edge cases | Сценарій | Поведінка API | | ---------------------------------------- | --------------------------------------------------------------------------- | | Endpoint викликано без query-параметрів | API повертає першу сторінку з page = 0 і size = 50. | | page=1 | API повертає другу сторінку, оскільки нумерація сторінок 0-based. | | q містить email | Пошук за email не підтримується; q призначений для пошуку за ПІБ. | | department або jobTitle містить кирилицю | Значення є валідним, якщо передане як стандартний URL-encoded query string. | | Передано кілька фільтрів | Фільтри комбінуються через AND. | Помилки Error responses | HTTP status | Коли виникає | | ------------------------- | ----------------------------------------------- | | 400 Bad Request | Некоректні query-параметри. | | 401 Unauthorized | Bearer token відсутній або невалідний. | | 403 Forbidden | Недостатньо прав або token без company context. | | 500 Internal Server Error | Неочікувана помилка BFF. | | 503 Service Unavailable | Збій внутрішньої інтеграції BFF -> back2. | Використання - Перший інтеграційний тест — виклик без параметрів. - Пагіноване завантаження співробітників у зовнішню систему. - Фільтрація списку за департаментом або посадою. - Пошук співробітника за частиною ПІБ. Типові помилки Typical integration mistakes | Типова помилка | Як правильно | | ------------------------------------------ | ------------------------------------------------------------------------------------ | | Передавати idCompany у query string | Не передавайте idCompany. BFF бере companyId з Bearer token. | | Очікувати, що q шукає за email | Використовуйте q лише для пошуку за ПІБ. | | Вважати page 1-based | Перша сторінка — page=0. | | Передавати UTF-8 значення без URL encoding | Для кирилиці використовуйте URL-encoded query string або curl -G з --data-urlencode. | FAQ Чи потрібно передавати idCompany? Ні. idCompany не передається зовнішнім клієнтом; BFF бере companyId з Bearer token. Чи підтримує q пошук за email? Ні. q підтримує пошук за ПІБ з частковим співпадінням. Які значення page і size використовуються за замовчуванням? page = 0 і size = 50. Чи можна комбінувати q, department і jobTitle? Так. Параметри комбінуються через логіку AND.

Востаннє оновлено May 03, 2026

Як отримати співробітника за ID через API?

GET /v1/employees/{employeeId} повертає одного співробітника за ID у межах tenant-контексту з Bearer token. Endpoint | Параметр | Значення | | -------------- | ------------------------------ | | Method | GET | | Path | /api/v1/employees/{employeeId} | | Base URL | https://smartway.pro | | Auth | Bearer token | | Required scope | employees.read | Призначення Endpoint використовується для отримання детальної інформації про одного співробітника. Пошук виконується тільки в межах tenant-контексту, визначеного Bearer token. Передумови - Клієнт має передати валідний Bearer token. - Token має містити company context. - Token має містити scope employees.read. - idCompany не передається окремо. - employeeId має належати співробітнику в межах поточного tenant-а. Запит Path parameters | Параметр | Тип | Обов’язковий | Опис | | ------------ | ------- | ---------------- | ----------------- | | employeeId | int64 | так | ID співробітника. | curl приклад Отримати співробітника за ID curl -X GET 'https://smartway.pro/api/v1/employees/3114' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Відповідь Успішна відповідь: 200 OK. Повертає Employee. { "employeeId": 4329, "candidateId": 10602, "email": "employee@example.com", "fullName": "Ім'я Прізвище", "name": "Ім'я", "surname": "Прізвище", "gender": "Female", "department": "КЛ", "departments": [ "КЛ" ], "jobTitle": "Менеджер", "jobTitles": [ "Менеджер" ], "phone": "+380000000000", "active": true } Поля відповіді Employee | Поле | Тип | Опис | | ----------- | -------- | ----------------------------------------------- | | employeeId | int64 | ID співробітника. | | candidateId | int64 | ID пов’язаного кандидата. | | email | string | Email співробітника. | | fullName | string | Повне ім’я, яке сервер формує з name + surname. | | name | string | Ім’я. | | surname | string | Прізвище. | | gender | string | Стать. | | department | string | Основний департамент. | | departments | string[] | Набір департаментів. | | jobTitle | string | Основна посада. | | jobTitles | string[] | Набір посад. | | phone | string | Телефон. | | active | boolean | Ознака активності. | Бізнес-логіка - BFF бере companyId з Bearer token, а не з параметрів запиту. - Endpoint повертає співробітника тільки з поточного tenant-контексту. - Якщо співробітника не знайдено в межах поточного tenant-а, API повертає 404 Not Found. - Для доступу потрібен scope employees.read. Edge cases Edge cases | Сценарій | Поведінка API | | ---------------------------------- | ---------------------------------------------------------- | | employeeId існує в іншому tenant-і | API повертає 404 Not Found для поточного tenant-контексту. | | Bearer token без company context | API повертає 403 Forbidden. | | employeeId не знайдено | API повертає 404 Not Found. | | Передано idCompany окремо | Endpoint не використовує idCompany з клієнтського запиту. | Помилки Error responses | HTTP status | Коли виникає | | ------------------------- | ----------------------------------------------------- | | 400 Bad Request | Некоректний запит. | | 401 Unauthorized | Bearer token відсутній або невалідний. | | 403 Forbidden | Недостатньо прав або token без company context. | | 404 Not Found | Співробітника не знайдено в межах поточного tenant-а. | | 500 Internal Server Error | Неочікувана помилка BFF. | | 503 Service Unavailable | Збій внутрішньої інтеграції BFF -> back2. | Використання - Отримати картку співробітника після вибору запису зі списку. - Перевірити актуальні поля співробітника перед PATCH. - Завантажити один Employee для синхронізації у зовнішній системі. Типові помилки Typical integration mistakes | Типова помилка | Як правильно | | ------------------------------------------------ | ------------------------------------------------------------- | | Вважати employeeId глобальним для всіх tenant-ів | employeeId шукається в межах tenant-контексту з Bearer token. | | Передавати idCompany окремо | Не передавайте idCompany; companyId береться з token. | | Використовувати token без employees.read | Додайте scope employees.read. | FAQ Чи можна отримати співробітника з іншої компанії? Ні. Пошук виконується в межах tenant-контексту з Bearer token. Що повертає API, якщо employeeId не знайдено? API повертає 404 Not Found. Чи потрібно передавати idCompany? Ні. idCompany передається автоматично.

Востаннє оновлено May 03, 2026

Як додати співробітника через API?

POST /v1/employees створює співробітника. Обов’язкові поля body: email, name, surname, gender і active. Для доступу потрібен scope employees.write. Endpoint | Параметр | Значення | | -------------- | ---------------------- | | Method | POST | | Path | /api/v1/employees | | Base URL | https://smartway.pro | | Auth | Bearer token | | Required scope | employees.write | Призначення Endpoint використовується для створення нового співробітника в межах компанії з Bearer token. Значення active керує не тільки бізнес-прапорцем, а й створенням або відсутністю пов’язаного користувача в Keycloak. Передумови - Клієнт має передати валідний Bearer token. - Token має містити company context. - Token має містити scope employees.write. - idCompany не передається у body або query string. - hrEmail не передається зовнішнім клієнтом; BFF бере його з Bearer token. - У поточній реалізації Idempotency-Key не використовується. Запит Body parameters | Поле | Тип | Обов’язкове | Опис | | ----------- | -------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | email | string | так | Email співробітника. | | name | string | так | Ім’я співробітника. Це source of truth для формування fullName під час створення. | | surname | string | так | Прізвище співробітника. Це source of truth для формування fullName під час створення. | | gender | string | так | Допустимі лише значення Male або Female. | | active | boolean | так | Допустимі лише JSON-boolean значення true або false. true створює або синхронізує доступ до приватного кабінету через Keycloak; false створює співробітника без такого доступу. | | department | string | ні | Основний департамент. Якщо не передати, зберігається null. | | departments | string[] | ні | Набір департаментів. Якщо не передати, колекція лишається порожньою. | | jobTitle | string | ні | Основна посада. Якщо не передати, зберігається null. | | jobTitles | string[] | ні | Набір посад. Якщо не передати, колекція лишається порожньою. | | phone | string | ні | Телефон. Якщо не передати, зберігається null. | | notes | string | ні | Примітки. Якщо не передати, зберігається null. | curl приклад Створити співробітника з primary-полями і масивами curl -X POST 'https://smartway.pro/api/v1/employees' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ --data-binary @- <<'JSON' { "email": "employee@example.com", "name": "Іван", "surname": "Петренко", "gender": "Female", "active": false, "department": "Управління", "departments": ["КЛ"], "jobTitle": "Менеджер", "jobTitles": ["Координатор"], "phone": "+380000000000", "notes": "Новий співробітник public API" } Створити співробітника тільки з масивами departments/jobTitles curl -X POST 'https://smartway.pro/api/v1/employees' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ --data-binary @- <<'JSON' { "email": "employee@example.com", "name": "Іван", "surname": "Петренко", "gender": "Male", "active": true, "departments": ["Управління", "КЛ"], "jobTitles": ["Менеджер", "Координатор"], "phone": "+380000000000", "notes": "Новий співробітник public API" } Відповідь Успішна відповідь: 201 Created. Повертає створений Employee. { "employeeId": 4432, "candidateId": 10748, "email": "employee@example.com", "fullName": "Іван Петренко", "name": "Іван", "surname": "Петренко", "gender": "Female", "department": "Управління", "departments": [ "КЛ", "Управління" ], "jobTitle": "Менеджер", "jobTitles": [ "Координатор", "Менеджер" ], "phone": "+380000000000", "active": false } Поля відповіді Employee | Поле | Тип | Опис | | ----------- | -------- | ----------------------------------------------- | | employeeId | int64 | ID співробітника. | | candidateId | int64 | ID пов’язаного кандидата. | | email | string | Email співробітника. | | fullName | string | Повне ім’я, яке сервер формує з name + surname. | | name | string | Ім’я. | | surname | string | Прізвище. | | gender | string | Стать. | | department | string | Основний департамент. | | departments | string[] | Набір департаментів. | | jobTitle | string | Основна посада. | | jobTitles | string[] | Набір посад. | | phone | string | Телефон. | | active | boolean | Ознака активності. | Бізнес-логіка - BFF визначає companyId тільки з Bearer token. - BFF бере hrEmail з Bearer token. hrEmail дорівнює email користувача з роллю HRADMIN, який створив або ротував активний API key компанії. - Якщо активний API key буде ротований іншим HRADMIN, наступні create-операції автоматично почнуть використовувати його hrEmail. - Повторний однаковий POST не створює дубль, якщо вже існує employee з таким самим email; API повертає 409 Conflict. - gender приймає тільки Male або Female. - active приймає тільки JSON-boolean true або false. - active = true створює або синхронізує пов’язаний користувацький акаунт у Keycloak і відкриває доступ до приватного кабінету. - active = false створює співробітника без доступу до приватного кабінету, тобто без користувача в Keycloak. - fullName у відповіді формується сервером з name + surname. - Якщо передано тільки departments або jobTitles, перший елемент масиву стає primary-значенням у department або jobTitle. - Якщо передано і одиничне поле, і масив, одиничне поле має пріоритет як primary, а масив доповнюється унікальними значеннями. - Якщо department, jobTitle, phone або notes не передані, у відповідних одиничних полях зберігається null. - Якщо departments або jobTitles не передані, відповідні колекції залишаються порожніми. - У відповіді departments і jobTitles повертаються у стабільно відсортованому вигляді. Edge cases Edge cases | Сценарій | Поведінка API | | --------------------------------------- | ----------------------------------------------------------------------------------- | | Відсутнє required поле | API повертає 400 Bad Request. | | gender має значення не Male і не Female | API повертає 400 Bad Request з поясненням. | | active передано рядком або числом | API повертає 400 Bad Request, бо active має бути JSON-boolean. | | email уже існує | API повертає 409 Conflict. | | Передано тільки departments | Перший елемент масиву стає department. | | Передано department і departments | department лишається primary, а departments доповнюється унікальними значеннями. | | Не передано department або jobTitle | У відповідному одиничному полі зберігається null. | | Не передано departments або jobTitles | Відповідна колекція лишається порожньою. | | Клієнт передає fullName | У create request поле fullName не описане. Сервер формує fullName з name + surname. | Помилки Error responses | HTTP status | Коли виникає | | ------------------------- | -------------------------------------------------------------------------------- | | 400 Bad Request | Відсутній хоча б один required-параметр email, name, surname, gender або active. | | 400 Bad Request | gender не дорівнює Male або Female. | | 400 Bad Request | active не є JSON-boolean значенням true або false. | | 401 Unauthorized | Bearer token відсутній або невалідний. | | 403 Forbidden | Недостатньо прав або token без company context. | | 409 Conflict | Employee з таким email уже існує. | | 500 Internal Server Error | Неочікувана помилка BFF. | | 503 Service Unavailable | Збій внутрішньої інтеграції BFF -> back2. | Використання - Створення активного співробітника з доступом до приватного кабінету: active = true. - Створення співробітника без доступу до приватного кабінету: active = false. - Передача кількох департаментів або посад із визначенням primary-значення. - Синхронізація співробітників із зовнішньої HR-системи. Типові помилки Typical integration mistakes | Типова помилка | Як правильно | | -------------------------------------------------------- | ---------------------------------------------------------- | | Передавати active як рядок "true" або "false" | Передавайте true або false як JSON-boolean. | | Передавати gender у значенні, відмінному від Male/Female | Використовуйте тільки Male або Female. | | Передавати idCompany або hrEmail | Не передавайте ці значення; BFF бере їх із Bearer token. | | Очікувати idempotency через Idempotency-Key | У поточній реалізації Idempotency-Key не використовується. | | Передавати fullName замість name і surname | Передавайте name і surname; fullName формує сервер. | FAQ Які поля обов’язкові для створення співробітника? email, name, surname, gender і active. Що робить active = true? Сервер створює або синхронізує пов’язаний користувацький акаунт у Keycloak і відкриває доступ до приватного кабінету. Що робить active = false? Співробітник створюється без доступу до приватного кабінету, тобто без користувача в Keycloak. Що буде, якщо email уже існує? API поверне 409 Conflict. Чи потрібно передавати hrEmail? Ні. BFF бере hrEmail з Bearer token.

Востаннє оновлено May 03, 2026

Як частково оновити дані співробітника через API?

PATCH /v1/employees/{employeeId} оновлює тільки передані поля. Body має містити хоча б одне поле. Для доступу потрібен scope employees.write. Endpoint | Параметр | Значення | | -------------- | ------------------------------ | | Method | PATCH | | Path | /api/v1/employees/{employeeId} | | Base URL | https://smartway.pro | | Auth | Bearer token | | Required scope | employees.write | Призначення Endpoint використовується для часткового оновлення співробітника в межах поточного tenant-а. Поле fullName у PATCH-контракт не входить; для зміни ПІБ використовуються name і surname. Передумови - Клієнт має передати валідний Bearer token. - Token має містити company context. - Token має містити scope employees.write. - employeeId має належати співробітнику в межах поточного tenant-а. - PATCH-body має містити хоча б одне поле. - idCompany і hrEmail не передаються зовнішнім клієнтом. Запит Path parameters | Параметр | Тип | Обов’язковий | Опис | | ------------ | ------- | ---------------- | ----------------- | | employeeId | int64 | так | ID співробітника. | Body parameters | Поле | Тип | Обов’язкове | Опис | | ----------- | -------- | --------------- | -------------------------------------------------------------------------------------- | | email | string | ні | Оновити email. | | name | string | ні | Оновити ім’я співробітника. Якщо поле передано, воно має містити непорожній текст. | | surname | string | ні | Оновити прізвище співробітника. Якщо поле передано, воно має містити непорожній текст. | | gender | string | ні | Оновити стать. | | department | string | ні | Оновити primary-департамент. | | departments | string[] | ні | Замінити повний набір департаментів. | | jobTitle | string | ні | Оновити primary-посаду. | | jobTitles | string[] | ні | Замінити повний набір посад. | | phone | string | ні | Оновити телефон. | | active | boolean | ні | Оновити ознаку активності. | curl приклад Оновити ПІБ, primary-поля, масиви й active curl -X PATCH 'https://smartway.pro/api/v1/employees/4432' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ --data-binary @- <<'JSON' { "name": "Оновлене Ім'я", "surname": "Прізвище", "department": "Управління", "departments": ["КЛ", "Логістика"], "jobTitle": "Старший менеджер", "jobTitles": ["Координатор", "Аналітик"], "active": false } JSON Відповідь Успішна відповідь: 200 OK. Повертає оновлений Employee. { "employeeId": 4432, "candidateId": 10748, "email": "employee@example.com", "fullName": "Оновлене Ім'я Прізвище", "name": "Оновлене Ім'я", "surname": "Прізвище", "gender": "not_specified", "department": "Управління", "departments": [ "КЛ", "Логістика", "Управління" ], "jobTitle": "Старший менеджер", "jobTitles": [ "Аналітик", "Координатор", "Старший менеджер" ], "phone": "+380000000000", "active": false } Поля відповіді Employee | Поле | Тип | Опис | | ----------- | -------- | ----------------------------------------------- | | employeeId | int64 | ID співробітника. | | candidateId | int64 | ID пов’язаного кандидата. | | email | string | Email співробітника. | | fullName | string | Повне ім’я, яке сервер формує з name + surname. | | name | string | Ім’я. | | surname | string | Прізвище. | | gender | string | Стать. | | department | string | Основний департамент. | | departments | string[] | Набір департаментів. | | jobTitle | string | Основна посада. | | jobTitles | string[] | Набір посад. | | phone | string | Телефон. | | active | boolean | Ознака активності. | Бізнес-логіка - BFF бере companyId з Bearer token, а не з параметрів запиту. - BFF бере hrEmail з Bearer token. hrEmail дорівнює email користувача з роллю HRADMIN, який створив або ротував активний API key компанії. - Якщо активний API key буде ротований іншим HRADMIN, наступні patch-операції автоматично почнуть використовувати його hrEmail. - PATCH змінює тільки ті поля, які передані в body. - fullName не передається в PATCH-body. Сервер формує fullName з актуальних name + surname. - name і surname можна передавати разом або окремо. Якщо поле передано, воно має містити непорожній текст. - Текстові поля підтримують UTF-8. - Якщо передано тільки departments або jobTitles, перший елемент масиву стає primary-значенням. - Якщо передано і одиничне поле, і масив, одиничне поле лишається primary. - Масиви departments і jobTitles у відповіді повертаються у відсортованому вигляді. - Якщо новий email уже належить іншому employee, API повертає 409 Conflict. - Якщо active змінюється з false на true, сервер створює або повторно синхронізує пов’язаного Keycloak-користувача і відкриває доступ до приватного кабінету. - Якщо active змінюється з true на false, сервер видаляє пов’язаного Keycloak-користувача і відкликає доступ до приватного кабінету. - Якщо PATCH одночасно змінює active і email, сервер синхронізує саме акаунт, який уже був пов’язаний із цим employee, а не довільного користувача за новим email. Edge cases Edge cases | Сценарій | Поведінка API | | ----------------------------------------- | ------------------------------------------------------------------------------ | | PATCH-body порожній | API повертає 400 Bad Request. | | name або surname передані порожніми | API повертає 400 Bad Request. | | fullName передано в PATCH-body | Поле не входить у PATCH-контракт; використовуйте name і surname. | | Новий email уже належить іншому employee | API повертає 409 Conflict. | | Передано тільки departments або jobTitles | Перший елемент масиву стає primary-значенням. | | Передано одиничне поле і масив | Одиничне поле лишається primary, масив у відповіді повертається відсортованим. | | active змінюється з false на true | Сервер створює або синхронізує пов’язаного Keycloak-користувача. | | active змінюється з true на false | Сервер видаляє пов’язаного Keycloak-користувача. | | active і email змінюються одночасно | Синхронізується акаунт, уже пов’язаний із цим employee. | Помилки Error responses | HTTP status | Коли виникає | | ------------------------- | -------------------------------------------------------------------------------------------------------------------- | | 400 Bad Request | Порожній PATCH-body або невалідні значення, зокрема порожні name / surname. | | 401 Unauthorized | Bearer token відсутній або невалідний. | | 403 Forbidden | Недостатньо прав або token без company context. | | 404 Not Found | Співробітника не знайдено в межах поточного tenant-а. | | 409 Conflict | Новий email уже зайнятий іншим employee або не може бути безпечно використаний для синхронізації доступу в Keycloak. | | 500 Internal Server Error | Неочікувана помилка BFF. | | 503 Service Unavailable | Збій внутрішньої інтеграції BFF -> back2. | Використання - Оновити контактні дані співробітника. - Змінити департамент або посаду. - Увімкнути доступ до приватного кабінету через active = true. - Відкликати доступ до приватного кабінету через active = false. - Оновити email з перевіркою конфлікту. Типові помилки Typical integration mistakes | Типова помилка | Як правильно | | ----------------------------------------------------- | ------------------------------------------------------------------- | | Надсилати порожній PATCH-body | Передайте хоча б одне поле для зміни. | | Передавати fullName | Передавайте name і surname. | | Передавати порожні name або surname | Якщо поле передане, воно має містити непорожній текст. | | Очікувати, що зміна active лише змінює прапорець у БД | active також керує синхронізацією пов’язаного Keycloak-користувача. | | Передавати idCompany або hrEmail | Не передавайте ці значення; BFF бере їх із Bearer token. | FAQ Чи можна передати тільки одне поле в PATCH? Так. Body має містити хоча б одне поле. Чи можна змінити fullName напряму? Ні. fullName не входить у PATCH-контракт. Використовуйте name і surname. Що буде, якщо новий email уже зайнятий? API поверне 409 Conflict. Що відбувається при active = false? Сервер видаляє пов’язаного Keycloak-користувача і відкликає доступ до приватного кабінету. Що відбувається, якщо одночасно змінити active і email? Сервер синхронізує акаунт, який уже пов’язаний із цим employee.

Востаннє оновлено May 03, 2026

Як видалити співробітника через API?

DELETE /v1/employees/{employeeId} видаляє співробітника в межах tenant-контексту. Успішна відповідь — 204 No Content. Endpoint | Параметр | Значення | | -------------- | ------------------------------ | | Method | DELETE | | Path | /api/v1/employees/{employeeId} | | Base URL | https://smartway.pro | | Auth | Bearer token | | Required scope | employees.write | Призначення Endpoint використовується для видалення співробітника за employeeId. Операція виконується в межах tenant-контексту з Bearer token. Передумови - Клієнт має передати валідний Bearer token. - Token має містити company context. - Token має містити scope employees.write. - idCompany не передається окремо. - employeeId має належати співробітнику в межах поточного tenant-а. Запит Path parameters | Параметр | Тип | Обов’язковий | Опис | | ------------ | ------- | ---------------- | ----------------- | | employeeId | int64 | так | ID співробітника. | curl приклад Видалити співробітника curl -X DELETE 'https://smartway.pro/api/v1/employees/4432' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Відповідь Успішна відповідь: 204 No Content. Успішна відповідь не містить body. Поля відповіді Delete response | Елемент | Тип | Опис | | ------------- | -------------- | -------------------------- | | HTTP status | 204 No Content | Операція виконана успішно. | | Response body | відсутній | Body не повертається. | Бізнес-логіка - BFF бере companyId з Bearer token, а не з параметрів запиту. - Endpoint видаляє співробітника тільки в межах поточного tenant-контексту. - Для доступу потрібен scope employees.write. Edge cases Edge cases | Сценарій | Поведінка API | | ------------------------------------------- | --------------------------------------------------------- | | employeeId не знайдено в поточному tenant-і | API повертає 404 Not Found. | | Bearer token без employees.write | API повертає 403 Forbidden. | | Операція успішна | API повертає 204 No Content без body. | | Клієнт передає idCompany | Endpoint не використовує idCompany з клієнтського запиту. | Помилки Error responses | HTTP status | Коли виникає | | ------------------------- | ----------------------------------------------------- | | 401 Unauthorized | Bearer token відсутній або невалідний. | | 403 Forbidden | Недостатньо прав або token без company context. | | 404 Not Found | Співробітника не знайдено в межах поточного tenant-а. | | 500 Internal Server Error | Неочікувана помилка BFF. | | 503 Service Unavailable | Збій внутрішньої інтеграції BFF -> back2. | Використання - Видалити співробітника з LMS Smart Way через інтеграцію. - Очистити тестові записи після перевірки інтеграції. - Прибрати співробітника, який більше не має бути в employee dataset. Типові помилки Typical integration mistakes | Типова помилка | Як правильно | | ----------------------------------------- | ------------------------------------------------------------ | | Очікувати JSON у відповіді | Успішна відповідь — 204 No Content без body. | | Передавати idCompany | Не передавайте idCompany; companyId береться з Bearer token. | | Використовувати token без employees.write | Для DELETE потрібен scope employees.write. | FAQ Що повертає API після успішного видалення? 204 No Content без response body. Чи потрібно передавати idCompany? Ні. companyId береться з Bearer token. Що буде, якщо employeeId не знайдено? API поверне 404 Not Found.

Востаннє оновлено May 03, 2026

Отримати каталог тестів

GET /v1/tests повертає каталог тестів, доступних поточній компанії: системні тести та власні тести компанії. Integrated synthetic-тести SCORM/CMI5/xAPI у відповідь не входять. Endpoint | Метод | URL | | --------- | ----------------------------------- | | GET | https://smartway.pro/api/v1/tests | Призначення Отримати список тестів, які можна використовувати для тестування кандидатів або співробітників. Передумови | Вимога | Значення | | -------------- | -------------------------------------- | | Авторизація | Authorization: Bearer <access_token> | | Scope | tests.read | | Tenant context | Визначається сервером з Bearer token | | idCompany | Не передається зовнішнім клієнтом | curl приклад curl -X GET 'https://smartway.pro/api/v1/tests' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Відповідь Успішна відповідь: 200 OK. { "data": [ { "testId": 5, "name": "Conflict Test", "active": true, "companyOwned": false, "questionCount": 30 }, { "testId": 200001, "name": "Adaptive Sales", "active": true, "companyOwned": true, "questionCount": 12 } ], "meta": { "total": 2 } } Поля відповіді | Поле | Тип | Опис | | ---------------------- | -------- | -------------------------------------------- | | data | object[] | Список тестів, доступних поточній компанії | | data[].testId | int64 | ID тесту | | data[].name | string | Назва тесту | | data[].active | boolean | Ознака активності тесту | | data[].companyOwned | boolean | true, якщо тест належить поточній компанії | | data[].questionCount | int32 | Кількість питань у тесті | | meta.total | int32 | Загальна кількість тестів у відповіді | Бізнес-логіка - Компанія визначається з Bearer token. - Повертаються системні тести та тести, що належать поточній компанії. - Поле companyOwned показує, чи належить тест поточній компанії. Edge cases | Сценарій | Поведінка API | | -------------------------------------------------- | ---------------------------- | | Тест є integrated synthetic-тестом SCORM/CMI5/xAPI | Тест не входить у каталог | | У токені немає company context | API повертає 403 Forbidden | Помилки | HTTP status | Причина | | ------------------------- | ---------------------------------------------- | | 401 Unauthorized | Відсутній або невалідний Bearer token | | 403 Forbidden | Недостатньо прав або токен без company context | | 500 Internal Server Error | Неочікувана помилка LMS Smart Way | | 503 Service Unavailable | Збій внутрішньої інтеграції LMS Smart Way | Використання Використовуйте endpoint, щоб отримати доступні testId перед створенням запрошення або налаштуванням фільтрів звітів. Типові помилки | Помилка | Як уникнути | | ------------------------------------------------------ | ---------------------------------------------------------- | | Використання токена без tests.read | Перевірте scope API key | | Передавання idCompany у запиті | Не передавайте idCompany; компанія визначається з токена | | Очікування SCORM/CMI5/xAPI synthetic-тестів у каталозі | Цей endpoint такі тести не повертає | FAQ Чи потрібно передавати idCompany? Ні. Компанія визначається сервером з Bearer token. Чи входять SCORM/CMI5/xAPI synthetic-тести у відповідь? Ні. Вони не входять у каталог GET /v1/tests.

Востаннє оновлено Apr 27, 2026

Отримати тест за ID

GET /v1/tests/{testId} повертає детальну інформацію про тест, якщо він доступний поточній компанії та не є integrated synthetic-тестом SCORM/CMI5/xAPI. Endpoint | Метод | URL | | --------- | -------------------------------------------- | | GET | https://smartway.pro/api/v1/tests/{testId} | Призначення Отримати налаштування конкретного тесту: активність, кількість питань, таймер, унікальність, валідацію та прохідний бал. Передумови | Вимога | Значення | | -------------- | ------------------------------------------------------- | | Авторизація | Authorization: Bearer <access_token> | | Scope | tests.read | | Tenant context | Пошук виконується в межах tenant context з Bearer token | Запит Path parameters | Параметр | Тип | Обов’язковий | Опис | | ------------ | ------- | ---------------- | -------- | | testId | int64 | так | ID тесту | curl приклад curl -X GET 'https://smartway.pro/api/v1/tests/200001' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Відповідь Успішна відповідь: 200 OK. { "testId": 200001, "name": "Adaptive Sales", "active": true, "companyOwned": true, "questionCount": 12, "timerEnabled": true, "timerMinutes": 10, "uniquenessEnabled": true, "uniquenessQuestionCount": 25, "validationEnabled": true, "passingScore": 75 } Поля відповіді | Поле | Тип | Опис | | ------------------------- | ------- | -------------------------------------------- | | testId | int64 | ID тесту | | name | string | Назва тесту | | active | boolean | Ознака активності тесту | | companyOwned | boolean | true, якщо тест належить поточній компанії | | questionCount | int32 | Кількість питань у тесті | | timerEnabled | boolean | Чи ввімкнений таймер | | timerMinutes | int32 | Тривалість таймера у хвилинах | | uniquenessEnabled | boolean | Чи ввімкнена унікальність питань | | uniquenessQuestionCount | int32 | Кількість унікальних питань | | validationEnabled | boolean | Чи ввімкнена валідація результату | | passingScore | int32 | Прохідний бал | Бізнес-логіка - API шукає тест у межах tenant context з Bearer token. - Якщо тест недоступний поточній компанії, API повертає 404 Not Found. - Integrated synthetic-тести SCORM/CMI5/xAPI через цей endpoint не повертаються. Edge cases | Сценарій | Поведінка API | | ----------------------------------------------------------------------------------- | ---------------------------------- | | Тест недоступний поточній компанії | 404 Not Found | | testId належить integrated synthetic-тесту SCORM/CMI5/xAPI | 404 Not Found | | Налаштування таймера, унікальності, валідації або прохідного балу не застосовуються | Відповідні поля можуть бути null | Помилки | HTTP status | Причина | | ------------------------- | ------------------------------------------------------------------------------------- | | 401 Unauthorized | Відсутній або невалідний Bearer token | | 403 Forbidden | Недостатньо прав | | 404 Not Found | Тест не знайдено, він недоступний поточному tenant-у або це integrated synthetic-тест | | 500 Internal Server Error | Неочікувана помилка LMS Smart Way | | 503 Service Unavailable | Збій внутрішньої інтеграції LMS Smart Way | Використання Використовуйте endpoint після GET /v1/tests, щоб отримати деталі конкретного тесту перед створенням запрошення або аналізом налаштувань. Типові помилки | Помилка | Як уникнути | | ----------------------------------------------------- | ---------------------------------------- | | Використання testId, недоступного поточній компанії | Отримуйте testId через GET /v1/tests | | Обробка nullable-полів як обов’язкових | Перевіряйте null для налаштувань тесту | FAQ Чому API повертає 404 Not Found для існуючого testId? Тест може бути недоступний поточній компанії або належати до integrated synthetic-тестів SCORM/CMI5/xAPI. Чи всі налаштування тесту завжди заповнені? Ні. Частина налаштувань може бути null.

Востаннє оновлено Apr 28, 2026

Як отримати список звітів з тестування через API

Коротка відповідь Endpoint POST /api/v1/tests/reports/search повертає список звітів з тестування із застосуванням поточного збереженого фільтра. Усі поля request body необов’язкові; без body API використовує page = 0, size = 50, view = all. Для доступу потрібен Bearer token зі scope tests.read, а lang може керувати мовою локалізованих ресурсів тестування. Який endpoint використовується? Використовується POST /api/v1/tests/reports/search. Endpoint повертає сторінку звітів з тестування у межах компанії з урахуванням поточного збереженого фільтра. | Параметр | Значення | | ------------ | ------------------------------ | | Method | POST | | Endpoint | /api/v1/tests/reports/search | | Base URL | https://smartway.pro | | Auth | Bearer token | | Content-Type | application/json | Для чого використовується цей API endpoint? Endpoint використовується для отримання звітів з тестування компанії з пагінацією, режимом представлення та пошуком по ПІБ. Його використовують HR-інтеграції, backend-сервіси та технічні адміністратори для побудови списків звітів і переходу до PDF-звітів. Які передумови потрібні перед виконанням запиту? - Потрібен Bearer token з company context. - Token має містити scope tests.read. - Перед отриманням потрібних даних потрібно врахувати поточний збережений фільтр або скинути його. | Передумова | Опис | Обов’язково | | ----------------- | ------------------------------------------------------------------------- | --------------- | | access_token | Bearer token з company context | Так | | tests.read | Scope для читання звітів з тестування | Так | | Збережений фільтр | Фільтр із GET/PUT /api/v1/tests/reports/filter застосовується додатково | Ні | Які параметри потрібно передати в запиті? Headers | Header | Тип | Обов’язково | Опис | | --------------- | ------- | -------------------------- | ---------------------------------------------- | | Authorization | string | Так | Bearer token у форматі Bearer <access_token> | | Accept | string | Так | application/json | | Content-Type | string | Так, якщо передається body | application/json | Path parameters Path parameters відсутні. Query parameters | Параметр | Тип | Обов’язково | Опис | | ------------ | ------- | --------------- | ------------------------------------------------------------------------------------ | | lang | string | Ні | Мова локалізованих ресурсів тестування; default en, доступні мови uk, ru, en | Request body | Параметр | Тип | Обов’язково | Опис | | ------------ | ------- | --------------- | ------------------------------------------------------------ | | page | int32 | Ні | Номер сторінки; default 0; параметр є 0-based | | size | int32 | Ні | Розмір сторінки; default 50, максимум 200 | | view | string | Ні | Режим вибірки; допустимі лише all, candidate, employee | | query | string | Ні | Пошук по ПІБ | curl приклад Приклад виклику без body: curl -X POST 'https://smartway.pro/api/v1/tests/reports/search' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Приклад виклику з параметрами: curl -X POST 'https://smartway.pro/api/v1/tests/reports/search?lang=uk' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "page": 0, "size": 20, "view": "all", "query": "Іван" }' Яку відповідь повертає API? Успішний запит повертає 200 OK і об’єкт PublicTestReportListResponse зі списком звітів та метаданими пагінації. { "data": [ { "uniqueId": "abc12345", "candidateId": 1001, "name": "Іван Петренко", "dateSend": "2026-03-10", "dateReceipt": "2026-03-12", "active": true, "testNames": "Conflict Test, Adaptive Sales", "department": "Sales", "jobTitle": "Manager" } ], "meta": { "page": 0, "size": 20, "totalElements": 1, "totalPages": 1, "hasNext": false } } Що означають поля у відповіді API? | Поле | Тип | Опис | | -------------------- | ------- | ------------------------------------------- | | data[].uniqueId | string | Унікальний ідентифікатор звіту з тестування | | data[].candidateId | integer | ID кандидата | | data[].name | string | ПІБ кандидата або співробітника | | data[].dateSend | string | Дата відправлення тестування | | data[].dateReceipt | string | Дата отримання результату | | data[].active | boolean | Ознака активності звіту | | data[].testNames | string | Назви тестів у звіті | | data[].department | string | Департамент | | data[].jobTitle | string | Посада | | meta.page | integer | Номер поточної сторінки | | meta.size | integer | Розмір сторінки | | meta.totalElements | integer | Загальна кількість елементів | | meta.totalPages | integer | Загальна кількість сторінок | | meta.hasNext | boolean | Ознака наявності наступної сторінки | Що відбувається під капотом? - Tenant-видимість звітів визначається server-side з companyId у Bearer token як company-level / HRADMIN-equivalent scope. - Звітність не обмежується кандидатами, запрошеними через поточний API key або HR-власника ключа. - API повертає всі звіти з тестування компанії, які доступні HRADMIN-рівню. - Додатково застосовується поточний збережений фільтр із GET/PUT /api/v1/tests/reports/filter: active, startDate, endDate, testIds, departments, jobTitles. - lang необов’язковий; якщо його не передати, API використовує en. - Для доступу потрібен scope tests.read. Які edge cases потрібно врахувати? | Сценарій | Поведінка API | Що зробити інтегратору | | -------------------------- | ------------------------------------------------------ | ----------------------------------------------------------- | | Запит без body | API використовує page = 0, size = 50, view = all | Не передавати body, якщо потрібні значення за замовчуванням | | Нумерація сторінок | page є 0-based | Передавати page = 0 для першої сторінки | | Невалідний view | API повертає 400 Bad Request | Використовувати лише all, candidate, employee | | Збережений фільтр активний | Фільтр застосовується додатково | Перед пошуком налаштувати або скинути фільтр | | lang не передано | API використовує en | Передати lang, якщо потрібна інша мова | Які помилки може повернути API? | HTTP status | Опис | | --------------------------- | ----------------------------------------------------- | | 400 Bad Request | Невалідний view або інші невалідні параметри пошуку | | 401 Unauthorized | Відсутній або невалідний Bearer token | | 403 Forbidden | Недостатньо прав | | 500 Internal Server Error | Неочікувана помилка | | 503 Service Unavailable | Збій внутрішньої інтеграції | Як використовувати результат у наступних API-запитах? Використовуйте meta.page, meta.size, meta.totalPages і meta.hasNext для пагінації. Значення uniqueId зі списку використовується для отримання PDF-звіту. Приклад наступного запиту для отримання PDF-звіту: curl -X GET 'https://smartway.pro/api/v1/tests/reports/pdf?uniqueId=abc12345&lang=uk' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/pdf' \ --output test-report-abc12345.pdf Яких помилок інтегратору варто уникати? - Вважати page = 1 першою сторінкою. - Не враховувати активний збережений фільтр перед пошуком. - Передавати view, відмінний від all, candidate, employee. - Очікувати, що API поверне тільки звіти кандидатів, запрошених через поточний API key. FAQ Чи обов’язково передавати request body? Ні. Якщо викликати endpoint без body, API використовує page = 0, size = 50, view = all. З якої сторінки починається пагінація? Параметр page є 0-based: page = 0 — перша сторінка, page = 1 — друга. Які значення підтримує view? Допустимі лише all, candidate, employee. Чи застосовується збережений фільтр? Так. Додатково застосовується фільтр із GET/PUT /api/v1/tests/reports/filter. Який scope потрібен? Для доступу потрібен scope tests.read.

Востаннє оновлено May 03, 2026

Як отримати PDF-звіт результатів тестування через API

Коротка відповідь Endpoint GET /api/v1/tests/reports/pdf повертає PDF-звіт з результатами тестування за uniqueId. У query потрібно передати uniqueId, а lang можна передати для вибору мови PDF-звіту. Перед видачею PDF сервер перевіряє, що звіт належить поточній компанії. Який endpoint використовується? Використовується GET /api/v1/tests/reports/pdf. Endpoint повертає binary PDF file за унікальним ідентифікатором звіту з тестування. | Параметр | Значення | | ------------ | --------------------------- | | Method | GET | | Endpoint | /api/v1/tests/reports/pdf | | Base URL | https://smartway.pro | | Auth | Bearer token | Для чого використовується цей API endpoint? Endpoint використовується для завантаження або відкриття PDF-звіту тестування. Його застосовують після отримання uniqueId зі списку звітів з тестування. Які передумови потрібні перед виконанням запиту? - Потрібен Bearer token з company context. - Token має містити scope tests.read. - Потрібен uniqueId звіту з тестування, що належить поточній компанії. | Передумова | Опис | Обов’язково | | -------------- | ------------------------------------------- | --------------- | | access_token | Bearer token з company context | Так | | tests.read | Scope для читання звітів з тестування | Так | | uniqueId | Унікальний ідентифікатор звіту з тестування | Так | Які параметри потрібно передати в запиті? Headers | Header | Тип | Обов’язково | Опис | | --------------- | ------- | --------------- | ---------------------------------------------- | | Authorization | string | Так | Bearer token у форматі Bearer <access_token> | | Accept | string | Так | application/pdf | Path parameters Path parameters відсутні. Query parameters | Параметр | Тип | Обов’язково | Опис | | ------------ | ------- | --------------- | ------------------------------------------------------------ | | uniqueId | string | Так | Унікальний ідентифікатор звіту з тестування | | lang | string | Ні | Мова PDF-звіту; default en, доступні мови uk, ru, en | Request body Request body не використовується. curl приклад curl -X GET 'https://smartway.pro/api/v1/tests/reports/pdf?uniqueId=abc12345&lang=uk' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/pdf' \ --output test-report-abc12345.pdf Яку відповідь повертає API? Успішний запит повертає 200 OK і binary PDF file. Успішна відповідь має Content-Type: application/pdf і Content-Disposition: inline; filename=test-report-<uniqueId>.pdf. JSON response body не використовується, оскільки відповідь є binary PDF file. Що означають поля у відповіді API? Недостатньо даних для опису полів відповіді. Що відбувається під капотом? - Перед видачею PDF сервер перевіряє, що звіт належить поточній компанії. - Для доступу потрібен scope tests.read. Які edge cases потрібно врахувати? | Сценарій | Поведінка API | Що зробити інтегратору | | ---------------------------------- | ---------------------------- | ------------------------------------------------------------------------------ | | uniqueId не знайдено | API повертає 404 Not Found | Перевірити uniqueId зі списку звітів з тестування | | Звіт не належить поточній компанії | API повертає 404 Not Found | Використовувати лише uniqueId, доступні в tenant-контексті поточної компанії | | lang не передано | API використовує en | Передати lang, якщо потрібна інша мова PDF | Які помилки може повернути API? | HTTP status | Опис | | --------------------------- | ------------------------------------------------------ | | 401 Unauthorized | Відсутній або невалідний Bearer token | | 403 Forbidden | Недостатньо прав | | 404 Not Found | Звіт не знайдено або він не належить поточній компанії | | 500 Internal Server Error | Неочікувана помилка | | 503 Service Unavailable | Збій сервісу | Як використовувати результат у наступних API-запитах? Значення uniqueId береться з відповіді POST /api/v1/tests/reports/search. Результат PDF-запиту потрібно зберігати у файл або відкривати як PDF-документ. Приклад отримання uniqueId зі списку звітів: curl -X POST 'https://smartway.pro/api/v1/tests/reports/search?lang=uk' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "page": 0, "size": 20, "view": "all" }' Яких помилок інтегратору варто уникати? - Передавати uniqueId, який не належить поточній компанії. - Не вказувати Accept: application/pdf. - Очікувати JSON-відповідь замість binary PDF file. - Викликати endpoint без scope tests.read. FAQ Який параметр обов’язковий? Обов’язковий query parameter uniqueId. Яку мову PDF можна запитати? Параметр lang підтримує uk, ru, en; якщо його не передати, використовується en. Що повертає API? API повертає binary PDF file з Content-Type: application/pdf. Що буде, якщо звіт не належить компанії? API поверне 404 Not Found. Який scope потрібен? Для доступу потрібен scope tests.read.

Востаннє оновлено Apr 28, 2026

Як отримати збережений фільтр звітів з тестування через API

Endpoint GET /api/v1/tests/reports/filter повертає збережений фільтр звітів з тестування для userKey, який береться із subject Bearer token. Для company API key цей userKey має формат company-api-key:{companyId} і залишається стабільним після ротації ключа. Для доступу потрібен Bearer token зі scope tests.read. Який endpoint використовується? Використовується GET /api/v1/tests/reports/filter. Endpoint повертає поточний збережений фільтр звітів з тестування для user context з Bearer token. | Параметр | Значення | | ------------ | ------------------------------ | | Method | GET | | Endpoint | /api/v1/tests/reports/filter | | Base URL | https://smartway.pro | | Auth | Bearer token | Для чого використовується цей API endpoint? Endpoint використовується для перегляду поточного фільтра, який застосовується до пошуку та експорту звітів з тестування. Його використовують перед POST /api/v1/tests/reports/search або POST /api/v1/tests/reports/export, щоб зрозуміти, які обмеження будуть застосовані. Які передумови потрібні перед виконанням запиту? | Передумова | Опис | Обов’язково | | -------------- | ------------------------------------- | --------------- | | access_token | Bearer token | Так | | tests.read | Scope для читання збереженого фільтра | Так | Які параметри потрібно передати в запиті? Headers | Header | Тип | Обов’язково | Опис | | --------------- | ------- | --------------- | ---------------------------------------------- | | Authorization | string | Так | Bearer token у форматі Bearer <access_token> | | Accept | string | Так | application/json | Path parameters Path parameters відсутні. Query parameters Query parameters відсутні. Request body Request body не використовується. curl приклад curl -X GET 'https://smartway.pro/api/v1/tests/reports/filter' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Яку відповідь повертає API? Успішний запит повертає 200 OK і об’єкт PublicTestReportFilterResponse з параметрами збереженого фільтра. { "active": true, "startDate": "2026-03-01", "endDate": "2026-03-10", "groupByName": true, "testIds": [5, 200001], "departments": ["Sales"], "jobTitles": ["Manager"] } Що означають поля у відповіді API? | Поле | Тип | Опис | | ------------- | ------- | ------------------------------------------ | | active | boolean | Фільтр за ознакою активності звіту | | startDate | string | Початок діапазону дат | | endDate | string | Кінець діапазону дат | | groupByName | boolean | Групування кількох спроб проходження тесту | | testIds | array | Набір ID тестів для фільтра | | departments | array | Набір департаментів для фільтра | | jobTitles | array | Набір посад для фільтра | Що відбувається під капотом? - Фільтр прив’язаний до userKey, який береться із subject Bearer token. - Для company API key userKey має формат company-api-key:{companyId}. - userKey стабільний після ротації ключа. - Зовнішній клієнт не передає idUser. - Для доступу потрібен scope tests.read. Які edge cases потрібно врахувати? | Сценарій | Поведінка API | Що зробити інтегратору | | -------------------------- | ------------------------------------------------------------------------ | ----------------------------------------------- | | Ротація company API key | userKey залишається стабільним у форматі company-api-key:{companyId} | Не створювати окрему прив’язку до active key id | | idUser у запиті | Зовнішній клієнт не передає idUser | Не додавати idUser у query string або body | | Активний збережений фільтр | Фільтр застосовується до пошуку та експорту | Перевіряти фільтр перед отриманням звітів | Які помилки може повернути API? | HTTP status | Опис | | --------------------------- | ------------------------------------- | | 401 Unauthorized | Відсутній або невалідний Bearer token | | 403 Forbidden | Недостатньо прав | | 500 Internal Server Error | Неочікувана помилка | | 503 Service Unavailable | Збій сервісу | Як використовувати результат у наступних API-запитах? Використовуйте отриманий фільтр, щоб зрозуміти, які обмеження будуть застосовані до POST /api/v1/tests/reports/search і POST /api/v1/tests/reports/export. Приклад пошуку звітів після перевірки фільтра: curl -X POST 'https://smartway.pro/api/v1/tests/reports/search' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Яких помилок інтегратору варто уникати? - Передавати idUser у запиті. - Очікувати, що фільтр прив’язаний до конкретного active key id. - Запускати пошук або експорт без перевірки поточного фільтра. - Викликати endpoint без scope tests.read. FAQ До чого прив’язаний збережений фільтр? Фільтр прив’язаний до userKey, який береться із subject Bearer token. Який формат userKey для company API key? Для company API key userKey має формат company-api-key:{companyId}. Чи потрібно передавати idUser? Ні. Зовнішній клієнт не передає idUser. Чи зміниться фільтр після ротації ключа? Для company API key userKey стабільний після ротації ключа. Який scope потрібен? Для доступу потрібен scope tests.read.

Востаннє оновлено May 04, 2026

Як оновити або очистити фільтр звітів з тестування через API

Endpoint PUT /api/v1/tests/reports/filter оновлює або очищає збережений фільтр звітів з тестування. У request body можна передати active, діапазон дат, groupByName, testIds, departments і jobTitles; якщо передати {} або body лише з null/порожніми колекціями, сервер очищає фільтр. Для доступу потрібен Bearer token зі scope tests.write. Який endpoint використовується? Використовується PUT /api/v1/tests/reports/filter. Endpoint змінює збережений фільтр звітів з тестування для user context з Bearer token. | Параметр | Значення | | ------------ | ------------------------------ | | Method | PUT | | Endpoint | /api/v1/tests/reports/filter | | Base URL | https://smartway.pro | | Auth | Bearer token | | Content-Type | application/json | Для чого використовується цей API endpoint? Endpoint використовується для керування фільтром, який застосовується до пошуку та експорту звітів з тестування. Його використовують перед отриманням списку звітів або перед формуванням Excel-експорту. Які передумови потрібні перед виконанням запиту? | Передумова | Опис | Обов’язково | | -------------- | --------------------------------------- | --------------- | | access_token | Bearer token | Так | | tests.write | Scope для оновлення збереженого фільтра | Так | Які параметри потрібно передати в запиті? Headers | Header | Тип | Обов’язково | Опис | | --------------- | ------- | --------------- | ---------------------------------------------- | | Authorization | string | Так | Bearer token у форматі Bearer <access_token> | | Accept | string | Так | application/json | | Content-Type | string | Так | application/json | Path parameters Path parameters відсутні. Query parameters Query parameters відсутні. Request body | Параметр | Тип | Обов’язково | Опис | | ------------- | ------------- | --------------- | --------------------------------------------------------------------------------------------------------------- | | active | boolean | Ні | Фільтр за ознакою активності звіту | | startDate | string (date) | Ні | Початок діапазону дат | | endDate | string (date) | Ні | Кінець діапазону дат | | groupByName | boolean | Ні | Групування кількох спроб проходження тесту в одну строку з максимальним результатом та вказаною кількістю спроб | | testIds | int64[] | Ні | Набір ID тестів для фільтра | | departments | string[] | Ні | Набір департаментів для фільтра | | jobTitles | string[] | Ні | Набір посад для фільтра | curl приклад Приклад виклику з оновленням фільтра: curl -X PUT 'https://smartway.pro/api/v1/tests/reports/filter' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "active": true, "startDate": "2026-03-01", "endDate": "2026-03-10", "groupByName": true, "testIds": [5, 200001], "departments": ["Sales"], "jobTitles": ["Manager"] }' Приклад виклику для очищення фільтра: curl -X PUT 'https://smartway.pro/api/v1/tests/reports/filter' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{}' Яку відповідь повертає API? Успішний запит повертає 200 OK і об’єкт PublicTestReportFilterResponse з актуальним станом фільтра. { "active": true, "startDate": "2026-03-01", "endDate": "2026-03-10", "groupByName": true, "testIds": [5, 200001], "departments": ["Sales"], "jobTitles": ["Manager"] } Що означають поля у відповіді API? | Поле | Тип | Опис | | ------------- | ------- | ------------------------------------------ | | active | boolean | Фільтр за ознакою активності звіту | | startDate | string | Початок діапазону дат | | endDate | string | Кінець діапазону дат | | groupByName | boolean | Групування кількох спроб проходження тесту | | testIds | array | Набір ID тестів для фільтра | | departments | array | Набір департаментів для фільтра | | jobTitles | array | Набір посад для фільтра | Що відбувається під капотом? - Фільтр прив’язаний до userKey, який береться із subject Bearer token. - Для company API key userKey має формат company-api-key:{companyId}. - Оновлення фільтра не прив’язане до конкретного active key id. - Зовнішній клієнт не передає idUser. - Якщо передати порожній об’єкт {} або body лише з null/порожніми колекціями, сервер очищає фільтр. - Якщо endDate < startDate, API повертає 400 Bad Request. - Для доступу потрібен scope tests.write. Які edge cases потрібно врахувати? | Сценарій | Поведінка API | Що зробити інтегратору | | ------------------------------------------- | ---------------------------------------------------- | --------------------------------------------- | | Порожній body {} | Сервер очищає фільтр | Передавати {}, якщо потрібно скинути фільтр | | Body лише з null або порожніми колекціями | Сервер очищає фільтр | Використовувати для очищення фільтра | | endDate < startDate | API повертає 400 Bad Request | Перевіряти діапазон дат перед запитом | | Ротація company API key | Оновлення не прив’язане до конкретного active key id | Не створювати залежність від active key id | Які помилки може повернути API? | HTTP status | Опис | | --------------------------- | ----------------------------------------------------------- | | 400 Bad Request | Невалідний діапазон дат або інші невалідні значення фільтра | | 401 Unauthorized | Відсутній або невалідний Bearer token | | 403 Forbidden | Недостатньо прав | | 500 Internal Server Error | Неочікувана помилка | | 503 Service Unavailable | Збій сервісу | Як використовувати результат у наступних API-запитах? Після оновлення або очищення фільтра наступні запити до пошуку та експорту звітів з тестування будуть виконуватись з урахуванням актуального фільтра. Приклад пошуку звітів після оновлення фільтра: curl -X POST 'https://smartway.pro/api/v1/tests/reports/search' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Яких помилок інтегратору варто уникати? - Передавати idUser у request body або query string. - Передавати endDate, менший за startDate. - Очікувати, що фільтр прив’язаний до конкретного active key id. - Забувати, що порожній {} очищає фільтр. - Викликати endpoint без scope tests.write. FAQ Як очистити фільтр? Передайте порожній JSON-об’єкт {} або body лише з null/порожніми колекціями. Що буде, якщо endDate < startDate? API поверне 400 Bad Request. Чи потрібно передавати idUser? Ні. idUser зовнішній клієнт не передає. Який scope потрібен? Для доступу потрібен scope tests.write. До чого прив’язаний фільтр? Фільтр прив’язаний до userKey, який береться із subject Bearer token.

Востаннє оновлено Apr 28, 2026

Як надіслати кандидату запрошення на тестування через API

Endpoint POST /api/v1/tests/invitations/candidates створює HR-запрошення кандидату на тестування. У body потрібно передати ім’я, прізвище, email, gender і список testIds; sendCopyToHr є необов’язковим. Параметр lang керує мовою листа-запрошення і мовою посилання на проходження тесту. Який endpoint використовується? Використовується POST /api/v1/tests/invitations/candidates. Endpoint створює запрошення кандидату на проходження одного або кількох тестів. | Параметр | Значення | | ------------ | -------------------------------------- | | Method | POST | | Endpoint | /api/v1/tests/invitations/candidates | | Base URL | https://smartway.pro | | Auth | Bearer token | | Content-Type | application/json | Для чого використовується цей API endpoint? Endpoint використовується для надсилання HR-запрошення кандидату на тестування. Його застосовують у рекрутингових інтеграціях, коли зовнішня система передає кандидата та список тестів для проходження. Які передумови потрібні перед виконанням запиту? - Потрібен Bearer token з company context. - Token має містити scope tests.write. - Потрібен хоча б один активний testId, доступний поточній компанії. | Передумова | Опис | Обов’язково | | -------------- | ------------------------------ | --------------- | | access_token | Bearer token з company context | Так | | tests.write | Scope для створення запрошення | Так | | testIds | Список ID активних тестів | Так | Які параметри потрібно передати в запиті? Headers | Header | Тип | Обов’язково | Опис | | --------------- | ------- | --------------- | ---------------------------------------------- | | Authorization | string | Так | Bearer token у форматі Bearer <access_token> | | Accept | string | Так | application/json | | Content-Type | string | Так | application/json | Path parameters Path parameters відсутні. Query parameters | Параметр | Тип | Обов’язково | Опис | | ------------ | ------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------ | | lang | string | Ні | Мова запрошення. Підтримуються uk, ru, en. Якщо параметр відсутній або передано інше значення, сервер використовує en. | Request body | Параметр | Тип | Обов’язково | Опис | | -------------- | ------- | --------------- | ----------------------------------------------------------------------------- | | name | string | Так | Ім’я кандидата | | surname | string | Так | Прізвище кандидата | | email | string | Так | Email кандидата | | gender | string | Так | Допустимі лише значення Male або Female | | testIds | int64[] | Так | Список ID тестів; має містити хоча б один елемент | | sendCopyToHr | boolean | Ні | Якщо true, сервер додатково надсилає копію запрошення на HR email із токена | curl приклад curl -X POST 'https://smartway.pro/api/v1/tests/invitations/candidates?lang=uk' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "name": "Іван", "surname": "Петренко", "email": "candidate@company.test", "gender": "Male", "testIds": [5, 200001], "sendCopyToHr": true }' Яку відповідь повертає API? Успішний запит повертає 202 Accepted. Що відбувається під капотом? - idCompany не передається у body або query string: його буде взято з Bearer token. - hrEmail не передається зовнішнім клієнтом: його буде взято з Bearer token. - lang приймає лише uk, ru, en; якщо параметр не передано або значення не підтримується, запрошення надсилається англійською (en). - gender приймає лише Male або Female. - testIds має містити хоча б один елемент. - Перед створенням запрошення сервер перевіряє кожен testId: тест має існувати та бути активним. - Якщо в запиті є кілька невалідних testIds, API повертає одну 400 Bad Request з переліком усіх проблемних елементів. - Для доступу потрібен scope tests.write. Які edge cases потрібно врахувати? | Сценарій | Поведінка API | Що зробити інтегратору | | ------------------------------------------------- | ------------------------------------------------------------------------ | -------------------------------------------------------------- | | lang відсутній або не підтримується | Сервер використовує en | Передавати uk, ru або en, якщо потрібна конкретна мова | | gender не Male або Female | API повертає 400 Bad Request | Передавати лише Male або Female | | testIds порожній | API повертає 400 Bad Request | Передавати хоча б один testId | | Один або кілька testIds не існують чи неактивні | API повертає одну 400 Bad Request з переліком усіх проблемних testId | Попередньо перевіряти testIds через каталог або деталі тесту | Які помилки може повернути API? | HTTP status | Опис | | --------------------------- | -------------------------------------------------------------------------------------------------------------------- | | 400 Bad Request | Відсутній required-параметр, gender не дорівнює Male / Female, або хоча б один testId не існує чи неактивний | | 401 Unauthorized | Відсутній або невалідний Bearer token | | 403 Forbidden | Недостатньо прав | | 500 Internal Server Error | Неочікувана помилка | | 503 Service Unavailable | Збій сервісу | Приклад error response: { "type": "https://smartway.pro/problems/public-api", "title": "Bad Request", "status": 400, "detail": "Candidate invitation contains invalid testIds: testId 2 does not exist; testId 3 is inactive.", "instance": "/api/v1/tests/invitations/candidates" } Як використовувати результат у наступних API-запитах? Перед створенням запрошення отримайте доступні testId через каталог тестів. Отримані testIds передавайте в body запиту у масиві testIds. Приклад отримання каталогу тестів перед створенням запрошення: curl -X GET 'https://smartway.pro/api/v1/tests' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Яких помилок інтегратору варто уникати? - Передавати idCompany або hrEmail у body. - Передавати gender у значеннях, відмінних від Male або Female. - Передавати порожній testIds. - Використовувати неактивні або неіснуючі testIds. - Очікувати помилку для непідтримуваного lang, хоча API використовує en. FAQ Який status повертається при успішному створенні запрошення? API повертає 202 Accepted. Чи потрібно передавати idCompany? Ні. idCompany буде взято з Bearer token. Звідки береться HR email? hrEmail буде взято з Bearer token; зовнішній клієнт його не передає. Які значення підтримує gender? Допустимі лише Male або Female. Що буде, якщо кілька testIds невалідні? API поверне одну 400 Bad Request з переліком усіх проблемних елементів.

Востаннє оновлено Apr 28, 2026

Як надіслати співробітникам запрошення на тестування через API

Endpoint POST /api/v1/tests/invitations/employees робить масову розсилку співробітникам запрошень на тестування. У body потрібно передати непорожні масиви employeeIds і testIds. Параметр lang керує мовою листів-запрошень і мовою посилань на проходження тесту. Який endpoint використовується? Використовується POST /api/v1/tests/invitations/employees. Endpoint надсилає запрошення на тестування списку співробітників. | Параметр | Значення | | ------------ | ------------------------------------- | | Method | POST | | Endpoint | /api/v1/tests/invitations/employees | | Base URL | https://smartway.pro | | Auth | Bearer token | | Content-Type | application/json | Для чого використовується цей API endpoint? Endpoint використовується для масової розсилки запрошень на тестування співробітникам компанії. Його застосовують у HR-інтеграціях, коли зовнішня система має список співробітників і список тестів. Які передумови потрібні перед виконанням запиту? - Потрібен Bearer token з company context. - Token має містити scope tests.write. - Потрібен хоча б один employeeId у межах поточної компанії. - Потрібен хоча б один testId. | Передумова | Опис | Обов’язково | | -------------- | ------------------------------ | --------------- | | access_token | Bearer token з company context | Так | | tests.write | Scope для створення запрошень | Так | | employeeIds | Список ID співробітників | Так | | testIds | Список ID тестів | Так | Які параметри потрібно передати в запиті? Headers | Header | Тип | Обов’язково | Опис | | --------------- | ------- | --------------- | ---------------------------------------------- | | Authorization | string | Так | Bearer token у форматі Bearer <access_token> | | Accept | string | Так | application/json | | Content-Type | string | Так | application/json | Path parameters Path parameters відсутні. Query parameters | Параметр | Тип | Обов’язково | Опис | | ------------ | ------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------ | | lang | string | Ні | Мова запрошення. Підтримуються uk, ru, en. Якщо параметр відсутній або передано інше значення, сервер використовує en. | Request body | Параметр | Тип | Обов’язково | Опис | | ------------- | ------- | --------------- | --------------------------------------------------------- | | employeeIds | int64[] | Так | Список ID співробітників; має містити хоча б один елемент | | testIds | int64[] | Так | Список ID тестів; має містити хоча б один елемент | curl приклад curl -X POST 'https://smartway.pro/api/v1/tests/invitations/employees?lang=en' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "employeeIds": [101, 102], "testIds": [5, 200001] }' Яку відповідь повертає API? Успішний запит повертає 202 Accepted. Що відбувається під капотом? - idCompany не передається у body або query string: його буде отримано з Bearer token. - hrEmail не передається зовнішнім клієнтом: його буде отримано з Bearer token. - lang приймає лише uk, ru, en; якщо параметр не передано або значення не підтримується, запрошення надсилаються англійською (en). - employeeIds і testIds мають містити хоча б один елемент. - Якщо хоча б один employee відсутній у межах поточної компанії, API повертає 404 Not Found. - Для доступу потрібен scope tests.write. Які edge cases потрібно врахувати? | Сценарій | Поведінка API | Що зробити інтегратору | | -------------------------------------------------- | ------------------------------ | ------------------------------------------------------------ | | lang відсутній або не підтримується | Сервер використовує en | Передавати uk, ru або en, якщо потрібна конкретна мова | | employeeIds порожній | API повертає 400 Bad Request | Передавати хоча б один employeeId | | testIds порожній | API повертає 400 Bad Request | Передавати хоча б один testId | | Хоча б одного співробітника не знайдено в tenant-і | API повертає 404 Not Found | Перевіряти, що всі employeeIds належать поточній компанії | Які помилки може повернути API? | HTTP status | Опис | | --------------------------- | ------------------------------------------------------------------ | | 400 Bad Request | Відсутні або порожні employeeIds / testIds | | 401 Unauthorized | Відсутній або невалідний Bearer token | | 403 Forbidden | Недостатньо прав | | 404 Not Found | Хоча б одного співробітника не знайдено в межах поточного tenant-а | | 500 Internal Server Error | Неочікувана помилка | | 503 Service Unavailable | Збій сервісу | Як використовувати результат у наступних API-запитах? Перед масовою розсилкою отримайте доступні testId через каталог тестів. У body передавайте співробітників у employeeIds, а тести — у testIds. Приклад отримання каталогу тестів: curl -X GET 'https://smartway.pro/api/v1/tests' \ -H 'Authorization: Bearer <access_token>' \ -H 'Accept: application/json' Яких помилок інтегратору варто уникати? - Передавати idCompany або hrEmail у body. - Передавати порожній employeeIds або testIds. - Передавати employeeIds, які не належать поточній компанії. - Очікувати помилку для непідтримуваного lang, хоча API використовує en. - Викликати endpoint без scope tests.write. FAQ Який status повертається при успішній розсилці? API повертає 202 Accepted. Чи потрібно передавати idCompany? Ні. idCompany буде отримано з Bearer token. Що буде, якщо один співробітник не знайдений? API поверне 404 Not Found, якщо хоча б одного співробітника не знайдено в межах поточного tenant-а. Які масиви обов’язкові? Обов’язкові непорожні employeeIds і testIds. Який scope потрібен? Для доступу потрібен scope tests.write.

Востаннє оновлено Apr 28, 2026