Saltar al contenido principal

Checkout

El dominio de Checkout gestiona los carritos de compra y el flujo de conversión a orden. Tiene dos entidades principales: Cart (carrito) y Checkout (proceso de pago).

Carrito (Cart)

Crear carrito

POST /api/v1/checkout/carts
CampoTipoRequeridoDescripción
customer_iduuidNoID del cliente (si está autenticado)
session_idstringNoID de sesión anónima
currencystringNoMoneda del carrito (default: moneda del tenant)
{
"session_id": "sess_abc123",
"currency": "PEN"
}

Respuesta 201 Created:

{
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"tenant_id": "...",
"session_id": "sess_abc123",
"line_items": [],
"item_count": 0,
"subtotal": 0,
"expires_at": "2026-07-23T12:00:00Z",
"created_at": "2026-07-22T12:00:00Z",
"updated_at": "2026-07-22T12:00:00Z"
}
}

Obtener carrito

GET /api/v1/checkout/carts/:id

Respuesta 200 OK: misma estructura que crear.

Agregar item al carrito

POST /api/v1/checkout/carts/:id/items
CampoTipoRequeridoDescripción
variant_iduuidID de la variante del producto
product_iduuidID del producto
titlestringNombre del producto
variant_titlestringNoTítulo de la variante
skustringNoSKU
quantityintCantidad (mínimo 1)
unit_priceint64Precio unitario en céntimos
requires_shippingboolNoRequiere envío
image_urlstringNoURL de imagen del producto
weight_gramsintNoPeso en gramos
taxableboolNoEstá sujeto a impuestos
{
"variant_id": "...",
"product_id": "...",
"title": "Camiseta básica",
"variant_title": "Negro / M",
"sku": "CAM-NEG-M",
"quantity": 2,
"unit_price": 4500,
"image_url": "https://cdn.example.com/camiseta.jpg"
}

Actualizar cantidad

PUT /api/v1/checkout/carts/:id/items/:variant_id
{
"quantity": 3
}

Eliminar item

DELETE /api/v1/checkout/carts/:id/items/:variant_id

Aplicar cupón

POST /api/v1/checkout/carts/:id/coupon
{
"code": "VERANO20"
}

Checkout

Iniciar checkout

Crea un checkout a partir de un carrito existente. El carrito se "congela" y ya no se puede modificar.

POST /api/v1/checkout/checkouts
CampoTipoRequeridoDescripción
cart_iduuidID del carrito
customer_iduuidNoID del cliente
emailstringEmail de contacto
currencystringNoMoneda
{
"cart_id": "550e8400-e29b-41d4-a716-446655440000",
"email": "[email protected]",
"currency": "PEN"
}

Respuesta 201 Created:

{
"data": {
"id": "...",
"cart_id": "...",
"email": "[email protected]",
"status": "pending",
"line_items": [...],
"subtotal": 9000,
"shipping_total": 0,
"discount_total": 0,
"tax_total": 0,
"total": 9000,
"currency": "PEN"
}
}

Obtener checkout

GET /api/v1/checkout/checkouts/:id

Actualizar envío

Configura las direcciones de envío y facturación, y la tarifa de envío seleccionada.

PUT /api/v1/checkout/checkouts/:id/shipping
{
"shipping_address": {
"first_name": "Juan",
"last_name": "Pérez",
"address1": "Av. Larco 123",
"city": "Lima",
"province": "Lima",
"country_code": "PE",
"zip": "15001",
"phone": "+51987654321"
},
"billing_address": {
"first_name": "Juan",
"last_name": "Pérez",
"address1": "Av. Larco 123",
"city": "Lima",
"province": "Lima",
"country_code": "PE",
"zip": "15001"
},
"shipping_rate": {
"carrier": "Olva",
"service": "Estándar",
"price": 1500
}
}

Completar checkout

Finaliza el checkout y genera la orden. Requiere que el pago esté confirmado.

POST /api/v1/checkout/checkouts/:id/complete
{
"order_id": "uuid-de-la-orden-creada"
}

Abandonar checkout

Marca el checkout como abandonado. Se usa para tracking de carritos abandonados.

POST /api/v1/checkout/checkouts/:id/abandon

Estados del Checkout

EstadoDescripción
pendingCheckout creado, esperando datos de envío
shipping_setDirecciones configuradas
payment_pendingEsperando confirmación de pago
completedCheckout completado, orden creada
abandonedCheckout abandonado por el comprador

Errores

CódigoHTTPDescripción
TENANT_REQUIRED400Falta el contexto de tenant
INVALID_ID400ID de carrito/checkout inválido
INVALID_REQUEST400Body de request inválido
CART_NOT_FOUND404Carrito no encontrado
CHECKOUT_NOT_FOUND404Checkout no encontrado
ITEM_NOT_FOUND404Item no existe en el carrito
COUPON_INVALID422Cupón no válido o expirado
CART_EXPIRED410Carrito expirado