Разбор
ИИ-агент публикует объявления на Авито: 50 карточек за час вместо рабочего дня
Менеджер тратит 5–10 минут на одно объявление — 50 лотов съедают весь рабочий день. ИИ-агент на Python + Claude + Авито API делает то же самое за час. Схема, код, примеры до/после и автомониторинг просмотров.
Пятница, 17:40. Менеджер Дмитрий открывает Авито и начинает вручную переносить в форму очередную машину из дилерского каталога — VIN, пробег, комплектация, история обслуживания. Это сорок восьмое объявление за неделю. На часах без двадцати шесть.
Где уходит время
При большом каталоге Авито превращается в конвейер по набиванию форм. Менеджер открывает карточку товара, копирует характеристики, переключается на браузер, заполняет поля, придумывает заголовок, пишет описание, проверяет категорию, добавляет теги, загружает фото. Минимум 5 минут на позицию — если всё идёт гладко.
50 объявлений = 250 минут = больше четырёх часов чистого времени только на ввод.
При этом самая муторная часть — текст. Авито давит шаблонные описания. Если у вас сто машин и все описания начинаются с «Продаётся автомобиль в хорошем состоянии» — алгоритм это замечает и режет охваты. Каждое объявление должно быть уникальным. А уникальность вручную — это ещё плюс две минуты на каждое.
Как работает агент
Схема простая. Все характеристики уже есть в вашей системе — база авто, CRM, Excel. Агент забирает их оттуда, отдаёт Claude, получает готовый текст, публикует через API.
Особенности Авито API: что нужно знать до старта
Авито предоставляет два пути для массовой публикации:
Авито Автозагрузка — для авто и недвижимости. Это XML-фид, который Авито сам парсит по расписанию. Вы кладёте файл на свой сервер, передаёте ссылку Авито, и они забирают обновления каждые несколько часов. Ограничений на количество практически нет — но обновления не мгновенные.
Авито API (REST) — для остальных категорий: услуги, товары, электроника, одежда. Здесь rate limit жёсткий: 20 запросов в минуту для большинства аккаунтов. 50 объявлений публикуются примерно за час с учётом паузы между запросами.
Важный нюанс про доступ: API для публикации объявлений — не то же самое что API для статистики. Для публикации нужно подать заявку на developers.avito.ru и дождаться одобрения. Обычно это 2–5 дней для бизнес-аккаунтов с реальным каталогом.
Категории на Авито имеют обязательные поля — для автомобилей это VIN, марка, модель, год, пробег; для недвижимости — тип, площадь, этаж. Если поля не заполнены, API вернёт ошибку валидации. Claude нужно знать эти требования — они передаются в системный промпт.
Как Claude оптимизирует под поиск Авито
Авито — не Яндекс. Здесь другой алгоритм ранжирования, и SEO-логика не работает напрямую.
Что реально влияет на позицию в поиске Авито:
-
Слова из запроса в заголовке — Авито ищет буквальные совпадения с поисковым запросом пользователя. Если человек ищет «Kia Rio 2021 автомат» — заголовок должен содержать именно эти слова в этом порядке.
-
Полнота характеристик — заполненные категорийные поля дают дополнительный буст. Неполное объявление проигрывает полному при одинаковой цене.
-
Свежесть — объявление опубликованное сегодня показывается выше, чем то же самое от месяца назад. Поэтому старые объявления нужно переиздавать.
-
Уникальность текста — Авито активно выявляет дублирующийся контент внутри аккаунта и между аккаунтами. Шаблонные описания режутся в выдаче.
Промпт для Claude учитывает всё это. Модель получает характеристики конкретного лота и генерирует заголовок под частотный запрос, уникальное описание с деталями именно этого товара.
Заголовки до и после: 5 примеров
| Было (менеджер) | Стало (Claude) | Результат |
|---|---|---|
| Продаётся Kia Rio | Kia 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
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 секунд и повторяет.
Автомониторинг просмотров
Публикация — это полдела. Объявление может начать «тухнуть»: просмотры падают, конкурент снизил цену, ваш лот уехал в хвост выдачи. Без мониторинга вы об этом узнаете только когда перестанут звонить.
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%.
Сколько экономит агент
Сколько ваш каталог теряет на Авито прямо сейчас
Диагностика за 4 вопроса
Оцениваем потенциал автоматизации для вашего каталога
Что агент не сделает за вас
Честно о границах.
Агент не заменит ценовую стратегию. Авито ранжирует выше те объявления, которые конкурентны по цене. Claude не знает что сегодня продаётся по 800 000, а не по 900 000 — это нужно мониторить отдельно через парсер конкурентов или вручную.
Агент не спасёт плохие фото. Заголовок может быть идеальным, но если на первом фото серый фон и машина снята с десяти метров — конверсия будет низкой. Авито сам это учитывает в ранжировании.
Агент не решит ошибки в категоризации. Если поставить товар не в ту категорию — его не найдут по нужным фильтрам, и никакой текст не поможет. Категории для Авито нужно маппить заранее и проверять.
Дилер из примера в начале статьи запустил агента на каталоге из 180 машин. Первый прогон занял три с половиной часа — из-за паузы между запросами и одного рестарта после 429. Зато все 180 объявлений получили уникальные заголовки и описания, и ни одно не было отклонено за дубль. Менеджер Дмитрий теперь занимается мониторингом просмотров и звонками, а не набиванием форм.
Есть вопрос по теме?
Разберу вашу ситуацию и предложу конкретный шаг
Источники
AI-агенты · Персональная карта
4 часа потратил — не работает?
Покажу где ты пошёл не туда и как сделать правильно за 2 недели
Получить разбор бесплатно →AI-агенты · 10 мест
Ты работаешь до полуночи — AI-агент будет работать вместо тебя
Покажу какой агент закроет твою главную операционную боль
Узнать свой маршрут →Есть вопрос по теме?
Разберу вашу ситуацию и предложу конкретный шаг
Источники
Читайте также
Часто задаваемые вопросы
- Как ИИ-агент публикует объявления на Авито?
- Агент берёт характеристики товара или услуги из вашей базы (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 получает системный промпт с этими ограничениями и не вставляет телефоны/ссылки в тексты. Финальную модерацию всё равно проходит Авито — агент лишь снижает процент отклонений.
Канал «Лёха Маркетолог»
Практика без воды: кейсы, инсайты, разборы. 1–2 поста в неделю.
Пока без комментариев. Будьте первым.