[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-duplicates":3,"docs-tabs-duplicates":6},{"content":4,"lastmod":5},"# Поиск дубликатов\n\n`POST \u002Fv1\u002Fduplicates\u002Ffind`\n\nНаходит в CRM лиды, контакты и компании, у которых телефон или адрес электронной почты совпадает с переданными значениями. Применяется перед созданием новой записи, чтобы не плодить дубли, при импорте данных из внешних источников и когда запись нужно найти по номеру телефона.\n\nБитрикс24 API: `crm.duplicate.findbycomm`\nСкоуп: `crm`\n\n## Поля запроса (body)\n\n| Поле | Тип | Обяз. | Описание |\n|------|-----|:-----:|----------|\n| `type` | string | да | Тип значения для поиска: `phone` или `email` |\n| `values` | array | да | Список значений для проверки — телефоны или адреса электронной почты. Максимум 20 значений за запрос |\n| `entityType` | string | нет | Ограничить поиск одним типом: `lead`, `contact` или `company`. Без параметра поиск идёт по всем трём типам |\n\n## Примеры\n\n### curl — личный ключ\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fduplicates\u002Ffind \\\n  -H \"X-Api-Key: YOUR_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"type\": \"phone\",\n    \"values\": [\"+79991234567\"]\n  }'\n```\n\n### curl — OAuth-приложение\n\n```bash\ncurl -X POST https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fduplicates\u002Ffind \\\n  -H \"X-Api-Key: YOUR_APP_KEY\" \\\n  -H \"Authorization: Bearer USER_SESSION_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"type\": \"phone\",\n    \"values\": [\"+79991234567\"]\n  }'\n```\n\n### JavaScript — личный ключ\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fduplicates\u002Ffind', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    type: 'phone',\n    values: ['+79991234567'],\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n### JavaScript — OAuth-приложение\n\n```javascript\nconst res = await fetch('https:\u002F\u002Fvibecode.bitrix24.tech\u002Fv1\u002Fduplicates\u002Ffind', {\n  method: 'POST',\n  headers: {\n    'X-Api-Key': 'YOUR_APP_KEY',\n    'Authorization': 'Bearer USER_SESSION_TOKEN',\n    'Content-Type': 'application\u002Fjson',\n  },\n  body: JSON.stringify({\n    type: 'phone',\n    values: ['+79991234567'],\n  }),\n})\n\nconst { success, data } = await res.json()\n```\n\n## Поля ответа\n\n| Поле | Тип | Описание |\n|------|-----|----------|\n| `success` | boolean | Всегда `true` при успехе |\n| `data` | object \\| array | Найденные совпадения, сгруппированные по типу сущности. Пустой массив `[]`, если совпадений нет |\n| `data.lead` | array | ID лидов с совпадающим контактом. Карточки: `GET \u002Fv1\u002Fleads` |\n| `data.contact` | array | ID контактов с совпадающим контактом. Карточки: `GET \u002Fv1\u002Fcontacts` |\n| `data.company` | array | ID компаний с совпадающим контактом. Карточки: `GET \u002Fv1\u002Fcompanies` |\n\n## Пример ответа\n\nНайдены совпадения — `data` содержит ключи по типам сущностей:\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"lead\": [105],\n    \"contact\": [42]\n  }\n}\n```\n\nСовпадений нет — `data` приходит пустым массивом:\n\n```json\n{\n  \"success\": true,\n  \"data\": []\n}\n```\n\n## Пример ответа при ошибке\n\n400 — не переданы обязательные параметры:\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"MISSING_PARAMS\",\n    \"message\": \"Required: type (\\\"PHONE\\\" or \\\"EMAIL\\\"), values (string array, max 20)\"\n  }\n}\n```\n\n## Ошибки\n\n| HTTP | Код | Описание |\n|------|-----|----------|\n| 400 | `MISSING_PARAMS` | Не передан `type` или `values`, либо `values` — пустой массив |\n| 400 | `TOO_MANY_VALUES` | В `values` больше 20 значений |\n| 422 | `BITRIX_ERROR` | Недопустимый `type` — текст ошибки приходит в поле `message` |\n| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `crm` |\n| 401 | `TOKEN_MISSING` | У ключа не настроены токены доступа |\n\nПолный список общих ошибок API — [Ошибки](\u002Fdocs\u002Ferrors).\n\n## Известные особенности\n\n**Номер находится в любом написании и по любому из номеров записи.** Значения `+7 (999) 123-45-67`, `+79991234567` и `89991234567` найдут одну и ту же запись, как бы номер ни был сохранён на портале. Если у контакта записаны рабочий и мобильный телефоны, метод найдёт его по каждому из них. Поэтому запись по номеру ищут этим методом, а не фильтром `filter.phone` в списке или поиске: тот сравнивает строку с сохранённым значением целиком и видит только первый номер записи — [Фильтр по телефону и почте](\u002Fdocs\u002Ffiltering#фильтр-по-телефону-и-почте). Номер передаётся целиком: без кода страны или без ведущей «8» он не опознаётся.\n\n**Тип `data` зависит от результата.** При совпадениях это объект с ключами по типам сущностей, при их отсутствии — пустой массив `[]`. Перед обработкой проверяйте тип: `Array.isArray(data)` означает «совпадений нет».\n\n**Одно значение может совпасть сразу в нескольких типах.** Если телефон или адрес электронной почты есть и у лида, и у контакта, в ответе придут оба ключа со своими ID. Без `entityType` проверяйте все вернувшиеся группы, а не только первую.\n\n## Смотрите также\n\n- [Синтаксис фильтрации](\u002Fdocs\u002Ffiltering)\n- [Контакты](\u002Fdocs\u002Fentities\u002Fcontacts)\n- [Лиды](\u002Fdocs\u002Fentities\u002Fleads)\n- [Компании](\u002Fdocs\u002Fentities\u002Fcompanies)\n- [Справочник сущностей](\u002Fdocs\u002Fentity-api)\n- [Ошибки](\u002Fdocs\u002Ferrors)\n","2026-07-13",{}]