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

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

Рекламный биддер: стратегии, бюджет и расчёт ставок

Руководство по рекламному профилю v2: данные кампаний, единицы денег, целевой ДРР, ограничения, расписание расчётов и причины, по которым ставка остаётся прежней.

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

Биддер превращает согласованные правила рекламы в повторяемый расчёт по выбранным кампаниям. Его задача — показать допустимое предложение, а не увеличивать ставку при любом падении продаж. Он учитывает полноту данных, статистику, бюджетные условия, запас и ограничения самой кампании.

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

«По этим кампаниям рассчитывай предложения с целевым ДРР и согласованным потолком ставки. Объясняй случаи, где данных недостаточно. Пока не меняй рекламу на WB».

Как начать

  1. Подключите данные рекламы и агентский доступ operations.read, operations.plan, tasks.read.
  2. Создайте или продолжите задачу рекламы в памяти. Согласуйте кампании, бюджет, цель и ограничения.
  3. Проверьте automations.catalog и automations.credentials.requirements для advertising, затем прочитайте текущую конфигурацию.
  4. Подготовьте профиль v2 сначала отключённым. После проверки отдельно включайте расчёт предложений и контролируйте историю.

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

Решение по каждой кампании: удержать, предложить повышение/снижение ставки или защитную остановку, с причинами и ссылками на источники.

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

Текущий режим — observe/shadow. Изменения ставок WB, переводы денег, автоматическое возобновление кампаний и общий распределитель бюджета магазина не включены. Некоторые обязательные входы расчёта могут отсутствовать у реального магазина; это приводит к hold, а не к выдуманной ставке.

Структура рекламного профиля

Один активный профиль advertising описывает набор campaign ID, стратегию и ограничения. Задача в памяти хранит цель бизнеса, профиль — её проверенную версию для расчёта, очередь — отдельные запуски, история — результаты. Создание профиля не создаёт кампанию Wildberries.

ЧастьПоля и назначение
Идентичность версииconfig_id, schema_version=1, expected_config_sha256; последняя прочитанная версия защищает от перезаписи чужой правки.
Основаниеsource_binding.card_id и card_version из tasks.resume; при сохранении проверяется текущая задача.
Кампанииtarget_ids — строковые ID рекламных кампаний, не nmID товаров.
Единицыbid_unit=kopecks; decision_basis=wb_attributed_revenue.
Стратегияbidder.version=2, bidder.strategy=fixed или target_drr.
Запускbidder.enabled и interval_seconds; включение запускает периодический shadow-расчёт.
ПравилаДля v2 rules=[]; произвольные legacy-правила с новым профилем не смешиваются.

Какие данные читает биддер

ВходЕдиница / смыслДля чего нужен
current_bid_kopecks, min_bid_kopecksЦелые копейки; текущая ставка и подтверждённый минимум платформы.Допустимый коридор и шаг.
spend_rub, attributed_revenue_rubРубли за окно статистики; выручка, отнесённая WB к рекламе.Расчёт ДРР. Это не вся выручка магазина.
clicksЧисло кликов.Проверка минимальной выборки.
daily_spend_kopecks, spend_date, spend_timezoneДневной расход именно за локальный день профиля.Сравнение с дневным лимитом и резервом. Расход окна статистики не подставляется вместо дневного.
stock_cover_days, stock_completeДни запаса и признак достаточности данных.Защита при малом запасе; неизвестное значение не считается нулём.
captured_at, metrics_captured_atВремя состояния кампании и её статистики.Независимая проверка свежести.
attribution_window_endКонец окна атрибуции.Ожидание запаздывающих заказов.
status, payment_type, bid_typeАктивность, cpm/cpc, manual/unified.Проверка подходящего типа кампании.
bid_change_supported, pause_supportedПодтверждённые адаптером возможности.Числовая ставка сама по себе не доказывает возможность её изменения.
manual_stop, pending_command, external_changeОстановка, незавершённая команда, внешняя правка.Предотвращение противоречащих друг другу действий.
data_complete, metrics_complete, source_run_idsДостаточность снимка и происхождение.Объяснимость решения и отказ при недостатке данных.

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

Настройки стратегии и бюджета

ПолеКак задаётсяПоведение
bidder.strategyfixed / target_drrФиксированная цель либо движение по ДРР.
bidder.fixed_bid_kopecksЦелые копейкиЦелевая ставка стратегии fixed; не гарантирует движение за один шаг.
bidder.target_drrДоля: 0.18 = 18%Цель расход / рекламная выручка.
bidder.deadbandОтносительная доля: 0.1 = 10%При цели 18% удержание в диапазоне 16,2–19,8%.
bidder.economic_bid_cap_kopecksКопейкиЯвно согласованный дополнительный потолок; сервис не выводит его автоматически из прибыли.
bidder.daily_budget_kopecksКопейки на каждую кампаниюНе общий лимит всех кампаний магазина.
bidder.budget_reserve_kopecksКопейкиЗащитный порог расхода = дневной лимит − резерв.
bidder.require_stocktrue / falseТребовать данные запаса для оптимизации.
bidder.attribution_lag_secondsСекундыПауза после конца окна атрибуции.
policy_confirmedtrue / falseФиксирует согласованность условий; не включает исполнение WB.
bidder.enabledtrue / falseВключает или прекращает повторяемые расчёты предложений.
interval_seconds10–86400 секундЧастота расчёта, а не частота изменения ставки.
Поле guardrailsСмысл
min_bid_kopecks / max_bid_kopecksНижняя и верхняя ставки; дополнительно учитывается минимум платформы и экономический потолок.
max_step_percentМаксимальный процент изменения за одно решение.
cooldown_secondsПауза после записанного действия.
min_clicks / min_spend_rubМинимум кликов и расходов в рублях перед оптимизацией.
min_stock_cover_daysЗащитный порог запаса в днях.
max_snapshot_age_secondsМаксимальный возраст состояния и статистики.
max_actions_per_cycleЛимит предложений в одном запуске; защитные остановки приоритетнее.

Как рассчитывается ставка

  1. Проверяются профиль, ручная остановка, незавершённая команда и внешние изменения.
  2. Проверяются рабочее окно, запас и дневной бюджет; при подтверждённых условиях может появиться защитное предложение pause.
  3. Для оптимизации требуются активная подходящая кампания, свежие и полные данные, законченная пауза, достаточная выборка и созревшая атрибуция.
  4. Стратегия fixed выбирает заданную целевую ставку. target_drr делит spend_rub на attributed_revenue_rub.
  5. Если ДРР выше диапазона допуска — направление вниз, ниже — вверх; внутри — удержание. При нулевой выручке ДРР неопределён и ставка удерживается.
  6. Желаемая ставка пересекается с шагом, минимумом платформы, коридором и экономическим потолком. Если допустимого решения нет, сохраняется причина отказа.

Учебный пример: ставка 1000 копеек, шаг 10%, целевой ДРР 0.18, допуск 0.1. При ДРР 0.25 желаемая ставка — 900 копеек. Если минимум платформы 950, допустимое предложение может стать 950. Если безопасное пересечение отсутствует, ставка не выбирается «примерно». Пример действует только при пройденных остальных проверках и не является настройкой магазина.

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

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

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

Полный учебный профиль биддера
{
  "schema_version": 1,
  "config_id": "advertising-task-bound-v2",
  "mode": "shadow",
  "interval_seconds": 60,
  "bid_unit": "kopecks",
  "decision_basis": "wb_attributed_revenue",
  "policy_confirmed": false,
  "target_ids": [],
  "guardrails": {
    "max_snapshot_age_seconds": 300,
    "max_actions_per_cycle": 5,
    "min_bid_kopecks": 100,
    "max_bid_kopecks": 250000,
    "max_step_percent": 10,
    "cooldown_seconds": 1800,
    "min_stock_cover_days": 7,
    "min_clicks": 30,
    "min_spend_rub": 100
  },
  "rules": [],
  "expected_config_sha256": "",
  "source_binding": {
    "card_id": "00000000-0000-0000-0000-000000000001",
    "card_version": 1
  },
  "bidder": {
    "version": 2,
    "enabled": false,
    "strategy": "target_drr",
    "target_drr": "0.18",
    "deadband": "0.1",
    "schedule": {
      "timezone": "Europe/Moscow",
      "windows": [
        {
          "days": [
            0,
            1,
            2,
            3,
            4,
            5,
            6
          ],
          "start_minute": 0,
          "end_minute": 1440
        }
      ]
    },
    "daily_budget_kopecks": 100000,
    "budget_reserve_kopecks": 10000,
    "require_stock": true,
    "attribution_lag_seconds": 172800,
    "economic_bid_cap_kopecks": 1000
  }
}

Три разных понятия времени и бюджета

ПонятиеКак работает сейчас
Расписание расчётаinterval_seconds и enabled управляют повторяемыми shadow-запусками X-MP.
Рабочее окно рекламыbidder.schedule содержит timezone и windows: days, start_minute, end_minute. Вне окна возможна рекомендация остановки; автоматического старта нет.
Пополнение бюджетаУтренние/вечерние переводы не подключены к исполнению v2. Дневной предел не является переводом средств.

Дни: понедельник 0, воскресенье 6. Минуты: 0–1440. Ночное окно разделите у полуночи, например 22:00–24:00 и 00:00–06:00. IANA timezone, например Europe/Moscow, задаётся явно. Даже наличие окна не означает, что WB физически остановит рекламу: текущий результат — предложение.

Создание, проверка, обновление и отключение

automations.config.get
{
  "domain": "advertising"
}
  1. Прочитайте задачу через tasks.resume и возьмите реальную card_version.
  2. Заполните профиль v2 по шаблону: кампании, цели, лимиты и source_binding. При создании expected_config_sha256 — пустая строка, при обновлении — текущая сумма.
  3. Передайте весь профиль в automations.config.apply с domain=advertising. Не возвращайте служебные received_at/config_sha256 как часть пользовательского config.
  4. Проверьте сохранённую версию. Отключённый профиль даёт profile_disabled. Для проверки предложений требуется осознанно включить enabled=true; это также запускает периодические расчёты.
  5. Читайте jobs.get для результата конкретного запуска, runs.list для истории и сравнивайте config hash.
  6. Для отключения сохраните новую версию enabled=false. Для удаления используйте lifecycle_action=delete с текущим hash и source_binding. История остаётся.
automations.jobs.create
{
  "domain": "advertising",
  "idempotency_key": "guide-bidder-run-001"
}

Удаление или отключение профиля X-MP не останавливает кампанию Wildberries. Независимая аварийная остановка не снимается изменением профиля. При конфликте версии перечитайте состояние и согласуйте новую конфигурацию.

Как читать причины решения

ПричинаОбъяснение
profile_disabled / policy_unconfirmedРасчёт отключён или условия не подтверждены.
stock_unknown / daily_spend_unknownНет доказанного запаса или расхода за нужный день.
attribution_immature / insufficient_sampleНе прошло время атрибуции либо недостаточно кликов/расхода.
undefined_drrНулевая рекламная выручка: ДРР нельзя посчитать.
platform_min_unknown / capability_unverifiedНе подтверждён минимум ставки или возможность действия для кампании.
no_feasible_bid / no_feasible_stepКоридор и шаг не дают допустимой ставки.
within_deadband / unchanged_bidНормальное удержание: изменение не нужно.
manual_stop / command_unresolved / external_changeСначала разобраться с ручным вмешательством или предыдущим действием.
schedule_closed / stock_protection / budget_limitОснование для защитного предложения при достаточных подтверждениях.

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

Параметры ниже относятся к 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
    }
  }
}

automations.catalog

Прочитать каталог пакетов и контракт биддера.

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

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

tasks.resume

Прочитать актуальную версию существующей задачи и рабочий контекст.

ПараметрТипОбязателенНазначение и ограничения
card_idстрокадаЗадача Seller Memory; возьмите реальный UUID. формат: "uuid"
Точная JSON Schema
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "card_id"
  ],
  "properties": {
    "card_id": {
      "type": "string",
      "format": "uuid"
    }
  }
}

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

Рекламный биддер

Выбирать, где и как изменить рекламные расходы

Без изменения ставок. Работает анализ и подготовка предложений. Автоматическое исполнение не включено.

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

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