Cómo fluye la información
Todo el tráfico lo origina tu sistema. Xenda nunca llama a tu POS ni accede a tus bases: tu sistema empuja el catálogo, consulta los pedidos y informa los cambios de estado, siempre contra esta API.Autenticación: una key por sucursal
Cada sucursal tiene su propia API key (xnd_...). La key es la sucursal: todo lo
que hagas con ella queda scopeado a ese local, y no puede tocar ningún otro. Se envía
en todas las llamadas:
store_id del body es opcional y funciona como verificación cruzada: si lo
mandás y no coincide con la sucursal de la key, la llamada se rechaza con 403. Sirve
para detectar el clásico error de configuración de “pegué la key del local equivocado”.
Límite de requests
Cada key admite hasta 120 requests por minuto — muy por encima del uso normal (un poll cada 1-2 minutos + eventos de catálogo). Si te pasás, recibís403 con
rate_limited: retry in Xs; esperá ese tiempo y reintentá. Si tu integración
necesita más, hablemos: el límite es configurable por sucursal.
Identificadores: tus códigos mandan
Los productos y opciones se identifican por elcodigo: un string estable que
define tu sistema (el ID interno de tu base). Xenda guarda el mapeo codigo ↔ producto
por sucursal, y los pedidos vuelven con esos mismos códigos — tu POS nunca necesita
conocer IDs de Xenda.
Reglas del codigo:
- Estable en el tiempo (si cambia, se interpreta como un producto nuevo).
- Único dentro de la sucursal por tipo (producto u opción).
- Cualquier string te sirve:
"1001","HEL-KILO", un hash — lo que ya uses.
Sincronización del catálogo
- Eventos durante el día: cambio de precio, alta de producto, baja de un sabor — empujás el evento en el momento y el bot deja de ofrecer lo que ya no está.
- Sincronización de cierre/apertura: podés empujar el catálogo completo como un lote grande; los ítems sin cambios simplemente se re-aplican.
- Idempotencia: cada request lleva un
event_idúnico. Si reintentás con el mismoevent_id, devolvemosduplicate: truey no se reprocesa nada — reintentar es siempre seguro. - Orden de eventos: cada request lleva
occurred_at(cuándo ocurrió el cambio en tu sistema). Si un evento llega tarde y hay uno más nuevo ya aplicado, el viejo se descarta (skipped_stale) — un cierre de caja demorado nunca pisa un cambio de precio posterior. - Errores por ítem: un ítem inválido no rechaza el lote. La respuesta indica
acceptedyrejected[{codigo, error}]para que reproceses solo lo que falló. - Bajas:
action: "delete"desactiva el ítem (deja de ofrecerse). Nunca se borra físicamente: los pedidos históricos siguen siendo legibles.
Lo que NO tenés que construir
La integración está pensada para que tu lado sea lo más chico posible:- Sin webhooks: no exponés ningún endpoint ni URL pública. Tu POS llama, nunca es llamado.
- Sin OAuth ni tokens que renovar: una key estática por sucursal en un header.
- Sin IDs de Xenda: trabajás siempre con tus propios códigos. El mapeo lo mantenemos nosotros.
- Sin manejo de conversaciones: el bot, WhatsApp, las notificaciones al cliente final y la plataforma de gestión son 100% lado Xenda.
Sandbox
Te entregamos una key de sandbox apuntada a una sucursal demo con catálogo y pedidos de prueba. Es un entorno real (misma API, misma URL) pero aislado: todo lo que hagas queda contenido en esa sucursal. Podés empujar catálogo, aceptar y rechazar pedidos, probar reintentos y romper lo que necesites. Empezá por el Quickstart: en 10 minutos recorrés el ciclo completo. Cuando el piloto pase a producción, la sucursal real recibe su propia key — mismo contrato, cero cambios de código.Pasar una sucursal a producción
El alta de cada sucursal la hace Xenda. Esto es lo que recibís y lo que hay que dejar listo antes de que el bot empiece a tomar pedidos.1. Credenciales
Por cada sucursal te entregamos tres datos:- La key se muestra una sola vez. Xenda no guarda el valor: si se pierde, se emite otra.
- Una sucursal puede tener varias keys activas a la vez (por ejemplo, una por computadora). Cada una tiene su propio límite de requests y se revoca por separado.
2. Carga inicial del catálogo
Dos caminos, a elección:- Empujás el catálogo completo por la API, como un lote grande de productos y otro de opciones.
- Nos mandás un CSV de productos (
Codigo, Nombre, Categoria, Precio, Deshabilitado) y otro de sabores (Codigo, Nombre, NoUsar) y lo cargamos nosotros con tu key, por el mismo camino que usaría tu sistema.
3. Qué productos llevan sabores
Empujar opciones no las asocia a ningún producto:POST /v1/catalog/options carga
el listado de sabores de la sucursal, y max_opciones en el producto dice cuántos
admite. Qué productos llevan opciones, de qué grupo y cuántas como mínimo se configura
del lado Xenda.
Es un paso de la puesta en marcha que hacemos con el local después de la carga inicial.
Si más adelante sumás un producto nuevo que lleva sabores, avisanos o avisale al local:
hasta que se configure, ese producto no ofrece sabores.
4. Prueba de punta a punta
POST /v1/test/orders también funciona con la key de una sucursal real, y es la forma
más directa de validar la instalación. Tené en cuenta que ahí el pedido es real:
aparece en la plataforma del local, y cada cambio de estado intenta avisarle por
WhatsApp al telefono que mandes. Usá un teléfono tuyo y cerrá el pedido al terminar.
5. Cambiar una key
- Pedinos una key nueva para la sucursal.
- Instalala. La anterior sigue funcionando mientras tanto: no hay corte.
- Avisanos y revocamos la anterior. La revocación es inmediata: la siguiente llamada
con esa key recibe
403 Invalid API key.
La deduplicación por
event_id es por key. Después de cambiar de key, un evento
viejo reenviado con la key nueva se procesa como si fuera nuevo: no reenvíes lotes
anteriores al cambio. El orden por occurred_at sigue protegiendo el catálogo (un
evento más viejo que el dato vigente se descarta).
