X·MPДокументация

Руководство по работе с магазином

Репрайсер: цены, экономика и согласование изменений

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

Зачем это нужно

Репрайсер нужен, когда цену нельзя выбирать изолированно от затрат, ограничений и предыдущих изменений. Вы задаёте целевую цену или правило по запасу, а сервис проверяет, укладывается ли предложение в экономику товара и установленные пределы. Агент помогает сформулировать условия; численный расчёт выполняет ценовой модуль.

Пример из работы магазина

«Для этих товаров подготовь движение к целевой цене. Не выходи за согласованный коридор, сохрани минимальную маржинальность моей модели и покажи причины по каждому товару».

Как начать

  1. Подключите магазин и проверьте agent.me, capabilities.list и automations.credentials.requirements с domain=pricing.
  2. Согласуйте в памяти магазина товары, цели, затраты, сроки действия и ограничения. Для настройки нужны operations.read, operations.plan и доступ к задаче.
  3. Прочитайте текущую конфигурацию, подготовьте новую версию, проверьте repricer.config.validate и привяжите условия к актуальной задаче.
  4. Сохраните конфигурацию, выполните один предварительный расчёт и прочитайте решения. Для возможной отправки используйте отдельный точный план и подтверждение владельца.

Что вы получите

По каждому товару — текущее состояние, желаемая и допустимая цена, ограничения и причина предложения, удержания или блокировки. При отдельном исполнении — план, состояние отправки и проверенный результат.

Что важно учитывать

Конфигурация и предварительные расчёты работают в observe/shadow. Отдельный исполнитель согласованных цен существует, но успешный реальный пилот изменения на WB не объявляется подтверждённым. Наличие ключа и метода не доказывает готовность конкретного магазина. Автономная переоценка без точного согласования не включена.

Из чего состоит репрайсер

ЧастьЧто хранит или делаетРезультат
Задача в памятиЦель, ограничения, обоснование затрат и актуальная версия договорённостей.Основание для настройки; не разрешение на запись.
Конфигурация pricingПолный набор задач и товаров, стратегии, срок действия и ограничения.Неизменяемая зарегистрированная версия с контрольной суммой.
Источник ценНаблюдаемая цена и скидка, варианты размеров, время и версия источника.Проверяемый снимок для расчёта.
Расчётный модульПересекает финансовый порог, коридор, шаг и лимит движения.Предложения и причины по каждому товару.
Точный планПовторно проверяет цены, условия задачи и историю исполнений.Конкретные цены и ссылка владельцу для согласования.
Проверка исполненияСопоставляет статус загрузки и фактические цены после отправки.Подтверждённый результат либо состояние, требующее разбора.

Один магазин имеет одну активную конфигурацию домена pricing, внутри которой может быть несколько задач. Обновление заменяет полный набор, а не добавляет к нему отдельное поле. Старые версии и история сохраняются.

Какие параметры читает расчёт

ПараметрСмыслКак влияет
target_idАртикул WB, передаваемый строкой.Товар должен совпасть с выбранным источником цены.
discountedPriceЦена продавца после его скидки, в рублях.Основная управляемая величина; не цена после СПП или кошелька.
Цена и скидка размеровНаблюдаемые варианты одного товара.Неодинаковые или неполные цены размеров блокируют общий расчёт.
Время и версия ценыКогда получено наблюдение и к какой версии относится.Устаревшую или неоднозначную цену нельзя использовать для нового плана.
stock_cover_days, stock_observed_atЗапас в днях и время наблюдения.Нужны только стратегии stock-cover; не угадываются из одного остатка.
История подтверждённых действийПоследняя проверенная цена, предыдущие движения, незавершённые операции и ручная остановка.Определяет паузу, остаток суточного лимита и блокировки.

Текущий адаптер цен не рассчитывает дни запаса автоматически из сырых заказов и остатков. Если такого входа нет, stock-cover вернёт missing_stock_cover. Для target-seller-price дни запаса не являются обязательной частью стратегии.

Структура конфигурации и задачи

ПолеНазначение
repricer_version=2Версия ценового формата внутри конфигурации контроллера.
config_id, modeИмя версии и режим observe/shadow.
expected_config_sha256Контрольная сумма последней прочитанной конфигурации; пустая строка — создание при её отсутствии.
tasks[].task_id, enabledИдентификатор задачи и явное включение её расчёта.
tasks[].bindingСсылки на согласованную запись памяти и версию задачи.
tasks[].valid_untilСрок действия условий с часовым поясом. Истёкшая модель затрат не продолжает действовать молча.
tasks[].strategy.kindtarget-seller-price, stock-cover или hold.
products[].safe_min_price / safe_max_priceРазрешённый ценовой коридор в рублях.
products[].target_priceЖелаемая цена для target-seller-price. Для hold не передаётся.
economics.revision_refВерсия согласованной модели затрат.
economics.fixed_cost_rubСогласованные фиксированные расходы на единицу, в рублях.
economics.variable_cost_percentСогласованная доля переменных расходов в процентах.

Неизвестные поля и стратегии отклоняются. На один товар допускается одна включённая задача. Лимит определения — до 100 задач и суммарно 1000 товарных строк; это ограничение файла, а не обещание производительности для 1000 магазинов.

Настройки ограничений

Поле guardrailsПо умолчаниюДопустимый диапазон и смысл
max_snapshot_age_seconds900 секунд1–3600; максимальный возраст цены.
max_actions_per_cycle51–100 предложений за расчёт.
max_step_percent5%0,01–20%; максимальное изменение за один шаг.
max_24h_movement_percent10%0,01–20%; сумма абсолютных движений за скользящие 24 часа.
cooldown_seconds21600 секунд / 6 часов900–604800; пауза после подтверждённого изменения.
minimum_margin_percent15%0–99%; минимум маржинальности именно заданной модели.
deadband_rub1 ₽0,01–100000 ₽; малое отклонение, при котором цену оставляют прежней.

interval_seconds задаётся отдельно: 60–86400 секунд, по умолчанию 900. Само сохранение интервала не включает расписание. Значения по умолчанию описывают контракт и не являются рекомендацией для вашей экономики.

Полный учебный профиль репрайсера

Шаблон отключён и содержит вымышленные идентификаторы, ссылки и суммы. Он показывает структуру, а не настройки вашего магазина. Замените их на согласованные условия и действительные версии памяти; выберите реальный срок действия. Не включайте пример как готовую конфигурацию.

Полный учебный профиль репрайсера
{
  "repricer_version": 2,
  "config_id": "repricer-example-v2",
  "mode": "shadow",
  "tasks": [
    {
      "task_id": "example-target-price",
      "enabled": false,
      "binding": {
        "memory_revision_ref": "example-memory-revision-1",
        "task_revision_ref": "example-task-revision-1"
      },
      "valid_until": "2099-01-01T00:00:00Z",
      "strategy": {
        "kind": "target-seller-price"
      },
      "products": [
        {
          "target_id": "123456",
          "safe_min_price": 900,
          "safe_max_price": 1300,
          "target_price": 1100,
          "economics": {
            "revision_ref": "example-economics-revision-1",
            "fixed_cost_rub": 550,
            "variable_cost_percent": 20
          }
        }
      ]
    }
  ],
  "expected_config_sha256": ""
}

Как получается предложение цены

  1. Проверяется задача: включена ли, не истёк ли срок, однозначно ли выбран товар.
  2. Проверяется цена и история: свежесть, незавершённые действия, ручная остановка и внешние изменения.
  3. Рассчитывается нижний порог модели затрат.
  4. Стратегия определяет желаемое направление.
  5. Финансовый порог пересекается с коридором владельца, допустимым шагом и оставшимся лимитом движения.
  6. Если пересечение пустое, товар блокируется; если отклонение мало — цена удерживается. Предложение сохраняется с причиной.

Порог = fixed_cost_rub / (1 − variable_cost_percent / 100 − minimum_margin_percent / 100). Знаменатель должен быть положительным. Порог округляется вверх до копейки. Расходы на налоги, возвраты, комиссию, рекламу и логистику должны быть согласованно включены в модель; сервис не угадывает их и не добавляет повторно.

Учебный расчёт: фиксированные расходы 550 ₽, переменная доля 20%, минимальная маржинальность 15%. Порог = 550 / 0,65 = 846,16 ₽ после округления вверх. При коридоре 900–1300 ₽, текущей цене 1000 ₽, цели 1100 ₽ и шаге 5% ближайшее предложение не выше 1050 ₽, если остальные проверки пройдены. Это пример механики, не прогноз прибыли.

СтратегияПравило
target-seller-priceДвижение к target_price в пределах всех ограничений.
stock-coverНиже low_days — повышение на step_percent; выше high_days — снижение; внутри диапазона — удержание. Нужны подтверждённые дни запаса.
holdУдержание без новой цены.

Суточный лимит учитывает оба направления: снижение и обратное повышение расходуют его. Предварительное предложение ещё не является действием и не расходует лимит подтверждённых изменений.

Порядок работы через методы

automations.config.get
{
  "domain": "pricing"
}
  1. Возьмите текущую конфигурацию и её server SHA-256. Не передавайте обратно служебные поля ответа.
  2. Вызовите repricer.config.validate с полным объектом config. Получите effective config и bindings[].success_criterion.
  3. Добавьте критерий в соответствующую задачу памяти, сохранив остальные критерии. Через tasks.resume прочитайте UUID и текущую version; укажите их в binding.
  4. Вызовите automations.config.apply с domain=pricing, config и idempotency_key. После записи перечитайте config.get.
  5. Выполните один automations.shadow.run либо создайте automations.jobs.create. Прочитайте результат и причины через runs.list или jobs.get.
automations.shadow.run
{
  "domain": "pricing",
  "idempotency_key": "guide-pricing-preview-001"
}
automations.runs.list
{
  "domain": "pricing",
  "limit": 5
}

Примеры показывают форму запроса. Артикулы, Memory refs и ключи идемпотентности заменяются для реальной задачи. Вызов расчёта сохраняет результат X-MP, но не меняет цену WB.

Точный план, согласование и чтение результата

repricer.plan
{
  "target_ids": [
    "123456"
  ],
  "idempotency_key": "guide-pricing-plan-001"
}

repricer.plan принимает 1–5 артикулов и повторно читает собственные цены зарегистрированным методом. Возвращает plan_id, точные значения, контрольную сумму конфигурации, срок и approval_url. План действует 10 минут. Повтор с тем же ключом возвращает тот же план, а не новый произвольный расчёт.

  1. Владелец открывает approval_url в своей сессии и проверяет товары, цены до/после, базовую цену и скидку.
  2. Отправка возможна только после точного подтверждения владельца и повторной серверной проверки. Кнопка отправки — отдельное действие, не часть чтения руководства.
  3. repricer.plan.get показывает состояние. repricer.reconcile проверяет загрузку и фактические цены, ничего не отправляя повторно.
  4. succeeded означает совпадение подтверждённого статуса загрузки и фактической базовой цены, скидки и цены продавца. pending/unknown требуют проверки, а не слепого повторения.

Исполнитель сохраняет текущую скидку и работает с общей ценой RUB при одинаковых ценах размеров. Акции, отдельные размеры, управление персональной ценой покупателя и автоматическое следование конкуренту этим путём не поддерживаются. Возврат к старой цене — новый проверяемый план.

Причины удержания и блокировки

ПричинаЧто означаетЧто проверить
missing_price / stale_priceЦены нет или она слишком старая.Источник и время последнего сбора.
ambiguous_price / incomplete_priceВарианты дают неоднозначную или неполную цену.Состав размеров и согласованность снимка.
definition_expiredИстёк срок задачи и её условий.Актуализировать затраты и срок через новую версию задачи.
infeasible_economics / corridor_step_conflictБезопасного допустимого решения нет.Модель расходов, коридор, целевую цену и шаг; не обходить проверку.
movement_limit / cooldownИсчерпан лимит движения или не закончена пауза.Историю подтверждённых действий и время.
pending_readback / external_price_changeЕсть незавершённое действие или цена изменилась вне ожиданий.Предыдущую операцию и фактическую цену.
missing_stock_cover / stale_stockНет свежего запаса в днях.Доступность входа stock-cover.
deadband / stock_in_bandИзменение по стратегии не требуется.Это нормальное удержание, а не техническая ошибка.

Методы и параметры

Параметры ниже относятся к MCP arguments. Идентичность и ключ не передаются в них. Для полного объекта config следуйте руководству домена.

automations.credentials.requirements

Узнать права X-MP и категории WB-ключей для домена без значений секретов.

ПараметрТипОбязателенНазначение и ограничения
domainзначениедаРабочий домен: цены, реклама, контент или ответы. варианты: ["advertising", "advertising-budget", "card-experiment", "catalog", "custom", "inventory-fbs", "pricing", "reputation", "supplies"]
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "domain"
  ],
  "properties": {
    "domain": {
      "enum": [
        "advertising",
        "advertising-budget",
        "card-experiment",
        "catalog",
        "custom",
        "inventory-fbs",
        "pricing",
        "reputation",
        "supplies"
      ]
    }
  }
}

automations.status

Прочитать состояние связанных рабочих доменов магазина.

Параметров нет: передайте {}.

Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false
}

automations.config.get

Прочитать конфигурацию и её контрольную сумму перед обновлением.

ПараметрТипОбязателенНазначение и ограничения
domainзначениедаРабочий домен: цены, реклама, контент или ответы. варианты: ["advertising", "pricing", "catalog", "responder"]
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "domain"
  ],
  "properties": {
    "domain": {
      "enum": [
        "advertising",
        "pricing",
        "catalog",
        "responder"
      ]
    }
  }
}

automations.config.apply

Проверить и сохранить полный observe/shadow config; включение биддера запускает расчёты, а не WB execution.

ПараметрТипОбязателенНазначение и ограничения
domainзначениедаРабочий домен: цены, реклама, контент или ответы. варианты: ["advertising", "pricing", "catalog", "responder"]
configобъектдаПолная конфигурация по руководству соответствующего домена, без секретов и caller scope.
idempotency_keyстрокадаСтабильный ключ одной логической операции; при повторе сохраняйте его. шаблон: "^[A-Za-z0-9][A-Za-z0-9_.:-]{7,127}$"
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "domain",
    "config",
    "idempotency_key"
  ],
  "properties": {
    "domain": {
      "enum": [
        "advertising",
        "pricing",
        "catalog",
        "responder"
      ]
    },
    "config": {
      "type": "object",
      "minProperties": 1
    },
    "idempotency_key": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{7,127}$"
    }
  }
}

automations.shadow.run

Выполнить один предварительный расчёт и сохранить отчёт без изменений WB.

ПараметрТипОбязателенНазначение и ограничения
domainзначениедаРабочий домен: цены, реклама, контент или ответы. варианты: ["advertising", "pricing", "catalog", "responder"]
idempotency_keyстрокадаСтабильный ключ одной логической операции; при повторе сохраняйте его. шаблон: "^[A-Za-z0-9][A-Za-z0-9_.:-]{7,127}$"
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "domain",
    "idempotency_key"
  ],
  "properties": {
    "domain": {
      "enum": [
        "advertising",
        "pricing",
        "catalog",
        "responder"
      ]
    },
    "idempotency_key": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{7,127}$"
    }
  }
}

automations.jobs.create

Поставить один расчёт в очередь и получить job_id.

ПараметрТипОбязателенНазначение и ограничения
domainзначениедаРабочий домен: цены, реклама, контент или ответы. варианты: ["advertising", "pricing", "catalog", "responder"]
idempotency_keyстрокадаСтабильный ключ одной логической операции; при повторе сохраняйте его. шаблон: "^[A-Za-z0-9][A-Za-z0-9_.:-]{7,127}$"
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "domain",
    "idempotency_key"
  ],
  "properties": {
    "domain": {
      "enum": [
        "advertising",
        "pricing",
        "catalog",
        "responder"
      ]
    },
    "idempotency_key": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{7,127}$"
    }
  }
}

automations.jobs.get

Прочитать состояние и полный результат задачи очереди, включая review_cases.

ПараметрТипОбязателенНазначение и ограничения
job_idстрокадаИдентификатор задачи очереди из jobs.create/list. формат: "uuid"
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "job_id"
  ],
  "properties": {
    "job_id": {
      "type": "string",
      "format": "uuid"
    }
  }
}

automations.jobs.list

Прочитать ограниченный список задач очереди магазина.

ПараметрТипОбязателенНазначение и ограничения
limitцелоенетЧисло строк/событий за страницу, а не полнота всего источника. минимум: 1; максимум: 100; по умолчанию: 20
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20
    }
  }
}

automations.runs.list

Прочитать ограниченную историю запусков домена.

ПараметрТипОбязателенНазначение и ограничения
domainзначениедаРабочий домен: цены, реклама, контент или ответы. варианты: ["advertising", "pricing", "catalog", "responder"]
limitцелоенетЧисло строк/событий за страницу, а не полнота всего источника. минимум: 1; максимум: 100
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "domain"
  ],
  "properties": {
    "domain": {
      "enum": [
        "advertising",
        "pricing",
        "catalog",
        "responder"
      ]
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    }
  }
}

automations.emergency-stop

Установить аварийную остановку контроллеров X-MP; не обещает остановить кампании непосредственно в WB.

ПараметрТипОбязателенНазначение и ограничения
reasonстрокадаПричина остановки или изменения состояния. не менее символов: 1; не более символов: 500
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "reason"
  ],
  "properties": {
    "reason": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500
    }
  }
}

repricer.config.validate

Проверить конфигурацию v2 и получить effective config и критерии привязки к памяти.

ПараметрТипОбязателенНазначение и ограничения
configобъектдаПолная конфигурация по руководству соответствующего домена, без секретов и caller scope.
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "config"
  ],
  "properties": {
    "config": {
      "type": "object"
    }
  }
}

repricer.plan

Подготовить точный ценовой план и approval_url без отправки цен.

ПараметрТипОбязателенНазначение и ограничения
target_idsмассивдаДля ценового плана — артикулы; для рекламного профиля — кампании. не менее элементов: 1; не более элементов: 5
idempotency_keyстрокадаСтабильный ключ одной логической операции; при повторе сохраняйте его. не менее символов: 8; не более символов: 128
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "target_ids",
    "idempotency_key"
  ],
  "properties": {
    "target_ids": {
      "type": "array",
      "minItems": 1,
      "maxItems": 5,
      "items": {
        "type": "string",
        "pattern": "^[0-9]+$"
      }
    },
    "idempotency_key": {
      "type": "string",
      "minLength": 8,
      "maxLength": 128
    }
  }
}

repricer.plan.get

Прочитать план и состояние его исполнения.

ПараметрТипОбязателенНазначение и ограничения
plan_idстрокадаИдентификатор плана из ответа соответствующего метода.
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "plan_id"
  ],
  "properties": {
    "plan_id": {
      "type": "string"
    }
  }
}

repricer.reconcile

Проверить загрузку WB и фактические цены, сохранить проверку; повторной отправки нет.

ПараметрТипОбязателенНазначение и ограничения
plan_idстрокадаИдентификатор плана из ответа соответствующего метода.
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "plan_id"
  ],
  "properties": {
    "plan_id": {
      "type": "string"
    }
  }
}

Связанные возможности

Репрайсер

Готовить цены с учётом экономики товара

Планы и согласование. Исполнитель согласованной цены развёрнут; реальный пилот изменения цены на WB ещё не подтверждён.

Техническая справка для агента и разработчика

Этот раздел предназначен для настройки интеграции. Для обычной работы начните с шагов выше.