Методы API для заказов и клиентов — команды, которыми связка Альбато без панели магазина получает, создаёт и меняет заказы, отмечает оплату, ищет и изменяет клиентов. Это первая часть справочника: в ней же общие правила запросов и коды ответов. Ниже — адрес и заголовки запроса, методы с примерами и ограничения токена.
Перед началом
Отправляйте запросы на адрес https://домен-магазина/api/v2/… с API-токеном в заголовке X-Service-Token, без слова Bearer. API-токен — секретный ключ, по которому магазин узнаёт связку и проверяет её права. Токен выпускают в разделе «Подключения» на вкладке «Альбато» и отмечают флажками нужные права — подробнее в статье «API-токены». У каждого метода ниже указано, какой флажок нужен.
Тело запроса передаётся в формате JSON (текст из пар «поле — значение») с заголовком Content-Type: application/json. Магазин определяется по токену, storeId передавать не нужно. Время в адресе запроса передавайте в UTC, например 2026-09-16T10:00:00Z, или кодируйте знак + как %2B: иначе он прочитается как пробел.
Списки приходят в виде {"count": …, "rows": […]}. У списков заказов и клиентов ограничения по умолчанию нет: всегда передавайте limit и перебирайте страницы через offset.
Сам API о новых заказах и оплатах не сообщает — для этого магазин отправляет вебхуки. Вебхук — автоматический запрос, который магазин отправляет на адрес из настроек, когда происходит событие. Поля событий описаны в статье «События вебхуков».
Методы этой статьи передают персональные данные клиентов: имена, телефоны, адреса и переписку. Обязанности оператора персональных данных лежат на владельце магазина — что учесть, описано в статье «Персональные данные», документы проверьте с юристом.
Связка — сценарий в Альбато. Товары и остатки описаны во второй части справочника «Методы API. Товары и остатки», исполнители и записи на услуги — в третьей, «Методы API. Исполнители и записи».
Коды ответов
- 200, 201 — запрос выполнен. 201 — объект создан.
- 400 — ошибка в параметрах или теле запроса. Причина — в поле
message. - 401 — токен не передан, неверный, отозван или истёк:
invalid or revoked service token. - 403 — запрос понят, но выполнить его нельзя. Причину показывает текст ответа, варианты разобраны в разделе «Короткие ответы».
- 404 — команда неприменима к объекту в текущем состоянии, например заказ уже отменён. Некоторые методы возвращают здесь не JSON, а текст
Not Found. - 409 — конфликт: такой
externalIdили адрес почты уже есть, товара не хватает на складе, интервал доставки занят. - 429 — слишком много запросов: больше 300 в минуту с одного сетевого адреса. Тело ответа — текст, а не JSON. Сделайте паузу и повторите.
- 500, 502, 503 — сбой на стороне магазина или платёжного сервиса. Повторите запрос позже.
💡 Обычно ошибка приходит в виде {"message": "…"}, но у отдельных методов тело другое: поле error или простой текст. В условиях связки сначала проверяйте код ответа, а текст используйте для диагностики.
Статусы заказа
Статус хранится числом в поле status. Для каждого перехода есть своя команда, они описаны в разделе «Сменить статус заказа»:
0— «Новый». Присваивается при создании, вернуть заказ в этот статус можно командойstatus.1— «Подтверждён», командаconfirm.2— «В обработке», командаstatus.4— «Доставляется», командаstatus.3— «Выполнен», командаdone.-1— «Отменён», командаcancel. Отменённый заказ вернуть в работу нельзя.
Поле source показывает, откуда пришёл заказ: web — сайт, max — бот MAX, manual — панель или API, yandex_market — Яндекс Маркет. Заказы Маркета меняются только через Маркет: команды API вернут ошибку 409.
Заказы
Получить заказ
GET /api/v2/order?id=123
Права: «Заказы и записи на услуги» → «Чтение».
Ответ — объект заказа. Если связке нужен ответ в виде списка, добавьте &format=list: придёт {"count": 1, "rows": [заказ]}.
{
"id": 123,
"status": 1,
"source": "web",
"clientId": 45,
"fullValue": 1450,
"discount": 50,
"deliveryValue": 300,
"currency": "RUB",
"isPayment": false,
"isWaitClientPayment": true,
"paymentId": 3,
"contactName": "Иван Петров",
"contactPhone": "+79990000001",
"email": "ivan@example.com",
"comment": "Позвонить заранее",
"deliveryType": "courier",
"address": "г. Москва, ул. Ленина, д. 1",
"externalId": null,
"createdAt": "2026-09-16T10:00:00.123456Z",
"client": {"id": 45, "caption": "Иван Петров", "phone": "+79990000001"},
"payment": {"caption": "Картой онлайн"},
"delivery": {"caption": "Курьер", "kind": "courier", "provider": null},
"orderCompositions": [
{
"id": 301,
"goodId": 10,
"count": 2,
"price": 500,
"optionsSnapshot": [{"groupCaption": "Размер", "valueCaption": "M"}],
"good": {"caption": "Футболка", "article": "SHIRT-M"}
}
]
}
В ответе больше полей, чем в примере. Для связок обычно нужны эти:
fullValue— итог к оплате: товары, доставка, включённая в заказ, и наценка способа оплаты минус скидки.discount,promoValue— ручная скидка; скидка по промокоду вместе с реферальной скидкой и оплатой бонусами.deliveryValue,paymentValue— стоимость доставки, включённая в заказ; наценка способа оплаты.isPayment—true, если заказ оплачен.isWaitClientPayment—true, если клиенту выставлена ссылка на оплату и магазин ждёт платёж.isWaitClientCancel—true, если клиент попросил отменить заказ.paymentId,paymentMethod— ID способа оплаты магазина; онлайн-провайдер:yookassa,yandexpayилиnull.contactName,contactPhone,email,comment— контакты и комментарий из заказа. Могут отличаться от профиля клиента.deliveryType,deliveryTypeId— код и ID способа доставки.address,addressEntrance,addressFloor,addressApt,addressComment— адрес доставки: адрес, подъезд, этаж, квартира, комментарий.deliveryDate,deliverySlotFrom,deliverySlotTo— дата и интервал доставки:2026-09-20,10:00:00,12:00:00.externalId,externalSource— ID заказа во внешней системе и название этой системы.client— профиль клиента:id,caption,firstName,lastName,phone,emailи другие.orderCompositions— позиции:idпозиции,goodId,count,priceза единицу, выбранные опцииoptionsSnapshot, название и артикул вgood.
Список заказов
GET /api/v2/order?limit=50
Права: «Заказы и записи на услуги» → «Чтение».
Заказы идут от новых к старым, count — число заказов по фильтрам без учёта страниц. Без limit придут все заказы магазина одним ответом. Фильтры можно сочетать:
status— коды статусов через запятую, например0,1,2.paymentStatus— состояние оплаты:paid— оплачен,waiting— ждёт оплаты по ссылке,unpaid— не оплачен. Можно через запятую.dateFrom,dateTo— дата создания заказа. ЕслиdateToуказан без времени, день входит в выборку целиком.source— источники через запятую:web,max,manual,yandex_market.externalId,externalSource— точное совпадение ID и названия внешней системы.search— номер заказа или часть имени, телефона, имени пользователя из профиля клиента. Контакты, введённые в самом заказе, не ищутся.totalFrom,totalTo— диапазон итоговой суммы.waitingCancel—true, чтобы получить только заказы, по которым клиент запросил отмену.deliveryTypeId— ID одного способа доставки.limit,offset— размер страницы и сдвиг от начала.
Заказы, созданные записями на услуги, в список не попадают: их получают методами записей из статьи «Методы API. Исполнители и записи». По id такой заказ доступен. Фильтров по клиенту и дате изменения нет — об изменениях сообщают вебхуки.
Справочники для фильтров
GET /api/v2/orderFilters
Права: «Заказы и записи на услуги» → «Чтение».
Возвращает способы доставки deliveryTypes (id, caption, kind, provider), зоны курьерской доставки courierZones, список источников sources и статусы с названиями statuses. В списки попадают и выключенные способы доставки, и удалённые зоны — учитывайте это, если подставляете ID в новый заказ.
Заказ в виде формы редактирования
GET /api/v2/newOrder?id=123
Права: «Заказы и записи на услуги» → «Чтение».
Отдаёт заказ так, как его показывает форма редактирования заказа в панели. Набор полей близок к ответу метода «Получить заказ», но есть отличия:
fullValue— не итог к оплате, а сумма позиций (количество × цена) без скидок, доставки и наценки способа оплаты;- в позициях
orderCompositionsнет выбранных опцийoptionsSnapshot; - есть сводка скидок
discounts: скидка по промокодуpromo, реферальная скидкаreferralс кодом и именем пригласившего, списанные бонусыbonus, ручная скидкаmanualи их суммаtotalDiscount; - для способа доставки с отдельной оплатой есть блок
orderDelivery.
⚠️ Для связок используйте «Получить заказ» (GET /api/v2/order): по этому методу итог к оплате считать нельзя. Кроме того, метод не только читает данные, хотя токену хватает права на чтение. Если доставка в заказе оплачивается отдельно, метод может создать для заказа запись о доставке (блок orderDelivery), а если по ней ожидается платёж через ЮKassa — запросить его статус и отметить доставку оплаченной.
Ошибки:
- 400
id is required— не переданid; - 400
invalid resource id—idне число или отрицательный; - 403
resource does not belong to service token store— заказа нет, он удалён или принадлежит другому магазину; - 404 — при
id=0, ответ приходит текстомNot Found, а не JSON.
Создать заказ
POST /api/v2/newOrder
Права: «Заказы и записи на услуги» → «Создание заказов, отправка клиенту и действия с записями».
clientId— ID клиента магазина. Обязательное поле.items— позиции:goodId— ID товара или варианта,count— количество,price— цена за единицу. Цена берётся из запроса, а не из каталога. Обязательное поле.contactName,contactPhone,email— контакты для заказа.comment— комментарий, до 2000 символов.paymentId— ID способа оплаты. Для онлайн-оплаты магазин сразу создаст ссылку на оплату.deliveryTypeId,deliveryType— ID и код способа доставки. Передавайте оба: без кода не сработают правила, завязанные на тип доставки, например автоотправка цифровых товаров.deliveryValue— стоимость доставки.address,addressEntrance,addressFloor,addressApt,addressComment— адрес доставки.pickupPointId— ID точки самовывоза.courierZoneId,deliveryDate,deliverySlotFrom,deliverySlotTo— зона курьера, дата и интервал доставки:2026-09-20,10:00,12:00. Интервал бронируется сразу.discount,promoId— ручная скидка в рублях; ID промокода.externalId,externalSource— ID заказа во внешней системе и её название. Повторный заказ с той же парой получит ошибку 409.
POST https://myshop.ru/api/v2/newOrder
X-Service-Token: ваш_токен
Content-Type: application/json
{
"clientId": 45,
"contactName": "Иван Петров",
"contactPhone": "+79990000001",
"items": [
{"goodId": 10, "count": 2, "price": 500},
{"goodId": 11, "count": 1, "price": 250}
],
"deliveryTypeId": 5,
"deliveryType": "courier",
"deliveryValue": 300,
"address": "г. Москва, ул. Ленина, д. 1",
"externalId": "CRM-5521",
"externalSource": "amocrm"
}
Ответ — код 201: {"id": 124, "fullValue": 1550, "status": 0, "message": "Заказ создан"}. Заказ получает статус «Новый», валюту RUB и источник manual.
- Остатки резервируются сразу. Если товара не хватает, заказ не создаётся, ответ — 409
insufficient stock. Для товаров с учётом остатка количество должно быть целым. Движения резерва видны в истории остатка — см. статью «Методы API. Товары и остатки». - Если интервал доставки уже занят, придёт 409 «Интервал доставки уже занят, выберите другой», и заказ тоже не создастся.
- Ошибки проверки оплаты приходят в поле
error, например{"error": "для создания платежа необходимо указать email или телефон клиента"}. - Защиты от повторного создания, кроме пары
externalIdиexternalSource, нет. Если связка может повторить шаг, передавайте эту пару: повтор получит 409, и дубля не будет. - ID способов оплаты, точек самовывоза и промокодов через API не получить. Возьмите их из уже оформленного заказа с нужными настройками: поля
paymentId,pickupPointIdиpromo.
После создания отправляются события «Новый заказ» и «Изменение остатков» по каждой позиции с учётом остатка, а сотрудники получают уведомление о новом заказе.
Изменить заказ
PUT /api/v2/newOrder?id=123
Права: «Заказы и записи на услуги» → «Редактирование, статусы, оплата и доставка».
Передавайте только поля, которые нужно изменить: comment, contactName, contactPhone, email, поля адреса вместе с addressMode, lat и lng, deliveryTypeId, deliveryType, pickupPointId, courierZoneId, deliveryDate, deliverySlotFrom, deliverySlotTo, discount, promoId, clientId и items. Поле, которого метод не знает, например status, paymentId или externalId, вернёт ошибку 400 unknown field.
Состав заказа меняется через items:
- поля нет — позиции не меняются;
- позиция с
id— у неё меняютсяcountиprice; - позиция без
id— добавляется, нуженgoodId; - позиции заказа, которых нет в списке, удаляются. Пустой массив удалит все позиции.
PUT https://myshop.ru/api/v2/newOrder?id=123
X-Service-Token: ваш_токен
Content-Type: application/json
{
"comment": "Перезвонить после 18:00",
"items": [
{"id": 301, "goodId": 10, "count": 3, "price": 500},
{"goodId": 12, "count": 1, "price": 990}
]
}
Ответ — обновлённый заказ без вложенных объектов. Итог пересчитывается, а неоплаченная ссылка на оплату сбрасывается. Выполненный и отменённый заказы менять нельзя (400), скидку и промокод оплаченного заказа — тоже (409). Смена интервала доставки этим методом интервал не бронирует.
Событий о заказе метод не отправляет. При изменении состава уходят события «Изменение остатков».
Позиции заказа
Отдельные позиции удобно менять тремя методами. ID позиции — поле id в orderCompositions.
POST /api/v2/orderComposition— добавить позицию, право «Создание заказов, отправка клиенту и действия с записями». Тело:{"orderId": 123, "goodId": 12, "count": 1, "price": 990}. Всегда передавайтеcountиprice. Ответ — 201 и созданная позиция.PUT /api/v2/orderComposition?id=305— изменить позицию, право «Редактирование, статусы, оплата и доставка». Тело:{"count": 2, "price": 950}. Ответ — позиция с новыми значениями.DELETE /api/v2/orderComposition?id=305— удалить позицию, право «Удаление». Ответ — код 200 и текстOK.
Резерв остатка пересчитывается сразу, а итог заказа — в фоне, за несколько секунд. Если следующий шаг связки читает сумму заказа, добавьте перед ним паузу. Позиции выполненного и отменённого заказа менять нельзя.
Сменить статус заказа
Все команды передают ID заказа в адресе, тело нужно только команде status. Ответ — {"success": true}. Права: «Заказы и записи на услуги» → «Редактирование, статусы, оплата и доставка».
PUT /api/v2/order/confirm?id=123
PUT /api/v2/order/status?id=123
PUT /api/v2/order/done?id=123
PUT /api/v2/order/cancel?id=123
PUT /api/v2/order/rejectCancel?id=123
confirm— подтверждает заказ, статус1.status— ставит статус из тела запроса:{"status": 2}. Допустимы только0,2и4, для остальных статусов есть свои команды.done— выполняет заказ, статус3. Резерв списывается окончательно, остаток не меняется. Для отменённого или уже выполненного заказа ответ — 404.cancel— отменяет заказ, статус-1. Резерв возвращается на склад, ожидающие ссылки на оплату, интервал доставки и записи на услуги по заказу отменяются. Повторная отмена — 404.rejectCancel— отклоняет запрос клиента на отмену. Статус не меняется, клиенту сообщение не отправляется. Если запроса нет — 404.
Команды работают так же, как кнопки в панели. Подтверждение и смена статуса снимают запрос клиента на отмену без отдельного уведомления.
После команд уходят события: «Изменение статуса заказа» для confirm, status и done, «Отмена заказа» и «Изменение остатков» для cancel.
⚠️ Важно: отмена оплаченного заказа не возвращает деньги клиенту — возврат оформляется в платёжной системе. Не переводите выполненный заказ обратно в другой статус: после этого состав заказа перестанет редактироваться.
Отметка об оплате
PUT /api/v2/order/changePayment?id=123
Права: «Заказы и записи на услуги» → «Редактирование, статусы, оплата и доставка».
Метод переключает отметку об оплате на противоположную: неоплаченный заказ становится оплаченным, оплаченный — неоплаченным. Тело не нужно. Ответ показывает новое значение: {"success": true, "isPayment": true}.
⚠️ Важно: перед вызовом прочитайте заказ и проверьте, что isPayment равен false. Если Альбато повторит шаг, второй вызов снимет оплату.
Когда заказ становится оплаченным, отправляется событие «Оплата заказа», а цифровые товары уходят автоматически, если это настроено. Статус заказа не меняется. Снятие отметки события не создаёт.
Клиенты
Список клиентов и поиск
GET /api/v2/clients/list?limit=50
Права: «Клиенты и сообщения» → «Чтение».
search— часть имени, телефона, адреса почты или имени пользователя в мессенджере.externalId,externalSource— точное совпадение ID клиента во внешней системе и её названия.limit,offset— размер страницы и сдвиг от начала.
Клиенты идут от новых к старым. Телефон ищется как часть строки в том виде, в каком его сохранили, поэтому надёжнее искать по последним десяти цифрам: search=9991234567.
Поля клиента, которые обычно нужны связкам:
id,caption— ID и отображаемое имя;firstName,lastName,middleName,phone,email;source— как появился клиент:manual— панель или API,web— посетитель сайта,registration— регистрация на сайте,max— мессенджер MAX;externalId,externalSource— ID во внешней системе;maxId— заполнен, если клиент писал боту в MAX;createdAt,updatedAt.
Карточка клиента
GET /api/v2/clients/info?id=1542
Права: «Клиенты и сообщения» → «Чтение».
Возвращает профиль клиента, число его заказов orderCount и до 20 последних сообщений переписки в recentMessages, новые первыми. В сообщениях from: true означает сообщение магазина, from: false — сообщение клиента. Полей source, externalId и externalSource в карточке нет, их отдаёт список клиентов.
Создать клиента
POST /api/v2/clients/create
Права: «Клиенты и сообщения» → «Создание и изменение клиентов, бонусы и сообщения».
caption— отображаемое имя, до 200 символов. Если не передать, соберётся из имени и фамилии или возьмётся адрес почты.firstName,lastName,middleName— имя, фамилия, отчество, до 100 символов каждое.phone— телефон, до 20 символов. Формат не проверяется, храните его единообразно, например+79991234567.email— адрес электронной почты. Должен быть уникальным.login,password— логин и пароль (от 6 символов) для входа на сайт. Без логина логином станет адрес почты.externalId,externalSource— ID клиента во внешней системе (строкой) и название системы.
POST https://myshop.ru/api/v2/clients/create
X-Service-Token: ваш_токен
Content-Type: application/json
{
"firstName": "Иван",
"lastName": "Петров",
"phone": "+79991234567",
"email": "ivan@example.com",
"externalId": "CRM-778",
"externalSource": "amocrm"
}
Ответ — код 201 и созданный клиент с source: "manual". После создания отправляется событие «Новый клиент».
- Занятый адрес почты или логин вернут 409
email already exists, повтор парыexternalIdиexternalSource— 409externalId already exists. - Дубли по телефону не проверяются. Перед созданием ищите клиента по телефону или
externalId. - Клиента, созданного через API, нельзя связать с MAX. Если он потом напишет боту магазина, появится отдельная карточка.
Изменить клиента
POST /api/v2/clients/updateInfo
Права: «Клиенты и сообщения» → «Создание и изменение клиентов, бонусы и сообщения».
ID клиента передаётся в теле, в поле clientId. Изменить можно caption, firstName, lastName, middleName, phone, email, description, login, password, lang и block (true — не включать клиента в рассылки).
POST https://myshop.ru/api/v2/clients/updateInfo
X-Service-Token: ваш_токен
Content-Type: application/json
{"clientId": 1542, "phone": "+79990000010"}
Ответ — клиент с новыми значениями, после него уходит событие «Изменение клиента». Оно отправляется после каждого успешного вызова, даже если значения не изменились.
⚠️ Важно: каждое переданное поле перезаписывается, в том числе пустым значением. "email": "" удалит адрес почты клиента. Не передавайте поля, которые менять не нужно. externalId, externalSource и привязку к мессенджерам этим методом изменить нельзя.
Что по токену недоступно
Следующие действия с заказами выполняются только в панели, API ответит 403 service token is not allowed on this route:
- смена способа оплаты у существующего заказа;
- расчёт стоимости доставки, выставление и отмена счёта за доставку;
- отправка созданного заказа клиенту и ручная выдача цифровых товаров;
- журнал действий по заказу.
Ограничение по клиентам (привязка к MAX) описано в разделе «Клиенты».
Короткие ответы
Почему API отвечает 403 на заказ, который точно существует?
Чаще всего токену не хватает права: тогда в ответе rbac_forbidden, а в поле requiredCapability указано, какого именно. resource does not belong to service token store значит, что заказ удалён или принадлежит другому магазину. Для несуществующих ID API тоже отвечает 403, а не 404.
Как не создать заказ дважды, если Альбато повторил шаг?
Передавайте в заказе externalId и externalSource, например номер сделки и amocrm. Повторный запрос с той же парой получит ошибку 409, и второй заказ не появится. Перед созданием можно проверить заказ запросом списка заказов с параметрами externalSource и externalId.
Как отметить заказ оплаченным из платёжной системы?
Сначала получите заказ через GET /api/v2/order?id=… и убедитесь, что isPayment равен false. Только после этого вызывайте команду changePayment: она переключает отметку, и повторный вызов снимет оплату.
Сколько запросов в минуту принимает API магазина?
До 300 запросов в минуту с одного сетевого адреса. При превышении API отвечает кодом 429 с текстом вместо JSON: сделайте паузу и повторите запрос.