Для AI-агентов: markdown этой страницы — /docs-content/import.md индекс документации — /llms.txt

Импорт записей CRM

Перенос уже существующих данных в CRM: до 100 записей за запрос, с сохранением автора и дат из внешней системы.

Импорт не запускает автоматизацию. Роботы, триггеры и бизнес-процессы, настроенные на создание элемента, на импортированных записях не срабатывают — это свойство самой операции в Битрикс24, а не наш параметр. Если вам нужно, чтобы автоматизация отработала, создавайте записи обычным способом — POST /v1/{entity}.

POST /v1/{entity}/import

Скоуп: crm | Базовый URL: https://vibecode.bitrix24.tech/v1 | Авторизация: X-Api-Key (APP-ключ)

Параметры

Параметр Тип Обяз. Описание
Параметрentity (path) Типstring Обяз.да ОписаниеОбъект CRM, в который идёт импорт. Допустимые пути — в таблице ниже. Для элементов смарт-процессов entityTypeId берётся из GET /v1/smart-processes
Путь Объект
ПутьPOST /v1/leads/import ОбъектЛиды
ПутьPOST /v1/deals/import ОбъектСделки
ПутьPOST /v1/contacts/import ОбъектКонтакты
ПутьPOST /v1/companies/import ОбъектКомпании
ПутьPOST /v1/quotes/import ОбъектПредложения
ПутьPOST /v1/invoices/import ОбъектСчета
ПутьPOST /v1/items/{entityTypeId}/import ОбъектЭлементы смарт-процессов

У остальных сущностей такого маршрута нет — Битрикс24 умеет импортировать только объекты CRM.

Поля запроса (body)

Поле Тип Обяз. Описание
Полеitems Типarray Обяз.да ОписаниеМассив записей, от 1 до 100. Поля каждой записи — те же, что у POST /v1/{entity}, плюс служебные поля ниже. Поля записи передаются плоско: объект fields при отсутствии этого поля в схеме отклоняет весь импорт с 400 IMPORT_ITEM_VALIDATION, индексом записи и причиной NESTED_FIELDS_ENVELOPE.
Полеitems[].createdBy Типnumber Обяз.нет ОписаниеКто создал запись. Список сотрудников: GET /v1/users
Полеitems[].createdTime Типdatetime Обяз.нет ОписаниеКогда запись создана
Полеitems[].updatedBy Типnumber Обяз.нет ОписаниеКто изменил запись. Список сотрудников: GET /v1/users
Полеitems[].updatedTime Типdatetime Обяз.нет ОписаниеКогда запись изменена
Полеitems[].movedBy Типnumber Обяз.нет ОписаниеКто перевёл запись на текущую стадию. Список сотрудников: GET /v1/users
Полеitems[].movedTime Типdatetime Обяз.нет ОписаниеКогда стадия изменилась

Шесть служебных полей принимаются только на импорте — при обычном создании Битрикс24 заполняет их сам.

Проставить их может только администратор портала. Обычному пользователю Битрикс24 ответит по такой записи ошибкой CRM_FIELD_ERROR_VALUE_NOT_VALID — остальные записи пакета при этом создадутся.

Передавайте существующего сотрудника. Битрикс24 не проверяет идентификатор на существование и запишет любое число — в карточке будет призрачный автор. Записью при этом можно управлять так же, как любой другой.

Набор доступных полей отличается по объектам: у сделок и счетов есть все шесть, у лидов — автор и даты создания и изменения. Точный перечень для конкретной сущности возвращает GET /v1/{entity}/fields — служебные поля помечены там "importable": true рядом с "readonly": true. Тот же признак доступен без сессии в GET /v1/guide, в data.entities[].fieldsDetailed.

Примеры

curl — личный ключ

Terminal
curl -X POST 'https://vibecode.bitrix24.tech/v1/leads/import' \
  -H 'X-Api-Key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "items": [
      {
        "title": "Website request",
        "name": "Jane",
        "lastName": "Doe",
        "phone": "+15551234567",
        "email": "jane@example.com",
        "assignedById": 31,
        "createdBy": 11
      }
    ]
  }'

curl — OAuth-приложение

Terminal
curl -X POST 'https://vibecode.bitrix24.tech/v1/leads/import' \
  -H 'X-Api-Key: YOUR_APP_KEY' \
  -H 'Authorization: Bearer USER_SESSION_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "items": [
      {
        "title": "Website request",
        "name": "Jane",
        "lastName": "Doe",
        "phone": "+15551234567",
        "email": "jane@example.com",
        "assignedById": 31,
        "createdBy": 11
      }
    ]
  }'

JavaScript — личный ключ

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/leads/import', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    items: [
      {
        title: 'Website request',
        name: 'Jane',
        lastName: 'Doe',
        phone: '+15551234567',
        email: 'jane@example.com',
        assignedById: 31,
        createdBy: 11,
      },
    ],
  }),
})

const { data } = await res.json()
console.log('Не создано:', data.summary.failed)

JavaScript — OAuth-приложение

javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/leads/import', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    items: [
      {
        title: 'Website request',
        name: 'Jane',
        lastName: 'Doe',
        phone: '+15551234567',
        email: 'jane@example.com',
        assignedById: 31,
        createdBy: 11,
      },
    ],
  }),
})

const { data } = await res.json()
console.log('Не создано:', data.summary.failed)

Поля ответа

Ответ приходит со статусом 200 даже когда часть записей не прошла — импорт не транзакционен, и результат нужно читать по каждой записи.

Поле Тип Описание
Полеsuccess Типboolean Описаниеtrue, когда запрос обработан — даже если часть записей не создана
Полеdata.results Типarray ОписаниеИсход по каждой записи. Длина results всегда равна длине items.
Полеdata.results[].index Типnumber ОписаниеПозиция записи в отправленном массиве items.
Полеdata.results[].success Типboolean ОписаниеСоздана ли запись.
Полеdata.results[].id Типnumber ОписаниеИдентификатор созданной записи. Приходит при success: true — и при отказах STAGE_NOT_APPLIED / AMOUNT_NOT_APPLIED, потому что запись при них уже создана.
Полеdata.results[].error Типstring ОписаниеКод ошибки Битрикс24 — либо код проверки платформы: STAGE_NOT_APPLIED, когда переданная стадия или воронка не применилась, например несуществующее значение, и запись создана на стадии по умолчанию, и AMOUNT_NOT_APPLIED, когда явно запрошенный ручной режим суммы у элемента смарт-процесса не сохранился — у типа без товарной части.
Полеdata.results[].message Типstring ОписаниеПояснение к ошибке. У кодов проверки платформы называет запрошенное и фактическое значение.
Полеdata.results[].details Типobject ОписаниеТолько у кодов проверки платформы: unappliedFields — что не применилось, currentValues — что стоит в записи.
Полеdata.summary Типobject ОписаниеСводка: total, succeeded, failed.

Пример ответа

Первая запись создана, вторая отклонена Битрикс24 — дата создания в будущем:

JSON
{
  "success": true,
  "data": {
    "results": [
      { "index": 0, "success": true, "id": 1001349 },
      {
        "index": 1,
        "success": false,
        "error": "CRM_FIELD_ERROR_VALUE_NOT_VALID",
        "message": "Значение поля \"Когда создан\" не может быть в будущем времени"
      }
    ],
    "summary": { "total": 2, "succeeded": 1, "failed": 1 }
  }
}

Пример ответа при ошибке

400 — массив items не передан:

JSON
{
  "success": false,
  "error": {
    "code": "IMPORT_ITEM_VALIDATION",
    "message": "items must be a non-empty array of lead objects"
  }
}

Ошибки

HTTP Код Когда
HTTP400 КодIMPORT_ITEM_VALIDATION Когдаitems отсутствует, пуст или не массив, элемент не объект либо пуст, в элементе поле, недоступное на запись, включая объект fields при отсутствии такого поля в схеме. Текст называет позицию и причину NESTED_FIELDS_ENVELOPE: Item at index N: …
HTTP400 КодIMPORT_LIMIT_EXCEEDED КогдаБольше 100 записей в запросе. Разбейте пакет и отправьте части по порядку.
HTTP400 КодINVALID_DYNAMIC_PARAM КогдаНекорректный entityTypeId в пути /v1/items/{entityTypeId}/import, либо у этого типа есть свой маршрут, например для сделок — /v1/deals/import.
HTTP403 КодWRITE_BLOCKED_READONLY_KEY КогдаКлюч работает в режиме «только чтение».
HTTP403 КодSCOPE_DENIED КогдаУ ключа нет скоупа crm.
HTTP429 КодRATE_LIMITED КогдаСлишком часто. Импорт ограничен по темпу на портал, чтобы массовая заливка не блокировала другие интеграции. Повторите через время из заголовка Retry-After.
HTTP404 Код— КогдаУ этой сущности импорта нет.

Ошибки по отдельным записям приходят внутри 200, в results[] — там коды самого Битрикс24 и два кода проверки платформы, STAGE_NOT_APPLIED и AMOUNT_NOT_APPLIED.

Полный список общих ошибок API — Ошибки.

Известные особенности

Чем импорт отличается от создания

POST /v1/{entity} POST /v1/{entity}/import
Право в Битрикс24 POST /v1/{entity}право на добавление POST /v1/{entity}/importправо на импорт — отдельное, выдаёт администратор портала
Роботы и бизнес-процессы POST /v1/{entity}запускаются POST /v1/{entity}/importне запускаются
Автор и даты записи POST /v1/{entity}проставляет Битрикс24 POST /v1/{entity}/importможно передать свои — служебные поля в «Поля запроса»
За один запрос POST /v1/{entity}одна запись POST /v1/{entity}/importдо 100 записей
Ответ POST /v1/{entity}созданная запись целиком POST /v1/{entity}/importисход по каждой записи

Ограничение на даты

У createdTime есть окно, которое задаёт Битрикс24, и обойти его нельзя:

  • дата не может быть позже текущего момента.
  • дата не может быть раньше, чем у самой свежей уже существующей записи этого объекта.

То есть перенести историю целиком получится в пустую CRM или в такую, где все записи старше переносимых. В наполненную CRM «подложить» записи задним числом Битрикс24 не даст — ответит CRM_FIELD_ERROR_VALUE_NOT_VALID с пояснением. Каждая успешно импортированная запись поднимает нижнюю границу окна, поэтому переносите пачки от старых к новым.

updatedTime должен быть не раньше createdTime, а movedTime — попадать между ними.

Если история не нужна, просто не передавайте даты: автора можно проставить и без них.

Проверка итогов импорта

Всегда проверяйте summary.failed. Статус 200 означает «запрос обработан», а не «все записи созданы».

Стадия и ручная сумма сверяются после импорта. Битрикс24 принимает импорт с несуществующей стадией и молча кладёт запись на стадию по умолчанию. Ручной режим суммы у типа без товарной части так же молча теряется. Поэтому после всех пачек платформа перечитывает созданные записи — один раз на каждые 50, страницей списка — и помечает те, у кого стадия, воронка или явно запрошенный isManualOpportunity: true не применились, кодом STAGE_NOT_APPLIED / AMOUNT_NOT_APPLIED — с сохранённым id: запись существует, повторять её нельзя, исправьте значение через PATCH или /move. Перечитываются только записи, у которых была стадия, воронка или явный ручной режим суммы. Импорт без них стоит ровно столько, сколько раньше. Импорт не запускает правила автоматизации, поэтому перечитанная запись — итог самого импорта, а не робота. Если перечитать не удалось, строки остаются такими, как их вернул Битрикс24. Пустая стадия (null, "") не сверяется — запись ляжет на стадию по умолчанию. Сумма без явного isManualOpportunity: true не проверяется. Лид, который портал в простом режиме CRM сам перевёл в «сконвертирован», за неприменённую стадию не считается.

Повторный импорт создаст дубли — идемпотентности у операции нет. Если повторы возможны, записывайте идентификатор записи из внешней системы в поля originatorId и originId: по ним потом можно найти уже перенесённое.

Что учесть при переносе базы

  • Один поток. Внутри одного запроса порядок гарантирован, между параллельными запросами — нет, а Битрикс24 требует неубывающих дат создания. Импортируйте последовательно.
  • Скорость. Сто записей за запрос — примерно 12–15 секунд. Лимит темпа даёт около тысячи записей в минуту на портал. Для базы в десятки тысяч записей закладывайте время.
  • Сбой посреди пакета. Если связь с Битрикс24 оборвалась после того, как часть записей уже создана, ответ всё равно придёт со статусом 200: созданные будут с идентификаторами, оставшиеся — помечены ошибкой. Это единственный источник знания о том, что успело пройти, — перед повтором сверьтесь с ним.
  • Телефон и почта. Передавайте в том же виде, что и при создании ("phone": "+15551234567" или массивом объектов) — приведение к формату, который принимает импорт, платформа делает сама.

Смотрите также