Как добавить сотрудника через 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 управляет не только бизнес-флагом, но и созданием или отсутствием связанного пользователя на сервере
авторизации.
Предусловия
Клиент должен передать валидный Bearer token.
Token должен содержать company context.
Token должен содержать scope employees.write.
idCompany не передаётся в body или query string.
Запрос
Body parameters
| Поле | Тип | Обязательное | Описание | | ------------- | -------- | ---------------- |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| | email | string | да | Email сотрудника. | | name | string | да | Имя сотрудника. Это источник данных для
формирования fullName при создании. | | surname | string | да | Фамилия сотрудника. Это источник данных для
формирования fullName при создании. | | gender | string | да | Допустимы только значения Male или Female. | | active |
boolean | да | Допустимы только JSON-boolean значения true или false. true создаёт или синхронизирует доступ к личному
кабинету через сервер авторизации; false создаёт сотрудника без такого доступа. | | manager | boolean | нет | Признак
роли руководителя подразделения. Допустимы только JSON-boolean значения true или false; true создаёт или синхронизирует
доступ с ролями сотрудника и руководителя подразделения, даже если active=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,
"manager": false,
"department": "Управление",
"departments": ["КЛ"],
"jobTitle": "Менеджер",
"jobTitles": ["Координатор"],
"phone": "+380000000000",
"notes": "Новый сотрудник public API"
}
JSON
Создать сотрудника только с массивами 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,
"manager": true,
"departments": ["Управление", "КЛ"],
"jobTitles": ["Менеджер", "Координатор"],
"phone": "+380000000000",
"notes": "Новый сотрудник public API"
}
JSON
Ответ
Успешный ответ: 201 Created. Возвращает созданный Employee.
{
"employeeId": 4432,
"candidateId": 10748,
"email": "employee@example.com",
"fullName": "Иван Петренко",
"name": "Иван",
"surname": "Петренко",
"gender": "Female",
"department": "Управление",
"departments": [
"КЛ",
"Управление"
],
"jobTitle": "Менеджер",
"jobTitles": [
"Координатор",
"Менеджер"
],
"phone": "+380000000000",
"active": false,
"manager": 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 | Признак активности. | | manager | boolean | Признак роли руководителя
подразделения. true означает, что сотрудник имеет эту роль. |
Бизнес-логика
API определяет companyId только из Bearer token.
API определяет 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 создаёт или синхронизирует связанный пользовательский аккаунт на сервере авторизации и открывает доступ к
личному кабинету.
active = false создаёт сотрудника без доступа к личному кабинету, то есть без пользовательского аккаунта на сервере
авторизации.
manager = true создаёт или синхронизирует доступ с ролями сотрудника и руководителя подразделения. Если одновременно
передать active = false, manager-доступ имеет приоритет и сотрудник будет создан как активный пользователь кабинета.
manager = false или отсутствие поля manager не назначает роль руководителя подразделения.
manager возвращается в Employee response; после создания эту роль можно изменить через PATCH /v1/employees/{employeeId}.
fullName в ответе формируется сервером из name + surname.
Если передан только departments или jobTitles, первый элемент массива становится primary-значением в department или
jobTitle.
Если передано и одиночное поле, и массив, одиночное поле имеет приоритет как primary, а массив дополняется уникальными
значениями.
Если department, jobTitle, phone или notes не переданы, в соответствующих одиночных полях сохраняется null.
Если departments или jobTitles не переданы, соответствующие коллекции остаются пустыми.
В ответе departments и jobTitles возвращаются в стабильно отсортированном виде.
Edge cases
| Сценарий | Поведение API | | ----------------------------------------------- |
---------------------------------------------------------------------------------- | | Отсутствует required-поле | API
возвращает 400 Bad Request. | | gender имеет значение не Male и не Female | API возвращает 400 Bad Request с
пояснением. | | active передан строкой или числом | API возвращает 400 Bad Request, потому что active должен
быть JSON-boolean. | | manager передан строкой или числом | API возвращает 400 Bad Request, потому что manager должен
быть JSON-boolean. | | active=false и manager=true | Manager-доступ имеет приоритет; сотрудник создаётся активным. | |
email уже существует | API возвращает 409 Conflict. | | Передан только departments | Первый элемент массива становится
department. | | Переданы department и departments | department остаётся primary, а departments дополняется уникальными
значениями. | | Не передан department или jobTitle | В соответствующем одиночном поле сохраняется null. | | Не передан
departments или jobTitles | Соответствующая коллекция остаётся пустой. |
Ошибки
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. | | 400 Bad
Request | manager не является JSON-boolean значением true или false. | | 401 Unauthorized | Bearer token отсутствует или
невалиден. | | 403 Forbidden | Недостаточно прав или token без company context. | | 409 Conflict | Employee с таким
email уже существует. | | 500 Internal Server Error | Неожиданная ошибка API. | | 503 Service Unavailable | Сбой
внутренней серверной интеграции. |
Использование
Создать активного сотрудника с доступом к личному кабинету: active = true.
Создать сотрудника без доступа к личному кабинету: active = false.
Создать сотрудника с ролью руководителя подразделения: manager = true.
Синхронизировать сотрудников из внешней HR-системы.
Типичные ошибки
Typical integration mistakes
| Типичная ошибка | Как правильно | | ----------------------------------------------------------- |
--------------------------------------------------------------- | | Передавать active как строку "true" или "false" |
Передавайте true или false как JSON-boolean. | | Передавать manager как строку "true" или "false" | Передавайте true
или false как JSON-boolean. | | Передавать gender в значении, отличном от Male/Female | Используйте только Male или
Female. | | Передавать idCompany или hrEmail | Не передавайте эти значения; API определяет их из Bearer token. | |
Ожидать идемпотентность через Idempotency-Key | В текущей реализации Idempotency-Key не используется. | |
Передавать fullName вместо name и surname | Передавайте name и surname; fullName формирует сервер. |
FAQ
Какие поля обязательны для создания сотрудника?
email, name, surname, gender и active.
Что делает active = true?
Сервер создаёт или синхронизирует связанный пользовательский аккаунт на сервере авторизации и открывает доступ к личному
кабинету.
Что делает active = false?
Сотрудник создаётся без доступа к личному кабинету, то есть без пользовательского аккаунта на сервере авторизации.
Что делает manager = true?
Сервер создаёт или синхронизирует доступ с ролями сотрудника и руководителя подразделения. Если одновременно передать
active = false, сотрудник всё равно будет создан как активный пользователь кабинета.
Что будет, если email уже существует?
API вернёт 409 Conflict.
Нужно ли передавать hrEmail?
Нет. API определяет hrEmail из Bearer token.