Mailoo no aloja tu tienda. La integración Market te ofrece una API de catálogo, APIs opcionales de pedido para un flujo simple de "snapshot del carrito → pedido por correo" y APIs del panel de control para que el propietario del proyecto liste pedidos y cambie estados.
Relacionado: lectura de catálogo y atributos --- market-catalog-csv{.interpreted-text role="doc"} / market-catalog-external-api{.interpreted-text role="doc"}. OpenAPI --- https://api.mailoo.app/docs/v1.
Arquitectura
- Carrito / caché de catálogo: Mantén el estado del carrito en el sitio del integrador (p. ej.
localStorageo un store del cliente). Actualiza precios usando ``GET /api/v1/market/.../effective-price?kind=...`` con la clave del tipo de precio (o las mismas reglas de resolución) antes de enviar para que los totales coincidan con el servidor. Consultamarket-catalog-external-api{.interpreted-text role="doc"} (Tipos de precio y precio efectivo). - Secretos: Todas las llamadas con ``X-API-Key`` se ejecutan desde tu servidor o BFF, nunca desde paquetes públicos del navegador.
- Enviar pedido: Tu BFF hace ``POST`` a Mailoo con ``market.order.submit``; Mailoo almacena un snapshot de líneas y precios resueltos, envía un correo de confirmación al comprador cuando esa integración Market tiene SMTP saliente configurado (panel de control Conexión y ajustes → Correo saliente (SMTP) --- mismo
outboundMailque las integraciones FORM/CONTACT), y devuelve un ``accessToken`` de un solo uso para consulta de solo lectura. El SMTP global de la plataforma (GLOBAL_SMTP_*) no se usa para este correo. - Después del envío: El comprador (o tu SPA) puede llamar a ``GET /api/v1/market/public/orders/{orderId}?token=`` sin clave API hasta que el token expire. Si el token se pierde, el comprador solo tiene el correo y el id de pedido que muestres en la UI.
- Back office: El propietario del proyecto usa rutas Bearer bajo ``/api/v1/projects/{uid}/integrations/{id}/market/orders/...`` para listar pedidos, ver detalle y actualizar estado.
Crear pedido (BFF)
- ``POST {baseUrl}/api/v1/market/{projectUid}/integrations/{integrationId}/orders``
- Cabeceras: ``X-API-Key`` con ``market.order.submit`` (o FULL)
- Cuerpo (JSON):
- ``customerEmail`` (obligatorio) --- dirección del comprador (normalizada a minúsculas)
- ``items`` (obligatorio, no vacío) --- cada elemento:
- ``productId`` --- debe estar ``PUBLISHED`` en esta integración
- ``priceKindId`` o ``priceKindKey`` (exactamente uno) --- el tipo de precio. Prefiere ``priceKindKey`` (p. ej.
base) para configuración del integrador; ``priceKindId`` es el CUID interno si ya lo tienes (p. ej. de líneas de ``GET .../price-lists/...``). - ``quantity`` --- string decimal positivo (p. ej.
"2","1.5") - ``variantId`` --- obligatorio si el producto tiene variantes, omitido (o null) si no tiene
- ``measurementUnitId`` --- opcional; por defecto usa la unidad predeterminada del producto + reglas de resolución de effective-price
- ``note``, ``metadata`` --- opcionales (definidos por el integrador)
Respuesta (201): ``data.id``, ``data.status`` (comienza como NEW), ``data.accessToken`` (almacenar solo en la sesión del comprador / devolver al cliente para UX), ``data.accessExpiresAt``, ``data.totalAmount``, ``data.currency`` y ``data.emailToCustomer`` (si el outboundMail de la integración pudo enviar: SENT / FAILED / NOT_CONFIGURED).
Lectura pública (comprador)
- ``GET {baseUrl}/api/v1/market/public/orders/{orderId}?token={accessToken}``
- O ``X-Market-Order-Token: {accessToken}``
- Sin ``X-API-Key``. Token inválido/faltante devuelve 404 (igual que pedido desconocido) para evitar filtrar la existencia.
TTL del token por defecto es 72 horas; la API puede establecer ``MARKET_ORDER_ACCESS_TOKEN_TTL_HOURS`` (1--720) en el host de Mailoo.
Panel del propietario (JWT)
Rutas autenticadas (resumen):
- ``GET .../market/orders`` --- lista (consulta ``limit`` opcional, máx. 100)
- ``GET .../market/orders/{orderId}`` --- snapshot completo + ``attributesSnapshot`` de línea
- ``PATCH .../market/orders/{orderId}`` --- ``{ "status": "...", "note"?: "..." }`` (transiciones de estado: los estados terminales ``REJECTED``, ``FULFILLED``, ``CANCELLED`` no pueden moverse a un estado diferente)
- ``GET .../market/orders/{orderId}/status-events`` --- historial de auditoría
Estados: ``NEW``, ``PROCESSING``, ``CONFIRMED``, ``REJECTED``, ``FULFILLED``, ``CANCELLED``.
Alcances de las claves API
- ``market.external-read`` --- solo ``GET`` del catálogo; usar en un BFF que obtiene páginas de producto.
- ``market.order.submit`` --- solo ``POST .../orders``; puede ser una clave restringida diferente en el BFF de checkout.
- Puedes usar una clave FULL solo en backends confiables; para mínimo privilegio, separa lectura vs envío como arriba.
:::: note ::: title Note :::
El panel de control de Mailoo es la consola de administración; el checkout orientado al cliente se ejecuta en tu sitio y llama a la API pública de Mailoo de la misma forma que lo haría cualquier tercero. ::::