[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MJRAMXZGEVYWCMP0XS0YX4":3,"skill-same:01M6MJRAMXZGEVYWCMP0XS0YX4":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":33,"commitSha":34,"skillDirectory":35,"forksCount":36,"repositoryHtmlUrl":37,"repositoryHomepageUrl":38,"ownerHtmlUrl":39,"ownerBlogUrl":40,"ownerDescription":41,"updatedAt":42,"install":43,"resources":56},"01M6MJRAMXZGEVYWCMP0XS0YX4","bitrix24-crm-api",null,"Безопасное подключение к Битрикс24 через входящий вебхук или локальное приложение: чтение лидов, сделок, воронок, стадий, источников, UTM, звонков и истории стадий, сверка с Яндекс Директом и Метрикой, атрибуция обращений, запись только по плану и разрешению владельца. Использовать вместо amoCRM\u002FRoistat, когда CRM клиента — Битрикс24.","hashgraph-online\u002Fawesome-codex-plugins","hashgraph-online","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F160371962?v=4","01M6CNB6NRJVNNGN14TR01Q6D3","HOL (Hashgraph Online)","01M6JT1HSKKG9V68KQAQGBA7XP",1559,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fbitrix24-crm-api\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",[24,25,26,27],"api","crm","bitrix24 crm api","utm","2026-11-10 10:12:30",false,"---\nname: bitrix24-crm-api\ndescription: \"Безопасное подключение к Битрикс24 через входящий вебхук или локальное приложение: чтение лидов, сделок, воронок, стадий, источников, UTM, звонков и истории стадий, сверка с Яндекс Директом и Метрикой, атрибуция обращений, запись только по плану и разрешению владельца. Использовать вместо amoCRM\u002FRoistat, когда CRM клиента — Битрикс24.\"\n---\n\n# Битрикс24: CRM через REST\n\n## Граница задачи\n\nНавык читает CRM клиента и сверяет её с рекламой. Запись (создание, изменение, удаление лидов, сделок, полей, стадий, вебхуков) — только по отдельному плану, с точным списком полей, «да» владельца и чтением после записи. Реклама, цели, ставки и кампании меняются только навыком `yandex-direct-unified`.\n\n## Доступ\n\n1. Берёт адрес из переменной `BITRIX24_WEBHOOK_URL` (вид `https:\u002F\u002F\u003Cпортал>\u002Frest\u002F\u003Cid_пользователя>\u002F\u003Cкод>\u002F`) или из закрытого JSON с правами `0600`. Адрес и код никогда не печатай, не передавай аргументом командной строки и не клади в журнал, отчёт и репозиторий.\n2. Вебхук действует от имени сотрудника, который его создал, и в рамках выбранных скоупов. Создаёт администратор или сотрудник с разрешением администратора. Для чтения достаточно скоупа `crm`; имена сотрудников требуют `user`; статистика звонков (`voximplant.statistic.get`) требует `telephony` и право «Статистика звонков — Просмотр». Если на ответе `insufficient_scope`, не повторяй запрос: попроси отдельный вебхук с нужным скоупом (переменная `BITRIX24_TELEPHONY_WEBHOOK_URL`) или используй локальное приложение.\n3. Часть методов (например, привязка виджетов, часть телефонии) недоступна из вебхука и требует контекста приложения. Для нескольких порталов, событий и методов с контекстом создай локальное приложение (OAuth 2.0: `access_token` живёт 1 час, `refresh_token` 180 дней; код авторизации 30 секунд) и храни токены в файле `0600`.\n4. Новый вебхук или приложение создаёт только владелец или по его явному «да». Перед этим проверь, нет ли уже подходящего. Срок действия вебхука может быть ограничен: при ошибке авторизации сначала проверь его.\n5. Файлы доступа и выгрузки (в них телефоны и имена) держи в закрытой папке, добавь её в `.gitignore`, в отчётах и чатах телефоны маскируй.\n\n## Режим чтения\n\n1. Скрипт `scripts\u002Fbitrix24_read.py` (команды `probe`, `schema`, `export`) вызывает только методы из белого списка: `crm.item.list`, `crm.item.fields`, `crm.lead.list`, `crm.deal.list`, `crm.lead.fields`, `crm.lead.userfield.list`, `crm.status.list`, `crm.status.entity.types`, `crm.category.list`, `crm.dealcategory.list`, `crm.stagehistory.list`, `crm.activity.list`, `crm.contact.list`, `voximplant.statistic.get`, `user.get`, `scope`, `batch` (только с чтением внутри). Любой другой метод — отказ.\n2. Основной путь — `crm.item.list` (`entityTypeId`: лид 1, сделка 2, контакт 3, компания 4). `crm.lead.list` и `crm.deal.list` помечены в документации как устаревшие; используй их только когда поле недоступно в `crm.item.list`.\n3. Страница списка всегда 50 записей. Малые выборки — через `start`\u002F`next`. Большие выгрузки — обход по ID: сортировка `ID` по возрастанию, в фильтре `>ID` последнего полученного, `start=-1`, повтор пока вернулось 50. Для этого режима `total` не приходит: объём считай отдельным запросом.\n4. Множественные поля (`PHONE`, `EMAIL`) перечисляй в `select` явно; маска `*` их и пользовательские поля не включает, добавляй `UF_*`. Поля UTM (`UTM_SOURCE`, `UTM_MEDIUM`, `UTM_CAMPAIGN`, `UTM_CONTENT`, `UTM_TERM`) называй в `select` явно; в `crm.item.list` сверь их имена через `crm.item.fields`.\n5. В фильтре `ENTITY_ID` и `STATUS_ID` справочников передавай строкой. Префиксы: `>=`, `>`, `\u003C=`, `\u003C`, `@` (IN, массив), `!@`, `%`, `=`, `!=`.\n6. Лимиты (облако): для тарифа «Энтерпрайз» 5 запросов в секунду при пороге 250, для остальных 2 в секунду при пороге 50; превышение — HTTP 503 `QUERY_LIMIT_EXCEEDED`; ресурсоёмкость — HTTP 429 `OPERATION_TIME_LIMIT` (ориентир `operating_reset_at` в блоке `time`). Держи не больше одного потока, паузу между запросами не меньше 0,5 с, при 503\u002F429 повторяй с растущей паузой, не запускай параллельные серии с того же IP. `batch` — до 50 команд, вложенный `batch` запрещён, ошибки команд лежат в `result_error` при ответе 200.\n7. Каждая выгрузка сохраняет манифест: метод, фильтр, период, число строк, число уникальных ID, число страниц, признак `complete`, время начала и конца. Повтор или отсутствие ID в выгрузке — ошибка; `ID` скрипт добавляет в поля сам. В файл попадают только объявленные поля (`--fields` или набор по умолчанию), даже если метод вернул больше. Телефоны, почта и имена сохраняются только с `--include-personal-data` и только если названы в `--fields`. Неполную выгрузку (`complete=false`) не превращай в отчёт.\n8. Время: даты REST приходят в часовом поясе портала. Переводи всё в UTC и записывай границу периода с поясом; Метрика считает в поясе счётчика, копия данных BI отстаёт.\n\n## Что прочитать перед вопросами клиенту\n\n1. Все воронки сделок (`crm.category.list` с `entityTypeId=2`; основная воронка имеет `id=0`) и стадии каждой через `crm.status.list`; семантика стадии: `S` успех, `F` провал, пусто или `P` в работе.\n2. Статусы лидов, справочник источников, пользовательские поля лидов и сделок, историю стадий (`crm.stagehistory.list`, `TYPE_ID`: 1 создание, 2 промежуточная, 3 финальная, 5 смена воронки).\n3. Какие формы и интеграции уже заводят лиды: штатные веб-формы CRM и установленные приложения интеграции форм. Пока не прочитано, не пиши «форма не подключена» и не включай второй отправитель.\n4. Только после этого спрашивай клиента о том, чего в CRM нет.\n\n## Атрибуция обращений\n\nПорядок источников для лида, строго в таком порядке:\n\n1. Точная метка: `UTM_SOURCE` (`yandex`; вариант `ya` принимай только при `UTM_MEDIUM=cpc` и числовой кампании, существующей в выгрузке Директа), `UTM_MEDIUM=cpc`, `UTM_CAMPAIGN` равен идентификатору кампании Директа; `UTM_CONTENT` равен идентификатору объявления, `yclid` — подтверждение клика. Совпадение только точное, без подбора по похожести.\n2. Номер коллтрекинга: ближайший к созданию лида входящий звонок (`CALL_TYPE` 2 или 3), связанный с лидом прямо (`CRM_ENTITY_TYPE=LEAD`) или через дело звонка с владельцем-лидом, разница не больше 300 секунд, совпадение номеров с картой источников, единственный кандидат. Окно не расширяй: большие окна переносят исходящие лиды во входящие.\n3. Иначе источник из подписи CRM с префиксом «CRM:».\n\nДополнительные правила:\n\n- Общий (основной) номер организации не является рекламной связью.\n- Если оператор набрал номер без открытой карточки, телефония сама заводит лид (`CALL_TYPE=1` в пределах нескольких секунд от создания): выдели такие лиды в отдельный источник «Исходящий звонок оператора», не называй их «не реклама» (первичный источник пациента не записан) и не считай в стоимости обращения.\n- Заявка без метки — `unknown`, не органика. Источник доказывает только ClientID Метрики из карточки (визит в Метрике до заявки). Сопоставление «по времени цели» годится для разовой оценки и помечается как оценка.\n- ClientID со значением `0` не связь с Метрикой. Отсутствие согласия на аналитику даёт пустое значение.\n- Тестовые и служебные записи отфильтровывай одним и тем же условием во всех выборках (пользовательские поля «тест», «служебная форма», имя «Тест»). Новые тестовые лиды без разрешения владельца не создавай.\n- Единица счёта — карточка лида. Повторные карточки одного телефона показывай отдельной строкой («уникальных телефонов»), первичный источник клиента — отдельным столбцом.\n- Удалённые лиды в выгрузке не видны; звонки на рекламные номера бери из статистики звонков отдельным показателем и не складывай с лидами.\n\n## Сверка с Директом и Метрикой\n\n1. Расход, показы, клики и кампании читай навыком `yandex-direct-unified` (или `yd_*` MCP), цели и визиты — `ym_*`. Не вызывай их API из этого навыка.\n2. Сопоставляй по числовым идентификаторам кампаний и объявлений. Таблица должна показывать три числа по каждой кампании: конверсии цели в Метрике\u002FДиректе, лиды CRM с точной меткой, лиды CRM по номеру коллтрекинга.\n3. Расхождение между конверсиями рекламы и лидами CRM ожидаемо (заявка без метки, звонок без согласия, окно атрибуции). Назови причину по доказательствам: ClientID, метка, звонок, время. Нулевой результат в отчёте не доказывает отсутствие обращений.\n4. Воронка: стадия «записан» не равна явке; успешная сделка не равна оплате; выручка привязана к дате создания лида или к дате закрытия, укажи, к какой. Проверь двойные сделки на одну сумму.\n5. НДС: перед любой арифметикой с расходом проверь признак НДС источника (расход, полученный штатным коннектором рекламной аналитики Битрикс24, приходит с НДС). Неподтверждённый коэффициент не добавляй.\n\n## Запись\n\nЛюбая запись требует: плана с точным списком сущностей и полей, «да» владельца на этот план, снимка полей «до» в закрытой папке, записи только перечисленных полей, чтения после записи с сопоставлением, журнала с откатом. Запрещено без отдельного «да»: создание и удаление лидов и сделок, смена стадий, изменение пользовательских полей, создание вебхуков и приложений, массовые изменения. Ответ HTTP 500 или таймаут на записи означает «исход неизвестен»: перечитай запись, а не повторяй вызов вслепую. Создание пользовательских полей — только отдельным скриптом с режимом без `--apply` (печатает план); в наборе записывающих скриптов нет.\n\n## Ловушки\n\n- Лид может сразу конвертироваться в сделку: ищите обращение и по сделке (`crm.deal.list` с фильтром `@LEAD_ID`), а не только по лиду.\n- Повторное сообщение существующего контакта новый лид не создаёт: повторные обращения ищите по контакту; дубли по телефону — `crm.duplicate.findbycomm` с `type: PHONE`.\n- Общая форма сайта может присылать лиды вебхуком без меток: смотрите поля формы, а не только `UTM_*`.\n- Чаты открытых линий: `imopenlines.crm.chat.getLastId` (`CRM_ENTITY_TYPE`: `LEAD`, `DEAL`, `CONTACT`) отдаёт только последний чат сущности — для периода перебирайте все сущности; сообщения — `im.dialog.messages.get` с `DIALOG_ID` вида `chat\u003Cid>`. Метка запуска бота (`\u002Fstart \u003Cметка>`) видна в сообщениях чата; ссылка мессенджера без метки к рекламе не привязывается.\n- Поля, которые дописывает фоновая интеграция аналитики, появляются через несколько минут после создания лида.\n- «Группа номеров» в описании источника — группа номеров АТС, а не коллтрекинг.\n- Роботы и бизнес-процессы лидов не трогайте.\n- Цепочку коллтрекинга (пул подменных номеров → скрипт сайта → приёмник звонков → карта номеров в BI) включайте с конца: пул номеров — последним, после всех потребителей.\n- Без вебхука в браузере, где пользователь уже вошёл в портал, те же методы доступны из вкладки через `BX.rest.callMethod` (права — этого пользователя). Значения форм, вебхуков и токенов из вкладки целиком не выгружайте.\n\n## Сбои\n\n- `insufficient_scope`: нужен другой скоуп, не повторяй запрос.\n- `INVALID_CREDENTIALS`, `NO_AUTH_FOUND`: проверь ID пользователя и код вебхука в адресе; у вебхука мог истечь срок.\n- `ACCESS_DENIED` «REST is available only on commercial plans»: REST недоступен на текущем тарифе.\n- `expired_token`: продли токены приложения и повтори вызов.\n- `ERROR_METHOD_NOT_FOUND`: опечатка в методе или нет скоупа.\n\n## Граница публикации\n\nНе публикуй адреса порталов, коды вебхуков, ID пользователей, телефоны, имена, названия кампаний клиента и выгрузки. Публичные примеры и тесты — только синтетические.\n","# Битрикс24: CRM через REST\n\n## Граница задачи\n\nНавык читает CRM клиента и сверяет её с рекламой. Запись (создание, изменение, удаление лидов, сделок, полей, стадий, вебхуков) — только по отдельному плану, с точным списком полей, «да» владельца и чтением после записи. Реклама, цели, ставки и кампании меняются только навыком `yandex-direct-unified`.\n\n## Доступ\n\n1. Берёт адрес из переменной `BITRIX24_WEBHOOK_URL` (вид `https:\u002F\u002F\u003Cпортал>\u002Frest\u002F\u003Cid_пользователя>\u002F\u003Cкод>\u002F`) или из закрытого JSON с правами `0600`. Адрес и код никогда не печатай, не передавай аргументом командной строки и не клади в журнал, отчёт и репозиторий.\n2. Вебхук действует от имени сотрудника, который его создал, и в рамках выбранных скоупов. Создаёт администратор или сотрудник с разрешением администратора. Для чтения достаточно скоупа `crm`; имена сотрудников требуют `user`; статистика звонков (`voximplant.statistic.get`) требует `telephony` и право «Статистика звонков — Просмотр». Если на ответе `insufficient_scope`, не повторяй запрос: попроси отдельный вебхук с нужным скоупом (переменная `BITRIX24_TELEPHONY_WEBHOOK_URL`) или используй локальное приложение.\n3. Часть методов (например, привязка виджетов, часть телефонии) недоступна из вебхука и требует контекста приложения. Для нескольких порталов, событий и методов с контекстом создай локальное приложение (OAuth 2.0: `access_token` живёт 1 час, `refresh_token` 180 дней; код авторизации 30 секунд) и храни токены в файле `0600`.\n4. Новый вебхук или приложение создаёт только владелец или по его явному «да». Перед этим проверь, нет ли уже подходящего. Срок действия вебхука может быть ограничен: при ошибке авторизации сначала проверь его.\n5. Файлы доступа и выгрузки (в них телефоны и имена) держи в закрытой папке, добавь её в `.gitignore`, в отчётах и чатах телефоны маскируй.\n\n## Режим чтения\n\n1. Скрипт `scripts\u002Fbitrix24_read.py` (команды `probe`, `schema`, `export`) вызывает только методы из белого списка: `crm.item.list`, `crm.item.fields`, `crm.lead.list`, `crm.deal.list`, `crm.lead.fields`, `crm.lead.userfield.list`, `crm.status.list`, `crm.status.entity.types`, `crm.category.list`, `crm.dealcategory.list`, `crm.stagehistory.list`, `crm.activity.list`, `crm.contact.list`, `voximplant.statistic.get`, `user.get`, `scope`, `batch` (только с чтением внутри). Любой другой метод — отказ.\n2. Основной путь — `crm.item.list` (`entityTypeId`: лид 1, сделка 2, контакт 3, компания 4). `crm.lead.list` и `crm.deal.list` помечены в документации как устаревшие; используй их только когда поле недоступно в `crm.item.list`.\n3. Страница списка всегда 50 записей. Малые выборки — через `start`\u002F`next`. Большие выгрузки — обход по ID: сортировка `ID` по возрастанию, в фильтре `>ID` последнего полученного, `start=-1`, повтор пока вернулось 50. Для этого режима `total` не приходит: объём считай отдельным запросом.\n4. Множественные поля (`PHONE`, `EMAIL`) перечисляй в `select` явно; маска `*` их и пользовательские поля не включает, добавляй `UF_*`. Поля UTM (`UTM_SOURCE`, `UTM_MEDIUM`, `UTM_CAMPAIGN`, `UTM_CONTENT`, `UTM_TERM`) называй в `select` явно; в `crm.item.list` сверь их имена через `crm.item.fields`.\n5. В фильтре `ENTITY_ID` и `STATUS_ID` справочников передавай строкой. Префиксы: `>=`, `>`, `\u003C=`, `\u003C`, `@` (IN, массив), `!@`, `%`, `=`, `!=`.\n6. Лимиты (облако): для тарифа «Энтерпрайз» 5 запросов в секунду при пороге 250, для остальных 2 в секунду при пороге 50; превышение — HTTP 503 `QUERY_LIMIT_EXCEEDED`; ресурсоёмкость — HTTP 429 `OPERATION_TIME_LIMIT` (ориентир `operating_reset_at` в блоке `time`). Держи не больше одного потока, паузу между запросами не меньше 0,5 с, при 503\u002F429 повторяй с растущей паузой, не запускай параллельные серии с того же IP. `batch` — до 50 команд, вложенный `batch` запрещён, ошибки команд лежат в `result_error` при ответе 200.\n7. Каждая выгрузка сохраняет манифест: метод, фильтр, период, число строк, число уникальных ID, число страниц, признак `complete`, время начала и конца. Повтор или отсутствие ID в выгрузке — ошибка; `ID` скрипт добавляет в поля сам. В файл попадают только объявленные поля (`--fields` или набор по умолчанию), даже если метод вернул больше. Телефоны, почта и имена сохраняются только с `--include-personal-data` и только если названы в `--fields`. Неполную выгрузку (`complete=false`) не превращай в отчёт.\n8. Время: даты REST приходят в часовом поясе портала. Переводи всё в UTC и записывай границу периода с поясом; Метрика считает в поясе счётчика, копия данных BI отстаёт.\n\n## Что прочитать перед вопросами клиенту\n\n1. Все воронки сделок (`crm.category.list` с `entityTypeId=2`; основная воронка имеет `id=0`) и стадии каждой через `crm.status.list`; семантика стадии: `S` успех, `F` провал, пусто или `P` в работе.\n2. Статусы лидов, справочник источников, пользовательские поля лидов и сделок, историю стадий (`crm.stagehistory.list`, `TYPE_ID`: 1 создание, 2 промежуточная, 3 финальная, 5 смена воронки).\n3. Какие формы и интеграции уже заводят лиды: штатные веб-формы CRM и установленные приложения интеграции форм. Пока не прочитано, не пиши «форма не подключена» и не включай второй отправитель.\n4. Только после этого спрашивай клиента о том, чего в CRM нет.\n\n## Атрибуция обращений\n\nПорядок источников для лида, строго в таком порядке:\n\n1. Точная метка: `UTM_SOURCE` (`yandex`; вариант `ya` принимай только при `UTM_MEDIUM=cpc` и числовой кампании, существующей в выгрузке Директа), `UTM_MEDIUM=cpc`, `UTM_CAMPAIGN` равен идентификатору кампании Директа; `UTM_CONTENT` равен идентификатору объявления, `yclid` — подтверждение клика. Совпадение только точное, без подбора по похожести.\n2. Номер коллтрекинга: ближайший к созданию лида входящий звонок (`CALL_TYPE` 2 или 3), связанный с лидом прямо (`CRM_ENTITY_TYPE=LEAD`) или через дело звонка с владельцем-лидом, разница не больше 300 секунд, совпадение номеров с картой источников, единственный кандидат. Окно не расширяй: большие окна переносят исходящие лиды во входящие.\n3. Иначе источник из подписи CRM с префиксом «CRM:».\n\nДополнительные правила:\n\n- Общий (основной) номер организации не является рекламной связью.\n- Если оператор набрал номер без открытой карточки, телефония сама заводит лид (`CALL_TYPE=1` в пределах нескольких секунд от создания): выдели такие лиды в отдельный источник «Исходящий звонок оператора», не называй их «не реклама» (первичный источник пациента не записан) и не считай в стоимости обращения.\n- Заявка без метки — `unknown`, не органика. Источник доказывает только ClientID Метрики из карточки (визит в Метрике до заявки). Сопоставление «по времени цели» годится для разовой оценки и помечается как оценка.\n- ClientID со значением `0` не связь с Метрикой. Отсутствие согласия на аналитику даёт пустое значение.\n- Тестовые и служебные записи отфильтровывай одним и тем же условием во всех выборках (пользовательские поля «тест», «служебная форма», имя «Тест»). Новые тестовые лиды без разрешения владельца не создавай.\n- Единица счёта — карточка лида. Повторные карточки одного телефона показывай отдельной строкой («уникальных телефонов»), первичный источник клиента — отдельным столбцом.\n- Удалённые лиды в выгрузке не видны; звонки на рекламные номера бери из статистики звонков отдельным показателем и не складывай с лидами.\n\n## Сверка с Директом и Метрикой\n\n1. Расход, показы, клики и кампании читай навыком `yandex-direct-unified` (или `yd_*` MCP), цели и визиты — `ym_*`. Не вызывай их API из этого навыка.\n2. Сопоставляй по числовым идентификаторам кампаний и объявлений. Таблица должна показывать три числа по каждой кампании: конверсии цели в Метрике\u002FДиректе, лиды CRM с точной меткой, лиды CRM по номеру коллтрекинга.\n3. Расхождение между конверсиями рекламы и лидами CRM ожидаемо (заявка без метки, звонок без согласия, окно атрибуции). Назови причину по доказательствам: ClientID, метка, звонок, время. Нулевой результат в отчёте не доказывает отсутствие обращений.\n4. Воронка: стадия «записан» не равна явке; успешная сделка не равна оплате; выручка привязана к дате создания лида или к дате закрытия, укажи, к какой. Проверь двойные сделки на одну сумму.\n5. НДС: перед любой арифметикой с расходом проверь признак НДС источника (расход, полученный штатным коннектором рекламной аналитики Битрикс24, приходит с НДС). Неподтверждённый коэффициент не добавляй.\n\n## Запись\n\nЛюбая запись требует: плана с точным списком сущностей и полей, «да» владельца на этот план, снимка полей «до» в закрытой папке, записи только перечисленных полей, чтения после записи с сопоставлением, журнала с откатом. Запрещено без отдельного «да»: создание и удаление лидов и сделок, смена стадий, изменение пользовательских полей, создание вебхуков и приложений, массовые изменения. Ответ HTTP 500 или таймаут на записи означает «исход неизвестен»: перечитай запись, а не повторяй вызов вслепую. Создание пользовательских полей — только отдельным скриптом с режимом без `--apply` (печатает план); в наборе записывающих скриптов нет.\n\n## Ловушки\n\n- Лид может сразу конвертироваться в сделку: ищите обращение и по сделке (`crm.deal.list` с фильтром `@LEAD_ID`), а не только по лиду.\n- Повторное сообщение существующего контакта новый лид не создаёт: повторные обращения ищите по контакту; дубли по телефону — `crm.duplicate.findbycomm` с `type: PHONE`.\n- Общая форма сайта может присылать лиды вебхуком без меток: смотрите поля формы, а не только `UTM_*`.\n- Чаты открытых линий: `imopenlines.crm.chat.getLastId` (`CRM_ENTITY_TYPE`: `LEAD`, `DEAL`, `CONTACT`) отдаёт только последний чат сущности — для периода перебирайте все сущности; сообщения — `im.dialog.messages.get` с `DIALOG_ID` вида `chat\u003Cid>`. Метка запуска бота (`\u002Fstart \u003Cметка>`) видна в сообщениях чата; ссылка мессенджера без метки к рекламе не привязывается.\n- Поля, которые дописывает фоновая интеграция аналитики, появляются через несколько минут после создания лида.\n- «Группа номеров» в описании источника — группа номеров АТС, а не коллтрекинг.\n- Роботы и бизнес-процессы лидов не трогайте.\n- Цепочку коллтрекинга (пул подменных номеров → скрипт сайта → приёмник звонков → карта номеров в BI) включайте с конца: пул номеров — последним, после всех потребителей.\n- Без вебхука в браузере, где пользователь уже вошёл в портал, те же методы доступны из вкладки через `BX.rest.callMethod` (права — этого пользователя). Значения форм, вебхуков и токенов из вкладки целиком не выгружайте.\n\n## Сбои\n\n- `insufficient_scope`: нужен другой скоуп, не повторяй запрос.\n- `INVALID_CREDENTIALS`, `NO_AUTH_FOUND`: проверь ID пользователя и код вебхука в адресе; у вебхука мог истечь срок.\n- `ACCESS_DENIED` «REST is available only on commercial plans»: REST недоступен на текущем тарифе.\n- `expired_token`: продли токены приложения и повтори вызов.\n- `ERROR_METHOD_NOT_FOUND`: опечатка в методе или нет скоупа.\n\n## Граница публикации\n\nНе публикуй адреса порталов, коды вебхуков, ID пользователей, телефоны, имена, названия кампаний клиента и выгрузки. Публичные примеры и тесты — только синтетические.\n",{"name":5,"description":7},"main","2b63f856ce19c2a797929cacabd9e0fc936812fa","plugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fbitrix24-crm-api",474,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins","https:\u002F\u002Fhol.org\u002Fplugins\u002Fbest-codex-plugins","https:\u002F\u002Fgithub.com\u002Fhashgraph-online","https:\u002F\u002Fhol.org","Open-source standards and developer tools for interoperable AI agents: discovery, identity, communication, payments, privacy and security.","2026-11-11 14:40:14",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add hashgraph-online\u002Fawesome-codex-plugins --skill bitrix24-crm-api",{"tool":49,"command":50},"bunx","bunx skills add hashgraph-online\u002Fawesome-codex-plugins --skill bitrix24-crm-api",{"tool":52,"command":53},"pnpm","pnpm dlx skills add hashgraph-online\u002Fawesome-codex-plugins --skill bitrix24-crm-api","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fbitrix24-crm-api\u002FSKILL.md",true,[57,63,69],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"agents\u002Fopenai.yaml","REFERENCE","参考文档",454,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fbitrix24-crm-api\u002Fagents\u002Fopenai.yaml",{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"scripts\u002Fbitrix24_read.py","SCRIPT","脚本",14310,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fbitrix24-crm-api\u002Fscripts\u002Fbitrix24_read.py",{"path":70,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":71,"sourceHtmlUrl":72},"tests\u002Ftest_bitrix24_read.py",9215,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fnebelov\u002Fyandex-direct-for-all\u002Fskills\u002Fbitrix24-crm-api\u002Ftests\u002Ftest_bitrix24_read.py",[74,82,89,96,123,148],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":81},"01M746ZWACVKMZ1BJXJZHYJSSX","migrate-to-e2e","Moves an existing Playwright, Cypress, Selenium, Appium, Detox, Maestro, or TesterArmy suite to e2e one slice at a time, with the old suite running beside the new one until each ported test is proven. Keeps a MIGRATION.md progress file so any later session resumes where the last stopped. Optionally plants a defect to show both suites catch it. Use for \u002Fmigrate-to-e2e, \"migrate our tests to e2e\", \"port these Maestro flows\", \"move our TesterArmy tests\", or when a project has an e2e config and an older suite still running.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fmigrate-to-e2e\u002FSKILL.md",[],[],"2026-11-11 15:11:14",{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":81},"01M746ZPTAX1Q0FBKAB1CYND7E","e2e","Writes, runs, and debugs end-to-end tests for web and mobile apps with e2e, the agentic test runner, which mixes agent.act goals with exact locator assertions on a Playwright browser or an iOS or Android device. Also drives a project's running app live over the e2e MCP server to look at a screen, check a UI change, take a screenshot or record a video, and try a locator; and runs bug bashes, parallel e2e explore runs with each bug proven by a repro test. Use when a project depends on e2e or has an e2e.config.ts, when asked for end-to-end, browser, mobile, or agentic UI tests, to check a change in the running app, to QA or bug bash an app or branch, or when an e2e run fails.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fe2e\u002FSKILL.md",[],[],{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":95,"publishedAt":81},"01M746ZJN784HVHMDP9MQGCSGG","create-verification-skill","Generate a project-local verify-\u003Capp> skill on top of e2e, so any coding agent can launch the app, check it is worth driving, exercise a feature the way a user does, keep evidence, and bug bash it. Writes the skill, a feature map with one explore charter per feature, and proves it once. Use for \u002Fcreate-verification-skill, \"make a verification skill for this repo\", or when a project has no scripted way to prove UI behavior.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftester-army\u002Fe2e\u002Fskills\u002Fcreate-verification-skill\u002FSKILL.md",[],[],{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":28},"01M716A6ETNB9B1SQ3GXZC75VR","deja-search","deja-vu memory — search the user's past AI coding sessions with the deja CLI. Holds what they already settled and never wrote into the repo (naming rules, banned or already-tried tools, required checks before merge, preferred values, who owns what). Use before your first edit in a task, before you call a change done or ready to merge, before you recommend a tool, library, design or reviewer, before re-debugging an error that may already be solved, when they say 'didn't we fix this before', 'what did we decide about X' or 'I already have that', and before telling them something on this machine does not exist.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-search\u002FSKILL.md",[],[103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122],"search","deja search","never","error","ready","memory","re","decide","fix","design","debugging","when","you","done","reviewer","io","change","cli","merge","past",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":28},"01M716A3J2W5SENSE9VGMXB375","deja-reflect","End-of-session reflection and memory curation with deja-vu. Review what was decided, what commands broke and what repaired them, and record durable project rules or decisions with deja remember so the next session starts with them.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fvshulcz\u002Fdeja-vu\u002Fskills\u002Fdeja-reflect\u002FSKILL.md",[],[130,131,132,118,133,134,135,136,137,138,139,140,141,142,108,143,144,145,146,147],"deja reflect","reflect","review","with","record","github","next","https","node","Rules","decisions","brew","remember","project rules","project","session","end","reflection",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":161,"publishedAt":28},"01M715T3RR4BAYSR57HPPTJ0PF","revid","Make, edit, export and post AI videos with Revid (revid.ai) through the Revid MCP server. Use whenever the user wants a short-form or long-form video made (from an idea, a script, a URL, an article, a PDF, a tweet, a product page, their own clips, or a song), wants to find what is going viral on TikTok, YouTube, Instagram or X before making something, wants to edit or re-export an existing Revid project, generate a standalone AI image or clip, make a series episode, or publish and schedule a finished video to connected social accounts. Covers setup (hosted MCP with OAuth, or an API key), the 36 tools, credits, polling and the rules for publishing. Routes to the more specific revid-* skills when one fits.","https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Ftmakersas\u002Frevid-skills\u002Fskills\u002Frevid\u002FSKILL.md",[154,157,160],{"categoryNo":155,"categoryName":156,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":158,"categoryName":159,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[150,162,163,164,165,166,167,144,168,109,169,170,171,172,114,173,174,175,24,176],"URL","Video","short-form","standalone","PDF","viral","tiktok","short","social","MCP","song","image","mcp server","schedule","publish"]