Клиенты и контрагенты
Все операции. Авторизация. Запросы и повторы.
Все пути в этом файле дополняют /api/v1 на домене организации.
Описание и ограничения
Назначение
Полноценное ведение клиентов, поставщиков и организаций: создание, изменение, контакты, реквизиты, поиск и связь с объектами обслуживания.
Поля и назначение
| Публичное поле | Формат и смысл | Доступ |
|---|---|---|
id |
id |
только чтение |
name |
обязательное имя или наименование | чтение и запись |
company_name |
строка/null | чтение и запись |
is_customer, is_supplier |
логическое значение, допустимы оба признака | чтение и запись |
phone, additional_phone, email, address |
phone — обязательная непустая строка до 255 символов; остальные контакты — строки/null после проверки данных |
чтение и запись |
inn, kpp, ogrn |
строки/null с сохранением ведущих нулей | чтение и запись |
bank.name, bank.bik, bank.account, bank.correspondent_account |
строки/null, банковские реквизиты | чтение и запись |
source |
строка/null, источник клиента | чтение и запись |
internal_note |
строка/null, обычные права клиента | чтение и запись |
contacts |
массив контактных сведений по явной схеме | чтение и запись |
custom_fields |
типизированные значения по схеме custom-fields | чтение и запись |
external_id |
строка внутри подключения | чтение и запись |
version |
строка Unix-секунд; для старого null — "0"; предусловие изменения по правилам версий | только чтение |
updated_at |
дата и время UTC без дробной части или null | только чтение |
Обязательность и null указаны в схемах каждой операции ниже.
Доступ и выборка
Карточка содержит ссылки только для чтения: links.edit (карточка панели), links.portal (вход в кабинет клиента), links.public=null. Ссылка портала сохраняет обычную клиентскую авторизацию; API не создаёт ссылку для входа без пароля. Для удалённого клиента все три ссылки равны null.
customers:read/write/delete и «Клиенты и поставщики → Просмотр, Изменение, Удаление». Реквизиты inn, kpp, ogrn, bank и internal_note читаются с обычным правом «Клиенты и поставщики → Просмотр» и изменяются с «Клиенты и поставщики → Изменение», включая очистку значением null. Фильтр по ИНН использует обычное право просмотра клиентов.
Фильтры: id, external_id, q, phone, email, inn, is_customer, is_supplier, updated_since, deleted.
GET списка и карточки с filter[deleted]=true выбирает только удалённых клиентов и требует одновременно разрешения подключения customers:read и customers:delete, а также права сотрудника «Клиенты и поставщики → Просмотр» и «Клиенты и поставщики → Удаление». Отсутствие любого из этих допусков — 403 FORBIDDEN; проверка прав выполняется до поиска конкретной карточки. При достаточных правах отсутствующая, чужая или недоступная запись — 404; неудалённая карточка с этим фильтром также возвращает 404. Без фильтра и с filter[deleted]=false доступны только неудалённые клиенты по обычным правам чтения. Разрешение подключения customers:write не заменяет customers:delete. Для удалённых клиентов действуют те же права просмотра; чтение версии перед restore не обходит авторизацию восстановления.
updated_at с точностью до секунды выбран основой version. Изменения внутри одной секунды могут иметь одинаковую версию. Поле не является моментом завершения транзакции или гарантированной границей уже видимых изменений; условия синхронизации описаны в правилах выборок.
Запросы и вложенные значения
При создании обязательны name длиной 1–255 символов и непустая строка phone до 255 символов. По умолчанию is_customer=true, is_supplier=false, contacts=[], custom_fields=[]. Хотя бы один из признаков клиента или поставщика должен быть true. Остальные необязательные контакты и реквизиты при отсутствии равны null. При изменении отсутствующие поля сохраняются. Для phone значения null, пустая строка, другой тип и превышение длины возвращают 422. Формат телефона не ограничен международной записью: допустима исходная непустая строка. Удаление и восстановление принимают {} и If-Resource-Version; восстановление возвращает 200 с карточкой или 409 при несовместимых связанных записях.
contacts — массив не более 100 объектов вида { "name": "Иван", "position": "Инженер", "phone": "+79990000000" }. Поля name (1–40 символов) и phone обязательны; position (до 40 символов или null) необязательно. Переданный массив полностью заменяет дополнительные контакты, [] очищает их, отсутствие поля сохраняет прежний список. Другие ключи не принимаются.
bank — объект только из name/bik/account/correspondent_account. При изменении присутствующие вложенные ключи изменяются, отсутствующие сохраняются; значение null очищает отдельный реквизит, bank=null очищает весь банк. Для contacts и bank внутренние имена не принимаются. Формат custom_fields описан в отдельном контракте и поддерживается при создании и изменении.
Правила и связи
- Физические лица и организации хранятся в одном ресурсе клиентов. Поле
company_nameне даёт права менять принадлежность чужих документов. - Телефон/email/ИНН помогают найти кандидатов, но неоднозначное совпадение не выбирается молча.
- Повтор создания с тем же
external_idвозвращает существующее соответствие либо конфликт данных, а не второго клиента. - Для одного подключения у одного клиента может быть не более одного
external_idодновременно. ID уникален в пределах подключения и типа ресурса; попытка связать второй ID с той же карточкой возвращает конфликт и не перезаписывает прежнее соответствие. - Пароли, данные клиентских сессий, коды входа и отметки прочтения не принимаются и не возвращаются.
- Удаление проверяет связанные акты, договоры, оборудование и документы; клиентская история не уничтожается каскадно.
Пример входных данных
{
"external_id": "crm-customer-104",
"name": "ООО Северный сервис",
"company_name": "ООО Северный сервис",
"phone": "+79990000000",
"inn": "7701234567",
"kpp": "770101001",
"is_customer": true,
"is_supplier": false
}
Операции
| Метод | Путь | Назначение |
|---|---|---|
| GET | /customers |
Список с фильтрами и пагинацией |
| POST | /customers |
Создание |
| GET | /customers/{id} |
Карточка |
| POST | /customers/{id}/update |
Изменение разрешённых полей |
| POST | /customers/{id}/delete |
Удаление с проверкой зависимостей |
| POST | /customers/{id}/restore |
Восстановление удалённого контрагента |
GET /customers
Доступные клиенты; deleted=true требует одновременно права чтения и удаления.
Доступ. Разрешения подключения: customers:read. Права сотрудника: «Клиенты и поставщики → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.
Параметры
| Имя | Где | Тип | Обязательно | null | Ограничения |
|---|---|---|---|---|---|
Authorization |
заголовок | строка | да | нет | Bearer <SERVICEAPP_TOKEN> |
sort |
параметр запроса | строка | нет | нет | Допустимо: "id", "-id", "updated_at,id", "-updated_at,-id" |
page[size] |
параметр запроса | целое число | нет | нет | ≥ 1; ≤ 100 |
page[cursor] |
параметр запроса | строка | нет | нет | не более 8192 символов |
filter[id] |
параметр запроса | целое число | нет | нет | ≥ 1 |
filter[external_id] |
параметр запроса | строка | нет | нет | не более 255 символов |
filter[q] |
параметр запроса | строка | нет | нет | не более 200 символов |
filter[phone] |
параметр запроса | строка | нет | нет | не более 255 символов |
filter[email] |
параметр запроса | строка | нет | нет | не более 255 символов |
filter[inn] |
параметр запроса | строка | нет | нет | не более 255 символов |
filter[is_customer] |
параметр запроса | строка | нет | нет | Допустимо: "true", "false" |
filter[is_supplier] |
параметр запроса | строка | нет | нет | Допустимо: "true", "false" |
filter[updated_since] |
параметр запроса | строка (дата и время) | нет | нет | Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$ |
filter[updated_before] |
параметр запроса | строка (дата и время) | нет | нет | Шаблон: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})$ |
filter[deleted] |
параметр запроса | строка | нет | нет | Допустимо: "true", "false" |
Ответы
| HTTP | Назначение и схема |
|---|---|
| 200 | Успех. Полная схема и пример |
| 400 | Некорректный запрос. Коды и формат ошибки |
| 401 | Требуется действующий Bearer. Коды и формат ошибки |
| 403 | Недостаточно допуска. Коды и формат ошибки |
| 409 | Конфликт состояния или повтора. Коды и формат ошибки |
| 422 | Ошибка входных данных. Коды и формат ошибки |
| 429 | Лимит запросов, Retry-After. Коды и формат ошибки |
| 500 | Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки |
| 503 | Временно недоступно. Коды и формат ошибки |
Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.
Пример запроса
Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.
curl --silent --show-error --globoff \
"$API/customers" \
--header "Authorization: Bearer $SERVICEAPP_TOKEN" \
--header "Accept: application/json"
POST /customers
Создание клиента с проверкой текущих прав при повторном запросе.
Доступ. Разрешения подключения: customers:write. Права сотрудника: «Клиенты и поставщики → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.
Параметры
| Имя | Где | Тип | Обязательно | null | Ограничения |
|---|---|---|---|---|---|
Authorization |
заголовок | строка | да | нет | Bearer <SERVICEAPP_TOKEN> |
Idempotency-Key |
заголовок | строка | да | нет | Уникальный ключ команды внутри подключения, 1–128 символов A–Z/a–z/0–9/._:-.; не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$ |
Тело запроса
Content-Type: application/json. Тело обязательно.
| Поле | Тип | Обязательно | null | Ограничения и смысл |
|---|---|---|---|---|
name |
строка | да | нет | не более 255 символов |
phone |
строка | да | нет | не более 255 символов |
company_name |
строка / null | нет | да | не более 255 символов |
additional_phone |
строка / null | нет | да | не более 255 символов |
email |
строка / null (email) |
нет | да | не более 255 символов |
address |
строка / null | нет | да | не более 255 символов |
inn |
строка / null | нет | да | не более 255 символов |
kpp |
строка / null | нет | да | не более 255 символов |
ogrn |
строка / null | нет | да | не более 255 символов |
source |
строка / null | нет | да | не более 255 символов |
internal_note |
строка / null | нет | да | не более 10000 символов |
is_customer |
логическое значение | нет | нет | — |
is_supplier |
логическое значение | нет | нет | — |
bank |
объект / null | нет | да | Только перечисленные ключи |
bank.name |
строка / null | нет | да | не более 255 символов |
bank.bik |
строка / null | нет | да | не более 255 символов |
bank.account |
строка / null | нет | да | не более 255 символов |
bank.correspondent_account |
строка / null | нет | да | не более 255 символов |
contacts |
массив | нет | нет | не более 100 элементов |
contacts[] |
объект | да | нет | Только перечисленные ключи |
contacts[].name |
строка | да | нет | не более 40 символов |
contacts[].phone |
строка | да | нет | не более 255 символов |
contacts[].position |
строка / null | нет | да | не более 40 символов |
custom_fields |
массив | нет | нет | не более 100 элементов; Без повторов |
custom_fields[] |
объект | да | нет | Только перечисленные ключи |
custom_fields[].field_id |
целое число | да | нет | ≥ 1 |
custom_fields[].value |
строка / логическое значение / массив / объект / null | да | да | — |
custom_fields[].value (вариант 3) |
массив | нет | нет | — |
custom_fields[].value (вариант 3)[] |
строка | да | нет | — |
custom_fields[].value (вариант 4) |
объект | нет | нет | — |
custom_fields[].value (вариант 4).amount |
строка | да | нет | — |
custom_fields[].value (вариант 4).currency |
строка | да | нет | — |
external_id |
строка / null | нет | да | не более 255 символов |
Ответы
| HTTP | Назначение и схема |
|---|---|
| 201 | Создано. Полная схема и пример |
| 400 | Некорректный запрос. Коды и формат ошибки |
| 401 | Требуется действующий Bearer. Коды и формат ошибки |
| 403 | Недостаточно допуска. Коды и формат ошибки |
| 404 | Не найдено или недоступно. Коды и формат ошибки |
| 409 | Конфликт состояния или повтора. Коды и формат ошибки |
| 413 | Превышен размер. Коды и формат ошибки |
| 415 | Неподдерживаемый Content-Type. Коды и формат ошибки |
| 422 | Ошибка входных данных. Коды и формат ошибки |
| 429 | Лимит запросов, Retry-After. Коды и формат ошибки |
| 500 | Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки |
| 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/customers" \
--header "Authorization: Bearer $SERVICEAPP_TOKEN" \
--header "Accept: application/json" \
--header "Idempotency-Key: example:v1-customers-store:001" \
--header "Content-Type: application/json" \
--data-binary '@examples/requests/v1.customers.store.json'
GET /customers/{id}
Карточка клиента, включая реквизиты и внутреннюю заметку.
Доступ. Разрешения подключения: customers:read. Права сотрудника: «Клиенты и поставщики → Просмотр». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.
Параметры
| Имя | Где | Тип | Обязательно | null | Ограничения |
|---|---|---|---|---|---|
Authorization |
заголовок | строка | да | нет | Bearer <SERVICEAPP_TOKEN> |
id |
путь | строка | да | нет | Шаблон: ^(?:[0-9]+)$ |
If-None-Match |
заголовок | строка | нет | нет | Сильный ETag представления из предыдущего GET.; — |
filter[deleted] |
параметр запроса | строка | нет | нет | Допустимо: "true", "false" |
Ответы
| HTTP | Назначение и схема |
|---|---|
| 200 | Успех. Полная схема и пример |
| 304 | Представление не изменилось, без тела. Условный GET |
| 400 | Некорректный запрос. Коды и формат ошибки |
| 401 | Требуется действующий Bearer. Коды и формат ошибки |
| 403 | Недостаточно допуска. Коды и формат ошибки |
| 404 | Не найдено или недоступно. Коды и формат ошибки |
| 406 | Недопустимое кодирование ответа. Коды и формат ошибки |
| 409 | Конфликт состояния или повтора. Коды и формат ошибки |
| 422 | Ошибка входных данных. Коды и формат ошибки |
| 429 | Лимит запросов, Retry-After. Коды и формат ошибки |
| 500 | Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки |
| 503 | Временно недоступно. Коды и формат ошибки |
| HTTP | Заголовок ответа | Тип | Описание |
|---|---|---|---|
| 200 | ETag |
строка | |
| 304 | ETag |
строка |
Каждый ответ содержит новый X-Request-Id в заголовке. Общие транспортные отказы и правила повтора действуют также при отказе до контроллера; см. ошибки.
Пример запроса
Запускается из каталога комплекта после настройки переменных в быстром старте. Замените демонстрационные идентификаторы 101 и UUID идентификаторами доступных записей. $RESOURCE_VERSION берётся из GET владельца версии, описанного выше. Для нового действия сохраните новый ключ; для повтора используйте прежний.
curl --silent --show-error --globoff \
"$API/customers/101" \
--header "Authorization: Bearer $SERVICEAPP_TOKEN" \
--header "Accept: application/json"
POST /customers/{id}/update
Изменить разрешённые поля. Отсутствующие ключи сохраняются; повтор проверяет текущий тариф.
Доступ. Разрешения подключения: customers:write. Права сотрудника: «Клиенты и поставщики → Изменение». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.
Параметры
| Имя | Где | Тип | Обязательно | null | Ограничения |
|---|---|---|---|---|---|
Authorization |
заголовок | строка | да | нет | Bearer <SERVICEAPP_TOKEN> |
id |
путь | строка | да | нет | Шаблон: ^(?:[0-9]+)$ |
Idempotency-Key |
заголовок | строка | да | нет | не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$ |
If-Resource-Version |
заголовок | строка | да | нет | data.version прочитанного клиента: Unix-секунды updated_at, для старого null — "0".; не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$ |
Тело запроса
Content-Type: application/json. Тело обязательно.
| Поле | Тип | Обязательно | null | Ограничения и смысл |
|---|---|---|---|---|
name |
строка | нет | нет | не более 255 символов |
phone |
строка | нет | нет | не более 255 символов |
company_name |
строка / null | нет | да | не более 255 символов |
additional_phone |
строка / null | нет | да | не более 255 символов |
email |
строка / null (email) |
нет | да | не более 255 символов |
address |
строка / null | нет | да | не более 255 символов |
inn |
строка / null | нет | да | не более 255 символов |
kpp |
строка / null | нет | да | не более 255 символов |
ogrn |
строка / null | нет | да | не более 255 символов |
source |
строка / null | нет | да | не более 255 символов |
internal_note |
строка / null | нет | да | не более 10000 символов |
is_customer |
логическое значение | нет | нет | — |
is_supplier |
логическое значение | нет | нет | — |
bank |
объект / null | нет | да | Только перечисленные ключи |
bank.name |
строка / null | нет | да | не более 255 символов |
bank.bik |
строка / null | нет | да | не более 255 символов |
bank.account |
строка / null | нет | да | не более 255 символов |
bank.correspondent_account |
строка / null | нет | да | не более 255 символов |
contacts |
массив | нет | нет | не более 100 элементов |
contacts[] |
объект | да | нет | Только перечисленные ключи |
contacts[].name |
строка | да | нет | не более 40 символов |
contacts[].phone |
строка | да | нет | не более 255 символов |
contacts[].position |
строка / null | нет | да | не более 40 символов |
custom_fields |
массив | нет | нет | не более 100 элементов; Без повторов |
custom_fields[] |
объект | да | нет | Только перечисленные ключи |
custom_fields[].field_id |
целое число | да | нет | ≥ 1 |
custom_fields[].value |
строка / логическое значение / массив / объект / null | да | да | — |
custom_fields[].value (вариант 3) |
массив | нет | нет | — |
custom_fields[].value (вариант 3)[] |
строка | да | нет | — |
custom_fields[].value (вариант 4) |
объект | нет | нет | — |
custom_fields[].value (вариант 4).amount |
строка | да | нет | — |
custom_fields[].value (вариант 4).currency |
строка | да | нет | — |
external_id |
строка / null | нет | да | не более 255 символов |
Ответы
| HTTP | Назначение и схема |
|---|---|
| 200 | Успех. Полная схема и пример |
| 400 | Некорректный запрос. Коды и формат ошибки |
| 401 | Требуется действующий Bearer. Коды и формат ошибки |
| 403 | Недостаточно допуска. Коды и формат ошибки |
| 404 | Не найдено или недоступно. Коды и формат ошибки |
| 409 | Конфликт состояния или повтора. Коды и формат ошибки |
| 412 | Версия устарела. Коды и формат ошибки |
| 413 | Превышен размер. Коды и формат ошибки |
| 415 | Неподдерживаемый Content-Type. Коды и формат ошибки |
| 422 | Ошибка входных данных. Коды и формат ошибки |
| 428 | Нужно предусловие версии. Коды и формат ошибки |
| 429 | Лимит запросов, Retry-After. Коды и формат ошибки |
| 500 | Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки |
| 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/customers/101/update" \
--header "Authorization: Bearer $SERVICEAPP_TOKEN" \
--header "Accept: application/json" \
--header "Idempotency-Key: example:v1-customers-update:001" \
--header "If-Resource-Version: $RESOURCE_VERSION" \
--header "Content-Type: application/json" \
--data-binary '@examples/requests/v1.customers.update.json'
POST /customers/{id}/delete
Удаление клиента с проверкой связанных записей и сохранением истории. Тело запроса — {}.
Доступ. Разрешения подключения: customers:delete. Права сотрудника: «Клиенты и поставщики → Удаление». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.
Параметры
| Имя | Где | Тип | Обязательно | null | Ограничения |
|---|---|---|---|---|---|
Authorization |
заголовок | строка | да | нет | Bearer <SERVICEAPP_TOKEN> |
id |
путь | строка | да | нет | Шаблон: ^(?:[0-9]+)$ |
Idempotency-Key |
заголовок | строка | да | нет | не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$ |
If-Resource-Version |
заголовок | строка | да | нет | data.version неудалённого клиента.; не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$ |
Тело запроса
Content-Type: application/json. Тело обязательно.
Тело — пустой JSON-объект {}. Другие ключи не принимаются.
Ответы
| HTTP | Назначение и схема |
|---|---|
| 200 | Успех. Полная схема и пример |
| 400 | Некорректный запрос. Коды и формат ошибки |
| 401 | Требуется действующий Bearer. Коды и формат ошибки |
| 403 | Недостаточно допуска. Коды и формат ошибки |
| 404 | Не найдено или недоступно. Коды и формат ошибки |
| 409 | Конфликт состояния или повтора. Коды и формат ошибки |
| 412 | Версия устарела. Коды и формат ошибки |
| 413 | Превышен размер. Коды и формат ошибки |
| 415 | Неподдерживаемый Content-Type. Коды и формат ошибки |
| 422 | Ошибка входных данных. Коды и формат ошибки |
| 428 | Нужно предусловие версии. Коды и формат ошибки |
| 429 | Лимит запросов, Retry-After. Коды и формат ошибки |
| 500 | Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки |
| 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/customers/101/delete" \
--header "Authorization: Bearer $SERVICEAPP_TOKEN" \
--header "Accept: application/json" \
--header "Idempotency-Key: example:v1-customers-delete:001" \
--header "If-Resource-Version: $RESOURCE_VERSION" \
--header "Content-Type: application/json" \
--data-binary '@examples/requests/v1.customers.delete.json'
POST /customers/{id}/restore
Восстановить удалённого клиента. Версия берётся из GET с filter[deleted]=true; тело запроса — {}.
Доступ. Разрешения подключения: customers:delete. Права сотрудника: «Клиенты и поставщики → Удаление». Дополнительно действуют доступ к записям, мастерским, модулям и условия полей из описания ресурса выше.
Параметры
| Имя | Где | Тип | Обязательно | null | Ограничения |
|---|---|---|---|---|---|
Authorization |
заголовок | строка | да | нет | Bearer <SERVICEAPP_TOKEN> |
id |
путь | строка | да | нет | Шаблон: ^(?:[0-9]+)$ |
Idempotency-Key |
заголовок | строка | да | нет | не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._:-]+$ |
If-Resource-Version |
заголовок | строка | да | нет | data.version удалённого клиента.; не менее 1 символов; не более 128 символов; Шаблон: ^[A-Za-z0-9._~-]+$ |
Тело запроса
Content-Type: application/json. Тело обязательно.
Тело — пустой JSON-объект {}. Другие ключи не принимаются.
Ответы
| HTTP | Назначение и схема |
|---|---|
| 200 | Успех. Полная схема и пример |
| 400 | Некорректный запрос. Коды и формат ошибки |
| 401 | Требуется действующий Bearer. Коды и формат ошибки |
| 403 | Недостаточно допуска. Коды и формат ошибки |
| 404 | Не найдено или недоступно. Коды и формат ошибки |
| 409 | Конфликт состояния или повтора. Коды и формат ошибки |
| 412 | Версия устарела. Коды и формат ошибки |
| 413 | Превышен размер. Коды и формат ошибки |
| 415 | Неподдерживаемый Content-Type. Коды и формат ошибки |
| 422 | Ошибка входных данных. Коды и формат ошибки |
| 428 | Нужно предусловие версии. Коды и формат ошибки |
| 429 | Лимит запросов, Retry-After. Коды и формат ошибки |
| 500 | Внутренняя ошибка, исход нужно уточнить. Коды и формат ошибки |
| 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/customers/101/restore" \
--header "Authorization: Bearer $SERVICEAPP_TOKEN" \
--header "Accept: application/json" \
--header "Idempotency-Key: example:v1-customers-restore:001" \
--header "If-Resource-Version: $RESOURCE_VERSION" \
--header "Content-Type: application/json" \
--data-binary '@examples/requests/v1.customers.restore.json'