Проверка товарного фида YML начинается не с вопроса «валиден ли XML», а с вопроса, какие ошибки в YML фиде ломают показ и расходятся с карточками товара. Синтаксически корректный документ ещё не означает, что реклама готова: идентификаторы могут дублироваться, цены — расходиться с сайтом, а ссылки — не открываться. Ниже — учебный разбор: полный маленький фид, срез карточек, копируемый промпт и протокол из пяти ошибок по offer ID с исправленным набором.
Выберите требования
Сначала зафиксируйте три вещи: площадку (здесь — Яндекс Директ), вид и категорию фида и место показа. От них зависит набор обязательных полей, поэтому универсального списка «обязательно для всех» нет. Требования площадки отделяйте от внутреннего quality gate: первое — что требует Яндекс, второе — что вы сами решили не пропускать в загрузку.
Каждый товар должен иметь уникальный идентификатор, и один и тот же товар в разных фидах, включая фиды разных типов, должен сохранять одинаковый ID Требования к фиду.
Внутренний quality gate в этом учебном примере: уникальный offer ID, ссылка отвечает 200 в переданном срезе, цена больше нуля, валюта объявлена в <currencies>, при доступной карточке цена равна цене карточки. Это локальные правила, а не перечень требований площадки.
Проверьте XML и связи
У любого XML-документа один корневой элемент; в YML это <yml_catalog>, а его атрибут date в формате YYYY-MM-DD hh:mm соответствует моменту генерации файла Требования к YML-фиду. Товарные предложения лежат в <offers>, каждое — отдельный <offer>, а <currencies> и <categories> идут в <shop> перед списком предложений Требования к YML-фиду.
Внутри одного фида допустимы оферы упрощённого и произвольного типа, а комбинированный тип даёт больше элементов для объявления Требования к YML-фиду.
Учебный фид целиком, одна строка — так его удобно передать парсеру и модели:
<yml_catalog date="2026-10-24 10:00"><shop><name>Учебный магазин</name><company>Example</company><url>https://example.test</url><currencies><currency id="RUB" rate="1"/></currencies><categories><category id="1">Сумки</category></categories><offers><offer id="A"><url>https://example.test/a</url><price>1000</price><currencyId>RUB</currencyId><categoryId>1</categoryId><name>Сумка A</name></offer><offer id="A"><url>https://example.test/a</url><price>1000</price><currencyId>RUB</currencyId><categoryId>1</categoryId><name>Сумка A</name></offer><offer id="B"><url>https://example.test/b</url><price>1900</price><currencyId>RUB</currencyId><categoryId>1</categoryId><name>Сумка B</name></offer><offer id="C"><url>https://example.test/c</url><price>0</price><currencyId>USD</currencyId><categoryId>1</categoryId><name>Сумка C</name></offer></offers></shop></yml_catalog>
Корень один, date на месте, справочники до <offers>, валюты и категории объявлены. XML разбирается стандартным парсером — и это не отменяет смысловых ошибок ниже. Номер row в протоколе — порядковый номер офера в <offers>, а не строка однострочного файла.
Сверьте карточки и фид
Модели передавайте две вещи вместе: текст фида и срез карточек. Срез — это то, что вы фактически получили от сайта: offer ID, HTTP-статус, цену и валюту. В учебном срезе: A — 200, 1000 RUB; B — 200, 2100 RUB; C — 404, цена и валюта null.
Не поручайте модели выдумывать HTTP-статус или цену по URL. Если данных в срезе нет, значение остаётся неизвестным; null — не ноль и не повод предполагать. Модель объясняет протокол и раскладывает расхождения, а XML, дубли и числа проверяет парсер и код.
Копируемый промпт ниже работает сам по себе: в нём есть входные строки, правила, схема выхода и допущения. Подставьте свои данные вместо учебных.
Ты помогаешь проверить товарный YML-фид Директа. Не выдумывай значения: всё, чего нет во входе, помечай unknown.
ВХОД 1 — XML фида (одна строка):
<yml_catalog date="2026-10-24 10:00"><shop><name>Учебный магазин</name><company>Example</company><url>https://example.test</url><currencies><currency id="RUB" rate="1"/></currencies><categories><category id="1">Сумки</category></categories><offers><offer id="A"><url>https://example.test/a</url><price>1000</price><currencyId>RUB</currencyId><categoryId>1</categoryId><name>Сумка A</name></offer><offer id="A"><url>https://example.test/a</url><price>1000</price><currencyId>RUB</currencyId><categoryId>1</categoryId><name>Сумка A</name></offer><offer id="B"><url>https://example.test/b</url><price>1900</price><currencyId>RUB</currencyId><categoryId>1</categoryId><name>Сумка B</name></offer><offer id="C"><url>https://example.test/c</url><price>0</price><currencyId>USD</currencyId><categoryId>1</categoryId><name>Сумка C</name></offer></offers></shop></yml_catalog>
ВХОД 2 — срез карточек (offer_id, http, price, currency):
A, 200, 1000, RUB
B, 200, 2100, RUB
C, 404, null, null
ПРАВИЛА ПРОВЕРКИ (локальный quality gate, не требования площадки):
1. offer ID уникален внутри фида.
2. Ссылка отвечает 200 в переданном срезе.
3. price больше нуля.
4. currencyId объявлен в <currencies>.
5. При доступной карточке (http 200) цена фида равна цене карточки.
ДОПУЩЕНИЯ:
- row — порядковый номер <offer> в <offers>, начиная с 1.
- null в срезе означает неизвестное значение; не считать его нулем.
- Если карточка недоступна (http не 200 или null), проверка 5 по ней не выполняется и записывается как unknown; проверка 4 всегда выполняется по XML.
ВЫХОД — строго такой JSON:
{
"xml_parse": "PASS|FAIL",
"errors": [{"row": число, "offer_id": строка, "code": строка, "actual": значение, "expected": значение}],
"repair_plan": [строки],
"repaired_offers": [{"id": строка, "price": число, "currency": строка, "url": строка}],
"still_unverified": [строки]
}
Коды ошибок: duplicate_id, price_mismatch, url_unavailable, nonpositive_price, currency_not_declared. Остальные расхождения — в still_unverified.
Разберите пять ошибок
Полный протокол по учебному входу. Каждая запись — с номером row, offer ID, ожиданием и фактом.
| row | offer ID | код | ожидание | факт |
|---|---|---|---|---|
| 2 | A | duplicate_id | одна запись A | две записи A |
| 3 | B | price_mismatch | 2100 | 1900 |
| 4 | C | url_unavailable | 200 | 404 |
| 4 | C | nonpositive_price | >0 | 0 |
| 4 | C | currency_not_declared | RUB или явное объявление валюты | USD |
Разбор по одной:
- Дубль A (row 2). Вторая запись повторяет первую. Требование уникального идентификатора нарушено; удаляется точный дубль.
- Цена B (row 3). Фид говорит 1900, карточка — 2100. После подтверждения актуального среза цена приводится к 2100.
- C (row 4), три проблемы сразу. Ссылка отдаёт 404, цена 0, валюта USD не объявлена в
<currencies>. Карточка недоступна, поэтому цену карточки не проверить:nullне ноль. C исключается из передаваемого набора до восстановления карточки, цены и валюты — выдумывать её значения нельзя.
Учебный пример
Исправленный учебный набор содержит ровно A и B:
<yml_catalog date="2026-10-24 10:00"><shop><name>Учебный магазин</name><company>Example</company><url>https://example.test</url><currencies><currency id="RUB" rate="1"/></currencies><categories><category id="1">Сумки</category></categories><offers><offer id="A"><url>https://example.test/a</url><price>1000</price><currencyId>RUB</currencyId><categoryId>1</categoryId><name>Сумка A</name></offer><offer id="B"><url>https://example.test/b</url><price>2100</price><currencyId>RUB</currencyId><categoryId>1</categoryId><name>Сумка B</name></offer></offers></shop></yml_catalog>
Эталон результата для сверки: xml_parse — PASS; ошибок пять, как в таблице; в repaired_offers — A с ценой 1000 RUB и B с ценой 2100 RUB. Непроверенным остаётся: картинки, полный состав обязательных полей для конкретного места показа, модерация и актуальность реального магазина.
Все товары, адреса, цены и HTTP-статусы в примере вымышлены; доступность реальных URL не проверялась. Это не ответ модели и не проведённый полевой эксперимент.
Повторите проверку до загрузки
После правок проверяйте заново по фактическим данным, а не по памяти:
- XML снова проходит парсер; корень один,
dateобновлён на момент новой генерации. - ID уникальны; после удаления дубля A в
<offers>две записи. - Ссылки A и B отвечают 200 в текущем срезе.
- Цена A — 1000 RUB, цена B — 2100 RUB; обе валюты объявлены.
- Изображения и остальные поля — по актуальным данным карточек, не по заглушкам.
Успешная проверка не гарантирует прохождение модерации: она ловит заданные локальные правила и расхождения с переданным срезом. Состав обязательных полей уточняйте по требованиям площадки для своего вида фида и места показа Требования к фиду.
Текст описания товара удобно готовить отдельно — см. карточка товара с нейросетью, а объявления под кампанию — тексты для Яндекс Директа с ИИ.

