Esta guía describe el flujo completo para construir un checkout externo con Ordering API, desde la identificación del customer hasta la creación del pedido. Todas las llamadas usanDocumentation Index
Fetch the complete documentation index at: https://docs.getjusto.com/llms.txt
Use this file to discover all available pages before exploring further.
Authorization: Bearer <token> con scope orderingApi. El customer se identifica con externalCustomerId; ese ID pertenece a la app autenticada y no se comparte con otras apps.
Flujo
1. Crear o actualizar customer
Crea el customer antes de armar el carrito. Esto permite reutilizar direcciones y mantener datos reales de contacto por app.email, phone, firstName y lastName cuando estén disponibles. El email real no se usa como identidad técnica del usuario interno; Ordering API lo guarda separado y lo copia en Order.email al crear la orden.
2. Dirección, cityId y placeId
Para delivery, la app debe trabajar con una dirección normalizada. Primero lista direcciones existentes del customer y reutiliza una si corresponde.placeId y datos normalizados para cobertura. El cityId lo debe resolver tu app desde su selector de ciudad o geocoding externo y usarlo en marketplace. Para go o serve, puedes omitir dirección, pero igual debes seleccionar un local compatible.
Cuando ya conozcas el website elegido, selecciona la dirección para ese website:
selectedAddressId en checkout-state y actualiza el placeId usado por el carrito.
3. Seleccionar website con marketplace
Usa marketplace para mostrar comercios disponibles según ciudad, dirección y búsqueda.websiteId, storeId, baseURL, cobertura y tiempos estimados. Para continuar el checkout necesitas el domain canónico del website, sin protocolo ni www..
4. Obtener menú y estado del carro
Obtén el menú del website antes de mostrar productos. Si omitesmenuId, Ordering API usa el menú por defecto del website.
availabilityAt, maxPurchaseQuantity y modifiers.
Lee también el estado inicial del carrito:
OrderingCartState contiene preferencias, dirección seleccionada, local, horarios, medios de pago y carrito calculado cuando ya hay items.
5. Agregar o editar productos
Antes de agregar un producto, valida:availabilityAt.availabledebe sertrue.amountno debe superarmaxPurchaseQuantity, si existe.- Cada modificador obligatorio debe cumplir
minymax. - No envíes opciones con
availabilityAt.available: false. - Si una opción tiene
requiresModifierOptionIds, selecciónala solo cuando las opciones requeridas ya estén elegidas.
data.state.cart.items para guardar el cartItemId real y mostrar precios calculados. No recalcules totales solo en cliente.
6. Configurar local, entrega, horario y pago
Guarda las decisiones estables del carrito en preferencias.deliveryType, storeId y, para delivery, dirección:
time exactamente el value retornado. Puede ser now o un valor programado.
Consulta medios de pago después de seleccionar local y tipo de entrega:
paymentType con el paymentMethod retornado. Si usas tarjeta guardada o subtipo de pago, envía cardId y otherPaymentType por separado.
Después de cada cambio importante, vuelve a leer el carrito:
itemsPrice, deliveryFee, serviceFee, calculatedTipAmount, totalPrice, amountToPay, couponStatus y beneficios.
7. Revisar billing, custom params y estado temporal
Antes de crear el pedido, revisa si el website exige facturación:billingParamsSchema es dinámico. Si orderBillingRequired es true, guarda billing antes de crear la orden.
orderParams en checkout-state o envíalos en order.orderParams al crear la orden. Estos campos se validan al crear el pedido según la configuración del website.
selectedAddressId, billing, tip, cashAmount, gift, orderParams, termSignatures, idempotencyKey, meta y datos equivalentes. Este estado expira automáticamente.
8. Crear pedido
Antes de llamarPOST /orders, valida que:
- El customer exista y tenga email real si necesitas notificaciones.
- El carrito tenga items.
- No haya productos o modificadores no disponibles.
deliveryType,storeId,menuId,paymentTypeytimeestén definidos.- Para delivery, exista
selectedAddressId. - Billing esté guardado si el website lo exige.
- Custom params y firmas requeridas estén en
orderParamsytermSignatures. idempotencyKeysea estable para reintentos del mismo checkout.
storeId, menuId, deliveryType, paymentType, time, billing o idempotencyKey, Ordering API intenta tomarlos desde preferencias del carrito o checkout-state.
El idempotencyKey debe ser el mismo en reintentos del mismo checkout y distinto para intentos nuevos. Las órdenes creadas por este endpoint siempre quedan asociadas a la app autenticada mediante orderingAPIAppId, se crean como órdenes marketplace y usan embeddedVendor: orderingAPI.
9. Consultar pedido
Después de crear el pedido, puedes leerlo por ID o listar pedidos del customer.Propina
cart.calculatedTipAmount sirve como sugerencia calculada por Justo. Para crear la orden, envía la propina como monto final en order.tipAmount o guarda checkout-state.tip.amount.
itemsPriceWithoutDiscount cuando exista, o itemsPrice como fallback. No envíes solo el porcentaje al crear la orden.
Cupones y coins
Puedes aplicarcouponCode, websiteCoinsToSpend y justoCoinsToSpend en preferencias del carrito. Luego lee el carrito y respeta couponStatus, benefits y amountToPay.
También puedes consultar balances:
Errores comunes
notFounden website: revisa quedomainsea el dominio canónico.- Sin comercios en marketplace: revisa
cityId,placeIdy cobertura. - Sin locales disponibles: revisa
deliveryType, dirección seleccionada y cobertura delplaceId. - Sin horarios: selecciona primero
storeIdy usa un local abierto para el tipo de entrega elegido. - Producto no disponible: vuelve a leer el detalle del producto y valida
availabilityAt. - Modificadores inválidos: revisa
min,max, opciones requeridas y disponibilidad de opciones. - Billing requerido: revisa
billing-paramsy guarda billing antes de crear el pedido. - Custom params inválidos: revisa los campos esperados por el website y envíalos en
orderParams. - Total inesperado: usa siempre el carrito calculado como fuente de verdad para totales, fees, descuentos y propina.