# Массовая генерация SEO-текстов через API

> Описания товаров, статьи, title и description для тысяч страниц. Один скрипт, один ключ, модели DeepSeek, Qwen, GPT, Gemini и Claude. В Polza.ai токены оплачиваются в рублях, для юрлиц — договор, счёт и УПД.

- 1 000 описаний — от 97,88 ₽ по ценам каталога
- 400+ моделей по одному ключу
- Ответ в JSON по вашей схеме
- Счёт и УПД для юрлиц

## 1 000 описаний товаров по текущим ценам каталога

- GPT-5 Mini — 97,88 ₽
- Gemini 2.5 Flash — 122 ₽
- DeepSeek V4 Pro — 272 ₽
- Grok 4.3 — 356 ₽
- Claude Sonnet 5 — 1 068 ₽

Тестовый прогон: 40 карточек: 0,9 ₽ (текст и проверка второй моделью, 65 секунд; замер 6 октября 2026, по ценам того дня).

## Задача

У магазина 5 000 карточек, у половины вместо описания — одна строка из выгрузки поставщика. У агентства 300 статей в месяц на десять клиентов. У сервиса страницы «услуга + город» на 40 городов.

Чат с нейросетью ускоряет одного автора, но тысячу текстов через окно чата не прогнать: копирование, ручная склейка, разный формат ответа. Через API тот же объём проходит одним скриптом: таблица на входе, JSON на выходе, стоимость видна до запуска.

## Для кого

Сценарий один: структурированные данные на входе, текст по шаблону на выходе. Меняются только данные и промпт.

- **Интернет-магазин и селлер.** Описания карточек по характеристикам из выгрузки: тысячи SKU, одинаковая структура, ключевые фразы из семантики. Из той же таблицы — [объявления для Авито](https://polza.ai/use-cases/obyavleniya-avito) и [ответы на отзывы к тем же товарам](https://polza.ai/use-cases/otvety-na-otzyvy). Описание, title и description за один запрос.
- **SEO-агентство.** Статьи и тексты категорий для нескольких клиентов. ТЗ готовит специалист, черновик пишет модель, редактор правит. Один ключ на всех клиентов, расход по ключам в кабинете.
- **Страницы по шаблону.** Услуга × город, товар × сценарий, сравнения моделей. Данные в таблице, текст под каждую строку. Свой текст для каждой страницы вместо подстановки слов в шаблон.
- **Маркетинг в компании.** Title и description для старых разделов, анонсы для блога, тексты рассылок по базе продуктов. Платит компания по счёту, бюджет виден заранее.

## Сколько стоит генерация 1 000 текстов

Стоимость считается по токенам: вход — задание и данные, выход — готовый текст. В русском тексте один токен — примерно 2–3 символа. Расчёт ниже Polza.ai ведёт по текущим ценам [каталога](https://polza.ai/models) и обновляет каждый час.

| Модель | Описания, замер 6 октября | Описания, сейчас | Статьи, сейчас | Мета-теги, сейчас | Где использовать |
| --- | --- | --- | --- | --- | --- |
| [DeepSeek V4 Flash](https://polza.ai/models/deepseek/deepseek-v4-flash.md) | — | 23,52 ₽ | 98 ₽ | 7,25 ₽ | Мета-теги, структура, проверка |
| [GPT-5 Mini](https://polza.ai/models/openai/gpt-5-mini.md) | 77 ₽ | 97,88 ₽ | 460 ₽ | 21,65 ₽ | Описания со строгим JSON |
| [Gemini 2.5 Flash](https://polza.ai/models/google/gemini-2.5-flash.md) | 94 ₽ | 122 ₽ | 572 ₽ | 26,69 ₽ | Длинные исходники: каталоги, выгрузки |
| [GPT-5.4 Mini](https://polza.ai/models/openai/gpt-5.4-mini.md) | — | 231 ₽ | 1 068 ₽ | 54,28 ₽ | Статьи с более сложной структурой |
| [DeepSeek V4 Pro](https://polza.ai/models/deepseek/deepseek-v4-pro.md) | 19 ₽ | 272 ₽ | 1 133 ₽ | 83,87 ₽ | Описания и статьи на потоке |
| [Qwen3.6 35B](https://polza.ai/models/qwen/qwen3.6-35b-a3b.md) | — | 334 ₽ | 1 101 ₽ | 151 ₽ | Данные должны храниться в России: цена — по провайдеру в РФ, запрос с `provider: {data_residency: "ru"}` |
| [Claude Sonnet 5](https://polza.ai/models/anthropic/claude-sonnet-5.md) | 708 ₽ | 1 068 ₽ | 4 864 ₽ | 261 ₽ | Экспертные статьи, где важен слог |

Замер — фактический расход 6 октября 2026 на 5 одинаковых карточках, пересчитанный на 1 000, по ценам того дня. «Сейчас» — расчёт по текущим ценам каталога для объёмов ниже.

- **Описание товара.** 1 000 токенов на входе: задание, характеристики, ключевые фразы. 700 на выходе: 1 500–2 000 знаков текста.
- **Статья.** 3 000 токенов на входе: ТЗ, структура, выдержки из источников. 3 500 на выходе: около 8 000 знаков.
- **Title и description.** 500 токенов на входе, 120 на выходе: две строки под лимиты поисковиков.

- **Отключите рассуждение.** Многие модели по умолчанию сначала рассуждают, и эти токены оплачиваются как выход. В тесте 6 октября DeepSeek V4 Pro с рассуждением потратила 1,19 ₽ и 256 секунд на 3 карточки, без него — 0,04 ₽ и 12 секунд. Передавайте `reasoning: {effort: "none"}`.
- **Закрепите провайдера.** Одну модель в Polza.ai обслуживают разные провайдеры по разной цене, в каталоге показана самая низкая. В тесте на 40 карточках без закрепления вышло 1,36 ₽, с сортировкой по цене — 2,17 ₽, с закреплённым провайдером — 0,67 ₽. Имя самого дешёвого — в поле `top_provider.name` каталога: у DeepSeek V4 Pro сейчас это `streamlake/fp8`.

## Как устроен конвейер

Пять этапов. Дорогая модель работает только там, где пишет текст, остальное делают дешёвые.

- **Этап 1. Данные.** Таблица: SKU, название, характеристики, ключевые фразы из семантики. Чем полнее характеристики, тем меньше модель додумывает. (CSV или выгрузка из CMS)
- **Этап 2. Текст.** Основная модель пишет описание, title и description и возвращает JSON по схеме. Структура ответа одинакова для всех строк. (DeepSeek V4 Pro)
- **Этап 3. Проверка.** Вторая модель сверяет текст с характеристиками: нет ли свойств, которых нет в данных, на месте ли ключевые фразы, уложен ли объём. (DeepSeek V4 Flash)
- **Этап 4. Мета-теги.** Если title и description нужны отдельно от текста — короткий запрос к дешёвой модели под лимиты 60 и 160 символов. (DeepSeek V4 Flash)
- **Этап 5. Выгрузка.** JSONL по одной строке на товар. Импорт в CMS по SKU, строки с ошибками — в отдельный файл для перезапуска. (results.jsonl, errors.txt)

**Во что обошёлся конвейер в тесте.** 40 карточек 6 октября 2026: текст на DeepSeek V4 Pro — 0,67 ₽, проверка на DeepSeek V4 Flash — 0,23 ₽, по ценам того дня. Title и description модель вернула в том же ответе, отдельный этап не понадобился.

## Готовый скрипт на Python

Читает таблицу, отправляет запросы параллельно, повторяет их при ошибках 429 и 5xx и считает расход в рублях. Нужен пакет `openai` и ключ в переменной `POLZA_API_KEY`.

### Вход: products.csv

Одна строка — один товар. Характеристики через точку с запятой, ключевые фразы так же.

products.csv:

```
sku,name,specs,keywords
LM-12Q,Настольная лампа Lumo Q с беспроводной зарядкой,"12 Вт; беспроводная зарядка Qi 10 Вт; 3000–6000 K; таймер отключения 30 мин; гибкая стойка","лампа с беспроводной зарядкой; настольная лампа с зарядкой"
KT-TC,Чайник с терморегулятором Boil Control,"1,5 л; 5 температур: 40, 70, 80, 90, 100 °C; поддержание температуры 30 мин; 2000 Вт","чайник с выбором температуры; чайник с поддержанием температуры"
```

### Выход: results.jsonl

Одна строка — один JSON с полями по схеме. Импортируется в CMS по SKU.

results.jsonl · одна строка:

```
{
  "sku": "LM-12Q",
  "title": "Настольная лампа Lumo Q с беспроводной зарядкой Qi 10 Вт",
  "description": "Настольная лампа с зарядкой Qi 10 Вт и регулировкой цветовой температуры от 3000 до 6000 K",
  "text": "Настольная лампа с беспроводной зарядкой Lumo Q решает задачу освещения рабочего стола и одновременной подзарядки телефона. Гибкая стойка позволяет направить свет точно туда, где вы читаете или пишете вечером. Встроенная…"
}
```

Реальный ответ DeepSeek V4 Pro из тестового прогона, текст сокращён.

Python · seo_batch.py:

```
# seo_batch.py — описания товаров из CSV через Polza
import asyncio, csv, json, os
from openai import AsyncOpenAI, APIStatusError

MODEL = "deepseek/deepseek-v4-pro"
# самый дешёвый провайдер модели: поле top_provider.name в каталоге
PROVIDER = "streamlake/fp8"
CONCURRENCY = 10  # сколько запросов идёт одновременно

ai = AsyncOpenAI(base_url="https://polza.ai/api/v1", api_key=os.environ["POLZA_API_KEY"])
SYSTEM = open("prompt.txt", encoding="utf-8").read()

SCHEMA = {
    "name": "product_page",
    "strict": True,
    "schema": {
        "type": "object",
        "properties": {
            "title": {"type": "string"},
            "description": {"type": "string"},
            "text": {"type": "string"},
        },
        "required": ["title", "description", "text"],
        "additionalProperties": False,
    },
}

async def generate(row, sem, stats):
    prompt = (f"Товар: {row['name']}\n"
              f"Характеристики: {row['specs']}\n"
              f"Ключевые фразы: {row['keywords']}")
    async with sem:
        for attempt in range(5):
            try:
                r = await ai.chat.completions.create(
                    model=MODEL,
                    messages=[{"role": "system", "content": SYSTEM},
                              {"role": "user", "content": prompt}],
                    response_format={"type": "json_schema", "json_schema": SCHEMA},
                    extra_body={
                        # без рассуждений: дешевле и быстрее на шаблонных текстах
                        "reasoning": {"effort": "none"},
                        # без закрепления часть запросов уходит к дорогим провайдерам
                        "provider": {"only": [PROVIDER], "allow_fallbacks": False},
                    },
                )
                break
            except APIStatusError as e:
                if e.status_code in (429, 500, 502, 503) and attempt < 4:
                    await asyncio.sleep(2 ** attempt)  # пауза 1, 2, 4, 8 секунд
                    continue
                raise
    stats["rub"] += r.usage.model_extra.get("cost_rub", 0)  # фактическая стоимость запроса
    return {"sku": row["sku"], **json.loads(r.choices[0].message.content)}

async def main():
    rows = list(csv.DictReader(open("products.csv", encoding="utf-8")))
    sem, stats = asyncio.Semaphore(CONCURRENCY), {"rub": 0}
    results = await asyncio.gather(*(generate(r, sem, stats) for r in rows),
                                   return_exceptions=True)
    ok = 0
    with open("results.jsonl", "w", encoding="utf-8") as out, \
         open("errors.txt", "w", encoding="utf-8") as err:
        for row, res in zip(rows, results):
            if isinstance(res, Exception):
                err.write(f"{row['sku']}\t{res}\n")  # перезапустите только эти строки
            else:
                out.write(json.dumps(res, ensure_ascii=False) + "\n")
                ok += 1
    print(f"Готово {ok} из {len(rows)}, расход {stats['rub']:.2f} ₽")

asyncio.run(main())
```

- **Параллельность.** `CONCURRENCY = 10` — десять запросов одновременно. В тесте так вышло около 2 200 карточек в час без ошибок 429. Если запросов станет больше лимита, API вернёт 429 с заголовком `Retry-After`, и скрипт повторит запрос после паузы.
- **Ошибки не теряются.** Строки, которые не прошли после пяти попыток, попадают в `errors.txt` с причиной. Перезапустите скрипт только на них.
- **Расход видно сразу.** Polza.ai возвращает стоимость каждого запроса в поле `usage.cost_rub`. Скрипт складывает её и печатает итог в рублях. Прогоните 20 строк, умножьте — получите бюджет на весь каталог.

## Промпт для описаний товаров

Скрипт читает промпт из файла `prompt.txt`, поэтому правила меняются без правки кода. Промпт задаёт три вещи: откуда брать факты, как строить текст и что вернуть.

Главное правило — писать только по характеристикам. В первом прогоне модель всё равно дописывала уход, посудомоечную машину и «не впитывает запахи». Вторая версия промпта называет эти темы прямо и задаёт объём через абзацы: текстов нужной длины стало 26 из 40 вместо 14.

Одинаковое начало промпта у всех запросов удешевляет вход у моделей с кэшем. У DeepSeek V4 Flash кэш включается сам, без разметки в запросе: чтение из кэша стоит 1,96 ₽ за миллион токенов против 9,8 ₽ за обычный вход.

prompt.txt:

```
Ты пишешь описания товаров для интернет-магазина.

Правила:
- Пиши только то, что есть в характеристиках. Не
  добавляй свойства, гарантии, цифры и сравнения с
  другими брендами.
- Не пиши про уход, мытьё, посудомоечную машину,
  запахи, вкус, прочность, удары, коррозию и
  материал стенок, если этого нет в характеристиках.
- Первое предложение — что это за товар и для какой
  задачи.
- Дальше — 2–3 абзаца: характеристики как польза для
  покупателя, уход и комплектация, если они есть в
  данных.
- Объём текста — от 700 до 1000 символов: три абзаца
  по 2–3 предложения. Если характеристик мало,
  раскрой каждую через ситуацию, в которой она
  пригодится.
- Каждую ключевую фразу используй один раз. Слова
  фразы оставь те же, менять можно только падеж и
  число.
- Без слов «уникальный», «идеальный», «лучший»,
  «качественный», без восклицательных знаков.

Верни JSON:
- title — до 60 символов, начинается с названия
  товара;
- description — до 160 символов, одна фраза с
  главной характеристикой;
- text — описание.
```

## Контроль качества

Модель пишет быстро, отвечаете за текст вы. Четыре проверки, которые ставят до публикации.

- **Факты сверяются с данными.** Этап проверки отдельной моделью: каждое утверждение текста должно найтись в характеристиках. Строки с расхождениями уходят на правку человеку.
- **Выборку читает редактор.** Первые 50 текстов — целиком, дальше 5–10% каждой партии. Правки редактора превращаются в новые правила промпта.
- **Тексты не повторяют друг друга.** Для похожих товаров сравните тексты между собой: одинаковые абзацы на сотне страниц делают их дублями для поисковика.
- **Ключевые фразы на месте.** Простая проверка кодом: каждая фраза из таблицы есть в тексте один раз, title до 60 символов, description до 160.
- **Сломанные ответы ловит код.** В тесте один ответ вместо описания содержал «Для выбора подарка напишите мне.», другой — пересказ инструкции. Модель-проверка оба пропустила. Отсекайте кодом тексты короче 300 знаков и без названия товара.
- **Проверку тоже проверяют.** Модель-проверка ошибается в обе стороны: пропускает выдумки и помечает свойства, которые есть в данных. Её отметки — сигнал для редактора, решение за ним.

## Через Claude, OpenAI и Grok — или без кода

Скрипт выше не обязательно писать самому. Его напишет и запустит ИИ-агент, а модели для текстов выбираются в том же каталоге Polza.ai.

- **Claude Code и Claude Desktop.** Положите таблицу и промпт в папку и отдайте Claude задание ниже. Агент сам напишет скрипт, прогонит пробные 20 строк и покажет расход. Работает из России через ключ Polza. Claude Sonnet 5: 1 000 описаний — 1 068 ₽ по ценам каталога.
- **Codex и ChatGPT Desktop.** То же задание отдаётся Codex CLI: агент OpenAI пишет и запускает скрипт в терминале. Модели GPT подключаются тем же ключом Polza. GPT-5 Mini: 1 000 описаний — 97,88 ₽ по ценам каталога.
- **Grok.** Модели xAI доступны в том же API. Чтобы писать тексты на Grok, поменяйте в скрипте одну строку: `MODEL = "x-ai/grok-4.3"`. Grok 4.3: 1 000 описаний — 356 ₽ по ценам каталога.

### Задание для агента

Подходит для Claude Code, Codex и других агентов из [интеграций](https://polza.ai/integrations). Агент спросит подтверждение перед полным прогоном, поэтому бюджет вы увидите на 20 строках.

задание для Claude Code или Codex:

```
В папке лежат products.csv и prompt.txt.
Напиши и запусти скрипт на Python:
для каждой строки таблицы запрос к https://polza.ai/api/v1
через OpenAI SDK, ключ — в переменной POLZA_API_KEY,
модель deepseek/deepseek-v4-pro без рассуждений
(reasoning: {effort: none}), провайдер streamlake/fp8,
системный промпт — prompt.txt,
ответ — JSON с полями title, description, text.
Сначала прогони 20 строк, покажи результат и расход
в рублях по полю usage.cost_rub.
После моего «ок» — всю таблицу.
Ошибки 429 и 5xx повторяй с паузой,
строки, которые не прошли, сохрани в errors.txt.
```

### Без кода: n8n и Dify

Тот же конвейер собирается из готовых блоков. В n8n: чтение Google-таблицы, нода OpenAI Chat Model с адресом `https://polza.ai/api/v1`, запись результата обратно в таблицу. Параллельность и повторы настраиваются в свойствах ноды.

- **n8n.** Сценарий по расписанию: новые товары в таблице — новые описания утром. Нода OpenAI Chat Model с адресом Polza.
- **Dify.** Workflow с этапами текста и проверки, запуск пачкой из интерфейса. Облако или self-hosted.

## Тест редакции: 40 карточек товаров

Мы прогнали скрипт со страницы на каталоге из 40 товаров: термокружки, лампы, рюкзаки и чайники. Бренды и характеристики вымышленные, ключевые фразы — в формулировках из поиска. Замер 6 октября 2026: весь тест, включая неудачные прогоны и сравнение моделей, стоил 11,9 ₽ по ценам того дня.

- Карточек: 40
- Время: 65 с
- Расход на API: 0,9 ₽
- Готовы без правок: 21 из 40

### Три прогона DeepSeek V4 Pro

| Прогон | Расход | Время | Объём 700–1000 | Ключи на месте | Без выдумок по проверке |
| --- | --- | --- | --- | --- | --- |
| Промпт v1, без закрепления провайдера | 1,36 ₽ | 55 с | 14 из 40 | 36 из 40 | 22 из 40 |
| Промпт v2, сортировка по цене | 2,17 ₽ | 54 с | 26 из 40 | 38 из 40 | 28 из 40 |
| Промпт v2, закреплённый провайдер | 0,67 ₽ | 65 с | 22 из 40 | 38 из 40 | 23 из 40 |

«Без выдумок» — по отметкам модели-проверки, она ошибается в обе стороны. Третий прогон редактор прочитал целиком. Расход — по ценам 6 октября 2026.

- **21 — можно публиковать.** Факты из характеристик, ключевые фразы на месте, объём в норме или близко к нему.
- **9 — править одну фразу.** Матовый оттенок у белой кружки, уход сухой тканью у лампы, «быстро сохнет» у рюкзака.
- **5 — слишком короткие.** У этих товаров в данных 4–5 характеристик. Модель не стала растягивать текст и выдала 170–290 знаков.
- **5 — брак.** Ответ не по задаче, пересказ инструкции, посудомоечная машина у бутылки, выдуманная схема работы помпы.

### Пять моделей на одних и тех же 5 карточках

| Модель | 1 000 описаний, замер | Ответ | Знаков | Что увидел редактор |
| --- | --- | --- | --- | --- |
| DeepSeek V4 Pro | 19 ₽ | 11,0 с | 885 | Многословна, выходит за 1 000 знаков, дописывает свойства. Нужна проверка. |
| GPT-5 Mini | 77 ₽ | 10,2 с | 774 | Точна по фактам и объёму. Один раз придумала комплектацию, иногда сливает текст в один абзац. |
| Gemini 2.5 Flash | 94 ₽ | 3,6 с | 850 | Быстрая. Канцелярит: «функциональное решение», «гарантирует». Добавила «без бликов». |
| Grok 4.3 | 129 ₽ | 3,1 с | 521 | Быстрая, но короткая: средний текст около 500 знаков. Придумала «поворотную ручку» и «съёмную подставку». |
| Claude Sonnet 5 | 708 ₽ | 7,9 с | 816 | Лучший слог и точность: факты из данных, объём в норме. |

Промпт v2, рассуждение отключено. Стоимость — фактическая по полю `cost_rub`, замер 6 октября 2026 по ценам того дня. Время — на один запрос. Стоимость по текущим ценам — в [разделе «Стоимость»](#stoimost).

**Вывод.** Для тысяч карточек — DeepSeek V4 Pro или GPT-5 Mini с проверкой и выборочной вычиткой: по текущим ценам каталога 1 000 описаний стоят 272 ₽ и 97,88 ₽. Для категорий, где текст читают внимательно, — Claude Sonnet 5 или GPT-5 Mini. В прогоне DeepSeek V4 Pro половину карточек можно было публиковать сразу, ещё четверть закрывается правкой одной фразы, брак и слишком короткие тексты перегенерируют с дополненными данными. Больше всего на качество влияют данные: чем больше характеристик, тем меньше модель додумывает.

## Вопросы

### Какую модель выбрать для текстов на русском?

В нашем тесте лучший текст написала Claude Sonnet 5, точнее всех по фактам и объёму среди недорогих — GPT-5 Mini, DeepSeek V4 Pro многословна и требует проверки. По текущим ценам Polza.ai 1 000 описаний стоят: DeepSeek V4 Pro — 272 ₽, GPT-5 Mini — 97,88 ₽, Claude Sonnet 5 — 1 068 ₽. Прогоните 20 своих строк на двух-трёх моделях и прочитайте результат. Смена модели — одна строка в скрипте.

### Сколько текстов можно сгенерировать в час?

В тесте при 10 параллельных запросах 40 описаний заняли 65 секунд — это около 2 200 в час. Скорость зависит от модели и длины текста.

### Можно ли платить юрлицом?

Да. Polza.ai работает по договору: счёт, УПД и НДС. Расход виден в кабинете по ключам и моделям.

### Где хранятся данные, которые я отправляю?

У каждой модели в каталоге Polza.ai указано, есть ли у неё провайдер с хранением данных в России — например, у Qwen3.6 35B из таблицы выше. Чтобы запрос шёл только к таким провайдерам, передайте `provider: {data_residency: "ru"}`: если подходящего провайдера нет, запрос отклонится.

### Как не получить одинаковые тексты для похожих товаров?

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

### Можно ли генерировать статьи, а не только описания?

Да. Скрипт тот же, меняются промпт и данные: вместо характеристик — ТЗ со структурой H2 и H3, ключевыми фразами и выдержками из источников.

## Ссылки

- Сценарий «Ответы на отзывы»: https://polza.ai/use-cases/otvety-na-otzyvy.md
- Сценарий «Объявления для Авито»: https://polza.ai/use-cases/obyavleniya-avito.md
- Сценарий «Тесты по урокам»: https://polza.ai/use-cases/testy-po-urokam.md
- Сценарий «Письма клиентам»: https://polza.ai/use-cases/pisma-klientam.md
- Сценарий «Протоколы встреч»: https://polza.ai/use-cases/protokoly-vstrech.md
- Документация: https://polza.ai/docs
- Каталог моделей: https://polza.ai/models/llms.txt
- Страница: https://polza.ai/use-cases/seo-content
- Обновлено: 2026-10-14; замер теста — 6 октября 2026
