Python SDK для Италия
corp-merch (PyPI) — sync и async клиенты, Python 3.10+, полные type hints, модели Pydantic v2, FastAPI-friendly.
Установка и init
pip install corp-merch. Sync: from corp_merch import CorpMerch; cm = CorpMerch(api_key=os.environ['CM_KEY'], country='Italy'). Async: from corp_merch import AsyncCorpMerch; та же сигнатура. Country автоматически применяет IVA 22% через SdI с маршрутом через хаб Милан.
Quickstart — отправка заказа
order = cm.orders.create(idempotency_key=str(uuid4()), buyer={'vat_id': 'EU…'}, lines=[{'sku': 'TSH-001', 'qty': 200}], promised_date=date(2026,7,1)). Возвращает модель Pydantic Order с полной типизацией. Ошибки поднимаются как ValidationError, RateLimitError и т.п. Async-эквивалент: await acm.orders.acreate(…).
Верификация webhook (FastAPI)
@app.post('/wh') async def wh(req: Request): event = cm.webhooks.construct_event(await req.body(), req.headers['x-corp-signature'], os.environ['CM_WEBHOOK_SECRET']); …. Поднимает SignatureVerificationError при неверной подписи; FastAPI конвертирует в 400 через зарегистрированный exception handler.
FAQ
Работает с Django/Flask?
Да — framework-agnostic. Поставляем middleware для Django (corp_merch.django) и Flask (corp_merch.flask) для webhook-маршрутов.
Sync и async оба поддерживаются?
Да — отдельные клиенты (CorpMerch / AsyncCorpMerch) делят одни типы. Используют httpx внутри; bring your own event loop.
Как пагинировать каталог?
for item in cm.catalog.list(country='Italy'): … итерирует все страницы (cursor pagination внутри). Async: async for item in acm.catalog.alist(country='Italy'): …
Type hints / mypy?
Полное покрытие. Marker ./py.typed. Тестируется с mypy --strict и pyright. Модели Pydantic v2 для всех ответов.
Исходный код?
MIT на GitHub: github.com/corp-merch/sdk-python. Issue tracker для багов / RFC.