Merch corporativo en otros países:AMArmeniaGEGeorgiaTRTürkiyeRSSerbiaAEUAECYCyprusITItalyPTPortugalPLPoland

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.

Habla con un especialista