Перейти к содержимому
СервисАпп API
На этой странице

Обращения

Все операции. Авторизация. Запросы и повторы.

Все пути в этом файле дополняют /api/v1 на домене организации.

Описание и ограничения

Назначение

Приём обращений от сайтов, ботов и CRM и управление их дальнейшей обработкой.

Поля и назначение

Публичное поле Формат и смысл Доступ
id id только чтение
name строка чтение и запись
phone, email проверенный контакт чтение и запись
message строка, при создании обращения при создании
customer_id id/null, доступный клиент чтение и запись
assigned_user_id id/null, через assign отдельная команда
status перечисление, через status отдельная команда
follow_up_at, desired_at дата и время/null чтение и запись
external_id строка внутри подключения чтение и запись

Обязательность и null указаны в схемах каждой операции ниже.

Доступ и выборка

leads:read/write и «Лиды и заявки → Просмотр, Изменение»; convert дополнительно требует права создания клиента.

Фильтры: status, customer_id, assigned_user_id, external_id, updated_since.

Запросы команд

При создании передайте name, контактные сведения phone или email и message. Также допустимы external_id, customer_id, follow_up_at и desired_at по таблице. Нужен хотя бы один корректный контакт; message — непустая строка до 10000 символов. Начальный статус — new, ответственный назначается по правилам организации и возвращается в ответе. external_id связывает обращение с внешней системой в пределах текущего подключения.

Команда смены статуса принимает status со значением new, active или archived и If-Resource-Version обращения. Статус converted устанавливается только при преобразовании обращения в клиента; попытка задать его напрямую возвращает 422. Для назначения ответственного передайте assigned_user_id и версию обращения. Идентификатор должен быть доступен; null снимает назначение. Обычное изменение не меняет клиента, связанного преобразованием.

Для преобразования обращения в клиента нужны mode=existing или mode=new и If-Resource-Version обращения. В режиме existing передайте customer_id; объект customer запрещён. В режиме new передайте customer по схеме создания клиента, включая обязательный phone; customer_id запрещён. Клиент не выбирается автоматически по совпадению телефона. Если обращение уже связано с тем же клиентом, повторное преобразование не выполняется. Выбор другого клиента возвращает 409 LEAD_ALREADY_CONVERTED. Клиент, обращение и связь сохраняются вместе. Ответ 200 содержит lead_id, customer_id и changed; версии перечислены в meta.affected_resources. Разные ключи не создают двух клиентов для одного обращения.

Правила и связи

  • HTTP-повтор не добавляет второе сообщение, не повторяет назначение и уведомление.
  • Дедупликация по контакту не заменяет Idempotency-Key и внешний ID.
  • Время первого контакта first_contact_at, последнего сообщения last_message_at и сведения от подключённого канала формирует сервер.

Операции

Метод Путь Назначение
GET /leads Список с фильтрами и пагинацией
POST /leads Создание
GET /leads/{id} Карточка
POST /leads/{id}/update Изменение разрешённых полей
POST /leads/{id}/status Допустимое изменение статуса
POST /leads/{id}/assign Назначение ответственного
POST /leads/{id}/convert Конвертация в клиента с явным выбором соответствия

GET /leads

Список с фильтрами и пагинацией.

Доступ. Разрешения подключения: leads:read. Права сотрудника: «Лиды и заявки → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
filter[status] параметр запроса строка нет нет Допустимо: "new", "active", "converted", "archived"
filter[customer_id] параметр запроса целое число нет нет ≥ 1
filter[assigned_user_id] параметр запроса целое число нет нет ≥ 1
filter[external_id] параметр запроса строка нет нет не более 255 символов
filter[updated_since] параметр запроса строка (дата и время) нет нет не более 64 символов; Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$
filter[updated_before] параметр запроса строка (дата и время) нет нет не более 64 символов; Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$
sort параметр запроса строка нет нет Допустимо: "id", "-id", "updated_at,id", "-updated_at,-id"
page[size] параметр запроса целое число нет нет ≥ 1; ≤ 100
page[cursor] параметр запроса строка нет нет не более 8192 символов

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/leads" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

POST /leads

Создание.

Доступ. Разрешения подключения: leads:write. Права сотрудника: «Лиды и заявки → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
name строка / null нет да не более 255 символов
phone строка / null нет да не более 32 символов
email строка / null (email) нет да не более 255 символов
customer_id целое число / null нет да ≥ 1
external_id строка / null нет да не менее 1 символов; не более 255 символов
follow_up_at строка / null (дата и время) нет да не более 64 символов; Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$
desired_at строка / null (дата и время) нет да не более 64 символов; Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$
message строка да нет не менее 1 символов; не более 10000 символов

Ответы

HTTP Назначение и схема
201 Создано. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
201 Location строка
201 Idempotency-Replayed строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/leads" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-leads-store:001" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.leads.store.json'

GET /leads/{id}

Карточка.

Доступ. Разрешения подключения: leads:read. Права сотрудника: «Лиды и заявки → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
If-None-Match заголовок строка нет нет —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
304 Представление не изменилось, без тела. Условный GET
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 ETag строка
304 ETag строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff \
  "$API/leads/101" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json"

POST /leads/{id}/update

Изменение разрешённых полей.

Доступ. Разрешения подключения: leads:write. Права сотрудника: «Лиды и заявки → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
name строка / null нет да не более 255 символов
phone строка / null нет да не более 32 символов
email строка / null (email) нет да не более 255 символов
customer_id целое число / null нет да ≥ 1
external_id строка / null нет да не менее 1 символов; не более 255 символов
follow_up_at строка / null (дата и время) нет да не более 64 символов; Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$
desired_at строка / null (дата и время) нет да не более 64 символов; Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка
200 Idempotency-Replayed строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/leads/101/update" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-leads-update:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.leads.update.json'

POST /leads/{id}/status

Допустимое изменение статуса.

Доступ. Разрешения подключения: leads:write. Права сотрудника: «Лиды и заявки → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
status строка да нет Допустимо: "new", "active", "archived"

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка
200 Idempotency-Replayed строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/leads/101/status" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-leads-status:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.leads.status.json'

POST /leads/{id}/assign

Назначение ответственного.

Доступ. Разрешения подключения: leads:write. Права сотрудника: «Лиды и заявки → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
assigned_user_id целое число / null да да ≥ 1

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка
200 Idempotency-Replayed строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/leads/101/assign" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-leads-assign:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.leads.assign.json'

POST /leads/{id}/convert

Конвертация в клиента с явным выбором соответствия.

Доступ. Разрешения подключения: leads:write. Права сотрудника: «Лиды и заявки → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.

Параметры

Имя Где Тип Обязательно null Ограничения
Authorization заголовок строка да нет Bearer <SERVICEAPP_TOKEN>
id путь строка да нет Шаблон: ^(?:[0-9]+)$
Idempotency-Key заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$
If-Resource-Version заголовок строка да нет не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$

Тело запроса

Content-Type: application/json. Тело обязательно.

Поле Тип Обязательно null Ограничения и смысл
mode строка да нет Допустимо: "existing", "new"
customer_id целое число нет нет ≥ 1; Условие: required_if:mode,existing; Условие: prohibited_if:mode,new
customer объект нет нет —
customer.name строка да нет не более 255 символов
customer.phone строка да нет не более 255 символов
customer.company_name строка / null нет да не более 255 символов
customer.additional_phone строка / null нет да не более 255 символов
customer.email строка / null (email) нет да не более 255 символов
customer.address строка / null нет да не более 255 символов
customer.inn строка / null нет да не более 255 символов
customer.kpp строка / null нет да не более 255 символов
customer.ogrn строка / null нет да не более 255 символов
customer.source строка / null нет да не более 255 символов
customer.internal_note строка / null нет да не более 10000 символов
customer.is_customer логическое значение нет нет —
customer.is_supplier логическое значение нет нет —
customer.bank объект / null нет да —
customer.bank.name строка / null нет да не более 255 символов
customer.bank.bik строка / null нет да не более 255 символов
customer.bank.account строка / null нет да не более 255 символов
customer.bank.correspondent_account строка / null нет да не более 255 символов
customer.contacts массив нет нет не более 100 элементов
customer.contacts[] объект да нет —
customer.contacts[].name строка да нет не более 40 символов
customer.contacts[].position строка / null нет да не более 40 символов
customer.contacts[].phone строка да нет не более 255 символов
customer.custom_fields массив нет нет не более 100 элементов; Без повторов
customer.custom_fields[] объект да нет —
customer.custom_fields[].field_id целое число да нет ≥ 1
customer.custom_fields[].value строка / логическое значение / массив / объект / null да да —
customer.custom_fields[].value (вариант 3) массив нет нет —
customer.custom_fields[].value (вариант 3)[] строка да нет —
customer.custom_fields[].value (вариант 4) объект нет нет —
customer.custom_fields[].value (вариант 4).amount строка да нет —
customer.custom_fields[].value (вариант 4).currency строка да нет —
customer.external_id строка / null нет да не более 255 символов
customer[] строка да нет —

Ответы

HTTP Назначение и схема
200 Успех. Полная схема и пример
401 Требуется действующий Bearer. Коды и формат ошибки
403 Недостаточно допуска. Коды и формат ошибки
404 Не найдено или недоступно. Коды и формат ошибки
409 Конфликт состояния или повтора. Коды и формат ошибки
412 Версия устарела. Коды и формат ошибки
422 Ошибка входных данных. Коды и формат ошибки
428 Нужно предусловие версии. Коды и формат ошибки
429 Лимит запросов, Retry-After. Коды и формат ошибки
503 Временно недоступно. Коды и формат ошибки
HTTP Заголовок ответа Тип Описание
200 Location строка
200 Idempotency-Replayed строка

Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.

У принятого POST Location и meta.operation_id указывают на журнал операции; ETag отсутствует. При повторе запроса сохраняются исходные data/meta, добавляется Idempotency-Replayed: true. Версии передавайте по назначению, указанному в описании ресурса.

Пример запроса

Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.

curl --silent --show-error --globoff --request POST \
  "$API/leads/101/convert" \
  --header "Authorization: Bearer $SERVICEAPP_TOKEN" \
  --header "Accept: application/json" \
  --header "Idempotency-Key: example:v1-leads-convert:001" \
  --header "If-Resource-Version: $RESOURCE_VERSION" \
  --header "Content-Type: application/json" \
  --data-binary '@examples/requests/v1.leads.convert.json'