Skip to main content
POST /developer/v1/ingest/{source_type} accepts a batch of records from an external system and queues it for asynchronous processing. Scope — ingest:write; it is only available to keys created by super-administrators.
The Idempotency-Key header is required. Re-sending with the same key does not create a second load — you get an “ingest request already exists” error. If the batch content changes, change the key too.

Sources and payload types

An unknown source/payload pair is not an error: the request is accepted and the records are silently skipped (counted as “skipped” in the processing log). Double-check the spelling — a typo will not return a 400.

Matching by external_id

Every record carries an external_id — the object’s identifier in your system. The platform stores an external_id → internal id binding per source_type:
  • a record with a known external_id updates the existing object;
  • a record with a new external_id creates an object only when create_missing: true, otherwise it is skipped;
  • references between records (external_department_id, external_person_id, etc.) also use external identifiers — the platform resolves them itself.
The external_id binding lives on the platform side and is not returned by GET /employees: the Employee object has no external_id field and no filter for it. To reconcile data after a load, keep the mapping on your side or rely on natural keys (the employee_number, the IIN).

Record schemas

Fields outside the schema are ignored. Dates are YYYY-MM-DD strings.

KEDO · PERSONS

KEDO · ORGANIZATIONS

KEDO · DEPARTMENTS

KEDO · EMPLOYEES

KEDO · JOB_TITLES

1C · EMPLOYEES_FULL

Records in the 1C export format — an employee together with the person, fields in Russian: ТабельныйНомер, ДатаПриема, Организация.Ссылка, Подразделение.Ссылка, Должность.Ссылка, and a nested ФизЛицо object (Имя, Фамилия, Отчество, ИИН, Телефон, ДатаРождения). 1C · DEPARTMENTSСсылка, Наименование, Родитель.Ссылка.

Response and tracking progress

Processing is asynchronous. There is currently no status endpoint for an ingest_request_id — a preview limitation. Practical ways to confirm the result:
  1. Wait for processing (batches of hundreds of records take seconds).
  2. Re-read the data: GET /employees?updated_since=… returns the created and updated employees.
  3. Subscribe to the employee.changed webhook — every changed profile arrives as an event.

Next steps

Employee sync

Full and incremental export back out.

Limits

Request rates and sizes.