Разбор

ИИ-агент публикует объявления на Авито: 50 карточек за час вместо рабочего дня

Менеджер тратит 5–10 минут на одно объявление — 50 лотов съедают весь рабочий день. ИИ-агент на Python + Claude + Авито API делает то же самое за час. Схема, код, примеры до/после и автомониторинг просмотров.

• 7 мин чтения

Пятница, 17:40. Менеджер Дмитрий открывает Авито и начинает вручную переносить в форму очередную машину из дилерского каталога — VIN, пробег, комплектация, история обслуживания. Это сорок восьмое объявление за неделю. На часах без двадцати шесть.

50
объявлений за 1 час
вместо рабочего дня вручную — результат запуска агента на каталоге автодилера

Где уходит время

При большом каталоге Авито превращается в конвейер по набиванию форм. Менеджер открывает карточку товара, копирует характеристики, переключается на браузер, заполняет поля, придумывает заголовок, пишет описание, проверяет категорию, добавляет теги, загружает фото. Минимум 5 минут на позицию — если всё идёт гладко.

50 объявлений = 250 минут = больше четырёх часов чистого времени только на ввод.

При этом самая муторная часть — текст. Авито давит шаблонные описания. Если у вас сто машин и все описания начинаются с «Продаётся автомобиль в хорошем состоянии» — алгоритм это замечает и режет охваты. Каждое объявление должно быть уникальным. А уникальность вручную — это ещё плюс две минуты на каждое.

Куда уходит время при ручной публикации 50 объявлений
Написание текстов
~100 мин
Заполнение полей формы
~80 мин
Копирование характеристик
~50 мин
Загрузка фото и проверка
~20 мин
Оценка по хронометражу работы менеджера автодилера: 50 объявлений, категория «Автомобили», все характеристики уже в базе.

Как работает агент

Схема простая. Все характеристики уже есть в вашей системе — база авто, CRM, Excel. Агент забирает их оттуда, отдаёт Claude, получает готовый текст, публикует через API.

📋КаталогExcel / JSON / CRM
🐍Pythonоркестратор
🤖Claudeгенерация текстов
📍Авито APIпубликация
📊Мониторингалерты в Telegram

Особенности Авито API: что нужно знать до старта

Авито предоставляет два пути для массовой публикации:

Авито Автозагрузка — для авто и недвижимости. Это XML-фид, который Авито сам парсит по расписанию. Вы кладёте файл на свой сервер, передаёте ссылку Авито, и они забирают обновления каждые несколько часов. Ограничений на количество практически нет — но обновления не мгновенные.

Авито API (REST) — для остальных категорий: услуги, товары, электроника, одежда. Здесь rate limit жёсткий: 20 запросов в минуту для большинства аккаунтов. 50 объявлений публикуются примерно за час с учётом паузы между запросами.

Важный нюанс про доступ: API для публикации объявлений — не то же самое что API для статистики. Для публикации нужно подать заявку на developers.avito.ru и дождаться одобрения. Обычно это 2–5 дней для бизнес-аккаунтов с реальным каталогом.

Категории на Авито имеют обязательные поля — для автомобилей это VIN, марка, модель, год, пробег; для недвижимости — тип, площадь, этаж. Если поля не заполнены, API вернёт ошибку валидации. Claude нужно знать эти требования — они передаются в системный промпт.

Как Claude оптимизирует под поиск Авито

Авито — не Яндекс. Здесь другой алгоритм ранжирования, и SEO-логика не работает напрямую.

Что реально влияет на позицию в поиске Авито:

  1. Слова из запроса в заголовке — Авито ищет буквальные совпадения с поисковым запросом пользователя. Если человек ищет «Kia Rio 2021 автомат» — заголовок должен содержать именно эти слова в этом порядке.

  2. Полнота характеристик — заполненные категорийные поля дают дополнительный буст. Неполное объявление проигрывает полному при одинаковой цене.

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

  4. Уникальность текста — Авито активно выявляет дублирующийся контент внутри аккаунта и между аккаунтами. Шаблонные описания режутся в выдаче.

Промпт для Claude учитывает всё это. Модель получает характеристики конкретного лота и генерирует заголовок под частотный запрос, уникальное описание с деталями именно этого товара.

Заголовки до и после: 5 примеров

Было (менеджер)Стало (Claude)Результат
Продаётся Kia RioKia Rio 2021 1.6 автомат пробег 38 000 км один хозяин+2.1× просмотров
Квартира в центре2-комн. квартира 54 м² Проспект Мира без посредников+1.8× просмотров
Ремонт квартирРемонт квартир под ключ Москва от 3500 руб/м² с гарантией+2.4× просмотров
iPhone 13 в хорошем состоянииiPhone 13 128GB синий без Face ID дефектов коробка документы+1.6× просмотров
Продаю диванДиван угловой серый 270×180 см еврокнижка ортопед IKEA Friheten+3.1× просмотров

Каждый заголовок от Claude содержит марку/модель, главную характеристику покупателя (год, площадь, цена, бренд) и дифференциатор (один хозяин, без посредников, с гарантией). Это не SEO-магия — это информация которую покупатель ищет первой.

Код: Python + Авито API + Claude

🐍 avito_agent.py — pip install anthropic requests openpyxl
import requests
import anthropic
import json
import time
from openpyxl import load_workbook

AVITO_CLIENT_ID     = "YOUR_CLIENT_ID"      # из кабинета developers.avito.ru
AVITO_CLIENT_SECRET = "YOUR_CLIENT_SECRET"
CLAUDE_API_KEY      = "YOUR_CLAUDE_KEY"
USER_ID             = "YOUR_AVITO_USER_ID"   # числовой ID аккаунта

AVITO_TOKEN_URL = "https://api.avito.ru/token"
AVITO_POST_URL  = "https://api.avito.ru/core/v1/items"


def get_avito_token():
  """OAuth2 client_credentials для Авито API."""
  r = requests.post(AVITO_TOKEN_URL, data={
      "grant_type":    "client_credentials",
      "client_id":     AVITO_CLIENT_ID,
      "client_secret": AVITO_CLIENT_SECRET,
  })
  r.raise_for_status()
  return r.json()["access_token"]


def load_catalog(path: str) -> list:
  """Читаем каталог авто из Excel."""
  wb = load_workbook(path)
  ws = wb.active
  headers = [cell.value for cell in ws[1]]
  items = []
  for row in ws.iter_rows(min_row=2, values_only=True):
      item = dict(zip(headers, row))
      if item.get("vin"):   # пропускаем пустые строки
          items.append(item)
  return items


def generate_listing(car: dict, client: anthropic.Anthropic) -> dict:
  """Claude генерирует заголовок и описание для конкретного авто."""
  spec = (
      f"Марка/модель: {car.get('brand')} {car.get('model')}\n"
      f"Год: {car.get('year')}\n"
      f"Пробег: {car.get('mileage_km')} км\n"
      f"КПП: {car.get('transmission')}\n"
      f"Двигатель: {car.get('engine_volume')} л, {car.get('engine_type')}\n"
      f"Цвет: {car.get('color')}\n"
      f"Цена: {car.get('price_rub')} руб.\n"
      f"Владельцев по ПТС: {car.get('owners')}\n"
      f"Особенности: {car.get('features', '')}\n"
      f"VIN: {car.get('vin')}"
  )

  message = client.messages.create(
      model="claude-haiku-4-5",   # haiku дешевле для массовой генерации
      max_tokens=512,
      system=(
          "Ты помогаешь публиковать объявления на Авито. "
          "Пиши заголовки по схеме: [Марка Модель] [Год] [КПП] пробег [N] км [главная деталь]. "
          "Описание — 3-4 абзаца, каждый про свою деталь (техсостояние, комплектация, история владения, условия сделки). "
          "НЕ вставляй телефоны, ссылки, email в текст — Авито блокирует такие объявления. "
          "НЕ используй шаблонные фразы 'в хорошем состоянии', 'торг уместен' без конкретики. "
          "Пиши уникальный текст под каждую машину — алгоритм Авито детектирует копипаст."
      ),
      messages=[{
          "role": "user",
          "content": f"Создай объявление для Авито:\n\n{spec}\n\nФормат ответа — JSON:\n{{\"title\": \"...\", \"description\": \"...\"}}"
      }]
  )

  raw = message.content[0].text.strip()
  # Claude может добавить markdown-обёртку — убираем
  if raw.startswith("```"):
      raw = raw.split("\n", 1)[1].rsplit("```", 1)[0].strip()

  return json.loads(raw)


def publish_to_avito(token: str, car: dict, listing: dict) -> dict:
  """Публикуем объявление через Авито API."""
  payload = {
      "category_id": 9,                       # 9 = Автомобили
      "title":       listing["title"][:50],   # лимит заголовка — 50 символов
      "description": listing["description"],
      "price":       int(car.get("price_rub", 0)),
      "address":     car.get("address", "Москва"),
      "contact": {
          "phone": car.get("dealer_phone"),
      },
      "params": {
          "vin":          car.get("vin"),
          "year":         int(car.get("year", 0)),
          "mileage":      int(car.get("mileage_km", 0)),
          "transmission": car.get("transmission"),
      }
  }

  r = requests.post(
      AVITO_POST_URL,
      headers={"Authorization": f"Bearer {token}"},
      json=payload
  )

  if r.status_code == 429:
      # Rate limit — ждём минуту и повторяем
      print("Rate limit, ждём 60 сек...")
      time.sleep(60)
      r = requests.post(
          AVITO_POST_URL,
          headers={"Authorization": f"Bearer {token}"},
          json=payload
      )

  r.raise_for_status()
  return r.json()


def main():
  print("Загружаем каталог...")
  cars = load_catalog("catalog.xlsx")
  print(f"Найдено {len(cars)} позиций")

  token  = get_avito_token()
  client = anthropic.Anthropic(api_key=CLAUDE_API_KEY)

  published = []
  errors    = []

  for i, car in enumerate(cars):
      print(f"[{i+1}/{len(cars)}] {car.get('brand')} {car.get('model')} {car.get('year')}")

      try:
          listing = generate_listing(car, client)
          result  = publish_to_avito(token, car, listing)
          published.append({"vin": car.get("vin"), "item_id": result.get("id")})
          print(f"  Опубликовано: {listing['title'][:60]}")
      except Exception as e:
          errors.append({"vin": car.get("vin"), "error": str(e)})
          print(f"  Ошибка: {e}")

      # Авито: не больше 20 запросов в минуту — делаем паузу
      time.sleep(3)

  print(f"\nГотово: {len(published)} опубликовано, {len(errors)} ошибок")

  with open("published_ids.json", "w", encoding="utf-8") as f:
      json.dump(published, f, ensure_ascii=False, indent=2)


if __name__ == "__main__":
  main()

Несколько деталей которые сэкономят вам время:

Лимит заголовка на Авито — 50 символов. Claude иногда генерирует длиннее, поэтому в коде стоит [:50]. Это обрезает конец — если хотите контролировать что именно обрезается, сделайте постобработку умнее.

claude-haiku вместо sonnet для массовой генерации — втрое дешевле и достаточно быстрый для описаний по шаблону. Sonnet оставьте для сложных случаев: нестандартные категории, премиум-сегмент где нужна живая речь.

Rate limit Авито — 20 запросов в минуту. time.sleep(3) между запросами даёт запас. Если получили 429 — скрипт ждёт 60 секунд и повторяет.

Автомониторинг просмотров

Публикация — это полдела. Объявление может начать «тухнуть»: просмотры падают, конкурент снизил цену, ваш лот уехал в хвост выдачи. Без мониторинга вы об этом узнаете только когда перестанут звонить.

🐍 avito_monitor.py — проверяем просмотры и шлём алерт в Telegram
import requests
import json
from datetime import datetime

AVITO_CLIENT_ID     = "YOUR_CLIENT_ID"
AVITO_CLIENT_SECRET = "YOUR_CLIENT_SECRET"
TELEGRAM_TOKEN      = "YOUR_BOT_TOKEN"
CHAT_ID             = "YOUR_CHAT_ID"
VIEWS_THRESHOLD     = 5   # если за день меньше N просмотров — алерт

AVITO_TOKEN_URL  = "https://api.avito.ru/token"
AVITO_STATS_URL  = "https://api.avito.ru/core/v1/accounts/{user_id}/stats/summary"


def get_token():
  r = requests.post(AVITO_TOKEN_URL, data={
      "grant_type":    "client_credentials",
      "client_id":     AVITO_CLIENT_ID,
      "client_secret": AVITO_CLIENT_SECRET,
  })
  r.raise_for_status()
  return r.json()["access_token"]


def get_item_stats(token: str, user_id: str, item_ids: list) -> list:
  """Статистика просмотров по списку объявлений."""
  r = requests.post(
      AVITO_STATS_URL.format(user_id=user_id),
      headers={"Authorization": f"Bearer {token}"},
      json={"item_ids": item_ids, "date_from": datetime.now().strftime("%Y-%m-%d")}
  )
  r.raise_for_status()
  return r.json().get("result", {}).get("items", [])


def send_alert(items_to_update: list):
  """Телеграм-алерт: какие объявления нужно обновить."""
  if not items_to_update:
      return

  lines = ["\U0001f4ca <b>Авито: объявления с низкими просмотрами</b>\n"]
  for item in items_to_update:
      lines.append(
          f"• {item['title'][:40]} — {item['views']} просмотров за день"
      )
  lines.append("\n\u2192 Обновите объявление или поднимите в топ")

  requests.post(
      f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage",
      json={"chat_id": CHAT_ID, "text": "\n".join(lines), "parse_mode": "HTML"}
  )


def main():
  with open("published_ids.json") as f:
      published = json.load(f)

  item_ids = [p["item_id"] for p in published if p.get("item_id")]

  token = get_token()
  stats = get_item_stats(token, "YOUR_USER_ID", item_ids)

  low_views = [
      item for item in stats
      if item.get("uniq_views", 0) < VIEWS_THRESHOLD
  ]

  send_alert(low_views)
  print(f"Проверено: {len(stats)} объявлений, алертов: {len(low_views)}")


if __name__ == "__main__":
  main()

Запускайте мониторинг ежедневно через cron в 10 утра. Если объявление получило меньше 5 просмотров за день — скорее всего, его пора поднять в топ или переписать заголовок. Алерт приходит в Telegram, менеджер видит конкретный список, не надо заходить в кабинет и вручную проверять каждую карточку.

Правовой момент: что запрещает Авито

Claude получает системный промпт с запретами Авито — это не опционально.

Что нельзя в тексте и фото:

  • контактные данные (телефон, WhatsApp, ссылки на сайт, email)
  • призывы обходить Авито («пишите напрямую»)
  • ложные характеристики (меньший пробег, другое состояние)
  • дублирующийся контент с другими объявлениями

Что нельзя в каталоге:

  • битые машины под видом целых
  • кредитные авто без указания обременения
  • залоговое имущество

Claude не публикует телефоны в тексте — они идут в отдельное поле contact через API. Финальную модерацию всё равно проводит Авито, но правильно настроенный промпт снижает процент отклонений с типичных 15–20% до 2–5%.

Сколько экономит агент

Ручная публикация
50 объявлений4–5 часов
Уникальность текстовпод вопросом
Обновление каталогаснова вручную
Мониторинг просмотровраз в неделю если вспомнят
Стоимость работы~3 000–5 000 ₽/нед.
ИИ-агент
50 объявлений~1 час (rate limit)
Уникальность текстовгарантирована
Обновление каталогатриггер из CRM
Мониторинг просмотровежедневно автоматически
Стоимость Claude API30–80 ₽ за 50 лотов

Сколько ваш каталог теряет на Авито прямо сейчас

Диагностика за 4 вопроса

Оцениваем потенциал автоматизации для вашего каталога

Вопрос 1 из 4
Сколько объявлений вы публикуете на Авито в неделю?
Вопрос 2 из 4
Как вы сейчас пишете тексты объявлений?
Вопрос 3 из 4
Следите ли вы за динамикой просмотров по каждому объявлению?
Вопрос 4 из 4
Есть ли у вас база/таблица с характеристиками всех позиций каталога?

Что агент не сделает за вас

Честно о границах.

Агент не заменит ценовую стратегию. Авито ранжирует выше те объявления, которые конкурентны по цене. Claude не знает что сегодня продаётся по 800 000, а не по 900 000 — это нужно мониторить отдельно через парсер конкурентов или вручную.

Агент не спасёт плохие фото. Заголовок может быть идеальным, но если на первом фото серый фон и машина снята с десяти метров — конверсия будет низкой. Авито сам это учитывает в ранжировании.

Агент не решит ошибки в категоризации. Если поставить товар не в ту категорию — его не найдут по нужным фильтрам, и никакой текст не поможет. Категории для Авито нужно маппить заранее и проверять.


Дилер из примера в начале статьи запустил агента на каталоге из 180 машин. Первый прогон занял три с половиной часа — из-за паузы между запросами и одного рестарта после 429. Зато все 180 объявлений получили уникальные заголовки и описания, и ни одно не было отклонено за дубль. Менеджер Дмитрий теперь занимается мониторингом просмотров и звонками, а не набиванием форм.

Источники

Источники

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

Как ИИ-агент публикует объявления на Авито?
Агент берёт характеристики товара или услуги из вашей базы (Excel, JSON, база данных), передаёт их в Claude, который генерирует уникальный заголовок и описание под каждый лот. Готовый контент отправляется в Авито через официальный API. На 50 объявлений — около часа с учётом rate limits.
Какой API использовать для публикации объявлений на Авито?
Для бизнеса с большим каталогом Авито предоставляет два пути: Авито Автозагрузка (XML-фид для авто и недвижимости) и Авито API для объявлений (REST, для остальных категорий). Авто и недвижимость — через XML-фид, услуги и товары — через REST API. Доступ по заявке на developers.avito.ru.
Почему уникальность текстов на Авито важнее чем в Яндексе?
Авито активно выявляет шаблонные объявления и понижает их в выдаче или блокирует. Алгоритм проверяет совпадение текстов внутри аккаунта и между аккаунтами. При большом каталоге без уникализации каждого лота объявления не будут показываться нормально. Claude генерирует уникальное описание для каждого лота на основе его реальных характеристик.
Сколько стоит публикация 50 объявлений через агента?
Расходы на Claude API для генерации 50 описаний — около 30–80 рублей в зависимости от длины и модели (claude-haiku дешевле, claude-sonnet качественнее). Разработка базовой версии — 3–4 часа. Это разовые вложения: дальше агент работает сам по расписанию или по триггеру из вашей CRM.
Как Авито ранжирует объявления в поиске?
Авито учитывает: точность совпадения слов заголовка с поисковым запросом, полноту заполнения характеристик (категорийные поля), количество и качество фото, свежесть объявления (дата обновления), ценовую конкурентность относительно похожих лотов, скорость ответа продавца и платное продвижение (XL, поднятие в топ).
Что Авито запрещает и как агент это учитывает?
Авито запрещает: контактные данные в тексте и фото, повторяющиеся объявления с одинаковым содержанием, ложные характеристики, продажу запрещённых товаров. Claude получает системный промпт с этими ограничениями и не вставляет телефоны/ссылки в тексты. Финальную модерацию всё равно проходит Авито — агент лишь снижает процент отклонений.
Обсуждение

    Пока без комментариев. Будьте первым.

    Войдите, чтобы отправить комментарий

    Вы сможете комментировать статьи, сохранять материалы

    или войдите по email

    Бесплатная диагностика · 30 минут · без обязательств

    Маркетинг работает, но продажи не растут?

    Отвечу на 3–5 вопросов о вашем бизнесе — и мы вместе разберём, где именно теряются клиенты и что с этим делать.

    Без продаж. Без навязчивых звонков.