# RetailCRM API v5: Загрузить остатки товаров

Сценарий из mcp-everything. Актуально на 2026-10-24.

Синхронизировать остатки со склада, чтобы операторы видели, что есть в наличии.

1. Отправь остатки: POST /api/v5/store/inventories/upload с offers — JSON-строкой: для каждого торгового предложения его externalId (или id) и stores — склады с code и available.
2. За один запрос можно передать много предложений — отправляй изменения пачками, а не по одному товару.
3. Проверь результат: GET /api/v5/store/products с фильтром по товару покажет актуальные остатки.

```bash
curl -X POST "https://<поддомен>.retailcrm.ru/api/v5/store/inventories/upload" \
  --data-urlencode "apiKey=$RCRM_KEY" \
  --data-urlencode 'site=my-shop' \
  --data-urlencode 'offers=[
    {"externalId": "SKU-17", "stores": [{"code": "main", "available": 25}]},
    {"externalId": "SKU-18", "stores": [{"code": "main", "available": 0}]}
  ]'
```

## Базовые URL

- Боевой: `https://{your-subdomain}.retailcrm.ru/api/v5/`

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

Тип: API-ключ

API-ключ создаётся в аккаунте RetailCRM и передаётся в параметре `apiKey` (GET или POST). Если ключ даёт доступ к нескольким магазинам, части методов нужен параметр `site` — символьный код магазина. Запросы — только по HTTPS, кодировка UTF-8.

## Методы сценария

### GET /api/v5/store/products — Список товаров

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `filter` | query | object | нет | Фильтр |
| `limit` | query | integer | нет | Количество записей |
| `page` | query | integer | нет | Страница |

### POST /api/v5/store/inventories/upload — Загрузка остатков

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `offers` | body | string (JSON) | да | Торговые предложения с остатками |
| `site` | body | string | нет | Код магазина |

## Нюансы

- POST-запросы отправляются как `application/x-www-form-urlencoded`, а вложенные структуры (`order`, `customer`, `offers`) — JSON-строкой внутри поля формы.
- Для ключа с доступом к нескольким магазинам часть методов требует `site`.
- Ответы списков содержат метаданные пагинации: `limit`, `totalCount`, `currentPage`, `totalPageCount`.
- Для синхронизации изменений используйте `/orders/history` и `/customers/history`, а не полную перевыгрузку списков.
- Код `460` при пакетной загрузке означает, что часть заказов загружена с ошибками; загруженные перечислены в `uploadedOrders`.

## Другие сценарии

- [Передать заказ с сайта в RetailCRM](https://mcp-everything.ru/integrations/retailcrm/scenarios/peredat-zakaz-s-sayta-v-retailcrm.md)
- [Забирать изменения заказов без полной перевыгрузки](https://mcp-everything.ru/integrations/retailcrm/scenarios/zabirat-izmeneniya-zakazov-bez-polnoy.md)
- [Сменить статус заказа и отметить оплату](https://mcp-everything.ru/integrations/retailcrm/scenarios/smenit-status-zakaza-i-otmetit-oplatu.md)

---

Если этого недостаточно — официальная документация: https://rest-api-docs.retailcrm.ru/v5/
Вся интеграция одним документом: https://mcp-everything.ru/integrations/retailcrm.md
