200+ проектовДоговорNDAГарантия 12 мес.Оплата по этапам
E-commerce

Выгрузка товаров в Яндекс Маркет: настройка YML-фида

Полное руководство по настройке YML-фида для Яндекс Маркета: структура файла, обязательные и необязательные элементы, автоматическая генерация, типичные ошибки.

04 сентября 2026
Выгрузка товаров в Яндекс Маркет: настройка YML-фида

Яндекс Маркет — один из ключевых каналов продаж для российских интернет-магазинов. Для передачи товарного каталога используется YML (Yandex Market Language) — XML-формат с чётко определённой структурой. Правильно настроенный фид = корректное отображение товаров, нет ошибок фида = нет трафика с Маркета. Разберём детально.

Структура YML-файла

YML-файл — это XML с конкретной схемой. Базовая структура:

<?xml version="1.0" encoding="UTF-8"?>
<yml_catalog date="2026-09-01 12:00">
  <shop>
    <name>Название магазина</name>
    <company>Название компании</company>
    <url>https://example.com</url>
    <currencies>
      <currency id="RUR" rate="1"/>
    </currencies>
    <categories>
      <category id="1">Электроника</category>
      <category id="2" parentId="1">Смартфоны</category>
    </categories>
    <offers>
      <!-- Товары здесь -->
    </offers>
  </shop>
</yml_catalog>

Элемент offer: обязательные поля

<offer id="12345" available="true">
  <!-- ОБЯЗАТЕЛЬНЫЕ поля -->
  <url>https://example.com/product/iphone-16-pro</url>
  <price>89990</price>
  <currencyId>RUR</currencyId>
  <categoryId>2</categoryId>
  <name>Смартфон Apple iPhone 16 Pro 256GB Черный</name>

  <!-- РЕКОМЕНДУЕМЫЕ поля -->
  <picture>https://example.com/images/iphone-16-pro.jpg</picture>
  <vendor>Apple</vendor>
  <model>iPhone 16 Pro</model>
  <description>Флагманский смартфон Apple с чипом A18 Pro...</description>
  <sales_notes>Официальная гарантия 1 год</sales_notes>
  <barcode>0194253411857</barcode>
</offer>

Типы офферов

Простой оффер (vendor.model)

Для стандартных товаров с производителем и моделью. Яндекс Маркет объединяет такие предложения с другими магазинами в карточку товара.

Произвольный оффер (type="vendor.model" не указан)

Для уникальных товаров без конкурентов (ручная работа, б/у, услуги). Создаётся отдельная карточка.

Книги, аудио, видео

Специальные типы с дополнительными обязательными полями (ISBN, автор, жанр).

Дополнительные характеристики (param)

<offer id="12345" available="true">
  <!-- ... основные поля ... -->
  <param name="Цвет">Черный</param>
  <param name="Объем памяти" unit="ГБ">256</param>
  <param name="Оперативная память" unit="ГБ">8</param>
  <param name="Диагональ экрана" unit="дюйм">6.3</param>
</offer>

Характеристики критичны для попадания в фильтры Маркета. Больше характеристик = больше показов в отфильтрованных выдачах.

Генерация YML в PHP (Laravel)

<?php
// routes/web.php
Route::get('/yml-feed', [YmlFeedController::class, 'index'])
    ->name('yml.feed');

// app/Http/Controllers/YmlFeedController.php
class YmlFeedController extends Controller
{
    public function index(): Response
    {
        $categories = Category::where('is_active', true)
            ->orderBy('parent_id')
            ->get();

        $products = Product::where('is_active', true)
            ->where('quantity', '>', 0)
            ->with(['category', 'images', 'attributes'])
            ->get();

        return response()
            ->view('feeds.yml', compact('categories', 'products'))
            ->header('Content-Type', 'application/xml; charset=utf-8');
    }
}
{{-- resources/views/feeds/yml.blade.php --}}
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<yml_catalog date="{{ now()->format('Y-m-d H:i') }}">
<shop>
  <name>{{ config('app.name') }}</name>
  <company>{{ config('shop.company_name') }}</company>
  <url>{{ config('app.url') }}</url>
  <currencies>
    <currency id="RUR" rate="1"/>
  </currencies>
  <categories>
    @foreach($categories as $cat)
    <category id="{{ $cat->id }}"@if($cat->parent_id) parentId="{{ $cat->parent_id }}"@endif>
      {{ htmlspecialchars($cat->name) }}
    </category>
    @endforeach
  </categories>
  <offers>
    @foreach($products as $product)
    <offer id="{{ $product->id }}" available="{{ $product->quantity > 0 ? 'true' : 'false' }}">
      <url>{{ route('products.show', $product->slug) }}</url>
      <price>{{ $product->price }}</price>
      <oldprice>{{ $product->old_price }}</oldprice>
      <currencyId>RUR</currencyId>
      <categoryId>{{ $product->category_id }}</categoryId>
      @foreach($product->images as $image)
      <picture>{{ $image->url }}</picture>
      @endforeach
      <name>{{ htmlspecialchars($product->name) }}</name>
      <vendor>{{ htmlspecialchars($product->brand) }}</vendor>
      <description><![CDATA[{{ $product->description }}]]></description>
      @foreach($product->attributes as $attr)
      <param name="{{ htmlspecialchars($attr->name) }}">
        {{ htmlspecialchars($attr->value) }}
      </param>
      @endforeach
    </offer>
    @endforeach
  </offers>
</shop>
</yml_catalog>

Кэширование и обновление фида

YML-фид для 10 000 товаров генерируется несколько секунд. Его не нужно генерировать при каждом запросе Яндекса. Правильная стратегия:

// Генерируем фид раз в час и кэшируем
public function index(): Response
{
    $xml = Cache::remember('yml_feed', 3600, function () {
        $categories = Category::where('is_active', true)->get();
        $products = Product::where('is_active', true)->with([...])->get();
        return view('feeds.yml', compact('categories', 'products'))->render();
    });

    return response($xml)->header('Content-Type', 'application/xml; charset=utf-8');
}

// Инвалидация при изменении товаров
// В ProductObserver:
public function saved(Product $product): void
{
    Cache::forget('yml_feed');
}

Типичные ошибки в фиде

ОшибкаПричинаРешение
Недопустимые символы в XMLКавычки, амперсанды в описанияхhtmlspecialchars() или CDATA
Цена 0 или отрицательнаяНекорректные данные в БДФильтровать where('price', '>', 0)
Битые ссылки на изображенияУдалённые файлыПроверять существование файла
Дублирующиеся IDКоллизии ID из разных источниковИспользовать уникальные ID
Кодировка не UTF-8Неверная конфигурацияmb_convert_encoding или declare

FAQ

Как часто Яндекс Маркет скачивает фид?

По умолчанию — раз в сутки. В настройках магазина можно изменить на каждые 6-12 часов. Принудительное обновление — кнопка «Обновить прайс» в личном кабинете.

Максимальный размер YML-фида?

Технических ограничений нет, но Яндекс рекомендует не более 600 000 офферов в одном файле. При большем количестве — делите на несколько фидов.

Нужно ли указывать товары с нулевым остатком?

Можно оставить с available="false" — это сохраняет историю отзывов. Или удалить — меньше размер фида. Яндекс принимает оба варианта.

Как передать скидки и акции?

Используйте поля <price> (актуальная цена) и <oldprice> (зачёркнутая). Яндекс Маркет автоматически покажет скидку в процентах.

Можно ли передавать товары с вариантами (размеры, цвета)?

Да, через несколько офферов с одинаковым товаром но разными id, или через параметры <param>. Яндекс умеет группировать офферы в одну карточку по name+vendor+model.

Настроим выгрузку в Яндекс Маркет

Разработаем YML-фид с правильной структурой, характеристиками и кэшированием. Подключим к Маркету и устраним ошибки валидации.

[ Gulaev.Dev ]

Нужна помощь с e-commerce?

Обсудим задачу, предложим решение и рассчитаем стоимость — бесплатно, без обязательств.

FAQ по статье

Часто задаваемые вопросы