---
slug: "moysklad"
name: "МойСклад JSON API 1.2"
vendor: "МойСклад"
industry: "retail"
docsUrl: "https://dev.moysklad.ru/doc/api/remap/1.2/"
version: 1
updatedAt: "2026-10-25"
---

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

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

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

## Охват

Есть:

- Получение токена доступа, Basic и Bearer-аутентификация
- Ассортимент (товары, услуги, комплекты, модификации) и создание товара
- Краткий отчёт об остатках — общий и по складам
- Контрагенты: список с поиском и фильтрами, создание
- Заказ покупателя с позициями
- Отгрузка по заказу через шаблон
- Вебхуки на создание, изменение и удаление сущностей
- Асинхронные выгрузки больших отчётов и списков

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

- Остальные документы: приёмки, платежи, кассовые ордера, перемещения, списания, возвраты, счета-фактуры, производство
- Расширенный отчёт об остатках, прибыльность, деньги, обороты, показатели
- Дополнительные поля, статусы, печать документов, публикации, файлы и изображения
- Розница (точки продаж, смены, продажи), бонусные программы, маркировка
- Аудит, уведомления, сотрудники и права, пользовательские справочники

## Сценарии

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

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

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

```shell
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 часов назад) и раз в сутки делай полную синхронизацию.

```shell
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; дальше добавляй через ресурс позиций заказа.

```shell
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`).

```shell
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 дней отвечает только ошибками, вебхуки отключаются.

```shell
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 час.

```shell
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

- Боевой: `https://api.moysklad.ru`
- Все пути начинаются с .: `/api/remap/1.2`

## Авторизация

Тип: 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 |

## Нюансы

- Обязательно сжатие: заголовок `Accept-Encoding: gzip`, иначе `415` без тела.
- Ссылки на объекты передаются в формате `meta` (`href`, `type`, `mediaType`).
- Списки возвращают `meta` (`size`, `limit`, `offset`, `nextHref`, `previousHref`) и `rows`; `limit` — до 1000.
- Массив `positions` в запросе на обновление полностью заменяет позиции документа: непереданные удаляются.
- Цены и суммы — в копейках.
- Функции под заголовком `X-Lognex-Remap-Beta-Feature` не подпадают под гарантию неизменности структуры.
- Остаток по заголовкам: `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-Lognex-Retry-TimeInterval`, `X-Lognex-Reset`, `X-Lognex-Retry-After`.
- Вебхуки работают только на платных тарифах и в пробный период; при бесплатном тарифе их нельзя создать.
- Есть MCP-сервер документации JSON API (раздел MCP-dev) — он ищет по документации и не выполняет запросы к аккаунту.

## Ошибки

| Код | Описание |
|---|---|
| `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` | Таймаут, повторите позднее |

## Ограничения

- Лимит за 3 секунды считается отдельно для каждого пользователя и решения: 45 единиц; токен публичного или приватного решения — 1 единица за запрос (45 запросов).
- Логин/пароль или токен пользователя: вес запроса растёт поэтапно — с 1 сентября 2026 года 3 единицы (15 запросов за 3 секунды), с 1 декабря 2026 года 4 единицы (11 запросов). Решение в статусе «Черновик» или «На модерации» — 4 единицы.
- `GET /report/stock/all` и `/report/stock/bystore` — вес 5 единиц за запрос.
- Не больше 5 параллельных запросов от пользователя или решения и 20 от аккаунта.
- Не больше 8 КБ в заголовках и 20 МБ данных в запросе; не больше 1000 элементов в массиве.
- Не больше 4 асинхронных задач в очереди на аккаунт; результат хранится 1 час.
- Доступ к API отключается при 200+ одинаковых ошибочных запросах в минуту или 200+ ответах `429` в минуту в течение часа, а также при 100+ PUT-запросах к одной сущности в минуту.

## Источники

- [МойСклад JSON API 1.2](https://dev.moysklad.ru/doc/api/remap/1.2/)
- [Общие сведения](https://dev.moysklad.ru/doc/api/remap/1.2/#/general)
- [Ограничения](https://dev.moysklad.ru/doc/api/remap/1.2/#/restrictions)
- [Асинхронный обмен](https://dev.moysklad.ru/doc/api/remap/1.2/#/async#2-asinhronnyj-obmen)
- [Ассортимент](https://dev.moysklad.ru/doc/api/remap/1.2/#/dictionaries/assortment#2-assortiment)
- [Отчёт Остатки](https://dev.moysklad.ru/doc/api/remap/1.2/#/reports/report-stock#2-otchet-ostatki)
- [Вебхуки](https://dev.moysklad.ru/doc/api/remap/1.2/#/dictionaries/webhook#2-vebhuki)
- [Исходники документации — moysklad/api-remap-1.2-doc](https://github.com/moysklad/api-remap-1.2-doc)

---

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