Skip to main content

SDK для разработки инструментов на базе Avito API

Project description

SDK для Avito

CI Coverage Status PyPI Downloads API coverage

avito-py — Python SDK для работы с Avito API через единый объектный фасад AvitoClient.

Цели SDK:

  • скрыть transport, OAuth и retry-логику от пользовательского кода;
  • возвращать типизированные dataclass-модели вместо сырого JSON;
  • дать единый вход в доменные сценарии вида avito.ad(...).get() и avito.chat(...).send_message(...);
  • покрыть все swagger-документы из каталога docs.

Каталог docs рассматривается как upstream API contract. Эти файлы не редактируются вручную при развитии SDK: публичные модели, мапперы и тесты должны подстраиваться под documented shape из docs/*.

Установка

poetry add avito-py

или

pip install avito-py

Требование к интерпретатору: Python 3.14 и выше в рамках ветки 3.x. Репозиторий и релизный контур валидируются именно на Python 3.14.

Быстрый старт

Получение ключей - https://www.avito.ru/professionals/api

from avito import AvitoClient

with AvitoClient() as avito:
    profile = avito.account().get_self()
    ad = avito.ad(42).get()

print(profile.name)
print(ad.title)

По умолчанию настройки читаются из переменных окружения с префиксом AVITO_.

Официальный способ конфигурации SDK:

from avito import AuthSettings, AvitoClient, AvitoSettings

settings = AvitoSettings(
    base_url="https://api.avito.ru",
    user_id=123,
    auth=AuthSettings(
        client_id="client-id",
        client_secret="client-secret",
    ),
)
client = AvitoClient(settings)

Инициализация из окружения и .env:

from avito import AvitoClient, AvitoSettings

settings = AvitoSettings.from_env()
client = AvitoClient.from_env()

Поддерживаемые env-переменные и alias-имена:

  • AVITO_BASE_URL
  • AVITO_USER_ID
  • AVITO_AUTH__CLIENT_ID, alias: AVITO_CLIENT_ID
  • AVITO_AUTH__CLIENT_SECRET, alias: AVITO_CLIENT_SECRET
  • AVITO_AUTH__REFRESH_TOKEN, alias: AVITO_REFRESH_TOKEN
  • AVITO_AUTH__SCOPE, alias: AVITO_SCOPE
  • AVITO_AUTH__TOKEN_URL, alias: AVITO_TOKEN_URL
  • AVITO_AUTH__ALTERNATE_TOKEN_URL, alias: AVITO_ALTERNATE_TOKEN_URL
  • AVITO_AUTH__AUTOTEKA_TOKEN_URL, alias: AVITO_AUTOTEKA_TOKEN_URL
  • AVITO_AUTH__AUTOTEKA_CLIENT_ID, alias: AVITO_AUTOTEKA_CLIENT_ID
  • AVITO_AUTH__AUTOTEKA_CLIENT_SECRET, alias: AVITO_AUTOTEKA_CLIENT_SECRET
  • AVITO_AUTH__AUTOTEKA_SCOPE, alias: AVITO_AUTOTEKA_SCOPE

Правила resolution:

  • значения из process environment имеют приоритет над .env;
  • AvitoSettings.from_env() и AvitoClient.from_env() детерминированно читают .env из текущей рабочей директории или из переданного env_file;
  • при отсутствии client_id или client_secret SDK завершает инициализацию с typed-ошибкой ConfigurationError.

Примеры по доменам

Аккаунт и объявления

from avito import AvitoClient

with AvitoClient() as avito:
    account = avito.account(user_id=123)
    balance = account.get_balance()
    ad = avito.ad(item_id=42, user_id=123).get()
    stats = avito.ad_stats(item_id=42, user_id=123).get()

Автозагрузка

from avito import AvitoClient

with AvitoClient() as avito:
    profile = avito.autoload_profile(user_id=123).get()
    report = avito.autoload_report(report_id=777).get()

Мессенджер

from avito import AvitoClient
from avito.messenger import UploadImageFile

with AvitoClient() as avito:
    chats = avito.chat(user_id=123).list()
    message = avito.chat_message(chat_id="chat-1", user_id=123).send_message(
        message="Здравствуйте"
    )
    uploaded = avito.chat_media(user_id=123).upload_images(
        files=[
            UploadImageFile(
                field_name="image",
                filename="photo.jpg",
                content=b"...",
                content_type="image/jpeg",
            )
        ]
    )
    subscriptions = avito.chat_webhook().list()

Продвижение

from avito import AvitoClient
from datetime import datetime

with AvitoClient() as avito:
    services = avito.promotion_order().list_orders()
    forecast = avito.bbip_promotion(item_id=42).get_forecasts(items=[])
    budget = avito.autostrategy_campaign().create_budget(
        campaign_type="AS",
        start_time="2026-04-20T00:00:00Z",
        finish_time="2026-04-27T00:00:00Z",
        items=[42, 43],
    )
    campaign = avito.autostrategy_campaign(campaign_id=15).get()
    campaigns = avito.autostrategy_campaign().list(
        limit=50,
        status_id=[1, 2],
        order_by=[("startTime", "asc")],
        updated_from=datetime(2026, 4, 1),
        updated_to=datetime(2026, 4, 30),
    )

print(budget.calc_id)
print(campaign.campaign.title if campaign.campaign else None)
print(campaigns.total_count)

Заказы и доставка

from avito import AvitoClient
from avito.orders import OrderLabelsRequest, StockInfoRequest

with AvitoClient() as avito:
    orders = avito.order().list()
    label_task = avito.order_label().create(request=OrderLabelsRequest(order_ids=["100500"]))
    label_pdf = avito.order_label(task_id=label_task.task_id).download()
    stock_info = avito.stock().get(request=StockInfoRequest(item_ids=[100500]))

Работа

from avito import AvitoClient
from avito.jobs import ApplicationIdsQuery, ResumeSearchQuery

with AvitoClient() as avito:
    vacancies = avito.vacancy().list()
    applications = avito.application().list(
        query=ApplicationIdsQuery(updated_at_from="2026-04-18")
    )
    resumes = avito.resume().list(query=ResumeSearchQuery(query="оператор"))
    webhooks = avito.job_webhook().list()

CPA и CallTracking

from avito import AvitoClient
from avito.cpa import CpaCallsByTimeRequest

with AvitoClient() as avito:
    calls = avito.cpa_call().list(
        request=CpaCallsByTimeRequest(
            date_time_from="2026-04-18T00:00:00Z",
            date_time_to="2026-04-19T00:00:00Z",
        )
    )
    calltracking = avito.call_tracking_call(10).get()
    records = avito.call_tracking_call(10).download()

Пагинация

Публичные list-операции, которые поддерживают lazy pagination, возвращают обычные SDK-результаты, а поле items в них ведет себя как list-like коллекция PaginatedList.

Текущий стабильный контракт:

  • первая страница загружается сразу, остальные страницы подгружаются только при чтении элементов за ее пределами;
  • доступ к уже загруженным элементам не делает повторных запросов;
  • частичная итерация и slicing загружают только необходимые страницы;
  • явная полная материализация выполняется через items.materialize().

Пример:

from avito import AvitoClient

with AvitoClient() as avito:
    result = avito.ad(user_id=123).list(status="active", limit=50)

    first = result.items[0]
    preview = result.items[:10]
    all_items = result.items.materialize()

Автотека

from avito import AvitoClient
from avito.autoteka import CatalogResolveRequest, PreviewReportRequest, VinRequest

with AvitoClient() as avito:
    catalog = avito.autoteka_vehicle().resolve_catalog(
        request=CatalogResolveRequest(brand_id=1)
    )
    preview = avito.autoteka_vehicle().create_preview_by_vin(
        request=VinRequest(vin="XTA00000000000000")
    )
    report = avito.autoteka_report().create_report(
        request=PreviewReportRequest(preview_id=int(preview.preview_id or 0))
    )
    reports = avito.autoteka_report().list_reports()

Недвижимость, отзывы и тарифы

from avito import AvitoClient
from avito.realty import RealtyBookingsUpdateRequest, RealtyPricePeriod, RealtyPricesUpdateRequest

with AvitoClient() as avito:
    booking = avito.realty_booking(20, user_id=10)
    booking.update_bookings_info(
        request=RealtyBookingsUpdateRequest(blocked_dates=["2026-05-01"])
    )
    bookings = booking.list_realty_bookings(date_start="2026-05-01", date_end="2026-05-05")
    avito.realty_pricing(20, user_id=10).update_realty_prices(
        request=RealtyPricesUpdateRequest(
            periods=[RealtyPricePeriod(date_from="2026-05-01", price=5000)]
        )
    )
    reviews = avito.review().list()
    tariff = avito.tariff().get_tariff_info()

Отладка интеграции

SDK не раскрывает сырой transport в основном API, но даёт безопасный debug snapshot без секретов:

from avito import AvitoClient

client = AvitoClient()
info = client.debug_info()

print(info.base_url)
print(info.user_id)
print(info.retry_max_attempts)
client.close()

debug_info() подходит для smoke-проверок окружения и диагностики конфигурации. Стабильный контракт включает base_url, user_id, флаг requires_auth, таймауты и retry-настройки. Access token, client_secret и Authorization header в этот снимок не попадают.

Проверки качества

Минимальный релизный набор:

make check

Для локальной разработки команды разделены:

make fmt
make lint
make typecheck
make test
make build

GitHub Actions

Для репозитория настроены два workflow:

  • CI запускается на каждый push в main/master и на каждый pull_request, выполняет make check.
  • Release запускается при пуше тега вида v*, выставляет версию пакета из тега, повторно выполняет make check, публикует пакет на PyPI и создаёт GitHub Release.

Для публикации релиза нужно добавить secret:

  • PYPI_API_TOKEN — токен публикации в PyPI для poetry publish.

Порядок релиза:

git tag v1.0.2
git push origin v1.0.2

Документация репозитория

  • STYLEGUIDE.md — нормативные архитектурные правила
  • docs/inventory.md — матрица соответствия swagger-операций и публичного API SDK

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

avito_py-2.0.1.tar.gz (98.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

avito_py-2.0.1-py3-none-any.whl (143.4 kB view details)

Uploaded Python 3

File details

Details for the file avito_py-2.0.1.tar.gz.

File metadata

  • Download URL: avito_py-2.0.1.tar.gz
  • Upload date:
  • Size: 98.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.4 CPython/3.14.4 Linux/6.17.0-1011-azure

File hashes

Hashes for avito_py-2.0.1.tar.gz
Algorithm Hash digest
SHA256 16e5dbf507648e927cfceab9fa68f7a02aca5292431fb73157b50e0ef96862a6
MD5 0dc764cb920fd55f07b5a2531721ec97
BLAKE2b-256 03e02cb5f219e550965e83699266998bda54064817faf5d48e2ecf320b3e47fb

See more details on using hashes here.

File details

Details for the file avito_py-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: avito_py-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 143.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.4 CPython/3.14.4 Linux/6.17.0-1011-azure

File hashes

Hashes for avito_py-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4edee03adc91baa43562a9e047e953d7c75d00a3667b3bb985f56f8158af564b
MD5 68707b9a748e676418c6eed598926adb
BLAKE2b-256 a713374079d0101e168f455575b2f8131f80d1bf45079a7328e2bc0411b4822a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page