Перейти к основному содержанию
POST /developer/v1/ingest/{source_type} принимает пачку записей из внешней системы (HRIS, расчётной системы или собственного справочника) и ставит её в асинхронную обработку. Один запрос несёт записи одного вида: юрлица, подразделения, должности, людей или сотрудников. Используйте его, чтобы наполнить тенант из другой системы и дальше держать его в актуальном состоянии. Повторная отправка записи с тем же external_id обновляет созданный ею объект.

Запрос

Тело: Полный запрос, который загружает одного человека:
Ответ 200:
ACCEPTED означает, что пачка сохранена и поставлена в очередь. Применилась ли каждая запись, становится известно только после обработки, см. Результат.
Заголовок Idempotency-Key обязателен: без него ответ будет 400 с кодом INTEGRATION.IDEMPOTENCY_REQUIRED. Повторная отправка с тем же ключом не создаёт вторую загрузку — вернётся 409 с тем же кодом. Меняете содержимое пачки — меняйте и ключ.

Важно, кому принадлежит ключ

Пачка применяется от имени владельца ключа. Два следствия:
  • Ключ должен создать супер-администратор: область ingest:write доступна только ключам пользователей с правом PERMISSIONS:MANAGE.
  • Чтение результата через GET /employees ограничено профилем прав владельца. Создавайте ключ от администратора, чей профиль охватывает всю компанию, иначе в списке не будет части только что загруженных сотрудников, а владелец вовсе без профиля получит 400 METADATA.FIELD_NOT_VISIBLE.

Порядок загрузки

Ссылки между записями разрешаются по external_id, но не на всякий объект можно сослаться до его появления. Отправляйте пачки в таком порядке:
1

ORGANIZATIONS

Юрлица. На них ссылается всё остальное.
2

DEPARTMENTS

Родительское подразделение может быть в той же пачке или в более ранней.
3

JOB_TITLES

4

PERSONS

Людей нужно загрузить до сотрудников. Сотрудник, чей external_person_id ещё не загружен, отклоняется.
5

EMPLOYEES

Связывает человека с юрлицом, подразделением и должностью.
Подразделение, должность или юрлицо, на которое сослались раньше его собственной записи, создаётся пустой заготовкой и заполняется, когда придёт его пачка. У людей заготовки нет: человек — это аккаунт, который находится по ИИН. Пачки обрабатывают несколько воркеров одновременно, поэтому ACCEPTED на предыдущий запрос не означает, что он уже применён. Для ORGANIZATIONS, DEPARTMENTS и JOB_TITLES порядок прощают заготовки, а EMPLOYEES отправляйте только после того, как пачка PERSONS успела примениться (несколько секунд на сотню записей), и повторно отправляйте сотрудников, отклонённых из-за ещё не загруженного человека.

Сопоставление по external_id

Каждая запись несёт external_id — идентификатор объекта в вашей системе. Платформа хранит привязку external_id → внутренний id в разрезе source_type:
  • запись с уже известным external_id обновляет существующий объект;
  • запись с новым external_id создаёт объект, только если create_missing: true, иначе пропускается;
  • ссылки между записями (external_department_id, external_person_id и т.д.) тоже указываются внешними идентификаторами — платформа разрешает их сама.
Привязка external_id хранится на стороне платформы и не возвращается в GET /employees: у объекта Employee нет поля external_id, и фильтра по нему нет. Чтобы сверять данные после загрузки, храните соответствие на своей стороне либо используйте естественные ключи (табельный номер employee_number, ИИН).
Привязка — единственный ключ сопоставления. Человек или сотрудник, который уже был в тенанте до интеграции (заведён вручную или другим источником), по ИИН или табельному номеру не находится: запись с новым external_id попытается создать второго человека с тем же ИИН и будет отклонена. Начинайте интеграцию на тенанте, где сотрудники приходят только из этого источника, либо согласуйте перенос существующих записей с поддержкой.

Схемы записей

Поля не из схемы игнорируются. Даты — строки YYYY-MM-DD. Пустая строка считается «не задано».

ORGANIZATIONS

DEPARTMENTS

JOB_TITLES

PERSONS

Человек — это личность за сотрудником. Загрузка человека создаёт или находит аккаунт платформы по ИИН; email становится логином этого аккаунта, если у него ещё нет логина.
Поля документа, удостоверяющего личность (номер, орган выдачи, адрес регистрации, гражданство, пол), через ingest сегодня не загружаются. Если их прислать, они игнорируются; заполняйте их в приложении или дождитесь расширения схемы.

EMPLOYEES

Схема сотрудника сегодня не покрывает вид занятости, руководителя, рабочую почту и локацию — они остаются такими, как заданы в приложении. Восстановление уволенного сотрудника через ingest не поддерживается; делайте это в приложении.

1C · EMPLOYEES_FULL и DEPARTMENTS

При source_type = 1C записи идут в формате выгрузки 1С — сотрудник вместе с физлицом, поля на русском: ТабельныйНомер, ДатаПриема, Организация.Ссылка, Подразделение.Ссылка, Должность.Ссылка и вложенный объект ФизЛицо (Имя, Фамилия, Отчество, ИИН, Телефон, ДатаРождения). 1C · DEPARTMENTS — Ссылка, Наименование, Родитель.Ссылка. Для любой другой системы используйте общую схему KEDO.

Обновления и увольнения

Отправьте запись повторно с тем же external_id и новыми значениями. Всегда отправляйте запись целиком, а не только изменившиеся поля. Чтобы уволить сотрудника, пришлите его запись с left_date: сотрудник станет TERMINATED, а end_date заполнится.
Запись сотрудника без left_date применяется как ACTIVE. Если уволенного сотрудника прислать повторно без left_date (например, при полной пересинхронизации), он будет восстановлен. Держите left_date в каждой пачке, где есть уволенный сотрудник, либо не включайте уволенных в последующие пачки.
Удаление объектов через ingest не поддерживается.

Результат

Обработка асинхронная. По каждой пачке платформа ведёт журнал с четырьмя счётчиками: Эндпоинта, который возвращает этот журнал или ошибки по записям для ingest_request_id, пока нет. Практический способ убедиться в результате:
  1. Подождите обработку: пачки в сотни записей обрабатываются за секунды.
  2. Перечитайте данные: GET /employees?updated_since=…&expand=person вернёт созданных и обновлённых сотрудников, GET /employees/{id} — одного.
  3. Подпишитесь на вебхук employee.changed — каждая изменённая карточка придёт событием.
Отклонённые записи не останавливают пачку: остальное применяется. Исправьте отклонённые записи и пришлите их новой пачкой с новым Idempotency-Key.
Неизвестный payload_type или source_type не отклоняется: запрос принимается, а все записи считаются отклонёнными. Проверяйте написание значений — опечатка не вернёт 400.

Ошибки

Дальше

Синхронизация сотрудников

Полная и инкрементальная выгрузка обратно.

Лимиты

Частота запросов и размеры.