МойСклад JSON API 1.2 API

Отрасль: Ритейл и e-commerce. Актуально на 2026-10-25.

REST API сервиса управления торговлей и складом МойСклад (JSON API Remap 1.2). Даёт доступ к справочникам (товары, услуги, комплекты, модификации, контрагенты, склады, юрлица), документам (заказы покупателей, отгрузки, приёмки, платежи, перемещения и др.), отчётам (остатки, прибыльность, деньги, показатели), вебхукам и асинхронным выгрузкам. Типовые задачи — синхронизация каталога и остатков с интернет-магазином или маркетплейсом, создание заказов и отгрузок из внешней системы, получение уведомлений об изменениях.

Охват

Есть:

Нет — смотри официальную документацию:

Сценарии

Получить токен и начать работу

Для интеграций удобнее токен: его передают как Bearer, логин и пароль не хранятся в каждом запросе.

  1. Получи токен: POST /api/remap/1.2/security/token с заголовком Authorization: Basic (логин:пароль в Base64). Предыдущие токены пользователя при этом отзываются.
  2. Дальше передавай Authorization: Bearer <AccessToken>.
  3. В каждом запросе обязателен заголовок Accept-Encoding: gzip — без него сервер ответит 415.
curl --compressed -X POST \
  "https://api.moysklad.ru/api/remap/1.2/security/token" \
  -H "Authorization: Basic <Credentials>" \
  -H "Accept-Encoding: gzip"

Выгрузить каталог с остатками

Синхронизация товаров и остатков с сайтом или маркетплейсом. Новый эндпоинт ассортимента не считает остатки — их берут из краткого отчёта и связывают по id.

  1. Получи ассортимент: GET /api/remap/1.2/entity/assortment с заголовком X-Lognex-Remap-Beta-Feature: assortmentWithoutStock; листай по limit (до 1000) и offset.
  2. Запроси остатки: GET /api/remap/1.2/report/stock/all/current с нужным stockType (stock, freeStock, quantity, reserve, inTransit).
  3. Свяжи id из ассортимента с assortmentId из отчёта.
  4. Для частых обновлений передавай changedSince (не дальше 24 часов назад) и раз в сутки делай полную синхронизацию.
curl --compressed -X GET \
  "https://api.moysklad.ru/api/remap/1.2/entity/assortment" \
  -H "Authorization: Basic <Credentials>" \
  -H "Accept-Encoding: gzip" \
  -H "X-Lognex-Remap-Beta-Feature: assortmentWithoutStock"

Создать покупателя и заказ

Заказ из интернет-магазина: найти или создать контрагента, затем создать заказ с позициями и резервом.

  1. Найди контрагента: GET /api/remap/1.2/entity/counterparty?search=... (или filter по inn, phone, email).
  2. Если не найден — создай: POST /api/remap/1.2/entity/counterparty (обязательно только name).
  3. Создай заказ: POST /api/remap/1.2/entity/customerorder с organization и agent (ссылки в формате meta) и массивом positions (quantity, price, assortment.meta, reserve).
  4. Позиций в одном запросе — не больше 1000; дальше добавляй через ресурс позиций заказа.
curl --compressed -X POST \
  "https://api.moysklad.ru/api/remap/1.2/entity/counterparty" \
  -H "Authorization: Basic <Credentials>" \
  -H "Accept-Encoding: gzip" \
  -H "Content-Type: application/json" \
  -d '{"name": "ООО Радуга", "inn": "125152124152", "email": "raduga@stroi.ru"}'

Отгрузить заказ

Отгрузка на основе заказа: шаблон заполнит контрагента, юрлицо, склад и позиции из заказа.

  1. Получи шаблон: PUT /api/remap/1.2/entity/demand/new с customerOrder.meta в теле.
  2. При необходимости поправь склад (store) и позиции в полученном JSON.
  3. Создай отгрузку: POST /api/remap/1.2/entity/demand с телом шаблона (обязательны organization, agent, store).
curl --compressed -X PUT \
  "https://api.moysklad.ru/api/remap/1.2/entity/demand/new" \
  -H "Authorization: Basic <Credentials>" \
  -H "Accept-Encoding: gzip" \
  -H "Content-Type: application/json" \
  -d '{
    "customerOrder": {
      "meta": {
        "href": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/451cb4c0-3d1d-11e6-8a84-bae500000004",
        "metadataHref": "https://api.moysklad.ru/api/remap/1.2/entity/customerorder/metadata",
        "type": "customerorder",
        "mediaType": "application/json"
      }
    }
  }'

Получать уведомления об изменениях

Вебхук присылает POST на ваш URL при создании, изменении или удалении сущности — без постоянного опроса API. Доступно на платных тарифах администратору или решению.

  1. Создай вебхук: POST /api/remap/1.2/entity/webhook с url, action (CREATE, UPDATE, DELETE) и entityType (например, customerorder, product).
  2. На ваш URL придёт JSON с events[] (meta.href изменённой сущности, action, updatedFields) и auditContext.
  3. Забери актуальные данные по meta.href из события.
  4. Отвечай успешным кодом: если сервис 7 из 10 дней отвечает только ошибками, вебхуки отключаются.
curl --compressed -X POST \
  "https://api.moysklad.ru/api/remap/1.2/entity/webhook" \
  -H "Authorization: Basic <Credentials>" \
  -H "Accept-Encoding: gzip" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "http://www.example.com",
    "action": "CREATE",
    "entityType": "supply"
  }'

Выгрузить большой отчёт асинхронно

Для больших коллекций (остатки, контрагенты, ассортимент, отчёты) без листания.

  1. Добавь async=true к запросу (без limit и offset) — ответ 202 с заголовками Location (результат) и Content-Location (статус).
  2. Опрашивай статус: GET /api/remap/1.2/async/{id}.
  3. Когда задача готова, скачай результат по адресу из Location. Результат хранится 1 час.
curl --compressed -X GET \
  "https://api.moysklad.ru/api/remap/1.2/report/stock/bystore?async=true" \
  -H "Authorization: Bearer <Access-Token>" \
  -H "Accept-Encoding: gzip"

Базовые URL

Авторизация

Тип: Bearer-токен

Два способа: Basic Auth (заголовок Authorization: Basic с логин:пароль в Base64) или токен доступа (Authorization: Bearer <AccessToken>). Токен пользователя выдаёт POST /api/remap/1.2/security/token; для решений из маркетплейса используется токен решения. Лимит запросов зависит от способа: токены решений расходуют лимит медленнее, чем логин/пароль и токен пользователя.

Методы

POST /api/remap/1.2/security/token — Получение токена

В ответе access_token. Новый токен отзывает ранее выданные токены пользователя.

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/general

Параметр Где Тип Обяз. Описание
Authorization header string да Basic <логин:пароль в Base64>
Accept-Encoding header string да gzip

GET /api/remap/1.2/entity/assortment — Ассортимент

Все товары, услуги, комплекты, модификации и партии. Без заголовка assortmentWithoutStock запрос уходит в старый эндпоинт, который планируется удалить.

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/dictionaries/assortment#2-assortiment

Параметр Где Тип Обяз. Описание
X-Lognex-Remap-Beta-Feature header string да assortmentWithoutStock
limit query integer нет До 1000 (по умолчанию 1000)
offset query integer нет Отступ, по умолчанию 0
search query string нет Контекстный поиск
filter query string нет Фильтр, например filter=archived=false

POST /api/remap/1.2/entity/product — Создание товара

Достаточно непустого name.

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/dictionaries/product#3-sozdat-tovar

Параметр Где Тип Обяз. Описание
name body string да Наименование товара
code body string нет Код
article body string нет Артикул
salePrices body array нет Цены продажи
productFolder.meta body object нет Группа товаров
barcodes body array нет Штрихкоды

GET /api/remap/1.2/report/stock/all/current — Краткий отчёт об остатках

Только ID позиции и остаток, все данные одним ответом без листания. Для частого обновления (каждые 5–15 минут). Доступен администратору или сотруднику с правом на остатки.

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/reports/report-stock#3-kratkij-otchet-ob-ostatkah

Параметр Где Тип Обяз. Описание
stockType query string нет stock (по умолчанию), freeStock, quantity, reserve, inTransit
changedSince query string нет Остатки, изменившиеся с момента гггг-мм-дд чч:мм:сс (не больше 24 часов назад)
include query string нет zeroLines — включить нулевые остатки
filter query string нет assortmentId=... и/или storeId=..., несколько через запятую

GET /api/remap/1.2/report/stock/bystore/current — Краткий отчёт по складам

Остатки с разбивкой по складам. Строка без склада содержит резервы без привязки к складу.

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/reports/report-stock#3-kratkij-otchet-ob-ostatkah

Параметр Где Тип Обяз. Описание
stockType query string нет Тип остатка
changedSince query string нет Изменившиеся остатки
withRecalculate query boolean нет Включить позиции на пересчёте (остаток null)
filter query string нет assortmentId=..., storeId=...

GET /api/remap/1.2/entity/counterparty — Список контрагентов

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/dictionaries/counterparty#2-kontragent

Параметр Где Тип Обяз. Описание
limit query integer нет До 1000
offset query integer нет Отступ
search query string нет Контекстный поиск по полям
filter query string нет Фильтр по полям, например inn, phone, email
async query boolean нет Асинхронная выгрузка

POST /api/remap/1.2/entity/counterparty — Создание контрагента

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/dictionaries/counterparty#2-kontragent

Параметр Где Тип Обяз. Описание
name body string да Наименование
inn body string нет ИНН
kpp body string нет КПП
legalTitle body string нет Полное наименование
legalAddress body string нет Юридический адрес
email body string нет Email
phone body string нет Телефон
tags body array нет Группы (теги)
externalCode body string нет Внешний код

POST /api/remap/1.2/entity/customerorder — Создание заказа покупателя

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/documents/customerOrder#2-zakaz-pokupatelya

Параметр Где Тип Обяз. Описание
organization.meta body object да Ваше юрлицо
agent.meta body object да Контрагент-покупатель
positions[].assortment.meta body object нет Товар, услуга или модификация
positions[].quantity body number нет Количество
positions[].price body number нет Цена в копейках
positions[].discount body number нет Скидка, %
positions[].vat body integer нет НДС, %
positions[].reserve body number нет Резерв
store.meta body object нет Склад
state.meta body object нет Статус заказа
name body string нет Номер заказа
moment body string нет Дата документа

GET /api/remap/1.2/entity/customerorder — Список заказов покупателей

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/documents/customerOrder#2-zakaz-pokupatelya

Параметр Где Тип Обяз. Описание
limit query integer нет До 1000
offset query integer нет Отступ
filter query string нет Например filter=moment>2016-10-11 12:00:00
expand query string нет Раскрыть связанные объекты, например positions
search query string нет Контекстный поиск

PUT /api/remap/1.2/entity/demand/new — Шаблон отгрузки

Возвращает предзаполненную отгрузку; без тела — пустой шаблон со стандартными значениями.

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/documents/demand#2-otgruzka

Параметр Где Тип Обяз. Описание
customerOrder.meta body object нет Заказ покупателя, на основе которого создаётся отгрузка

POST /api/remap/1.2/entity/demand — Создание отгрузки

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/documents/demand#2-otgruzka

Параметр Где Тип Обяз. Описание
organization.meta body object да Ваше юрлицо
agent.meta body object да Контрагент
store.meta body object да Склад
customerOrder.meta body object нет Связанный заказ
positions body array нет Позиции, до 1000

POST /api/remap/1.2/entity/webhook — Создание вебхука

Сочетание entityType, action, url должно быть уникальным; на одно сочетание entityType и action — до 5 URL для пользователей и 1 для решения.

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/dictionaries/webhook#2-vebhuki

Параметр Где Тип Обяз. Описание
url body string да Адрес для уведомлений
action body string да CREATE, UPDATE, DELETE
entityType body string да Тип сущности, например customerorder
diffType body string нет Формат изменений для UPDATE (отображение изменённых полей)

GET /api/remap/1.2/async/{id} — Статус асинхронной задачи

Документация: https://dev.moysklad.ru/doc/api/remap/1.2/#/async#2-asinhronnyj-obmen

Параметр Где Тип Обяз. Описание
id path string да ID задачи из заголовка Content-Location

Нюансы

Ошибки

Код Описание
400 Ошибка в структуре JSON запроса
401 Неверные имя или пароль, пользователь или аккаунт заблокирован
403 Нет прав на просмотр объекта
404 Ресурс не существует
405 Неверный HTTP-метод для ресурса
409 Объект используется и не может быть удалён
410 Версия API больше не поддерживается
412 Не указан обязательный параметр или поле
413 Превышен размер запроса или число элементов (больше 1000 позиций)
414 Превышена длина URL
415 Формат запроса не поддерживается (в том числе нет Accept-Encoding: gzip)
429 Превышен лимит запросов (ошибка 1073 — лимит параллельных запросов)
500 Непредвиденная ошибка
502 Сервис временно недоступен
503 Сервис временно отключён
504 Таймаут, повторите позднее

Ограничения

Источники


Если этого недостаточно — официальная документация: https://dev.moysklad.ru/doc/api/remap/1.2/ JSON: https://mcp-everything.ru/api/integrations/moysklad. MCP: https://mcp-everything.ru/mcp