Referencia API
Conecta tu tienda con Istmo POS.
Una API REST para publicar tu catálogo y recibir solicitudes de pedido, con credenciales independientes para cada integración.
Usa los ejemplos de la derecha para construir el backend de tu sitio. Los parámetros y respuestas se generan desde el contrato OpenAPI.
checkout-commands permite cotización, reserva y ACH; conciliación y emisión por API administrativa, sin cobros automáticos. El puente saliente está implementado; requiere un gateway HTTPS configurado y el POS actualizado.
Tu primera integración
Configura la conexión desde el servidor de tu sitio.
Abrir guía de inicio →https://TU-SERVIDOR-POS/api/v1/commerceAutenticación y API keys
Cada tienda usa una API key independiente en la cabecera x-istmo-commerce-key. En el POS se generan 32 bytes aleatorios y sólo se guarda el hash SHA-256; la clave se entrega una vez al crear o rotar. En gateway, el operador aprovisiona una clave de sitio independiente en el gestor de secretos del despliegue.
La clave POS fija empresa, sucursal y almacén y revalida contexto y licencia. La clave gateway sólo accede a su tienda y scopes; el conector revalida el POS al sincronizar. Durante desconexión el gateway puede recibir solicitudes con el último catálogo.
Las operaciones administrativas requieren JWT de usuario y permisos vigentes; una API key de tienda no los sustituye. Guarda los secretos sólo en el backend, nunca en Vue o variables VITE_.
Permisos y ciclo de vida
- catalog:read: consultar únicamente el catálogo publicado.
- orders:write: enviar solicitudes de pedido; no autoriza cobros ni facturas.
- orders:read: consultar solicitudes de esa integración; el backend también debe autorizar al comprador.
- Crear: POST /admin/integrations. Guardar data.credential de inmediato; el listado no vuelve a mostrarla.
- Rotar: POST /admin/integrations/{id}/rotate. Invalida la clave anterior; si pierdes la respuesta, vuelve a rotar.
- Revocar: DELETE /admin/integrations/{id}. Preserva pedidos e historial; una conexión revocada no se reactiva.
- Se auditan creación, rotación y revocación. Ante una filtración, revoca o rota y actualiza el secreto del backend.
- Las operaciones /admin anteriores se ejecutan en POS. Para gateway, el operador rota siteKey en su configuración; enabled=false y reinicio de todas las réplicas corta recepción inmediatamente. Cambiar sólo la clave POS no garantiza revocación cloud mientras está desconectado.
curl "$ISTMO_COMMERCE_BASE_URL/catalog" \
-H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY"Configura ISTMO_COMMERCE_BASE_URL con el servidor operativo autorizado. Usa una clave diferente para cada sitio o integración.
Errores e idempotencia
La respuesta usa success y data, o un objeto error con código y mensaje.
Un pedido devuelve 202: solicitud pendiente, no venta confirmada. Ante un timeout conserva el mismo externalId y cuerpo; consulta su estado antes de crear otro intento.
400Solicitud inválida401Credencial inválida403Permisos o licencia404Recurso no encontrado409Referencia o estado en conflicto429Demasiadas consultas500Resultado por comprobar/catalogConsultar catálogo autorizado
Catálogo publicado de referencia. Cotizar y reservar mediante checkout-commands; disponibilidad y precios deben confirmarse en POS.
x-istmo-commerce-keyPermiso: catalog:readParámetros de consulta
afterstringnextCursor previo. Orden UUID ascendente; no es un cursor de sincronización incremental.
Formato: uuid
limitintegerMínimo: 1 · Máximo: 100 · Predeterminado: 50
No requiere cuerpo de solicitud.
Respuesta 200
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
itemsarrayobligatorioVer campos de items
idstringobligatorioFormato: uuid
skustringobligatorionamestringobligatoriodescriptionstringobligatoriounitPriceReferencestringobligatorioPrecio de la lista; referencia, no cotización fiscal ni total a cobrar. No calcular impuestos o confirmar cobros a partir de este campo.
currencystringobligatorioValores: USD
availableReferencestringobligatoriomax(0, existencia-reservada) del almacén autorizado. No garantiza disponibilidad ni reserva.
stockUpdatedAtstring · nullobligatorioFormato: date-time
nextCursorstring · nullobligatorioFormato: uuid
integrationIdstringobligatorioFormato: uuid
observedAtstringobligatorioFormato: date-time
availabilityGuaranteedbooleanobligatorioValores: false
checkoutEnabledbooleanobligatorioValores: false
modestringobligatorioValores: request_only
lastSyncAtstring · nullSólo gateway: última publicación recibida. El catálogo puede estar desactualizado durante desconexión.
Formato: date-time
curl -X GET "$ISTMO_COMMERCE_BASE_URL/catalog" \
-H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/catalog',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
'x-istmo-commerce-key': process.env.ISTMO_COMMERCE_KEY
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"items": [
{
"id": "11111111-1111-4111-8111-111111111111",
"sku": "ARROZ",
"name": "Arroz nacional 1 kg",
"description": "Arroz nacional 1 kg",
"unitPriceReference": "1.2500",
"currency": "USD",
"availableReference": "8.2500",
"stockUpdatedAt": null
}
],
"nextCursor": null,
"integrationId": "11111111-1111-4111-8111-111111111111",
"observedAt": "2026-09-17T15:00:00.000Z",
"availabilityGuaranteed": false,
"checkoutEnabled": false,
"mode": "request_only",
"lastSyncAt": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/ordersRegistrar solicitud de pedido
externalId es la clave idempotente por integración y se conserva mientras exista el pedido. Mismo contenido devuelve el mismo ID; contenido diferente devuelve 409. Cantidades decimales equivalentes y orden de líneas no cambian la identidad. No acepta precios, totales ni afirmaciones de pago. No reserva inventario, cobra o factura. Los reintentos consultan el estado actual, incluso si fue rechazado.
x-istmo-commerce-keyPermiso: orders:writeCuerpo de la solicitud
externalIdstringobligatorioReferencia estable única por integración. Conservar exactamente en reintentos, incluso tras un timeout.
customerobjectobligatorioVer campos de customer
namestringobligatorioHasta 150 caracteres
emailstringobligatorioFormato: email · Hasta 150 caracteres
phonestringobligatorioHasta 40 caracteres
fulfillmentobjectobligatorioVer campos de fulfillment
Variante 1
methodstringobligatorioValores: pickup
Variante 2
methodstringobligatorioValores: delivery
addressstringobligatorioHasta 500 caracteres
linesarrayobligatorioHasta 100 elementos
Ver campos de lines
productIdstringobligatorioFormato: uuid
quantitystringobligatorioDecimal como texto > 0, hasta 999999.9999. No repetir productId.
notestringHasta 500 caracteres · Predeterminado: ""
Respuesta 202
Solicitud persistida pendiente de confirmación. No es una venta ni autorización de cobro.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
idstringobligatorioFormato: uuid
externalIdstringobligatoriostatusstringobligatorioValores: recibido_gateway, pendiente_confirmacion, rechazado
reasonstring · nullobligatoriocreatedAtstringobligatorioFormato: date-time
updatedAtstringobligatorioFormato: date-time
paymentStatusstringobligatorioValores: not_requested
stockReservedbooleanobligatorioValores: false
invoicedbooleanobligatorioValores: false
posOrderIdstring · nullSólo gateway. Recibo local, o null mientras no existe. El id principal del gateway permanece estable.
Formato: uuid
curl -X POST "$ISTMO_COMMERCE_BASE_URL/orders" \
-H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY" \
-H "Content-Type: application/json" \
--data '{
"externalId": "web-7d2f4c9a",
"customer": {
"name": "María González",
"email": "maria@example.com",
"phone": "6000-1234"
},
"fulfillment": {
"method": "pickup"
},
"lines": [
{
"productId": "11111111-1111-4111-8111-111111111111",
"quantity": "2.0000"
}
],
"note": ""
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/orders',
{
method: 'POST',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
'x-istmo-commerce-key': process.env.ISTMO_COMMERCE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"externalId": "web-7d2f4c9a",
"customer": {
"name": "María González",
"email": "maria@example.com",
"phone": "6000-1234"
},
"fulfillment": {
"method": "pickup"
},
"lines": [
{
"productId": "11111111-1111-4111-8111-111111111111",
"quantity": "2.0000"
}
],
"note": ""
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"externalId": "web-7d2f4c9a",
"status": "recibido_gateway",
"reason": null,
"createdAt": "2026-09-17T15:00:00.000Z",
"updatedAt": "2026-09-17T15:00:00.000Z",
"paymentStatus": "not_requested",
"stockReserved": false,
"invoiced": false,
"posOrderId": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/orders/{externalId}Consultar estado de una solicitud
Sólo solicitudes de la integración autenticada. No exponer esta consulta públicamente sin comprobar propiedad del comprador en el backend de la tienda.
x-istmo-commerce-keyPermiso: orders:readParámetros de ruta
externalIdstringobligatorioNo requiere cuerpo de solicitud.
Respuesta 200
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
idstringobligatorioFormato: uuid
externalIdstringobligatoriostatusstringobligatorioValores: recibido_gateway, pendiente_confirmacion, rechazado
reasonstring · nullobligatoriocreatedAtstringobligatorioFormato: date-time
updatedAtstringobligatorioFormato: date-time
paymentStatusstringobligatorioValores: not_requested
stockReservedbooleanobligatorioValores: false
invoicedbooleanobligatorioValores: false
posOrderIdstring · nullSólo gateway. Recibo local, o null mientras no existe. El id principal del gateway permanece estable.
Formato: uuid
curl -X GET "$ISTMO_COMMERCE_BASE_URL/orders/web-7d2f4c9a" \
-H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/orders/web-7d2f4c9a',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
'x-istmo-commerce-key': process.env.ISTMO_COMMERCE_KEY
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"externalId": "web-7d2f4c9a",
"status": "recibido_gateway",
"reason": null,
"createdAt": "2026-09-17T15:00:00.000Z",
"updatedAt": "2026-09-17T15:00:00.000Z",
"paymentStatus": "not_requested",
"stockReserved": false,
"invoiced": false,
"posOrderId": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrationsCrear conexión de tienda
Empresa y sucursal se derivan del JWT y permisos vigentes de BD. No se aceptan desde el body. Requiere admin.configuracion o rol superadmin vigente, licencia POS/facturación y almacén autorizado. La creación no es idempotente: ante respuesta perdida listar antes de repetir; una clave perdida se rota.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Cuerpo de la solicitud
nombrestringobligatorioHasta 100 caracteres
sitioUrlstringobligatorioURL HTTPS sin credenciales, query ni fragmento. Informativa; no se usa para autenticación ni llamadas salientes.
Formato: uri · Hasta 500 caracteres
almacenIdstringobligatorioFormato: uuid
numeroListaintegerMínimo: 1 · Máximo: 3 · Predeterminado: 1
scopesarrayobligatorioHasta 3 elementos
Respuesta 201
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
idstringobligatorioFormato: uuid
empresaIdstringobligatorioFormato: uuid
sucursalIdstringobligatorioFormato: uuid
almacenIdstringobligatorioFormato: uuid
nombrestringobligatoriositioUrlstringobligatorioFormato: uri
numeroListaintegerobligatorioscopesarrayobligatorioHasta 3 elementos
activobooleanobligatoriocreatedAtstringobligatorioFormato: date-time
updatedAtstringobligatorioFormato: date-time
credentialstringobligatorioSe entrega una sola vez. Guardar exclusivamente como secreto del backend.
curl -X POST "$ISTMO_COMMERCE_BASE_URL/admin/integrations" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"nombre": "Mi tienda",
"sitioUrl": "https://tienda.example.com",
"almacenId": "11111111-1111-4111-8111-111111111111",
"numeroLista": 1,
"scopes": [
"catalog:read"
]
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations',
{
method: 'POST',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"nombre": "Mi tienda",
"sitioUrl": "https://tienda.example.com",
"almacenId": "11111111-1111-4111-8111-111111111111",
"numeroLista": 1,
"scopes": [
"catalog:read"
]
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"empresaId": "11111111-1111-4111-8111-111111111111",
"sucursalId": "11111111-1111-4111-8111-111111111111",
"almacenId": "11111111-1111-4111-8111-111111111111",
"nombre": "Mi tienda",
"sitioUrl": "https://tienda.example.com",
"numeroLista": 1,
"scopes": [
"catalog:read"
],
"activo": false,
"createdAt": "2026-09-17T15:00:00.000Z",
"updatedAt": "2026-09-17T15:00:00.000Z",
"credential": "CREDENCIAL-SOLO-EN-EL-BACKEND"
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrationsListar conexiones de la sucursal
Operación disponible para el contexto autorizado de la integración.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de consulta
afterstringnextCursor previo. Orden UUID ascendente; no es un cursor de sincronización incremental.
Formato: uuid
limitintegerMínimo: 1 · Máximo: 100 · Predeterminado: 50
No requiere cuerpo de solicitud.
Respuesta 200
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
itemsarrayobligatorioVer campos de items
idstringobligatorioFormato: uuid
empresaIdstringobligatorioFormato: uuid
sucursalIdstringobligatorioFormato: uuid
almacenIdstringobligatorioFormato: uuid
nombrestringobligatoriositioUrlstringobligatorioFormato: uri
numeroListaintegerobligatorioscopesarrayobligatorioHasta 3 elementos
activobooleanobligatoriocreatedAtstringobligatorioFormato: date-time
updatedAtstringobligatorioFormato: date-time
nextCursorstring · nullobligatorioFormato: uuid
curl -X GET "$ISTMO_COMMERCE_BASE_URL/admin/integrations" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"items": [
{
"id": "11111111-1111-4111-8111-111111111111",
"empresaId": "11111111-1111-4111-8111-111111111111",
"sucursalId": "11111111-1111-4111-8111-111111111111",
"almacenId": "11111111-1111-4111-8111-111111111111",
"nombre": "Mi tienda",
"sitioUrl": "https://tienda.example.com",
"numeroLista": 1,
"scopes": [
"catalog:read"
],
"activo": false,
"createdAt": "2026-09-17T15:00:00.000Z",
"updatedAt": "2026-09-17T15:00:00.000Z"
}
],
"nextCursor": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/rotateRotar credencial
Invalida la anterior. Devuelve el secreto una sola vez; si se pierde la respuesta volver a rotar. No reactiva integraciones revocadas.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
No requiere cuerpo de solicitud.
Respuesta 200
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
idstringobligatorioFormato: uuid
credentialstringobligatorioSe entrega una sola vez. Guardar exclusivamente como secreto del backend.
curl -X POST "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/rotate" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/rotate',
{
method: 'POST',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"credential": "CREDENCIAL-SOLO-EN-EL-BACKEND"
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}Revocar conexión
Revocación lógica irreversible, idempotente. Preserva pedidos e historial. Operaciones que ya adquirieron el bloqueo pueden terminar antes de la revocación.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
No requiere cuerpo de solicitud.
Respuesta 200
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
idstringobligatorioFormato: uuid
activobooleanobligatorioValores: false
curl -X DELETE "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111',
{
method: 'DELETE',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"activo": false
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/productsReemplazar productos publicados
Selección atómica por integración, máximo 200 productos simples activos. No cambia productos ni precios del POS. No publica automáticamente todo el inventario.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
Cuerpo de la solicitud
productoIdsarrayobligatorioReemplaza toda la selección. [] despublica todo. Sólo productos simples activos con precio USD.
Hasta 200 elementos
Respuesta 200
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
idstringobligatorioFormato: uuid
productoIdsarrayobligatoriocurl -X PUT "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/products" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"productoIds": [
"11111111-1111-4111-8111-111111111111"
]
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/products',
{
method: 'PUT',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"productoIds": [
"11111111-1111-4111-8111-111111111111"
]
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"productoIds": [
"11111111-1111-4111-8111-111111111111"
]
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/productsBuscar productos elegibles para publicar
Operación disponible para el contexto autorizado de la integración.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
Parámetros de consulta
searchstringHasta 100 caracteres · Predeterminado: ""
afterstringFormato: uuid
No requiere cuerpo de solicitud.
Respuesta 200
Operación completada; guardar no confirma conectividad.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
itemsarrayobligatorioVer campos de items
idstringobligatorioFormato: uuid
skustringobligatorionamestringobligatorionextCursorstring · nullobligatoriocurl -X GET "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/products" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/products',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"items": [
{
"id": "11111111-1111-4111-8111-111111111111",
"sku": "ARROZ",
"name": "Arroz nacional 1 kg"
}
],
"nextCursor": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/ordersConsultar bandeja de solicitudes
Incluye datos personales y snapshot; acceso administrativo, no usar desde Vue público.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
Parámetros de consulta
afterstringnextCursor previo. Orden UUID ascendente; no es un cursor de sincronización incremental.
Formato: uuid
limitintegerMínimo: 1 · Máximo: 100 · Predeterminado: 50
No requiere cuerpo de solicitud.
Respuesta 200
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
itemsarrayobligatorioVer campos de items
idstringobligatorioFormato: uuid
externalIdstringobligatoriostatusstringobligatorioValores: pendiente_confirmacion, rechazado
reasonstring · nullobligatoriocreatedAtstringobligatorioFormato: date-time
updatedAtstringobligatorioFormato: date-time
paymentStatusstringobligatorioValores: not_requested
stockReservedbooleanobligatorioValores: false
invoicedbooleanobligatorioValores: false
requestobjectobligatorioVer campos de request
externalIdstringobligatorioReferencia estable única por integración. Conservar exactamente en reintentos, incluso tras un timeout.
customerobjectobligatorioVer campos de customer
namestringobligatorioHasta 150 caracteres
emailstringobligatorioFormato: email · Hasta 150 caracteres
phonestringobligatorioHasta 40 caracteres
fulfillmentobjectobligatorioVer campos de fulfillment
Variante 1
methodstringobligatorioValores: pickup
Variante 2
methodstringobligatorioValores: delivery
addressstringobligatorioHasta 500 caracteres
linesarrayobligatorioHasta 100 elementos
Ver campos de lines
productIdstringobligatorioFormato: uuid
quantitystringobligatorioDecimal como texto > 0, hasta 999999.9999. No repetir productId.
notestringHasta 500 caracteres · Predeterminado: ""
snapshotobjectobligatorioVer campos de snapshot
currencystringobligatorioValores: USD
productsarrayobligatorioVer campos de products
idstringobligatorioFormato: uuid
skustringobligatorionamestringobligatoriodescriptionstringobligatoriounitPriceReferencestringobligatorioPrecio de la lista; referencia, no cotización fiscal ni total a cobrar. No calcular impuestos o confirmar cobros a partir de este campo.
currencystringobligatorioValores: USD
availableReferencestringobligatoriomax(0, existencia-reservada) del almacén autorizado. No garantiza disponibilidad ni reserva.
stockUpdatedAtstring · nullobligatorioFormato: date-time
checkoutEnabledbooleanobligatorioValores: false
nextCursorstring · nullobligatorioFormato: uuid
curl -X GET "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/orders" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/orders',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"items": [
{
"id": "11111111-1111-4111-8111-111111111111",
"externalId": "web-7d2f4c9a",
"status": "pendiente_confirmacion",
"reason": null,
"createdAt": "2026-09-17T15:00:00.000Z",
"updatedAt": "2026-09-17T15:00:00.000Z",
"paymentStatus": "not_requested",
"stockReserved": false,
"invoiced": false,
"request": {
"externalId": "web-7d2f4c9a",
"customer": {
"name": "María González",
"email": "maria@example.com",
"phone": "6000-1234"
},
"fulfillment": {
"method": "pickup"
},
"lines": [
{
"productId": "11111111-1111-4111-8111-111111111111",
"quantity": "2.0000"
}
],
"note": ""
},
"snapshot": {
"currency": "USD",
"products": [
{
"id": "11111111-1111-4111-8111-111111111111",
"sku": "ARROZ",
"name": "Arroz nacional 1 kg",
"description": "Arroz nacional 1 kg",
"unitPriceReference": "1.2500",
"currency": "USD",
"availableReference": "8.2500",
"stockUpdatedAt": null
}
],
"checkoutEnabled": false
}
}
],
"nextCursor": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/orders/{orderId}/rejectRechazar solicitud con motivo
Mismo motivo es idempotente; otro motivo después del rechazo devuelve 409. No anula documentos fiscales ni devuelve dinero.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
orderIdstringobligatorioFormato: uuid
Cuerpo de la solicitud
motivostringobligatorioHasta 500 caracteres
Respuesta 200
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
idstringobligatorioFormato: uuid
externalIdstringobligatoriostatusstringobligatorioValores: recibido_gateway, pendiente_confirmacion, rechazado
reasonstring · nullobligatoriocreatedAtstringobligatorioFormato: date-time
updatedAtstringobligatorioFormato: date-time
paymentStatusstringobligatorioValores: not_requested
stockReservedbooleanobligatorioValores: false
invoicedbooleanobligatorioValores: false
posOrderIdstring · nullSólo gateway. Recibo local, o null mientras no existe. El id principal del gateway permanece estable.
Formato: uuid
curl -X POST "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/orders/11111111-1111-4111-8111-111111111111/reject" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"motivo": "Producto sin disponibilidad"
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/orders/11111111-1111-4111-8111-111111111111/reject',
{
method: 'POST',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"motivo": "Producto sin disponibilidad"
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"externalId": "web-7d2f4c9a",
"status": "recibido_gateway",
"reason": null,
"createdAt": "2026-09-17T15:00:00.000Z",
"updatedAt": "2026-09-17T15:00:00.000Z",
"paymentStatus": "not_requested",
"stockReserved": false,
"invoiced": false,
"posOrderId": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/optionsConsultar almacenes y requisitos del puente
Operación disponible para el contexto autorizado de la integración.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.No requiere cuerpo de solicitud.
Respuesta 200
Operación completada; guardar no confirma conectividad.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
warehousesarrayobligatorioVer campos de warehouses
idstringobligatorioFormato: uuid
nombrestringobligatorioallowedGatewaysarrayobligatorioencryptionReadybooleanobligatoriopaymentInstrumentsarrayobligatorioVer campos de paymentInstruments
idstringobligatorioFormato: uuid
nombrestringobligatoriopermissionsobjectobligatorioVer campos de permissions
reconcilebooleanobligatorioinvoicebooleanobligatoriofulfillbooleanobligatoriocurl -X GET "$ISTMO_COMMERCE_BASE_URL/admin/options" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/options',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"warehouses": [
{
"id": "11111111-1111-4111-8111-111111111111",
"nombre": "Mi tienda"
}
],
"allowedGateways": [
"Ejemplo"
],
"encryptionReady": false,
"paymentInstruments": [
{
"id": "11111111-1111-4111-8111-111111111111",
"nombre": "Mi tienda"
}
],
"permissions": {
"reconcile": false,
"invoice": false,
"fulfill": false
}
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/settingsConsultar publicación y diagnóstico sin secretos
Operación disponible para el contexto autorizado de la integración.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
No requiere cuerpo de solicitud.
Respuesta 200
Operación completada; guardar no confirma conectividad.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
selectedarrayobligatorioVer campos de selected
idstringobligatorioFormato: uuid
skustringobligatorionamestringobligatoriobridgeobject · nullobligatorioVer campos de bridge
sourcestringobligatorioValores: environment, database
gatewayUrlstringobligatoriobindingobjectobligatorioVer campos de binding
installationIdstringobligatorioFormato: uuid
integrationIdstringobligatorioFormato: uuid
enabledbooleanobligatoriostatusobjectobligatorioVer campos de status
attemptAtstring · nullobligatoriosuccessAtstring · nullobligatorioerrorCodestring · nullobligatoriopausedbooleanobligatoriopaymentSettingsobject · nullobligatorioVer campos de paymentSettings
enabledbooleanobligatorioinstrumentoIdstringobligatorioFormato: uuid
instructionsstringobligatorioHasta 1000 caracteres
curl -X GET "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/settings" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/settings',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"selected": [
{
"id": "11111111-1111-4111-8111-111111111111",
"sku": "ARROZ",
"name": "Arroz nacional 1 kg"
}
],
"bridge": null,
"paymentSettings": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/bridgeGuardar y activar vínculo cifrado
Operación disponible para el contexto autorizado de la integración.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
Cuerpo de la solicitud
gatewayUrlstringobligatorioOrigen HTTPS incluido en la lista del operador. Inmutable después de guardar.
Formato: uri
installationIdstringobligatorioFormato: uuid
connectorKeystringobligatoriolocalKeystringobligatorioRespuesta 200
Operación completada; guardar no confirma conectividad.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
idstringobligatorioFormato: uuid
enabledbooleanobligatoriocurl -X PUT "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/bridge" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"gatewayUrl": "https://tienda.example.com",
"installationId": "11111111-1111-4111-8111-111111111111",
"connectorKey": "Ejemplo",
"localKey": "Ejemplo"
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/bridge',
{
method: 'PUT',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"gatewayUrl": "https://tienda.example.com",
"installationId": "11111111-1111-4111-8111-111111111111",
"connectorKey": "Ejemplo",
"localKey": "Ejemplo"
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"enabled": false
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/bridgeSolicitar pausa del puente
Operación disponible para el contexto autorizado de la integración.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
No requiere cuerpo de solicitud.
Respuesta 200
Operación completada; guardar no confirma conectividad.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
idstringobligatorioFormato: uuid
enabledbooleanobligatoriocurl -X DELETE "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/bridge" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/bridge',
{
method: 'DELETE',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"enabled": false
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/checkout-commandsCotizar, reservar, solicitar transferencia, consultar o cancelar
quote/payment/cancel requieren orders:write; status requiere orders:read. quote/payment nuevos requieren gateway sincronizado en últimos 45s y llegada al POS antes de 60s. payment requiere configuración ACH y reserva vigente; reintentos recuperan la intención original. Las API keys de tienda no confirman pagos ni facturas. cancel rechaza pagos conciliados: resolución administrativa. Reserva de 5 minutos.
x-istmo-commerce-keyPermiso vigente de configuración en esta sucursal.Cuerpo de la solicitud
Variante 1
commandIdstringobligatorioFormato: uuid
checkoutIdstringobligatorioactionstringobligatorioValores: quote
orderobjectobligatorioVer campos de order
externalIdstringobligatorioReferencia estable única por integración. Conservar exactamente en reintentos, incluso tras un timeout.
customerobjectobligatorioVer campos de customer
namestringobligatorioHasta 150 caracteres
emailstringobligatorioFormato: email · Hasta 150 caracteres
phonestringobligatorioHasta 40 caracteres
fulfillmentobjectobligatorioVer campos de fulfillment
Variante 1
methodstringobligatorioValores: pickup
Variante 2
methodstringobligatorioValores: delivery
addressstringobligatorioHasta 500 caracteres
linesarrayobligatorioHasta 100 elementos
Ver campos de lines
productIdstringobligatorioFormato: uuid
quantitystringobligatorioDecimal como texto > 0, hasta 999999.9999. No repetir productId.
notestringHasta 500 caracteres · Predeterminado: ""
Variante 2
commandIdstringobligatorioFormato: uuid
checkoutIdstringobligatorioactionstringobligatorioValores: status
Variante 3
commandIdstringobligatorioFormato: uuid
checkoutIdstringobligatorioactionstringobligatorioValores: cancel
Variante 4
commandIdstringobligatorioFormato: uuid
checkoutIdstringobligatorioactionstringobligatorioValores: payment
Respuesta 202
Recibo de operación; no confirma venta ni pago.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatoriopending en gateway sólo confirma persistencia. completed/failed son recibos históricos: para consultar pago/factura actuales enviar status con nuevo commandId. checkoutEnabled=false significa que no hay cobro automático. ACH requiere confirmación administrativa.
Ver campos de data
Variante 1
commandIdstringobligatorioFormato: uuid
statestringobligatorioValores: pending
checkoutEnabledbooleanobligatorioValores: false
Variante 2
commandIdstringobligatorioFormato: uuid
statestringobligatorioValores: completed
resultobjectobligatorioVer campos de result
idstringobligatorioFormato: uuid
externalIdstringobligatoriostatusstringobligatorioValores: reservado, expirado, cancelado, vendido
expiresAtstringobligatorioFormato: date-time
observedAtstringobligatorioFormato: date-time
stockReservedbooleanobligatoriocheckoutEnabledbooleanobligatorioValores: false
paymentStatusstringobligatorioValores: not_requested, pending, confirmed, applied, refunded
invoicedbooleanobligatorioquoteobjectobligatorioVer campos de quote
currencystringobligatorioValores: USD
fulfillmentstringobligatorioValores: pickup
pricingPolicystringobligatorioValores: published_list_no_discounts
subtotalstringobligatoriotaxstringobligatoriototalstringobligatoriolinesarrayobligatorioVer campos de lines
productIdstringobligatorioFormato: uuid
namestringobligatorioquantitystringobligatoriounitPricestringobligatoriotaxRatestringobligatoriosubtotalstringobligatoriotaxstringobligatoriototalstringobligatoriopaymentobject · nullVer campos de payment
idstringobligatorioFormato: uuid
methodstringobligatorioValores: bank_transfer
statusstringobligatorioValores: pending, confirmed, applied, refunded
amountstringobligatoriocurrencystringobligatorioValores: USD
instructionsstringobligatorioreferencestring · nullobligatorioinvoiceobject · nullVer campos de invoice
idstringobligatorioFormato: uuid
numberstringobligatoriostatusstring · nullobligatoriofiscalStatusinteger · nullobligatoriofulfillmentobjectVer campos de fulfillment
statusstringobligatorioValores: pendiente, preparando, listo, entregado
updatedAtstring · nullobligatorioFormato: date-time
Variante 3
commandIdstringobligatorioFormato: uuid
statestringobligatorioValores: failed
errorobjectobligatorioVer campos de error
codestringobligatoriomessagestringobligatoriocurl -X POST "$ISTMO_COMMERCE_BASE_URL/checkout-commands" \
-H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY" \
-H "Content-Type: application/json" \
--data '{
"commandId": "11111111-1111-4111-8111-111111111111",
"checkoutId": "web-7d2f4c9a",
"action": "quote",
"order": {
"externalId": "web-7d2f4c9a",
"customer": {
"name": "María González",
"email": "maria@example.com",
"phone": "6000-1234"
},
"fulfillment": {
"method": "pickup"
},
"lines": [
{
"productId": "11111111-1111-4111-8111-111111111111",
"quantity": "2.0000"
}
],
"note": ""
}
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/checkout-commands',
{
method: 'POST',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
'x-istmo-commerce-key': process.env.ISTMO_COMMERCE_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"commandId": "11111111-1111-4111-8111-111111111111",
"checkoutId": "web-7d2f4c9a",
"action": "quote",
"order": {
"externalId": "web-7d2f4c9a",
"customer": {
"name": "María González",
"email": "maria@example.com",
"phone": "6000-1234"
},
"fulfillment": {
"method": "pickup"
},
"lines": [
{
"productId": "11111111-1111-4111-8111-111111111111",
"quantity": "2.0000"
}
],
"note": ""
}
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"commandId": "11111111-1111-4111-8111-111111111111",
"state": "pending",
"checkoutEnabled": false
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/checkout-commands/{commandId}Recuperar recibo histórico de operación
Operación disponible para el contexto autorizado de la integración.
x-istmo-commerce-keyPermiso vigente de configuración en esta sucursal.Parámetros de ruta
commandIdstringobligatorioFormato: uuid
No requiere cuerpo de solicitud.
Respuesta 200
Recibo de operación; no confirma venta ni pago.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatoriopending en gateway sólo confirma persistencia. completed/failed son recibos históricos: para consultar pago/factura actuales enviar status con nuevo commandId. checkoutEnabled=false significa que no hay cobro automático. ACH requiere confirmación administrativa.
Ver campos de data
Variante 1
commandIdstringobligatorioFormato: uuid
statestringobligatorioValores: pending
checkoutEnabledbooleanobligatorioValores: false
Variante 2
commandIdstringobligatorioFormato: uuid
statestringobligatorioValores: completed
resultobjectobligatorioVer campos de result
idstringobligatorioFormato: uuid
externalIdstringobligatoriostatusstringobligatorioValores: reservado, expirado, cancelado, vendido
expiresAtstringobligatorioFormato: date-time
observedAtstringobligatorioFormato: date-time
stockReservedbooleanobligatoriocheckoutEnabledbooleanobligatorioValores: false
paymentStatusstringobligatorioValores: not_requested, pending, confirmed, applied, refunded
invoicedbooleanobligatorioquoteobjectobligatorioVer campos de quote
currencystringobligatorioValores: USD
fulfillmentstringobligatorioValores: pickup
pricingPolicystringobligatorioValores: published_list_no_discounts
subtotalstringobligatoriotaxstringobligatoriototalstringobligatoriolinesarrayobligatorioVer campos de lines
productIdstringobligatorioFormato: uuid
namestringobligatorioquantitystringobligatoriounitPricestringobligatoriotaxRatestringobligatoriosubtotalstringobligatoriotaxstringobligatoriototalstringobligatoriopaymentobject · nullVer campos de payment
idstringobligatorioFormato: uuid
methodstringobligatorioValores: bank_transfer
statusstringobligatorioValores: pending, confirmed, applied, refunded
amountstringobligatoriocurrencystringobligatorioValores: USD
instructionsstringobligatorioreferencestring · nullobligatorioinvoiceobject · nullVer campos de invoice
idstringobligatorioFormato: uuid
numberstringobligatoriostatusstring · nullobligatoriofiscalStatusinteger · nullobligatoriofulfillmentobjectVer campos de fulfillment
statusstringobligatorioValores: pendiente, preparando, listo, entregado
updatedAtstring · nullobligatorioFormato: date-time
Variante 3
commandIdstringobligatorioFormato: uuid
statestringobligatorioValores: failed
errorobjectobligatorioVer campos de error
codestringobligatoriomessagestringobligatoriocurl -X GET "$ISTMO_COMMERCE_BASE_URL/checkout-commands/11111111-1111-4111-8111-111111111111" \
-H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/checkout-commands/11111111-1111-4111-8111-111111111111',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
'x-istmo-commerce-key': process.env.ISTMO_COMMERCE_KEY
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"commandId": "11111111-1111-4111-8111-111111111111",
"state": "pending",
"checkoutEnabled": false
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/payment-settingsConfigurar ACH/transferencia
Requiere admin.configuracion vigente. Opt-in por integración. Instrumento ACH/TRANSFERENCIA activo USD. instructions se publica al solicitar payment; nunca incluir credenciales bancarias. Consultar configuración en GET settings.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
Cuerpo de la solicitud
enabledbooleanobligatorioinstrumentoIdstringobligatorioFormato: uuid
instructionsstringobligatorioHasta 1000 caracteres
Respuesta 200
Resultado persistido en el POS; consulte estado actual ante respuesta incierta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
enabledbooleanobligatorioinstrumentoIdstringobligatorioFormato: uuid
instructionsstringobligatorioHasta 1000 caracteres
curl -X PUT "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/payment-settings" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"enabled": false,
"instrumentoId": "11111111-1111-4111-8111-111111111111",
"instructions": "Ejemplo"
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/payment-settings',
{
method: 'PUT',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"enabled": false,
"instrumentoId": "11111111-1111-4111-8111-111111111111",
"instructions": "Ejemplo"
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"enabled": false,
"instrumentoId": "11111111-1111-4111-8111-111111111111",
"instructions": "Ejemplo"
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/checkoutsListar cotizaciones y pagos
Requiere admin.configuracion. Paginación limit 1–100 y after UUID. Sólo esta empresa/sucursal. confirmed sin invoice significa pago recibido pendiente de resolver, nunca pedir otro cobro.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
Parámetros de consulta
afterstringFormato: uuid
limitintegerMínimo: 1 · Máximo: 100 · Predeterminado: 50
No requiere cuerpo de solicitud.
Respuesta 200
Resultado persistido en el POS; consulte estado actual ante respuesta incierta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
itemsarrayobligatorioVer campos de items
idstringobligatorioFormato: uuid
externalIdstringobligatoriostatusstringobligatorioexpiresAtstringobligatorioFormato: date-time
customerobjectobligatorioVer campos de customer
externalIdstringobligatorioReferencia estable única por integración. Conservar exactamente en reintentos, incluso tras un timeout.
customerobjectobligatorioVer campos de customer
namestringobligatorioHasta 150 caracteres
emailstringobligatorioFormato: email · Hasta 150 caracteres
phonestringobligatorioHasta 40 caracteres
fulfillmentobjectobligatorioVer campos de fulfillment
Variante 1
methodstringobligatorioValores: pickup
Variante 2
methodstringobligatorioValores: delivery
addressstringobligatorioHasta 500 caracteres
linesarrayobligatorioHasta 100 elementos
Ver campos de lines
productIdstringobligatorioFormato: uuid
quantitystringobligatorioDecimal como texto > 0, hasta 999999.9999. No repetir productId.
notestringHasta 500 caracteres · Predeterminado: ""
quoteobjectobligatorioVer campos de quote
currencystringobligatorioValores: USD
fulfillmentstringobligatorioValores: pickup
pricingPolicystringobligatorioValores: published_list_no_discounts
subtotalstringobligatoriotaxstringobligatoriototalstringobligatoriolinesarrayobligatorioVer campos de lines
productIdstringobligatorioFormato: uuid
namestringobligatorioquantitystringobligatoriounitPricestringobligatoriotaxRatestringobligatoriosubtotalstringobligatoriotaxstringobligatoriototalstringobligatoriopaymentStatusstringobligatorioValores: not_requested, pending, confirmed, applied, refunded
invoicedbooleanobligatoriopaymentobject · nullobligatorioVer campos de payment
idstringobligatorioFormato: uuid
methodstringobligatorioValores: bank_transfer
statusstringobligatorioValores: pending, confirmed, applied, refunded
amountstringobligatoriocurrencystringobligatorioValores: USD
instructionsstringobligatorioreferencestring · nullobligatorioinvoiceobject · nullobligatorioVer campos de invoice
idstringobligatorioFormato: uuid
numberstringobligatoriostatusstring · nullobligatoriofiscalStatusinteger · nullobligatoriofulfillmentobjectobligatorioVer campos de fulfillment
statusstringobligatorioValores: pendiente, preparando, listo, entregado
updatedAtstring · nullobligatorioFormato: date-time
nextCursorstring · nullobligatorioFormato: uuid
curl -X GET "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/checkouts" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/checkouts',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"items": [
{
"id": "11111111-1111-4111-8111-111111111111",
"externalId": "web-7d2f4c9a",
"status": "Ejemplo",
"expiresAt": "2026-09-17T15:00:00.000Z",
"customer": {
"externalId": "web-7d2f4c9a",
"customer": {
"name": "María González",
"email": "maria@example.com",
"phone": "6000-1234"
},
"fulfillment": {
"method": "pickup"
},
"lines": [
{
"productId": "11111111-1111-4111-8111-111111111111",
"quantity": "2.0000"
}
],
"note": ""
},
"quote": {
"currency": "USD",
"fulfillment": "pickup",
"pricingPolicy": "published_list_no_discounts",
"subtotal": "Ejemplo",
"tax": "Ejemplo",
"total": "Ejemplo",
"lines": [
{
"productId": "11111111-1111-4111-8111-111111111111",
"name": "María González",
"quantity": "2.0000",
"unitPrice": "Ejemplo",
"taxRate": "Ejemplo",
"subtotal": "Ejemplo",
"tax": "Ejemplo",
"total": "Ejemplo"
}
]
},
"paymentStatus": "not_requested",
"invoiced": false,
"payment": null,
"invoice": null,
"fulfillment": {
"status": "pendiente",
"updatedAt": null
}
}
],
"nextCursor": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/checkouts/{checkoutId}/confirm-transferConciliar transferencia recibida
Requiere admin.configuracion + admin.bancos vigentes. El administrador verifica el banco antes de enviar. Monto exacto, referencia normalizada a mayúsculas única por empresa dentro de Commerce y motivo auditado. Idempotente con mismo cuerpo; no registra abono bancario contable ni emite factura. No aceptar esta declaración del comprador.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
checkoutIdstringobligatorioUUID POS del checkout, distinto de la referencia externa usada en los comandos.
Formato: uuid
Cuerpo de la solicitud
amountstringobligatorioreferencestringobligatorioHasta 120 caracteres
reasonstringobligatorioHasta 500 caracteres
Respuesta 200
Resultado persistido en el POS; consulte estado actual ante respuesta incierta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
paymentStatusstringobligatorioValores: not_requested, pending, confirmed, applied, refunded
invoicedbooleanobligatoriopaymentobject · nullobligatorioVer campos de payment
idstringobligatorioFormato: uuid
methodstringobligatorioValores: bank_transfer
statusstringobligatorioValores: pending, confirmed, applied, refunded
amountstringobligatoriocurrencystringobligatorioValores: USD
instructionsstringobligatorioreferencestring · nullobligatorioinvoiceobject · nullobligatorioVer campos de invoice
idstringobligatorioFormato: uuid
numberstringobligatoriostatusstring · nullobligatoriofiscalStatusinteger · nullobligatoriofulfillmentobjectobligatorioVer campos de fulfillment
statusstringobligatorioValores: pendiente, preparando, listo, entregado
updatedAtstring · nullobligatorioFormato: date-time
curl -X POST "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/checkouts/11111111-1111-4111-8111-111111111111/confirm-transfer" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"amount": "Ejemplo",
"reference": "Ejemplo",
"reason": "Ejemplo"
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/checkouts/11111111-1111-4111-8111-111111111111/confirm-transfer',
{
method: 'POST',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"amount": "Ejemplo",
"reference": "Ejemplo",
"reason": "Ejemplo"
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"paymentStatus": "not_requested",
"invoiced": false,
"payment": null,
"invoice": null,
"fulfillment": {
"status": "pendiente",
"updatedAt": null
}
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/checkouts/{checkoutId}/invoiceEmitir venta desde pago conciliado
Requiere admin.configuracion + pos.documentos, licencia y capacidad de facturación. Consumidor final 02 existente. Reutiliza motor documental, precios/permisos y FE. Stock/reserva/factura/pago atómicos, sin estación/turno. Si reserva expiró, comprueba stock disponible; falta de stock o cambio de precio conserva pago confirmado sin factura. Repetir devuelve factura original; no vuelve a cobrar. No garantiza aceptación PAC: revisar fiscalStatus y flujo fiscal administrativo.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
checkoutIdstringobligatorioUUID POS del checkout, distinto de la referencia externa usada en los comandos.
Formato: uuid
Cuerpo de la solicitud
terceroIdstringobligatorioFormato: uuid
Respuesta 201
Resultado persistido en el POS; consulte estado actual ante respuesta incierta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
paymentStatusstringobligatorioValores: not_requested, pending, confirmed, applied, refunded
invoicedbooleanobligatoriopaymentobject · nullobligatorioVer campos de payment
idstringobligatorioFormato: uuid
methodstringobligatorioValores: bank_transfer
statusstringobligatorioValores: pending, confirmed, applied, refunded
amountstringobligatoriocurrencystringobligatorioValores: USD
instructionsstringobligatorioreferencestring · nullobligatorioinvoiceobject · nullobligatorioVer campos de invoice
idstringobligatorioFormato: uuid
numberstringobligatoriostatusstring · nullobligatoriofiscalStatusinteger · nullobligatoriofulfillmentobjectobligatorioVer campos de fulfillment
statusstringobligatorioValores: pendiente, preparando, listo, entregado
updatedAtstring · nullobligatorioFormato: date-time
curl -X POST "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/checkouts/11111111-1111-4111-8111-111111111111/invoice" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"terceroId": "11111111-1111-4111-8111-111111111111"
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/checkouts/11111111-1111-4111-8111-111111111111/invoice',
{
method: 'POST',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"terceroId": "11111111-1111-4111-8111-111111111111"
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"paymentStatus": "not_requested",
"invoiced": false,
"payment": null,
"invoice": null,
"fulfillment": {
"status": "pendiente",
"updatedAt": null
}
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/checkouts/{checkoutId}/record-refundRegistrar devolución bancaria realizada
Requiere admin.configuracion + admin.bancos. Sólo pago confirmado sin factura. Registra importe completo, referencia de devolución y motivo verificados; no mueve dinero ni emite nota de crédito. Repetir mismo cuerpo es idempotente; bloquea emisión posterior y libera reserva. Si existe factura usar flujo documental de anulación/nota de crédito.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
checkoutIdstringobligatorioUUID POS del checkout, distinto de la referencia externa usada en los comandos.
Formato: uuid
Cuerpo de la solicitud
amountstringobligatorioreferencestringobligatorioHasta 120 caracteres
reasonstringobligatorioHasta 500 caracteres
Respuesta 200
Resultado persistido en el POS; consulte estado actual ante respuesta incierta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
paymentStatusstringobligatorioValores: not_requested, pending, confirmed, applied, refunded
invoicedbooleanobligatoriopaymentobject · nullobligatorioVer campos de payment
idstringobligatorioFormato: uuid
methodstringobligatorioValores: bank_transfer
statusstringobligatorioValores: pending, confirmed, applied, refunded
amountstringobligatoriocurrencystringobligatorioValores: USD
instructionsstringobligatorioreferencestring · nullobligatorioinvoiceobject · nullobligatorioVer campos de invoice
idstringobligatorioFormato: uuid
numberstringobligatoriostatusstring · nullobligatoriofiscalStatusinteger · nullobligatoriofulfillmentobjectobligatorioVer campos de fulfillment
statusstringobligatorioValores: pendiente, preparando, listo, entregado
updatedAtstring · nullobligatorioFormato: date-time
curl -X POST "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/checkouts/11111111-1111-4111-8111-111111111111/record-refund" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"amount": "Ejemplo",
"reference": "Ejemplo",
"reason": "Ejemplo"
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/checkouts/11111111-1111-4111-8111-111111111111/record-refund',
{
method: 'POST',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"amount": "Ejemplo",
"reference": "Ejemplo",
"reason": "Ejemplo"
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"paymentStatus": "not_requested",
"invoiced": false,
"payment": null,
"invoice": null,
"fulfillment": {
"status": "pendiente",
"updatedAt": null
}
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/customersBuscar cliente para emitir factura
Requiere admin.configuracion. Hasta 50 clientes activos consumidor final 02 de la empresa, por nombre/código/RUC. nextCursor permite continuar; no crea clientes ni elige automáticamente al comprador.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
Parámetros de consulta
searchstringHasta 100 caracteres · Predeterminado: ""
afterstringFormato: uuid
No requiere cuerpo de solicitud.
Respuesta 200
Resultado de la operación.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
itemsarrayobligatorioVer campos de items
idstringobligatorioFormato: uuid
nombrestringobligatoriocodigostringobligatoriorucstring · nullobligatorionextCursorstring · nullobligatorioFormato: uuid
curl -X GET "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/customers" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/customers',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"items": [
{
"id": "11111111-1111-4111-8111-111111111111",
"nombre": "Mi tienda",
"codigo": "Ejemplo",
"ruc": null
}
],
"nextCursor": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/admin/integrations/{id}/checkouts/{checkoutId}/fulfillmentAvanzar preparación y retiro
Requiere admin.configuracion y pos.documentos vigentes. Sólo pago aplicado y factura no anulada. Secuencia pendiente → preparando → listo → entregado, sin saltos ni retrocesos. commandId UUID estable por transición: mismo cuerpo devuelve recibo histórico y otro cuerpo genera 409. entregado requiere receivedBy y comprobante fiscal disponible si FE está activa (mismo criterio del recibo fiscal, incluida contingencia firmada). Actor/nota/receptor se auditan localmente; no se publican. Para estado actual, comando status nuevo vía POS o gateway.
Bearer JWT administrativoPermiso vigente de configuración en esta sucursal.Parámetros de ruta
idstringobligatorioID de integración, no ID de empresa.
Formato: uuid
checkoutIdstringobligatorioUUID POS del checkout, distinto de la referencia externa usada en los comandos.
Formato: uuid
Cuerpo de la solicitud
Variante 1
commandIdstringobligatorioFormato: uuid
statusstringobligatorioValores: preparando
notestringHasta 500 caracteres · Predeterminado: ""
Variante 2
commandIdstringobligatorioFormato: uuid
statusstringobligatorioValores: listo
notestringHasta 500 caracteres · Predeterminado: ""
Variante 3
commandIdstringobligatorioFormato: uuid
statusstringobligatorioValores: entregado
notestringHasta 500 caracteres · Predeterminado: ""
receivedBystringobligatorioHasta 150 caracteres
Respuesta 200
Resultado de la operación.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
statusstringobligatorioValores: pendiente, preparando, listo, entregado
updatedAtstring · nullobligatorioFormato: date-time
curl -X POST "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/checkouts/11111111-1111-4111-8111-111111111111/fulfillment" \
-H "Authorization: Bearer $ISTMO_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"commandId": "11111111-1111-4111-8111-111111111111",
"status": "preparando",
"note": ""
}'Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/admin/integrations/11111111-1111-4111-8111-111111111111/checkouts/11111111-1111-4111-8111-111111111111/fulfillment',
{
method: 'POST',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
Authorization: 'Bearer ' + process.env.ISTMO_ADMIN_TOKEN,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"commandId": "11111111-1111-4111-8111-111111111111",
"status": "preparando",
"note": ""
})
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"status": "pendiente",
"updatedAt": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/webhook-deliveriesConsultar entregas webhook (gateway)
Sólo gateway, no POS directo. Paginación UUID para inspección, no cursor incremental. Evento sin PII: consultar estado actual con un nuevo comando status. No devuelve destino ni secreto.
x-istmo-commerce-keyPermiso: orders:readParámetros de consulta
afterstringnextCursor previo. Orden UUID ascendente; no es un cursor de sincronización incremental.
Formato: uuid
limitintegerMínimo: 1 · Máximo: 100 · Predeterminado: 50
No requiere cuerpo de solicitud.
Respuesta 200
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
itemsarrayobligatorioVer campos de items
eventobjectobligatorioVer campos de event
idstringobligatorioFormato: uuid
versionstringobligatorioValores: 1
integrationIdstringobligatorioFormato: uuid
typestringobligatorioValores: checkout.reserved, checkout.expirado, checkout.cancelado, checkout.vendido, checkout.invoiced, checkout.fulfillment, transfer.requested, transfer.confirmed, transfer.refund_recorded, invoice.updated
occurredAtstringobligatorioFormato: date-time
dataobjectobligatorioVer campos de data
checkoutIdstringobligatoriostatusstringobligatorioValores: pending, retry, processing, delivered, failed, disabled
attemptsintegerobligatorioMínimo: 0
httpStatusinteger · nullobligatorionextAttemptAtstringobligatorioFormato: date-time
deliveredAtstring · nullobligatorioFormato: date-time
nextCursorstring · nullobligatorioFormato: uuid
curl -X GET "$ISTMO_COMMERCE_BASE_URL/webhook-deliveries" \
-H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/webhook-deliveries',
{
method: 'GET',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
'x-istmo-commerce-key': process.env.ISTMO_COMMERCE_KEY
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"items": [
{
"event": {
"id": "11111111-1111-4111-8111-111111111111",
"version": "1",
"integrationId": "11111111-1111-4111-8111-111111111111",
"type": "checkout.reserved",
"occurredAt": "2026-09-17T15:00:00.000Z",
"data": {
"checkoutId": "web-7d2f4c9a"
}
},
"status": "pending",
"attempts": 0,
"httpStatus": null,
"nextAttemptAt": "2026-09-17T15:00:00.000Z",
"deliveredAt": null
}
],
"nextCursor": null
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.
/webhook-deliveries/{eventId}/retryReintentar entrega fallida (gateway)
Sólo gateway. Reactiva failed/disabled con destino actualmente configurado y contador cero. Pending/retry/processing no se duplican; La respuesta conserva el estado actual de trabajos activos. Delivered devuelve 409. Requiere webhook habilitado. Sin body.
x-istmo-commerce-keyPermiso: orders:writeParámetros de ruta
eventIdstringobligatorioFormato: uuid
No requiere cuerpo de solicitud.
Respuesta 200
Operación correcta.
Ver atributos de la respuesta
successbooleanobligatorioValores: true
dataobjectobligatorioVer campos de data
idstringobligatorioFormato: uuid
statusstringobligatorioValores: pending, retry, processing
curl -X POST "$ISTMO_COMMERCE_BASE_URL/webhook-deliveries/{eventId}/retry" \
-H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY"Ejemplo Node.js
// Node 20+ · ejecutar sólo en el servidor
const response = await fetch(
process.env.ISTMO_COMMERCE_BASE_URL + '/webhook-deliveries/{eventId}/retry',
{
method: 'POST',
redirect: 'error',
signal: AbortSignal.timeout(10000),
headers: {
'x-istmo-commerce-key': process.env.ISTMO_COMMERCE_KEY
}
}
);
const result = await response.json();
if (!response.ok) throw new Error(result.error?.code);
// En un timeout, conservar externalId y consultar su estado.{
"success": true,
"data": {
"id": "11111111-1111-4111-8111-111111111111",
"status": "pending"
}
}Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.