HR Directory API

API интеграции сотрудников

API позволяет синхронизировать справочник сотрудников из 1С и других учётных или HR-систем (ERP, HRM, собственная учётная система) с организацией в Оснарис. Контракт универсальный и не привязан к конкретному источнику данных.

Введение

  1. Создайте интеграцию в личном кабинете Оснарис
  2. Получите API-ключ
  3. Выполните preview данных
  4. Запустите синхронизацию
  5. При необходимости читайте синхронизированный справочник

Интеграция создаётся в личном кабинете Оснарис, в разделе модуля «Обучение» — там же выдаётся API-ключ.

Авторизация

Текущий API использует Bearer-токен:

Authorization: Bearer odk_xxxxx

API-ключ относится к конкретной организации и конкретному source system. Секрет создаётся в Оснарис и не должен публиковаться в клиентском frontend-коде.

Scopes

training.directory.read
чтение сотрудников, синхронизированных данным source system.
training.directory.write
preview и синхронизация сотрудников.

Сотрудники

GET /employees

Возвращает всех сотрудников организации для данного source system, синхронизированных ранее через этот API.

Требуемый scope: training.directory.read

POST /employees:preview

Проверяет пакет сотрудников и показывает, какие записи будут созданы или обновлены, без применения изменений.

Требуемый scope: training.directory.write

POST /employees:sync

Создаёт и обновляет сотрудников из пакета. Поддерживает безопасный повтор запроса через заголовок Idempotency-Key — при совпадении ключа для уже завершённого запуска возвращает тот же результат, не выполняя синхронизацию повторно.

Требуемый scope: training.directory.write

deactivateMissing

  • false / отсутствует — сотрудники, которых нет в текущем пакете, остаются как есть.
  • true — активные сотрудники данного source system, отсутствующие в полном пакете, переводятся в inactive.

Используйте deactivateMissing=true только при передаче полного актуального справочника source system. Разрешено только для непустого пакета без ошибок валидации — иначе запрос отклоняется с 400.

Схема сотрудника

ПолеТипОбязательноеНазначение
externalIdstringдаУникальный ID сотрудника в вашей системе. До 200 символов.
personnelNumberstringнетТабельный номер. До 100 символов.
lastNamestringнетФамилия. До 300 символов.
firstNamestringнетИмя. До 300 символов.
middleNamestringнетОтчество. До 300 символов.
displayNamestringнетГотовое отображаемое имя. До 300 символов. Если не передано, собирается из lastName/firstName/middleName, а при их отсутствии — из externalId.
emailstringнетДо 300 символов.
phonestringнетДо 100 символов.
positionstringнетДолжность. До 300 символов.
departmentstringнетПодразделение. До 300 символов.
managerExternalIdstringнетexternalId руководителя из того же source system. До 200 символов.
status"active" | "inactive"нетПо умолчанию active.
rolesstring[]нетРоли source system. Максимум 50 элементов.
customFieldsobjectнетДополнительные поля произвольной структуры.
updatedAtstring (date-time)нетТолько в ответах GET /employees — не передавайте это поле при sync.

Ограничения

  • externalId обязателен
  • externalId — до 200 символов после обрезки
  • personnelNumber — до 100 символов
  • phone — до 100 символов
  • managerExternalId — до 200 символов
  • большинство текстовых полей — до 300 символов
  • roles — максимум 50 элементов
  • один запрос обрабатывает максимум 5000 сотрудников (лишние попадают в errors, запрос не отклоняется целиком)
  • тело запроса читается с лимитом 8 МиБ

Идентификация и upsert

Сотрудник идентифицируется внутри организации по сочетанию source system + externalId. Повторная синхронизация существующего externalId обновляет запись, новыйexternalId создаёт сотрудника. Email не является первичным ключом.

Руководитель

managerExternalId связывает сотрудника с руководителем из того же source system:

[
  { "externalId": "EMP-001", "displayName": "Руководитель" },
  { "externalId": "EMP-002", "displayName": "Сотрудник", "managerExternalId": "EMP-001" }
]

Ошибки и коды ответа

HTTPКогда
200успешный GET / preview / sync
400некорректный запрос — невалидный JSON, ошибка валидации, запрещённый сценарий deactivateMissing. Внутренние ошибки preview/sync тоже возвращаются как 400, не как 500.
401отсутствующий/невалидный API-ключ или ключ без требуемого scope
429превышен лимит запросов — 120 в минуту для данного API-ключа
500внутренняя ошибка чтения справочника — только на GET /employees

Построчные ошибки в пакете

preview/sync возвращают построчные ошибки прямо внутри 200-ответа:

{
  "index": 3,
  "externalId": "EMP-004",
  "errors": ["status должен быть active или inactive"]
}
  • пустой externalId → ошибка
  • повторяющийся externalId в одном пакете → ошибка
  • невалидный status → ошибка
  • customFields должен быть объектом
  • пакет больше 5000 записей → отдельная строка ошибки, а не отказ всего запроса