CRM API: ресурсы
Контакты, компании, сделки и задачи
Пути в таблицах указаны относительно базового URL. Все mutation-маршруты требуют
Idempotency-Key.
| Метод | Путь | Scope | Назначение |
|---|---|---|---|
GET | /contacts | crm_contacts_read | Список контактов |
GET | /contacts/:id | crm_contacts_read | Контакт по UUID |
POST | /contacts | crm_contacts_write | Создать контакт |
PATCH | /contacts/:id | crm_contacts_write | Обновить контакт с CAS |
DELETE | /contacts/:id | crm_contacts_delete | Удалить или анонимизировать контакт с CAS |
POST | /contacts/upsert | crm_contacts_write | Создать или обновить контакт по externalId |
POST | /contacts/batch/get | crm_contacts_read | Получить до 100 контактов по UUID или externalId |
POST | /contacts/batch/upsert | crm_contacts_write | Upsert до 100 контактов |
GET | /companies | crm_companies_read | Список компаний |
GET | /companies/:id | crm_companies_read | Компания по UUID |
POST | /companies | crm_companies_write | Создать компанию |
PATCH | /companies/:id | crm_companies_write | Обновить компанию с CAS |
POST | /companies/upsert | crm_companies_write | Создать или обновить компанию по externalId |
GET | /companies/:id/contacts | crm_companies_read + crm_contacts_read | Связи компании с контактами |
PUT | /companies/:id/contacts | crm_companies_write + crm_contacts_read | Атомарно заменить связи с CAS |
GET | /deals | crm_deals_read | Список сделок |
GET | /deals/:id | crm_deals_read | Сделка по UUID |
POST | /deals | crm_deals_write | Создать сделку |
PATCH | /deals/:id | crm_deals_write | Обновить сделку с CAS |
PATCH | /deals/:id/move | crm_deals_write | Переместить сделку с CAS |
DELETE | /deals/:id | crm_deals_delete | Удалить сделку с CAS |
POST | /deals/upsert | crm_deals_write | Создать или обновить сделку по externalId |
POST | /deals/batch/get | crm_deals_read | Получить до 100 сделок по UUID или externalId |
POST | /deals/batch/upsert | crm_deals_write | Upsert до 100 сделок |
GET | /tasks | crm_tasks_read | Список задач |
GET | /tasks/:id | crm_tasks_read | Задача по UUID |
POST | /tasks | crm_tasks_write | Создать задачу |
PATCH | /tasks/:id | crm_tasks_write | Обновить задачу с CAS |
DELETE | /tasks/:id | crm_tasks_delete | Удалить задачу с CAS |
POST | /tasks/upsert | crm_tasks_write | Создать или обновить задачу по externalId |
POST | /tasks/batch/get | crm_tasks_read | Получить до 100 задач по UUID или externalId |
POST | /tasks/batch/upsert | crm_tasks_write | Upsert до 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 текущего
приложения. Первая компания становится основной.
{
"companies": [
{ "id": "2c3902fc-5f60-4d49-ab04-313597436a3c" },
{ "externalId": "company-from-erp-42" }
]
}В PATCH отсутствие companies не меняет связи, а null или пустой массив очищают их. Дубли
ссылок отклоняются. Для обычной сделки после изменения должна остаться хотя бы одна компания или
один контакт.
Ответ сделки содержит упорядоченные companyIds и подробные связи companies. Одиночного
верхнеуровневого companyId в контракте сделки нет.
{
"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/preview | crm_contacts_read | Конфликты полей и связи дубля |
POST | /contacts/merge/commit | crm_contacts_write + crm_contacts_delete | Объединить контакты с CAS |
GET | /contacts/:id/delete/preview | crm_contacts_read | Что затронет удаление |
POST | /contacts/:id/delete/commit | crm_contacts_delete | Анонимизировать или удалить |
POST | /companies/merge/preview | crm_companies_read | Конфликты и связи компании |
POST | /companies/merge/commit | crm_companies_write + crm_companies_delete | Объединить компании с CAS |
GET | /companies/:id/delete/preview | crm_companies_read | Что затронет удаление |
POST | /companies/:id/delete/commit | crm_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/tags | crm_*_read + crm_tags_read | Теги объекта |
PUT | /contacts|companies|deals|tasks/:id/tags | crm_*_write + crm_tags_read | Заменить набор тегов |
Набор заменяется целиком: точечных add/remove нет, потому что они не идемпотентны при повторной
доставке. PUT требует expectedVersion самого ресурса и поднимает его версию, если набор
изменился. Теги указываются по UUID либо по externalId текущего приложения.
Вложенные ресурсы сделки
| Метод | Путь | Scope | Назначение |
|---|---|---|---|
GET | /deals/:id/events | crm_deals_read | Лента событий сделки |
GET | /deals/:id/activities | crm_deals_read | Активности |
POST | /deals/:id/activities | crm_deals_write | Добавить активность |
PATCH | /deals/:id/activities/:id | crm_deals_write | Обновить активность с CAS |
DELETE | /deals/:id/activities/:id | crm_deals_write | Удалить активность с CAS |
GET | /deals/:id/items | crm_deals_read + crm_amounts_read | Позиции сделки |
POST | /deals/:id/items | crm_deals_write + crm_amounts_write | Добавить позицию |
PATCH | /deals/:id/items/:id | crm_deals_write + crm_amounts_write | Обновить позицию с CAS |
DELETE | /deals/:id/items/:id | crm_deals_write + crm_amounts_write | Удалить позицию с CAS |
Любое изменение вложенного ресурса поднимает версию самой сделки: интеграции синхронизируют сделку целиком, и без этого их копия расходилась бы с сервером незаметно. Количество и деньги в позициях передаются decimal-строками — числа с плавающей точкой теряют точность на суммах.
Лента событий неизменяема, поэтому её курсор идёт по createdAt, а не по updatedAt.
Чек-листы задачи
| Метод | Путь | Scope | Назначение |
|---|---|---|---|
GET | /tasks/:id/checklists | crm_tasks_read | Чек-листы с пунктами |
POST | /tasks/:id/checklists | crm_tasks_write | Создать чек-лист |
PATCH | /tasks/:id/checklists/:id | crm_tasks_write | Обновить с CAS |
DELETE | /tasks/:id/checklists/:id | crm_tasks_write | Удалить с CAS |
POST | /tasks/:id/checklists/:id/items | crm_tasks_write | Добавить пункт |
POST | /tasks/:id/checklists/:id/items/reorder | crm_tasks_write | Полная перестановка |
PATCH | /tasks/:id/checklists/:id/items/:itemId | crm_tasks_write | Обновить пункт с CAS |
DELETE | /tasks/:id/checklists/:id/items/:itemId | crm_tasks_write | Удалить пункт с CAS |
Удаление чек-листа снимает его пункты каскадом. Изменение любого пункта поднимает версию задачи.
Поиск и аналитика
| Метод | Путь | Scope | Назначение |
|---|---|---|---|
GET | /search | crm_search | Поиск контактов, компаний, сделок и задач |
GET | /analytics/summary | crm_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 | /audit | crm_audit_read | Журнал изменений CRM |
Доступны фильтры resourceType, action, applicationId, cursor и limit до 100. Одного
crm_audit_read недостаточно для чтения любого содержимого: API возвращает только типы ресурсов,
для которых у приложения есть соответствующий read-scope. Контакты, суммы и дополнительные поля
редактируются по их scopes; UUID пользователя-актора выдаётся только с crm_operators_read.