Carrito
Crea el carrito, agrega artículos, aplica un código y elige el envío con Storefront API.
Andrea compra dos polos desde Miraflores, en Lima. Usa el código BIENVENIDA10
y pide delivery para el jueves a las 10:00. Esta guía arma ese carrito hasta el
checkout.
Requisitos
- El slug de la tienda o un dominio configurado, en
x-Store-Domain. No necesitas token de acceso. - Una variante publicada y métodos de envío activos. Ver Tienda headless y Zonas y tarifas.
Crea el carrito
POST /
crea un carrito en la moneda de la tienda. Guarda token: identifica el
carrito en todas las llamadas.
curl -X POST https://storefront.ecomiq.pe/v1/carts \
-H "x-Store-Domain: mi-tienda" \
-H "Content-Type: application/json" \
-d '{ "email": "andrea.ramos@example.com" }'{
"token": "kP3vX9qL2mT7wR4nB8sD1A",
"cartNumber": "C-04325176",
"currencyCode": "PEN",
"status": "inProgress"
}Los ejemplos siguientes reutilizan API, headers y cart.
emailes opcional. También va con los datos del comprador.- Si el cliente inició sesión, crea el carrito con su
X-Customer-Session. Así usa sus precios y sus códigos reservados. Ver Cuentas de clientes.
Lee el carrito
GET /
devuelve el carrito completo. Úsalo al recargar la página.
curl https://storefront.ecomiq.pe/v1/carts/<cart-token> \
-H "x-Store-Domain: mi-tienda"- Un carrito sin actividad pasa a
abandoned. Leerlo o cambiarlo lo reabre. - Un carrito
completedocancelledya no acepta cambios. Crea otro.
Agrega artículos
POST /
agrega una variante. Esta y las demás operaciones devuelven el carrito
recalculado.
curl -X POST https://storefront.ecomiq.pe/v1/carts/<cart-token>/items \
-H "x-Store-Domain: mi-tienda" \
-H "Content-Type: application/json" \
-d '{ "variantId": "7204558912004325377", "quantity": 2 }'{
"items": [
{
"id": "7204558912004325450",
"title": "Polo de algodón",
"quantity": 2,
"unitPrice": 79
}
],
"totals": {
"subtotal": 158,
"discountTotal": 0,
"shippingTotal": 0,
"total": 158
}
}- Agregar la misma variante suma a su línea.
- El stock se valida con la cantidad total de esa variante en el carrito.
- Agregar, cambiar o quitar un artículo con envío borra el envío elegido de su grupo. Elige el envío al final.
Cambia la cantidad
PATCH /
fija la cantidad de una línea. Usa el id del artículo, no el de la variante.
Con 0, quita la línea.
curl -X PATCH https://storefront.ecomiq.pe/v1/carts/<cart-token>/items/7204558912004325450 \
-H "x-Store-Domain: mi-tienda" \
-H "Content-Type: application/json" \
-d '{ "quantity": 3 }'Quita un artículo
DELETE /
quita la línea.
curl -X DELETE https://storefront.ecomiq.pe/v1/carts/<cart-token>/items/7204558912004325450 \
-H "x-Store-Domain: mi-tienda"Aplica un código
POST /
aplica un cupón. Da igual si viene en minúsculas: se guarda en mayúsculas.
curl -X POST https://storefront.ecomiq.pe/v1/carts/<cart-token>/promotion-codes \
-H "x-Store-Domain: mi-tienda" \
-H "Content-Type: application/json" \
-d '{ "code": "bienvenida10" }'El código queda en promotionCodes. Con 10 % sobre S/ 158,
totals.discountTotal queda en -15.8 y totals.total, en 142.2.
- Si el carrito no cumple las condiciones del cupón, el código se guarda igual, pero no descuenta hasta que las cumpla.
Quita un código
DELETE /
quita el código y recalcula el total.
curl -X DELETE https://storefront.ecomiq.pe/v1/carts/<cart-token>/promotion-codes/BIENVENIDA10 \
-H "x-Store-Domain: mi-tienda"Agrega los datos del comprador
PATCH /
guarda el contacto y el documento del comprador.
curl -X PATCH https://storefront.ecomiq.pe/v1/carts/<cart-token>/buyer \
-H "x-Store-Domain: mi-tienda" \
-H "Content-Type: application/json" \
-d '{
"email": "andrea.ramos@example.com", "phone": "+51987654321",
"firstName": "Andrea", "lastName": "Ramos",
"identificationType": "DNI", "identificationNumber": "45678912"
}'- Envía todos los datos en cada llamada: los que omitas quedan vacíos. Solo
invoiceTypese conserva si no lo envías. - Para factura, envía
invoiceType: "invoice", el RUC enentityTaxIdy la razón social enentityName.
Arma el formulario de dirección
Los selectores de departamento, provincia y distrito salen del catálogo de
ubigeos. Pide cada nivel con el code del anterior:
departments,
provinces
y districts.
curl https://storefront.ecomiq.pe/v1/geo/departments -H "x-Store-Domain: mi-tienda"
curl "https://storefront.ecomiq.pe/v1/geo/provinces?departmentCode=15" -H "x-Store-Domain: mi-tienda"
curl "https://storefront.ecomiq.pe/v1/geo/districts?provinceCode=1501" -H "x-Store-Domain: mi-tienda"Cada área trae id, code y name, por ejemplo 150122 y Miraflores. En
Perú, code es el ubigeo del INEI y source vale inei.
- Sin
countryCode, usaPE. Cada lista llega ordenada por nombre, con hasta 200 áreas. - Para precargar una dirección guardada, resuelve su ubigeo con
GET /. Envíav1/ geo/ resolve countryCode=PE,source=ineiy el ubigeo encode.
Guarda la dirección
PATCH /
guarda la dirección de envío. Si no envías billingAddress, el checkout usa la
de envío.
curl -X PATCH https://storefront.ecomiq.pe/v1/carts/<cart-token>/addresses \
-H "x-Store-Domain: mi-tienda" \
-H "Content-Type: application/json" \
-d '{
"shippingAddress": {
"name": "Andrea Ramos", "phone": "+51987654321",
"address1": "Av. Larco 1234", "address2": "Dpto. 501",
"department": "Lima", "departmentCode": "15",
"province": "Lima", "provinceCode": "1501",
"district": "Miraflores", "districtCode": "150122",
"city": "Lima", "postalCode": "15074", "countryCode": "PE"
}
}'- En Perú,
department,provinceydistrictson obligatorios, además dename,address1,cityycountryCode. - Si envías códigos, envía los tres. Cada uno empieza por el anterior:
15,1501,150122. Las cotizaciones y los horarios usan esos códigos. - Cada
PATCHreemplaza la dirección: sin códigos, se borran los que tenía. - Si ya elegiste envío, cambiar la dirección lo vuelve a cotizar. Si ya no aplica o cambió de precio, se quita.
Lista las opciones de envío
GET /
cotiza el envío con la dirección del carrito. Agrupa los artículos por vendedor
y perfil de envío.
curl https://storefront.ecomiq.pe/v1/carts/<cart-token>/shipping-options \
-H "x-Store-Domain: mi-tienda"{
"groups": [
{
"sellerId": "7204558912004325305",
"shippingProfileId": "7204558912004329819",
"rates": [
{
"shippingMethodId": "7204558912004325207",
"rateId": "7204558912004322088",
"name": "Delivery Lima",
"type": "localDelivery",
"target": "location",
"targetId": "7204558912004325563",
"price": 10,
"serviceCode": null
}
]
}
]
}- Elige una tarifa por grupo.
- Si ningún artículo requiere envío,
groupsllega vacío. - Sin dirección, puedes cotizar con
?postalCode=15074.
Consulta los horarios
GET /
devuelve los horarios de un día. Envía target, targetId y rateId de la
tarifa, y la fecha en date.
curl -G https://storefront.ecomiq.pe/v1/carts/<cart-token>/shipping-methods/7204558912004325207/slots \
-H "x-Store-Domain: mi-tienda" \
-d target=location -d targetId=7204558912004325563 \
-d rateId=7204558912004322088 -d date=2026-10-08{
"date": "2026-10-08",
"capacity": 30,
"scheduledCount": 12,
"slots": ["10:00:00", "12:00:00"]
}- Solo
pickupylocalDeliverytienen horarios. - Las horas son locales de la tienda.
capacityes el cupo del día yscheduledCount, lo ya reservado. - Si el día está cerrado o lleno,
slotsllega vacío. Prueba otra fecha.
Elige el envío
PUT /
guarda la tarifa elegida. Copia shippingMethodId, rateId, target,
targetId y serviceCode de la tarifa, y sellerId y shippingProfileId del
grupo. En el código, shippingOptions es la respuesta de las opciones de envío.
curl -X PUT https://storefront.ecomiq.pe/v1/carts/<cart-token>/shipping-method \
-H "x-Store-Domain: mi-tienda" \
-H "Content-Type: application/json" \
-d '{
"shippingProfileId": "7204558912004329819",
"shippingMethodId": "7204558912004325207", "rateId": "7204558912004322088",
"target": "location", "targetId": "7204558912004325563",
"scheduledDate": "2026-10-08", "scheduledTime": "10:00:00"
}'La respuesta trae el envío en shippingMethods. totals.shippingTotal vale
10 y totals.total, 152.2.
- Con
target: "automatic",targetIdva ennull. scheduledDateyscheduledTimevan juntos o no van. La hora es la deslots, sin zona horaria.
Quita el envío
DELETE /
quita el envío elegido de todos los grupos. Con sellerId o
shippingProfileId, solo el de ese grupo.
curl -X DELETE "https://storefront.ecomiq.pe/v1/carts/<cart-token>/shipping-method?shippingProfileId=7204558912004329819" \
-H "x-Store-Domain: mi-tienda"Pasa al checkout
El checkout pide artículos, correo, dirección de envío y un envío por cada grupo con artículos que se envían. Sigue en Checkout y pago.
El checkout vuelve a calcular los descuentos. Si un código dejó de aplicar,
responde 409 con Promotions.CodeNoLongerApplies; si se agotó una promoción
automática, con Promotions.NoLongerApplies.
Errores
Lee code en el cuerpo del error.
code | Estado | Qué hacer |
|---|---|---|
Carts.NotFound | 404 | El token no existe en la tienda. Crea otro carrito. |
Carts.NotActive | 400 | El carrito ya se compró o se canceló. Crea otro. |
Checkout.InProgress | 409 | Hay un checkout en curso. Espera y lee el carrito. |
Common.Validation | 400 | Falta un campo o tiene otro formato. Revisa errors. |
Catalog.VariantNotFound | 404 | La variante no existe o no está publicada en la tienda. |
Catalog.InsufficientStock | 400 | No hay stock para esa cantidad. Bájala. |
Promotions.CodeNotFound | 400 | El código no existe. |
Promotions.CodeLimitReached | 400 | El cupón se agotó. |
Promotions.CodeInactive | 400 | El cupón está inactivo, aún no empieza o venció. |
ShippingMethods.RateNotFound | 400 | La tarifa ya no aplica. Lista las opciones otra vez. |
ShippingMethods.GroupRequired | 400 | Envía sellerId y shippingProfileId del grupo. |
ShippingMethods.InvalidSchedule | 400 | El horario no está disponible. Consulta los horarios. |
Con un token que no existe, las demás operaciones responden 404 sin cuerpo.
Más códigos de cupón en
Promociones y cupones.
Siguientes pasos
Última actualización: