SDK Python dla Polski
corp-merch (PyPI) — klienty sync i async, Python 3.10+, pełne type hints, modele Pydantic v2, FastAPI-friendly.
Instalacja i init
pip install corp-merch. Sync: from corp_merch import CorpMerch; cm = CorpMerch(api_key=os.environ['CM_KEY'], country='PL'). Async: from corp_merch import AsyncCorpMerch; ta sama sygnatura. Country stosuje VAT 23% via KSeF przez hub Warszawa.
Quickstart — złóż zamówienie
order = cm.orders.create(idempotency_key=str(uuid4()), buyer={'vat_id': 'PL…'}, lines=[{'sku': 'TSH-001', 'qty': 200}], promised_date=date(2026,7,1)). Zwraca model Pydantic Order z pełnym typingiem. Błędy podnoszone jako ValidationError, RateLimitError itp. Równoważnik async: await acm.orders.acreate(…).
Weryfikacja 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']); …. Podnosi SignatureVerificationError przy złym podpisie; FastAPI konwertuje na 400 via exception handler zarejestrowany na app.
FAQ
Działa z Django/Flask?
Tak — framework-agnostic. Wysyłamy middleware dla Django (corp_merch.django) i Flask (corp_merch.flask) dla tras webhook.
Sync i async oba wspierane?
Tak — osobne klienty (CorpMerch / AsyncCorpMerch) dzielą te same typy. Używają httpx pod spodem; bring your own event loop.
Jak paginować katalog?
for item in cm.catalog.list(country='PL'): … iteruje wszystkie strony (cursor pagination wewnątrz). Async: async for item in acm.catalog.alist(country='PL'): …
Type hints / mypy?
Pełne pokrycie. Marker ./py.typed. Testowane z mypy --strict i pyright. Modele Pydantic v2 dla wszystkich response.
Kod źródłowy?
MIT na GitHub: github.com/corp-merch/sdk-python. Issue tracker dla bugów / RFC.