Загружаем витрину
Подбираем товары и категории
Это займет несколько секунд, если каталог обновляется.
AMAGU MARKET · API v1
Подключите каталог AMAGU MARKET к своему магазину или учётной системе. Карточки товаров и остатки доступны раздельно в JSON по HTTPS. Карточки содержат цену продажи, фотографии, описания и характеристики товаров.
OpenAPI JSON для разработчиков · Скачать документацию
Базовый адрес: https://amagu-market.ru/api/v1. Для выгрузки используйте GET без тела. Для приёма продаж и отмен используйте POST из раздела «Заказы партнёров».
curl 'https://amagu-market.ru/api/v1/products?limit=100' curl 'https://amagu-market.ru/api/v1/stocks?limit=100'
Если администратор включил доступ по ключу, получите ключ у AMAGU MARKET и передавайте его в заголовке. Ключи предназначены для серверных интеграций: не размещайте их в адресах страниц или публичном JavaScript.
curl 'https://amagu-market.ru/api/v1/products?limit=100' \ -H 'X-API-Key: ВАШ_API_КЛЮЧ'
Также поддерживается Authorization: Bearer ВАШ_API_КЛЮЧ. В открытом режиме ключ необязателен. Переданный недействительный ключ всё равно возвращает 401.
| Эндпоинт | Текущий доступ | Запросов/мин с IP | Максимум товаров |
|---|---|---|---|
/v1/products | Требуется API-ключ | 30 | 100 |
/v1/stocks | Требуется API-ключ | 60 | 100 |
Общий текущий предел API: 600 запросов в минуту для всех клиентов вместе. Значения показаны на момент открытия страницы.
Администратор может независимо открыть, закрыть или ограничить ключом каждый эндпоинт. Лимиты IP, ключа и общий предел действуют совместно. Счётчики общие для всех процессов сервера. Окно минуты начинается с первого запроса, суточное окно ключа — с первого запроса на 24 часа.
Заголовки успешного ответа: X-RateLimit-Limit и X-RateLimit-Remaining показывают предел и остаток бюджета минуты для IP/ключа, X-RateLimit-Reset — Unix-время сброса. Общий и суточный бюджеты могут завершиться раньше. При 429 ориентируйтесь на Retry-After в секундах.
GET /api/v1/products
Возвращает активные товары с идентификатором МойСклад или поставщика Ресанта, включая товары с нулевым остатком. Каждый вариант имеет собственный id. Для товаров МойСклад это UUID соответствующего товара или модификации; для Ресанта — идентификатор поставщика с префиксом resanta:. Правила скрытия витрины по нулевому остатку, цене или фото не исключают активные товары из выгрузки. Цена продажи указана в поле price. Остатки получайте отдельным запросом к /stocks.
| Параметр | Формат и назначение |
|---|---|
limit | 1–200, но не выше максимума из настроек. По умолчанию 100. Если максимум снижен, передавайте limit явно. |
after_id | Строка next_cursor предыдущей страницы. Передавайте её целиком; для первой страницы не передавайте after_id. Курсор сохраняет позицию обхода каталога. |
ids | До 100 строковых ID через запятую без пробелов: UUID МойСклад или resanta:ID_ПОСТАВЩИКА. Неизвестные и неактивные ID пропускаются. |
sku | Точный артикул, до 80 символов. Закодируйте специальные символы URL. Фильтры можно сочетать, они работают одновременно. |
| Поле | Описание |
|---|---|
minimum_order_quantity | Размер упаковки: минимум и кратность заказа. Например, 3 означает 3, 6, 9 шт. Если доступный остаток меньше упаковки, его можно купить поштучно от 1 до остатка. |
id, moysklad_id, source, supplier_id | Строковый ключ товара. Для МойСклад id совпадает с UUID moysklad_id; source=moysklad. Для Ресанта id=resanta:ID_ПОСТАВЩИКА, source=resanta, supplier_id содержит ID поставщика, moysklad_id=null. Карточки и остатки связываются по id. |
sku, barcode | Артикул и штрихкод товара. |
name, slug, url | Название, адресный идентификатор и абсолютная ссылка на карточку. |
short_description, description | Краткое и полное описание. Может содержать HTML; при встраивании используйте безопасную обработку HTML. |
price, compare_at_price, currency | Публичная цена продажи, цена до скидки или null, валюта RUB. Цены — строки десятичных чисел; индивидуальные скидки клиента не учитываются. |
image_url, images[] | Основное фото и список оригиналов: url, sort_order, is_primary. Ссылки абсолютные. |
categories[] | Активные категории: id, name, slug, parent_id. Список без дубликатов. |
tags[] | Метки товара: id, name, slug. |
attributes[] | Публичные характеристики: slug, name, value, data_type. Скрытые характеристики не выгружаются. |
variant | Группа варианта: group_id, label, attribute_label; null, если группы нет. Каждый вариант выгружается отдельным товаром. |
weight, dimensions, unit | Вес (строка или null), габариты и единица измерения в формате карточки товара. |
video_url | Абсолютная ссылка на видео или null. |
meta_title, meta_keywords, meta_description | SEO-поля карточки или null. |
average_rating, review_count, created_at | Средняя оценка (строка или null), число отзывов, время создания в ISO 8601. |
Точная схема всех полей и допустимых null опубликована в OpenAPI. Пример структуры страницы (карточка сокращена):
{
"items": [
{
"id": "11111111-1111-4111-8111-111111111111",
"source": "moysklad",
"moysklad_id": "11111111-1111-4111-8111-111111111111",
"supplier_id": null,
"sku": "AM-001",
"name": "Пример товара",
"price": "1250.00",
"currency": "RUB",
"images": [],
"attributes": []
}
],
"next_cursor": null,
"has_more": false,
"generated_at": "2026-10-28T10:00:00Z"
}GET /api/v1/stocks. Параметры и пагинация совпадают с карточками.
{
"items": [
{
"id": "11111111-1111-4111-8111-111111111111",
"source": "moysklad",
"moysklad_id": "11111111-1111-4111-8111-111111111111",
"supplier_id": null,
"sku": "AM-001",
"stock_quantity": 25,
"in_stock": true
},
{
"id": "resanta:12345",
"source": "resanta",
"moysklad_id": null,
"supplier_id": "12345",
"sku": "AM-002",
"stock_quantity": 0,
"in_stock": false
}
],
"next_cursor": null,
"has_more": false,
"generated_at": "2026-10-28T10:00:00Z"
}stock_quantity — общий свободный остаток для новых заказов. Для товаров МойСклад он уже учитывает резервы покупателей, включая принятые через API продажи вашего клиента. Все API-ключи получают остаток из одного общего пула. in_stock равно true, когда количество больше нуля.
После успешного приёма продажи с status=reserved и stock_reservation=committed её количество уже вычтено на сайте. Повторно вычитать свои подтверждённые резервы из stock_quantity не нужно. Например, из 22 шт. зарезервированы 10 шт.; API отдаёт 12 шт. При вашем дополнительном страховом запасе 3 шт. остаётся 9 шт. для новых продаж.
Этот остаток общий и для всех ваших кабинетов Ozon/WB. При распределении между кабинетами учитывайте единый доступный пул. Кеш остатков — до 15 секунд; generated_at показывает время формирования ответа. Синхронизация внешних изменений МойСклад выполняется в фоне. Запрос остатков сам по себе не резервирует товар; наличие повторно проверяется при приёме заказа. Нулевые остатки передаются, чтобы ваша система могла выключать продажи.
POST /api/v1/orders. Только для серверной интеграции зарегистрированного клиента: нужен API-ключ с разрешением orders, привязанный к вашему аккаунту партнёра. Ключи выгрузки не дают право создавать заказы. Пароль или сессионная cookie клиента вместе с ключом не требуются.
Передавайте от 1 до 100 позиций (или меньше по настройкам). Продажи разных площадок объединяются в один общий заказ клиента за расчётный период. По умолчанию это календарный месяц по времени Оренбурга. Первый заказ создаётся при первой принятой продаже. После закрытия периода следующая новая продажа открывает новый общий заказ.
curl 'https://amagu-market.ru/api/v1/orders' \
-X POST \
-H 'X-API-Key: ВАШ_API_КЛЮЧ' \
-H 'Idempotency-Key: sale-ozon-100001-v1' \
-H 'Content-Type: application/json' \
--data '{"items":[{"marketplace":"ozon","external_order_id":"100001","external_line_id":"1","product_id":"11111111-1111-4111-8111-111111111111","quantity":1}]}'| Поле | Назначение |
|---|---|
marketplace | Постоянный код площадки: ozon, wb и т. п.; латинские строчные буквы, цифры, точка, дефис, подчёркивание, до 64 символов. |
external_order_id | Номер исходного заказа в вашей системе, строка до 120 символов. |
external_line_id | Постоянный ID позиции исходного заказа, до 120 символов. Для одной позиции можно использовать "1". При добавлении нового товара в тот же заказ используйте новый ID позиции. |
product_id | UUID МойСклад из поля id выгрузки товаров. Внутренние числовые ID сайта не принимаются. Приём с резервом МойСклад для товаров Ресанта пока не поддерживается. |
quantity | Целое число единиц от 1 до 100000. Для партнёрских продаж разрешён поштучный приём независимо от упаковки. Цена AMAGU фиксируется сервером при первом приёме, передавать цену не нужно. |
Весь пакет принимается одной транзакцией: либо все новые позиции зарезервированы на сайте, либо ни одна. При нехватке товара или ошибке API возвращает 409/422. Количества одного товара суммируются в общем заказе. Если цена AMAGU изменилась, новая продажа сохраняется по новой цене, прошлые продажи не пересчитываются.
Idempotency-Key обязателен: 1–128 печатных ASCII-символов без пробелов. После таймаута или потери ответа повторяйте тот же пакет с тем же ключом. Ответ с replayed=true подтверждает ранее принятый пакет. Изменение тела при прежнем ключе даёт 409.
Дополнительная защита действует по сочетанию marketplace + external_order_id + external_line_id в пределах клиента: прежняя позиция с новым ключом запроса вернёт status=duplicate без повторного резерва. Попытка изменить товар или количество вернёт 409. Отмены неотправленных позиций передавайте через /orders/cancellations; возвраты отправленных товаров согласуйте с менеджером.
?limit=100 (либо меньшего limit по настройкам).Это последовательное чтение текущего состояния, без фиксации общего снимка и без фильтра изменений. Для полной сверки начинайте без after_id. При успешной полной выгрузке считайте отсутствующие id снятыми с публикации. При ошибке или незавершённой выгрузке не удаляйте товары на своей стороне.
Кеш карточек — до 60 секунд, остатков — до 15 секунд. generated_at показывает время формирования страницы, включая ответы из кеша. Доступ и ключ проверяются на каждом запросе. Рекомендуем обновлять карточки раз в час, остатки — раз в 5 минут, последовательно и без параллельных запросов.
| Код | Действие клиента |
|---|---|
| 401 | Нужен ключ, ключ недействителен, истёк или отозван. Проверьте заголовок, обратитесь за новым ключом. |
| 403 | Эндпоинт закрыт или ключу не выдано разрешение. Обратитесь к AMAGU MARKET. |
| 422 | Проверьте параметры, размер страницы, ids и диапазоны значений. |
| 429 | Достигнут один из лимитов. Подождите не меньше Retry-After секунд и добавьте случайную небольшую задержку. |
| 503 | Временная недоступность или занятость. Соблюдайте Retry-After; при повторении увеличивайте задержку. |
Ошибки возвращаются в JSON с полем detail. Не повторяйте запросы в бесконечном цикле без задержки. Не передавайте ключ в query-параметрах. Изменяющие товар методы API не поддерживаются.
stock_reservation=committed подтверждает резерв на сайте. moysklad=queued означает, что состав записан в сохраняемую очередь синхронизации; это ещё не подтверждение резерва в МойСклад. При сбое МойСклад сайт сохраняет резерв и повторяет синхронизацию. Обновление учитывает распределение по складам и общие лимиты интеграции.
Резерв сайта уменьшает stock_quantity в той же транзакции, что и приём продажи, до синхронизации с МойСклад. При последующем обновлении остатков подтверждённый резерв МойСклад учитывается один раз. Повтор с тем же Idempotency-Key или ответ duplicate дополнительный резерв не создаёт. Используйте свободный остаток из GET /stocks и вычитайте только свой страховой запас.
POST /api/v1/orders/cancellations принимает items с marketplace, external_order_id и external_line_id. Передавайте API-ключ и отдельный Idempotency-Key. До выставления счёта неотправленная позиция удаляется из общего заказа, сумма уменьшается, резерв сайта освобождается, а снятие резерва МойСклад записывается в очередь. При отмене последней позиции заказ остаётся пустым. Повтор не увеличивает остаток.
{
"items": [
{
"marketplace": "ozon",
"external_order_id": "100001",
"external_line_id": "1"
}
]
}После выставления счёта или оплаты API возвращает status=requires_review и передаёт отмену менеджеру. Счёт и резервы автоматически не изменяются. POST /api/v1/orders/shipments с теми же полями фиксирует фактическую отправку внешней позиции: status=shipped. Отменить её как неотправленную после этого нельзя — API вернёт 409.
Общий расчётный заказ не собирается. Обычные статусы сайта используются для учёта и сами не меняют резервы. По окончании периода отдельный планировщик автоматически закрывает период и общий заказ.
GET /api/v1/orders?limit=20&offset=0 возвращает только ваши периоды: id, starts_at, ends_at, closed, order_number, total_quantity, total_amount, currency и sync_status. synced подтверждает последнюю версию заказа в МойСклад, pending — ожидание, error — необходимость проверки AMAGU MARKET. Проверяйте состояние не чаще раза в минуту.
GET /api/v1/orders/ID_ПЕРИОДА?limit=100&offset=0 возвращает период и журнал продаж. При has_more=true следующий offset указан в next_offset. Заказы другого клиента недоступны. После закрытия периода общий заказ используется для выставления счёта; поздние новые продажи попадают в следующий период, повтор старой остаётся в исходном.
Максимум тела приёма — 256 КБ, строк общего заказа — 2000. При достижении предела обратитесь в AMAGU MARKET для закрытия периода. Лимиты API действуют и на приём; при 429/503 соблюдайте Retry-After и повторяйте неизменённый пакет с прежним Idempotency-Key.