SDK Python para España
corp-merch (PyPI) — clientes sync y async, Python 3.10+, type hints completos, modelos Pydantic v2, FastAPI-friendly.
Instalación e init
pip install corp-merch. Sync: from corp_merch import CorpMerch; cm = CorpMerch(api_key=os.environ['CM_KEY'], country='ES'). Async: from corp_merch import AsyncCorpMerch; misma firma. País aplica IVA 21% vía FACe/SII (AEAT) enrutado por el hub Madrid.
Quickstart — enviar pedido
order = cm.orders.create(idempotency_key=str(uuid4()), buyer={'vat_id': 'ES…'}, lines=[{'sku': 'TSH-001', 'qty': 200}], promised_date=date(2026,7,1)). Devuelve modelo Pydantic Order con typing completo. Errores lanzados como ValidationError, RateLimitError etc. Equivalente async: await acm.orders.acreate(…).
Verificación 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']); …. Lanza SignatureVerificationError en firma inválida; FastAPI convierte a 400 vía exception handler registrado en la app.
FAQ
¿Funciona con Django/Flask?
Sí — framework-agnostic. Enviamos middleware para Django (corp_merch.django) y Flask (corp_merch.flask) para rutas webhook.
¿Sync y async ambos soportados?
Sí — clientes separados (CorpMerch / AsyncCorpMerch) comparten los mismos tipos. Usan httpx por debajo; tráete tu event loop.
¿Cómo paginar el catálogo?
for item in cm.catalog.list(country='ES'): … itera todas las páginas (cursor pagination interno). Async: async for item in acm.catalog.alist(country='ES'): …
¿Type hints / mypy?
Cobertura completa. Marker ./py.typed. Probado con mypy --strict y pyright. Modelos Pydantic v2 para todas las responses.
¿Código fuente?
MIT en GitHub: github.com/corp-merch/sdk-python. Issue tracker para bugs / RFCs.