---
title: "Оценить начальный остаток склада площадки"
method: POST
path: "/api/v1/marketplace/{platform}/opening-stock/preview"
tags: ["Marketplace accounting"]
---

# Оценить начальный остаток склада площадки

`POST /api/v1/marketplace/{platform}/opening-stock/preview`

## Request

- Base URL: `https://erp.akeda.ru`
- URL: `https://erp.akeda.ru/api/v1/marketplace/{platform}/opening-stock/preview`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-Api-Key`
  - OAuth 2 (authorization code, authorization URL `https://erp.akeda.ru/oauth2/authorize`, token URL `https://erp.akeda.ru/oauth2/token`, scopes: `akeda:delegate`)
  - HTTP bearer

Снимок площадки на складе, в пути к покупателю и от покупателя, собранный
по позициям и оценённый на дату ввода выбранным источником цены:
stock — себестоимость товара на своих складах юрлица (средняя или
средневзвешенная по слоям FIFO, без остатка — последний приход, у набора
без остатка и прихода — по составу действующей спецификации), manual —
цена строки, rates — ставка маркетплейса. Пустой cost_source — по учётной
политике магазина. Количества собирает сервер; lines только выбирают
источник и ручную цену позиции. Позицию без сопоставления закрывают по
её card_ref: marketplaceLinkCatalogMatches к существующему товару или
marketplaceCreateCatalogMatchProducts новым. Ввод на прошлую дату:
у Wildberries без суточного снимка на неё остаток считается от
ближайшего более позднего снимка по движениям (snapshot_source =
movements): + продано и − вернулось по дате продажи, − принято
поставками; минус — строка negative на разбор; отчёт, не дошедший до
дня снимка, — not_covered. Поставки, бывшие на дату в пути, — transit.
Это чтение: документа не создаёт.

## Path parameters

- `platform` 'ozon' | 'wildberries', required

## Headers

- `X-Tenant` string, required

## Request body

- MarketplaceOpeningRequest
  - `company_id` string, uuid
  - `store_id` string, uuid
  - `as_of` string, date: Дата ввода — дата запуска склада: с неё у магазина действует себестоимость со склада; нет — она же, а у магазина без неё — день снимка площадки по Москве
  - `q` string: Поиск сужает только строки ответа; итоги — по всему срезу
  - `cost_source` 'stock' | 'manual' | 'rates': Источник цены документа; нет — по учётной политике магазина
  - `lines` MarketplaceOpeningLine[]
    - `store_id` string, uuid, required
    - `external_id` string, required: Позиция площадки — external_id строки ответа
    - `cost_source` 'stock' | 'manual' | 'rates': Источник цены строки; нет — источник документа
    - `unit_cost` string: Цена единицы при источнике manual: положительное число
  - `transit_supplies` string[]: Ключи поставок (supply_key), которые на дату ввода были в пути на площадку. Поля нет — по правилу: дошла до ворот площадки до даты ввода, заведена не раньше окна transit_window_days, не принята до даты ввода, нашей отгрузки нет; пустой список — в пути ничего
  - `transit_window_days` integer: Окно правила «в пути» по умолчанию: поставка заведена не раньше чем за столько дней до даты ввода; 0 или нет поля — 30

## Response `200`

Оценённый начальный остаток

- MarketplaceOpeningView
  - `platform` string, required
  - `snapshot_at` string, date-time, nullable
  - `snapshot_source` 'current' | 'history' | 'movements': Откуда количества: current — текущий снимок остатков площадки; history — суточный снимок из истории остатков сборщика на дату ввода (as_of раньше дня текущего снимка); movements — у Wildberries снимка на дату нет, остаток посчитан от ближайшего более позднего снимка по движениям. У Ozon снимка на дату нет — 409 marketplace.opening.history_missing
  - `as_of` string, date
  - `cost_source` string
  - `default_cost_source` 'stock' | 'rates', required
  - `rows` MarketplaceOpeningRow[], required
    - `store_id` string, uuid, required
    - `store_name` string
    - `company_id` string, uuid, required
    - `company_name` string
    - `product_id` string, uuid, nullable
    - `product_sku` string
    - `product_name` string
    - `external_id` string, required
    - `external_name` string
    - `card_ref` string: Карточка площадки в строках сопоставления (external_id): у Wildberries variant:<chrt_id>, у Ozon product:<product_id>. По ней несопоставленную позицию создают товаром — marketplaceCreateCatalogMatchProducts с opening_costs. Поля нет — карточку опознать нельзя
    - `on_hand` integer, required
    - `in_transit` integer, required
    - `returning` integer, required
    - `total` integer, required
    - `in_own_shipment` integer: Сколько штук снимка площадка приняла из нашей отгрузки до момента снимка. Они уже учтены документом отгрузки и придут на склад площадки приёмкой поставки, поэтому вычтены из строки. Поля нет — вычитать нечего
    - `snapshot_total` integer: Расчёт по движениям: остаток позиции в более позднем снимке (computed_from). total = snapshot_total + sold_after − returned_after − received_after
    - `sold_after` integer: Расчёт по движениям: продано по отчёту площадки с даты ввода до снимка, по дате продажи
    - `returned_after` integer: Расчёт по движениям — вернулось за те же дни
    - `received_after` integer: Расчёт по движениям: принято поставками за те же дни — до даты ввода этого на складе площадки не было
    - `snapshot_at` string, date-time, nullable
    - `unit_cost` string, nullable
    - `value` string, nullable
    - `currency` string
    - `cost_version_id` string, uuid, nullable
    - `cost_source` 'stock' | 'manual' | 'rates'
    - `cost_basis` 'balance' | 'last_receipt' | 'none' | 'composition' | 'rate' | 'rate_fallback' | 'manual' | 'product_create': На чём стоит цена: balance — остаток своих складов, last_receipt — последний приход, none — основания нет, composition — по составу набора, rate — ставка маркетплейса, rate_fallback — источник «со склада», а своего остатка, прихода и состава нет: ставка из списка товаров площадки, manual — цена строки, product_create — цена, указанная при создании товара из карточки
    - `cost_spec_id` string, uuid
    - `cost_method` 'fifo' | 'moving_average'
    - `cost_basis_qty` string
    - `cost_any_condition` boolean
    - `policy_cost_source` string
    - `rate_unit_cost` string
    - `rate_currency` string
    - `rate_version_id` string, uuid
    - `state` 'ready' | 'missing_cost' | 'stock_cost_missing' | 'manual_cost_missing' | 'stock_cost_required' | 'unmatched_product' | 'negative', required: negative — расчёт по движениям дал минус: строка на разбор, в документ не входит
  - `total_qty` integer, required
  - `total_value` string, required
  - `missing_cost` integer, required
  - `unmatched` integer, required
  - `skipped` integer
  - `ready` boolean
  - `computed_from` string, date: Расчёт по движениям: дата снимка, от которого посчитано
  - `coverage_through` string, date: Расчёт по движениям: по какой день загружен отчёт реализации площадки
  - `not_covered` boolean: Отчёт площадки не дошёл до дня перед снимком: продажи между датой ввода и снимком известны не все, ввод не готов
  - `negative` integer: Строк с минусом расчёта — на разбор, в документ не входят
  - `unknown_operations` string[]: Незнакомые виды строк отчёта: пока они есть, расчёт не готов
  - `unmapped_movements` integer: Штук в строках отчёта и поставок без размера каталога: расчёт по ним неполон
  - `transit` MarketplaceOpeningTransit[]: Поставки в пути на площадку на дату ввода (ввод на прошлую дату)
    - `store_id` string, uuid, required
    - `store_name` string, required
    - `company_id` string, uuid, required
    - `supply_key` string, required
    - `number` string, required
    - `created_at` string, date-time, nullable
    - `accepted_at` string, date-time, nullable
    - `in_transit` boolean, required: Входит ли поставка во ввод: по правилу или по выбору (transit_supplies)
    - `lines` MarketplaceOpeningTransitLine[], required
      - `product_id` string, uuid, nullable, required
      - `product_sku` string, required
      - `product_name` string, required
      - `barcode` string
      - `qty` integer, required: Отправлено по поставке
      - `unit_cost` string, nullable, required: Себестоимость своих складов юрлица на дату ввода
      - `value` string, nullable, required
      - `currency` string
      - `cost_basis` string
      - `state` 'ready' | 'stock_cost_missing' | 'unmatched_product', required
    - `qty` integer, required
    - `value` string, required
    - `ready` boolean, required: У каждой строки есть товар и цена
  - `transit_skipped` MarketplaceOpeningTransitSkipped: Незакрытые поставки площадки, которые правило «в пути» не включило
    - `old` integer, required: Заведены раньше окна — висят незакрытыми у площадки
    - `old_qty` integer, required
    - `not_dispatched` integer, required: Не дошли до ворот площадки: у Wildberries статус 1–3, даты факта нет
    - `not_dispatched_qty` integer, required
    - `arrived_later` integer, required: Дошли до ворот в день ввода или позже: на дату товар мог быть ещё у продавца; показаны в transit без отметки
    - `arrived_later_qty` integer, required
    - `window_days` integer, required: Окно правила в днях
  - `ledger_from` string, date: Дата начала книги бизнеса юрлица, если задана: склад площадки запускают с неё же

## Other responses

- `400`: Некорректный запрос или нарушение бизнес-правила
- `401`: Сессия, ключ или кабинет не подтверждены
- `403`: Текущая роль не имеет требуемого права
- `409`: Конфликт версии, идемпотентности или бизнес-состояния

---

[API](https://skmtc.dev/akeda/apis/akeda-erp-client-api.md) · [All operations](https://skmtc.dev/akeda/apis/akeda-erp-client-api/llms.txt) · [OpenAPI document](https://skmtc.dev/akeda/apis/akeda-erp-client-api/revisions/a99574d597cc?raw)
