CRM API: ресурсы

← CRM API: начало работы

Контакты, компании, сделки и задачи

Пути в таблицах указаны относительно базового URL. Все mutation-маршруты требуют Idempotency-Key.

МетодПутьScopeНазначение
GET/contactscrm_contacts_readСписок контактов
GET/contacts/:idcrm_contacts_readКонтакт по UUID
POST/contactscrm_contacts_writeСоздать контакт
PATCH/contacts/:idcrm_contacts_writeОбновить контакт с CAS
DELETE/contacts/:idcrm_contacts_deleteУдалить или анонимизировать контакт с CAS
POST/contacts/upsertcrm_contacts_writeСоздать или обновить контакт по externalId
POST/contacts/batch/getcrm_contacts_readПолучить до 100 контактов по UUID или externalId
POST/contacts/batch/upsertcrm_contacts_writeUpsert до 100 контактов
GET/companiescrm_companies_readСписок компаний
GET/companies/:idcrm_companies_readКомпания по UUID
POST/companiescrm_companies_writeСоздать компанию
PATCH/companies/:idcrm_companies_writeОбновить компанию с CAS
POST/companies/upsertcrm_companies_writeСоздать или обновить компанию по externalId
GET/companies/:id/contactscrm_companies_read + crm_contacts_readСвязи компании с контактами
PUT/companies/:id/contactscrm_companies_write + crm_contacts_readАтомарно заменить связи с CAS
GET/dealscrm_deals_readСписок сделок
GET/deals/:idcrm_deals_readСделка по UUID
POST/dealscrm_deals_writeСоздать сделку
PATCH/deals/:idcrm_deals_writeОбновить сделку с CAS
PATCH/deals/:id/movecrm_deals_writeПереместить сделку с CAS
DELETE/deals/:idcrm_deals_deleteУдалить сделку с CAS
POST/deals/upsertcrm_deals_writeСоздать или обновить сделку по externalId
POST/deals/batch/getcrm_deals_readПолучить до 100 сделок по UUID или externalId
POST/deals/batch/upsertcrm_deals_writeUpsert до 100 сделок
GET/taskscrm_tasks_readСписок задач
GET/tasks/:idcrm_tasks_readЗадача по UUID
POST/taskscrm_tasks_writeСоздать задачу
PATCH/tasks/:idcrm_tasks_writeОбновить задачу с CAS
DELETE/tasks/:idcrm_tasks_deleteУдалить задачу с CAS
POST/tasks/upsertcrm_tasks_writeСоздать или обновить задачу по externalId
POST/tasks/batch/getcrm_tasks_readПолучить до 100 задач по UUID или externalId
POST/tasks/batch/upsertcrm_tasks_writeUpsert до 100 задач

crm_contact_data_read/write, crm_amounts_read/write и crm_custom_fields_read/manage применяются дополнительно к scope ресурса. Без read-scope защищённые значения исключаются или маскируются; для записи соответствующих полей нужен write/manage-scope.

Компании сделки

В POST /deals, PATCH /deals/:id и upsert-командах компании передаются упорядоченным массивом ссылок companies. Каждая ссылка содержит ровно один ключ: UUID id или externalId текущего приложения. Первая компания становится основной.

JSON
{
  "companies": [
    { "id": "2c3902fc-5f60-4d49-ab04-313597436a3c" },
    { "externalId": "company-from-erp-42" }
  ]
}

В PATCH отсутствие companies не меняет связи, а null или пустой массив очищают их. Дубли ссылок отклоняются. Для обычной сделки после изменения должна остаться хотя бы одна компания или один контакт.

Ответ сделки содержит упорядоченные companyIds и подробные связи companies. Одиночного верхнеуровневого companyId в контракте сделки нет.

JSON
{
  "companyIds": [
    "2c3902fc-5f60-4d49-ab04-313597436a3c",
    "85a87511-a8a4-48ee-a7ee-e6fc88546d1d"
  ],
  "companies": [
    {
      "companyId": "2c3902fc-5f60-4d49-ab04-313597436a3c",
      "isPrimary": true
    },
    {
      "companyId": "85a87511-a8a4-48ee-a7ee-e6fc88546d1d",
      "isPrimary": false
    }
  ]
}

Batch возвращает результат каждого элемента отдельно. Частичный успех не означает, что весь batch применён одинаково; проверяйте status, data или error каждого элемента. POST */batch/get — операция чтения и единственное POST-исключение в этих таблицах, для которого Idempotency-Key не нужен.

Слияние и удаление контактов и компаний

МетодПутьScopeНазначение
POST/contacts/merge/previewcrm_contacts_readКонфликты полей и связи дубля
POST/contacts/merge/commitcrm_contacts_write + crm_contacts_deleteОбъединить контакты с CAS
GET/contacts/:id/delete/previewcrm_contacts_readЧто затронет удаление
POST/contacts/:id/delete/commitcrm_contacts_deleteАнонимизировать или удалить
POST/companies/merge/previewcrm_companies_readКонфликты и связи компании
POST/companies/merge/commitcrm_companies_write + crm_companies_deleteОбъединить компании с CAS
GET/companies/:id/delete/previewcrm_companies_readЧто затронет удаление
POST/companies/:id/delete/commitcrm_companies_deleteУдалить и отвязать компанию

merge/preview возвращает requiredResolutions — список конфликтных полей. Все они должны быть разрешены в fieldResolutions при commit, иначе ответ 422. Commit требует expectedPrimaryVersion и expectedSecondaryVersion.

Если externalId этого приложения есть у обоих клиентов, commit отвечает 409 external_id_conflict. Передайте externalIdConflictResolution: "keep_primary", чтобы оставить ключ основного клиента; ключ присоединённого станет tombstone и будет отвечать 410. Когда конфликта нет, externalId дубля переносится на основной объект.

delete/commit принимает mode: anonymize стирает персональные данные, сохраняя объект и ссылки на него, full удаляет клиента и превращает его externalId в tombstone. После анонимизации GET /contacts/:id отвечает 410 resource_deleted — объект существует для связей, но перестаёт быть ресурсом API.

Теги ресурсов

МетодПутьScopeНазначение
GET/contacts|companies|deals|tasks/:id/tagscrm_*_read + crm_tags_readТеги объекта
PUT/contacts|companies|deals|tasks/:id/tagscrm_*_write + crm_tags_readЗаменить набор тегов

Набор заменяется целиком: точечных add/remove нет, потому что они не идемпотентны при повторной доставке. PUT требует expectedVersion самого ресурса и поднимает его версию, если набор изменился. Теги указываются по UUID либо по externalId текущего приложения.

Вложенные ресурсы сделки

МетодПутьScopeНазначение
GET/deals/:id/eventscrm_deals_readЛента событий сделки
GET/deals/:id/activitiescrm_deals_readАктивности
POST/deals/:id/activitiescrm_deals_writeДобавить активность
PATCH/deals/:id/activities/:idcrm_deals_writeОбновить активность с CAS
DELETE/deals/:id/activities/:idcrm_deals_writeУдалить активность с CAS
GET/deals/:id/itemscrm_deals_read + crm_amounts_readПозиции сделки
POST/deals/:id/itemscrm_deals_write + crm_amounts_writeДобавить позицию
PATCH/deals/:id/items/:idcrm_deals_write + crm_amounts_writeОбновить позицию с CAS
DELETE/deals/:id/items/:idcrm_deals_write + crm_amounts_writeУдалить позицию с CAS

Любое изменение вложенного ресурса поднимает версию самой сделки: интеграции синхронизируют сделку целиком, и без этого их копия расходилась бы с сервером незаметно. Количество и деньги в позициях передаются decimal-строками — числа с плавающей точкой теряют точность на суммах.

Лента событий неизменяема, поэтому её курсор идёт по createdAt, а не по updatedAt.

Чек-листы задачи

МетодПутьScopeНазначение
GET/tasks/:id/checklistscrm_tasks_readЧек-листы с пунктами
POST/tasks/:id/checklistscrm_tasks_writeСоздать чек-лист
PATCH/tasks/:id/checklists/:idcrm_tasks_writeОбновить с CAS
DELETE/tasks/:id/checklists/:idcrm_tasks_writeУдалить с CAS
POST/tasks/:id/checklists/:id/itemscrm_tasks_writeДобавить пункт
POST/tasks/:id/checklists/:id/items/reordercrm_tasks_writeПолная перестановка
PATCH/tasks/:id/checklists/:id/items/:itemIdcrm_tasks_writeОбновить пункт с CAS
DELETE/tasks/:id/checklists/:id/items/:itemIdcrm_tasks_writeУдалить пункт с CAS

Удаление чек-листа снимает его пункты каскадом. Изменение любого пункта поднимает версию задачи.

Поиск и аналитика

МетодПутьScopeНазначение
GET/searchcrm_searchПоиск контактов, компаний, сделок и задач
GET/analytics/summarycrm_analytics_readСводная аналитика CRM

Поиск принимает q длиной 2–200 символов, types=contact,company,deal,task, cursor и limit от 1 до 50 (по умолчанию 20). Результаты каждого типа появляются только при наличии соответствующего crm_*_read. Поиск по контактам включается только с crm_contacts_read, по дополнительным полям — с crm_custom_fields_read. Телефоны и email раскрываются только с crm_contact_data_read.

Analytics принимает ISO-даты startDate/endDate и UUID-фильтры pipelineId, ownerId, contactId, companyId, tagId. Без crm_amounts_read денежные показатели маскируются; без crm_operators_read исключаются manager leaderboard и связанный insight. Поле meta.redacted перечисляет применённые проекции.

Audit log

МетодПутьScopeНазначение
GET/auditcrm_audit_readЖурнал изменений CRM

Доступны фильтры resourceType, action, applicationId, cursor и limit до 100. Одного crm_audit_read недостаточно для чтения любого содержимого: API возвращает только типы ресурсов, для которых у приложения есть соответствующий read-scope. Контакты, суммы и дополнительные поля редактируются по их scopes; UUID пользователя-актора выдаётся только с crm_operators_read.