IstmoAPI
ISTMO COMMERCE / V1

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.

Catálogo y solicitudes pendientes

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 →
URL base · reemplazar por tu servidor
https://TU-SERVIDOR-POS/api/v1/commerce
CONSTRUYE CON

Credenciales sólo en backend. Este dominio aloja documentación, no la API operativa.

Autenticació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.
Crear y configurar una integración →
Petición autenticada · cURL
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.

ADMINISTRACIÓN DE CLAVES

Operaciones protegidas con JWT administrativo. Los ejemplos son documentación; no generan ni solicitan claves en esta página.

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.

Guía de estados y recuperación →
400Solicitud inválida
401Credencial inválida
403Permisos o licencia
404Recurso no encontrado
409Referencia o estado en conflicto
429Demasiadas consultas
500Resultado por comprobar
GET/catalog

Consultar catálogo autorizado

Catálogo publicado de referencia. Cotizar y reservar mediante checkout-commands; disponibilidad y precios deben confirmarse en POS.

Autenticaciónx-istmo-commerce-keyPermiso: catalog:read

Parámetros de consulta

afterstring

nextCursor previo. Orden UUID ascendente; no es un cursor de sincronización incremental.

Formato: uuid

limitinteger

Mínimo: 1 · Máximo: 100 · Predeterminado: 50

No requiere cuerpo de solicitud.

Respuesta 200

Operación correcta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
itemsarrayobligatorio
Ver campos de items
idstringobligatorio

Formato: uuid

skustringobligatorio
namestringobligatorio
descriptionstringobligatorio
unitPriceReferencestringobligatorio

Precio de la lista; referencia, no cotización fiscal ni total a cobrar. No calcular impuestos o confirmar cobros a partir de este campo.

currencystringobligatorio

Valores: USD

availableReferencestringobligatorio

max(0, existencia-reservada) del almacén autorizado. No garantiza disponibilidad ni reserva.

stockUpdatedAtstring · nullobligatorio

Formato: date-time

nextCursorstring · nullobligatorio

Formato: uuid

integrationIdstringobligatorio

Formato: uuid

observedAtstringobligatorio

Formato: date-time

availabilityGuaranteedbooleanobligatorio

Valores: false

checkoutEnabledbooleanobligatorio

Valores: false

modestringobligatorio

Valores: request_only

lastSyncAtstring · null

Sólo gateway: última publicación recibida. El catálogo puede estar desactualizado durante desconexión.

Formato: date-time

Enlace a este endpoint
Solicitud
cURL
curl -X GET "$ISTMO_COMMERCE_BASE_URL/catalog" \
  -H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY"
Ejemplo Node.js
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.
Respuesta · 200
{
  "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.

POST/orders

Registrar 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.

Autenticaciónx-istmo-commerce-keyPermiso: orders:write

Cuerpo de la solicitud

externalIdstringobligatorio

Referencia estable única por integración. Conservar exactamente en reintentos, incluso tras un timeout.

customerobjectobligatorio
Ver campos de customer
namestringobligatorio

Hasta 150 caracteres

emailstringobligatorio

Formato: email · Hasta 150 caracteres

phonestringobligatorio

Hasta 40 caracteres

fulfillmentobjectobligatorio
Ver campos de fulfillment
Variante 1
methodstringobligatorio

Valores: pickup

Variante 2
methodstringobligatorio

Valores: delivery

addressstringobligatorio

Hasta 500 caracteres

linesarrayobligatorio

Hasta 100 elementos

Ver campos de lines
productIdstringobligatorio

Formato: uuid

quantitystringobligatorio

Decimal como texto > 0, hasta 999999.9999. No repetir productId.

notestring

Hasta 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
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
idstringobligatorio

Formato: uuid

externalIdstringobligatorio
statusstringobligatorio

Valores: recibido_gateway, pendiente_confirmacion, rechazado

reasonstring · nullobligatorio
createdAtstringobligatorio

Formato: date-time

updatedAtstringobligatorio

Formato: date-time

paymentStatusstringobligatorio

Valores: not_requested

stockReservedbooleanobligatorio

Valores: false

invoicedbooleanobligatorio

Valores: false

posOrderIdstring · null

Sólo gateway. Recibo local, o null mientras no existe. El id principal del gateway permanece estable.

Formato: uuid

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 202
{
  "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.

GET/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.

Autenticaciónx-istmo-commerce-keyPermiso: orders:read

Parámetros de ruta

externalIdstringobligatorio

No requiere cuerpo de solicitud.

Respuesta 200

Operación correcta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
idstringobligatorio

Formato: uuid

externalIdstringobligatorio
statusstringobligatorio

Valores: recibido_gateway, pendiente_confirmacion, rechazado

reasonstring · nullobligatorio
createdAtstringobligatorio

Formato: date-time

updatedAtstringobligatorio

Formato: date-time

paymentStatusstringobligatorio

Valores: not_requested

stockReservedbooleanobligatorio

Valores: false

invoicedbooleanobligatorio

Valores: false

posOrderIdstring · null

Sólo gateway. Recibo local, o null mientras no existe. El id principal del gateway permanece estable.

Formato: uuid

Enlace a este endpoint
Solicitud
cURL
curl -X GET "$ISTMO_COMMERCE_BASE_URL/orders/web-7d2f4c9a" \
  -H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY"
Ejemplo Node.js
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.
Respuesta · 200
{
  "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.

POST/admin/integrations

Crear 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.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Cuerpo de la solicitud

nombrestringobligatorio

Hasta 100 caracteres

sitioUrlstringobligatorio

URL HTTPS sin credenciales, query ni fragmento. Informativa; no se usa para autenticación ni llamadas salientes.

Formato: uri · Hasta 500 caracteres

almacenIdstringobligatorio

Formato: uuid

numeroListainteger

Mínimo: 1 · Máximo: 3 · Predeterminado: 1

scopesarrayobligatorio

Hasta 3 elementos

Respuesta 201

Operación correcta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
idstringobligatorio

Formato: uuid

empresaIdstringobligatorio

Formato: uuid

sucursalIdstringobligatorio

Formato: uuid

almacenIdstringobligatorio

Formato: uuid

nombrestringobligatorio
sitioUrlstringobligatorio

Formato: uri

numeroListaintegerobligatorio
scopesarrayobligatorio

Hasta 3 elementos

activobooleanobligatorio
createdAtstringobligatorio

Formato: date-time

updatedAtstringobligatorio

Formato: date-time

credentialstringobligatorio

Se entrega una sola vez. Guardar exclusivamente como secreto del backend.

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 201
{
  "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.

GET/admin/integrations

Listar conexiones de la sucursal

Operación disponible para el contexto autorizado de la integración.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de consulta

afterstring

nextCursor previo. Orden UUID ascendente; no es un cursor de sincronización incremental.

Formato: uuid

limitinteger

Mínimo: 1 · Máximo: 100 · Predeterminado: 50

No requiere cuerpo de solicitud.

Respuesta 200

Operación correcta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
itemsarrayobligatorio
Ver campos de items
idstringobligatorio

Formato: uuid

empresaIdstringobligatorio

Formato: uuid

sucursalIdstringobligatorio

Formato: uuid

almacenIdstringobligatorio

Formato: uuid

nombrestringobligatorio
sitioUrlstringobligatorio

Formato: uri

numeroListaintegerobligatorio
scopesarrayobligatorio

Hasta 3 elementos

activobooleanobligatorio
createdAtstringobligatorio

Formato: date-time

updatedAtstringobligatorio

Formato: date-time

nextCursorstring · nullobligatorio

Formato: uuid

Enlace a este endpoint
Solicitud
cURL
curl -X GET "$ISTMO_COMMERCE_BASE_URL/admin/integrations" \
  -H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"
Ejemplo Node.js
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.
Respuesta · 200
{
  "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.

POST/admin/integrations/{id}/rotate

Rotar credencial

Invalida la anterior. Devuelve el secreto una sola vez; si se pierde la respuesta volver a rotar. No reactiva integraciones revocadas.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

No requiere cuerpo de solicitud.

Respuesta 200

Operación correcta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
idstringobligatorio

Formato: uuid

credentialstringobligatorio

Se entrega una sola vez. Guardar exclusivamente como secreto del backend.

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 200
{
  "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.

DELETE/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.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

No requiere cuerpo de solicitud.

Respuesta 200

Operación correcta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
idstringobligatorio

Formato: uuid

activobooleanobligatorio

Valores: false

Enlace a este endpoint
Solicitud
cURL
curl -X DELETE "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111" \
  -H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"
Ejemplo Node.js
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.
Respuesta · 200
{
  "success": true,
  "data": {
    "id": "11111111-1111-4111-8111-111111111111",
    "activo": false
  }
}

Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.

PUT/admin/integrations/{id}/products

Reemplazar 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.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

Cuerpo de la solicitud

productoIdsarrayobligatorio

Reemplaza 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
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
idstringobligatorio

Formato: uuid

productoIdsarrayobligatorio
Enlace a este endpoint
Solicitud
cURL
curl -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.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.
Respuesta · 200
{
  "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.

GET/admin/integrations/{id}/products

Buscar productos elegibles para publicar

Operación disponible para el contexto autorizado de la integración.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

Parámetros de consulta

searchstring

Hasta 100 caracteres · Predeterminado: ""

afterstring

Formato: uuid

No requiere cuerpo de solicitud.

Respuesta 200

Operación completada; guardar no confirma conectividad.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
itemsarrayobligatorio
Ver campos de items
idstringobligatorio

Formato: uuid

skustringobligatorio
namestringobligatorio
nextCursorstring · nullobligatorio
Enlace a este endpoint
Solicitud
cURL
curl -X GET "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/products" \
  -H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"
Ejemplo Node.js
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.
Respuesta · 200
{
  "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.

GET/admin/integrations/{id}/orders

Consultar bandeja de solicitudes

Incluye datos personales y snapshot; acceso administrativo, no usar desde Vue público.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

Parámetros de consulta

afterstring

nextCursor previo. Orden UUID ascendente; no es un cursor de sincronización incremental.

Formato: uuid

limitinteger

Mínimo: 1 · Máximo: 100 · Predeterminado: 50

No requiere cuerpo de solicitud.

Respuesta 200

Operación correcta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
itemsarrayobligatorio
Ver campos de items
idstringobligatorio

Formato: uuid

externalIdstringobligatorio
statusstringobligatorio

Valores: pendiente_confirmacion, rechazado

reasonstring · nullobligatorio
createdAtstringobligatorio

Formato: date-time

updatedAtstringobligatorio

Formato: date-time

paymentStatusstringobligatorio

Valores: not_requested

stockReservedbooleanobligatorio

Valores: false

invoicedbooleanobligatorio

Valores: false

requestobjectobligatorio
Ver campos de request
externalIdstringobligatorio

Referencia estable única por integración. Conservar exactamente en reintentos, incluso tras un timeout.

customerobjectobligatorio
Ver campos de customer
namestringobligatorio

Hasta 150 caracteres

emailstringobligatorio

Formato: email · Hasta 150 caracteres

phonestringobligatorio

Hasta 40 caracteres

fulfillmentobjectobligatorio
Ver campos de fulfillment
Variante 1
methodstringobligatorio

Valores: pickup

Variante 2
methodstringobligatorio

Valores: delivery

addressstringobligatorio

Hasta 500 caracteres

linesarrayobligatorio

Hasta 100 elementos

Ver campos de lines
productIdstringobligatorio

Formato: uuid

quantitystringobligatorio

Decimal como texto > 0, hasta 999999.9999. No repetir productId.

notestring

Hasta 500 caracteres · Predeterminado: ""

snapshotobjectobligatorio
Ver campos de snapshot
currencystringobligatorio

Valores: USD

productsarrayobligatorio
Ver campos de products
idstringobligatorio

Formato: uuid

skustringobligatorio
namestringobligatorio
descriptionstringobligatorio
unitPriceReferencestringobligatorio

Precio de la lista; referencia, no cotización fiscal ni total a cobrar. No calcular impuestos o confirmar cobros a partir de este campo.

currencystringobligatorio

Valores: USD

availableReferencestringobligatorio

max(0, existencia-reservada) del almacén autorizado. No garantiza disponibilidad ni reserva.

stockUpdatedAtstring · nullobligatorio

Formato: date-time

checkoutEnabledbooleanobligatorio

Valores: false

nextCursorstring · nullobligatorio

Formato: uuid

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 200
{
  "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.

POST/admin/integrations/{id}/orders/{orderId}/reject

Rechazar solicitud con motivo

Mismo motivo es idempotente; otro motivo después del rechazo devuelve 409. No anula documentos fiscales ni devuelve dinero.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

orderIdstringobligatorio

Formato: uuid

Cuerpo de la solicitud

motivostringobligatorio

Hasta 500 caracteres

Respuesta 200

Operación correcta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
idstringobligatorio

Formato: uuid

externalIdstringobligatorio
statusstringobligatorio

Valores: recibido_gateway, pendiente_confirmacion, rechazado

reasonstring · nullobligatorio
createdAtstringobligatorio

Formato: date-time

updatedAtstringobligatorio

Formato: date-time

paymentStatusstringobligatorio

Valores: not_requested

stockReservedbooleanobligatorio

Valores: false

invoicedbooleanobligatorio

Valores: false

posOrderIdstring · null

Sólo gateway. Recibo local, o null mientras no existe. El id principal del gateway permanece estable.

Formato: uuid

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 200
{
  "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.

GET/admin/options

Consultar almacenes y requisitos del puente

Operación disponible para el contexto autorizado de la integración.

AutenticaciónBearer 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
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
warehousesarrayobligatorio
Ver campos de warehouses
idstringobligatorio

Formato: uuid

nombrestringobligatorio
allowedGatewaysarrayobligatorio
encryptionReadybooleanobligatorio
paymentInstrumentsarrayobligatorio
Ver campos de paymentInstruments
idstringobligatorio

Formato: uuid

nombrestringobligatorio
permissionsobjectobligatorio
Ver campos de permissions
reconcilebooleanobligatorio
invoicebooleanobligatorio
fulfillbooleanobligatorio
Enlace a este endpoint
Solicitud
cURL
curl -X GET "$ISTMO_COMMERCE_BASE_URL/admin/options" \
  -H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"
Ejemplo Node.js
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.
Respuesta · 200
{
  "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.

GET/admin/integrations/{id}/settings

Consultar publicación y diagnóstico sin secretos

Operación disponible para el contexto autorizado de la integración.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID 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
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
selectedarrayobligatorio
Ver campos de selected
idstringobligatorio

Formato: uuid

skustringobligatorio
namestringobligatorio
bridgeobject · nullobligatorio
Ver campos de bridge
sourcestringobligatorio

Valores: environment, database

gatewayUrlstringobligatorio
bindingobjectobligatorio
Ver campos de binding
installationIdstringobligatorio

Formato: uuid

integrationIdstringobligatorio

Formato: uuid

enabledbooleanobligatorio
statusobjectobligatorio
Ver campos de status
attemptAtstring · nullobligatorio
successAtstring · nullobligatorio
errorCodestring · nullobligatorio
pausedbooleanobligatorio
paymentSettingsobject · nullobligatorio
Ver campos de paymentSettings
enabledbooleanobligatorio
instrumentoIdstringobligatorio

Formato: uuid

instructionsstringobligatorio

Hasta 1000 caracteres

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 200
{
  "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.

PUT/admin/integrations/{id}/bridge

Guardar y activar vínculo cifrado

Operación disponible para el contexto autorizado de la integración.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

Cuerpo de la solicitud

gatewayUrlstringobligatorio

Origen HTTPS incluido en la lista del operador. Inmutable después de guardar.

Formato: uri

installationIdstringobligatorio

Formato: uuid

connectorKeystringobligatorio
localKeystringobligatorio

Respuesta 200

Operación completada; guardar no confirma conectividad.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
idstringobligatorio

Formato: uuid

enabledbooleanobligatorio
Enlace a este endpoint
Solicitud
cURL
curl -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.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.
Respuesta · 200
{
  "success": true,
  "data": {
    "id": "11111111-1111-4111-8111-111111111111",
    "enabled": false
  }
}

Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.

DELETE/admin/integrations/{id}/bridge

Solicitar pausa del puente

Operación disponible para el contexto autorizado de la integración.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID 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
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
idstringobligatorio

Formato: uuid

enabledbooleanobligatorio
Enlace a este endpoint
Solicitud
cURL
curl -X DELETE "$ISTMO_COMMERCE_BASE_URL/admin/integrations/11111111-1111-4111-8111-111111111111/bridge" \
  -H "Authorization: Bearer $ISTMO_ADMIN_TOKEN"
Ejemplo Node.js
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.
Respuesta · 200
{
  "success": true,
  "data": {
    "id": "11111111-1111-4111-8111-111111111111",
    "enabled": false
  }
}

Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.

POST/checkout-commands

Cotizar, 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.

Autenticaciónx-istmo-commerce-keyPermiso vigente de configuración en esta sucursal.

Cuerpo de la solicitud

Variante 1
commandIdstringobligatorio

Formato: uuid

checkoutIdstringobligatorio
actionstringobligatorio

Valores: quote

orderobjectobligatorio
Ver campos de order
externalIdstringobligatorio

Referencia estable única por integración. Conservar exactamente en reintentos, incluso tras un timeout.

customerobjectobligatorio
Ver campos de customer
namestringobligatorio

Hasta 150 caracteres

emailstringobligatorio

Formato: email · Hasta 150 caracteres

phonestringobligatorio

Hasta 40 caracteres

fulfillmentobjectobligatorio
Ver campos de fulfillment
Variante 1
methodstringobligatorio

Valores: pickup

Variante 2
methodstringobligatorio

Valores: delivery

addressstringobligatorio

Hasta 500 caracteres

linesarrayobligatorio

Hasta 100 elementos

Ver campos de lines
productIdstringobligatorio

Formato: uuid

quantitystringobligatorio

Decimal como texto > 0, hasta 999999.9999. No repetir productId.

notestring

Hasta 500 caracteres · Predeterminado: ""

Variante 2
commandIdstringobligatorio

Formato: uuid

checkoutIdstringobligatorio
actionstringobligatorio

Valores: status

Variante 3
commandIdstringobligatorio

Formato: uuid

checkoutIdstringobligatorio
actionstringobligatorio

Valores: cancel

Variante 4
commandIdstringobligatorio

Formato: uuid

checkoutIdstringobligatorio
actionstringobligatorio

Valores: payment

Respuesta 202

Recibo de operación; no confirma venta ni pago.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio

pending 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
commandIdstringobligatorio

Formato: uuid

statestringobligatorio

Valores: pending

checkoutEnabledbooleanobligatorio

Valores: false

Variante 2
commandIdstringobligatorio

Formato: uuid

statestringobligatorio

Valores: completed

resultobjectobligatorio
Ver campos de result
idstringobligatorio

Formato: uuid

externalIdstringobligatorio
statusstringobligatorio

Valores: reservado, expirado, cancelado, vendido

expiresAtstringobligatorio

Formato: date-time

observedAtstringobligatorio

Formato: date-time

stockReservedbooleanobligatorio
checkoutEnabledbooleanobligatorio

Valores: false

paymentStatusstringobligatorio

Valores: not_requested, pending, confirmed, applied, refunded

invoicedbooleanobligatorio
quoteobjectobligatorio
Ver campos de quote
currencystringobligatorio

Valores: USD

fulfillmentstringobligatorio

Valores: pickup

pricingPolicystringobligatorio

Valores: published_list_no_discounts

subtotalstringobligatorio
taxstringobligatorio
totalstringobligatorio
linesarrayobligatorio
Ver campos de lines
productIdstringobligatorio

Formato: uuid

namestringobligatorio
quantitystringobligatorio
unitPricestringobligatorio
taxRatestringobligatorio
subtotalstringobligatorio
taxstringobligatorio
totalstringobligatorio
paymentobject · null
Ver campos de payment
idstringobligatorio

Formato: uuid

methodstringobligatorio

Valores: bank_transfer

statusstringobligatorio

Valores: pending, confirmed, applied, refunded

amountstringobligatorio
currencystringobligatorio

Valores: USD

instructionsstringobligatorio
referencestring · nullobligatorio
invoiceobject · null
Ver campos de invoice
idstringobligatorio

Formato: uuid

numberstringobligatorio
statusstring · nullobligatorio
fiscalStatusinteger · nullobligatorio
fulfillmentobject
Ver campos de fulfillment
statusstringobligatorio

Valores: pendiente, preparando, listo, entregado

updatedAtstring · nullobligatorio

Formato: date-time

Variante 3
commandIdstringobligatorio

Formato: uuid

statestringobligatorio

Valores: failed

errorobjectobligatorio
Ver campos de error
codestringobligatorio
messagestringobligatorio
Enlace a este endpoint
Solicitud
cURL
curl -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.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.
Respuesta · 202
{
  "success": true,
  "data": {
    "commandId": "11111111-1111-4111-8111-111111111111",
    "state": "pending",
    "checkoutEnabled": false
  }
}

Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.

GET/checkout-commands/{commandId}

Recuperar recibo histórico de operación

Operación disponible para el contexto autorizado de la integración.

Autenticaciónx-istmo-commerce-keyPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

commandIdstringobligatorio

Formato: uuid

No requiere cuerpo de solicitud.

Respuesta 200

Recibo de operación; no confirma venta ni pago.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio

pending 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
commandIdstringobligatorio

Formato: uuid

statestringobligatorio

Valores: pending

checkoutEnabledbooleanobligatorio

Valores: false

Variante 2
commandIdstringobligatorio

Formato: uuid

statestringobligatorio

Valores: completed

resultobjectobligatorio
Ver campos de result
idstringobligatorio

Formato: uuid

externalIdstringobligatorio
statusstringobligatorio

Valores: reservado, expirado, cancelado, vendido

expiresAtstringobligatorio

Formato: date-time

observedAtstringobligatorio

Formato: date-time

stockReservedbooleanobligatorio
checkoutEnabledbooleanobligatorio

Valores: false

paymentStatusstringobligatorio

Valores: not_requested, pending, confirmed, applied, refunded

invoicedbooleanobligatorio
quoteobjectobligatorio
Ver campos de quote
currencystringobligatorio

Valores: USD

fulfillmentstringobligatorio

Valores: pickup

pricingPolicystringobligatorio

Valores: published_list_no_discounts

subtotalstringobligatorio
taxstringobligatorio
totalstringobligatorio
linesarrayobligatorio
Ver campos de lines
productIdstringobligatorio

Formato: uuid

namestringobligatorio
quantitystringobligatorio
unitPricestringobligatorio
taxRatestringobligatorio
subtotalstringobligatorio
taxstringobligatorio
totalstringobligatorio
paymentobject · null
Ver campos de payment
idstringobligatorio

Formato: uuid

methodstringobligatorio

Valores: bank_transfer

statusstringobligatorio

Valores: pending, confirmed, applied, refunded

amountstringobligatorio
currencystringobligatorio

Valores: USD

instructionsstringobligatorio
referencestring · nullobligatorio
invoiceobject · null
Ver campos de invoice
idstringobligatorio

Formato: uuid

numberstringobligatorio
statusstring · nullobligatorio
fiscalStatusinteger · nullobligatorio
fulfillmentobject
Ver campos de fulfillment
statusstringobligatorio

Valores: pendiente, preparando, listo, entregado

updatedAtstring · nullobligatorio

Formato: date-time

Variante 3
commandIdstringobligatorio

Formato: uuid

statestringobligatorio

Valores: failed

errorobjectobligatorio
Ver campos de error
codestringobligatorio
messagestringobligatorio
Enlace a este endpoint
Solicitud
cURL
curl -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.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.
Respuesta · 200
{
  "success": true,
  "data": {
    "commandId": "11111111-1111-4111-8111-111111111111",
    "state": "pending",
    "checkoutEnabled": false
  }
}

Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.

PUT/admin/integrations/{id}/payment-settings

Configurar 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.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

Cuerpo de la solicitud

enabledbooleanobligatorio
instrumentoIdstringobligatorio

Formato: uuid

instructionsstringobligatorio

Hasta 1000 caracteres

Respuesta 200

Resultado persistido en el POS; consulte estado actual ante respuesta incierta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
enabledbooleanobligatorio
instrumentoIdstringobligatorio

Formato: uuid

instructionsstringobligatorio

Hasta 1000 caracteres

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 200
{
  "success": true,
  "data": {
    "enabled": false,
    "instrumentoId": "11111111-1111-4111-8111-111111111111",
    "instructions": "Ejemplo"
  }
}

Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.

GET/admin/integrations/{id}/checkouts

Listar 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.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

Parámetros de consulta

afterstring

Formato: uuid

limitinteger

Mí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
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
itemsarrayobligatorio
Ver campos de items
idstringobligatorio

Formato: uuid

externalIdstringobligatorio
statusstringobligatorio
expiresAtstringobligatorio

Formato: date-time

customerobjectobligatorio
Ver campos de customer
externalIdstringobligatorio

Referencia estable única por integración. Conservar exactamente en reintentos, incluso tras un timeout.

customerobjectobligatorio
Ver campos de customer
namestringobligatorio

Hasta 150 caracteres

emailstringobligatorio

Formato: email · Hasta 150 caracteres

phonestringobligatorio

Hasta 40 caracteres

fulfillmentobjectobligatorio
Ver campos de fulfillment
Variante 1
methodstringobligatorio

Valores: pickup

Variante 2
methodstringobligatorio

Valores: delivery

addressstringobligatorio

Hasta 500 caracteres

linesarrayobligatorio

Hasta 100 elementos

Ver campos de lines
productIdstringobligatorio

Formato: uuid

quantitystringobligatorio

Decimal como texto > 0, hasta 999999.9999. No repetir productId.

notestring

Hasta 500 caracteres · Predeterminado: ""

quoteobjectobligatorio
Ver campos de quote
currencystringobligatorio

Valores: USD

fulfillmentstringobligatorio

Valores: pickup

pricingPolicystringobligatorio

Valores: published_list_no_discounts

subtotalstringobligatorio
taxstringobligatorio
totalstringobligatorio
linesarrayobligatorio
Ver campos de lines
productIdstringobligatorio

Formato: uuid

namestringobligatorio
quantitystringobligatorio
unitPricestringobligatorio
taxRatestringobligatorio
subtotalstringobligatorio
taxstringobligatorio
totalstringobligatorio
paymentStatusstringobligatorio

Valores: not_requested, pending, confirmed, applied, refunded

invoicedbooleanobligatorio
paymentobject · nullobligatorio
Ver campos de payment
idstringobligatorio

Formato: uuid

methodstringobligatorio

Valores: bank_transfer

statusstringobligatorio

Valores: pending, confirmed, applied, refunded

amountstringobligatorio
currencystringobligatorio

Valores: USD

instructionsstringobligatorio
referencestring · nullobligatorio
invoiceobject · nullobligatorio
Ver campos de invoice
idstringobligatorio

Formato: uuid

numberstringobligatorio
statusstring · nullobligatorio
fiscalStatusinteger · nullobligatorio
fulfillmentobjectobligatorio
Ver campos de fulfillment
statusstringobligatorio

Valores: pendiente, preparando, listo, entregado

updatedAtstring · nullobligatorio

Formato: date-time

nextCursorstring · nullobligatorio

Formato: uuid

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 200
{
  "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.

POST/admin/integrations/{id}/checkouts/{checkoutId}/confirm-transfer

Conciliar 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.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

checkoutIdstringobligatorio

UUID POS del checkout, distinto de la referencia externa usada en los comandos.

Formato: uuid

Cuerpo de la solicitud

amountstringobligatorio
referencestringobligatorio

Hasta 120 caracteres

reasonstringobligatorio

Hasta 500 caracteres

Respuesta 200

Resultado persistido en el POS; consulte estado actual ante respuesta incierta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
paymentStatusstringobligatorio

Valores: not_requested, pending, confirmed, applied, refunded

invoicedbooleanobligatorio
paymentobject · nullobligatorio
Ver campos de payment
idstringobligatorio

Formato: uuid

methodstringobligatorio

Valores: bank_transfer

statusstringobligatorio

Valores: pending, confirmed, applied, refunded

amountstringobligatorio
currencystringobligatorio

Valores: USD

instructionsstringobligatorio
referencestring · nullobligatorio
invoiceobject · nullobligatorio
Ver campos de invoice
idstringobligatorio

Formato: uuid

numberstringobligatorio
statusstring · nullobligatorio
fiscalStatusinteger · nullobligatorio
fulfillmentobjectobligatorio
Ver campos de fulfillment
statusstringobligatorio

Valores: pendiente, preparando, listo, entregado

updatedAtstring · nullobligatorio

Formato: date-time

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 200
{
  "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.

POST/admin/integrations/{id}/checkouts/{checkoutId}/invoice

Emitir 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.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

checkoutIdstringobligatorio

UUID POS del checkout, distinto de la referencia externa usada en los comandos.

Formato: uuid

Cuerpo de la solicitud

terceroIdstringobligatorio

Formato: uuid

Respuesta 201

Resultado persistido en el POS; consulte estado actual ante respuesta incierta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
paymentStatusstringobligatorio

Valores: not_requested, pending, confirmed, applied, refunded

invoicedbooleanobligatorio
paymentobject · nullobligatorio
Ver campos de payment
idstringobligatorio

Formato: uuid

methodstringobligatorio

Valores: bank_transfer

statusstringobligatorio

Valores: pending, confirmed, applied, refunded

amountstringobligatorio
currencystringobligatorio

Valores: USD

instructionsstringobligatorio
referencestring · nullobligatorio
invoiceobject · nullobligatorio
Ver campos de invoice
idstringobligatorio

Formato: uuid

numberstringobligatorio
statusstring · nullobligatorio
fiscalStatusinteger · nullobligatorio
fulfillmentobjectobligatorio
Ver campos de fulfillment
statusstringobligatorio

Valores: pendiente, preparando, listo, entregado

updatedAtstring · nullobligatorio

Formato: date-time

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 201
{
  "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.

POST/admin/integrations/{id}/checkouts/{checkoutId}/record-refund

Registrar 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.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

checkoutIdstringobligatorio

UUID POS del checkout, distinto de la referencia externa usada en los comandos.

Formato: uuid

Cuerpo de la solicitud

amountstringobligatorio
referencestringobligatorio

Hasta 120 caracteres

reasonstringobligatorio

Hasta 500 caracteres

Respuesta 200

Resultado persistido en el POS; consulte estado actual ante respuesta incierta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
paymentStatusstringobligatorio

Valores: not_requested, pending, confirmed, applied, refunded

invoicedbooleanobligatorio
paymentobject · nullobligatorio
Ver campos de payment
idstringobligatorio

Formato: uuid

methodstringobligatorio

Valores: bank_transfer

statusstringobligatorio

Valores: pending, confirmed, applied, refunded

amountstringobligatorio
currencystringobligatorio

Valores: USD

instructionsstringobligatorio
referencestring · nullobligatorio
invoiceobject · nullobligatorio
Ver campos de invoice
idstringobligatorio

Formato: uuid

numberstringobligatorio
statusstring · nullobligatorio
fiscalStatusinteger · nullobligatorio
fulfillmentobjectobligatorio
Ver campos de fulfillment
statusstringobligatorio

Valores: pendiente, preparando, listo, entregado

updatedAtstring · nullobligatorio

Formato: date-time

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 200
{
  "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.

GET/admin/integrations/{id}/customers

Buscar 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.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

Parámetros de consulta

searchstring

Hasta 100 caracteres · Predeterminado: ""

afterstring

Formato: uuid

No requiere cuerpo de solicitud.

Respuesta 200

Resultado de la operación.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
itemsarrayobligatorio
Ver campos de items
idstringobligatorio

Formato: uuid

nombrestringobligatorio
codigostringobligatorio
rucstring · nullobligatorio
nextCursorstring · nullobligatorio

Formato: uuid

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 200
{
  "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.

POST/admin/integrations/{id}/checkouts/{checkoutId}/fulfillment

Avanzar 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.

AutenticaciónBearer JWT administrativoPermiso vigente de configuración en esta sucursal.

Parámetros de ruta

idstringobligatorio

ID de integración, no ID de empresa.

Formato: uuid

checkoutIdstringobligatorio

UUID POS del checkout, distinto de la referencia externa usada en los comandos.

Formato: uuid

Cuerpo de la solicitud

Variante 1
commandIdstringobligatorio

Formato: uuid

statusstringobligatorio

Valores: preparando

notestring

Hasta 500 caracteres · Predeterminado: ""

Variante 2
commandIdstringobligatorio

Formato: uuid

statusstringobligatorio

Valores: listo

notestring

Hasta 500 caracteres · Predeterminado: ""

Variante 3
commandIdstringobligatorio

Formato: uuid

statusstringobligatorio

Valores: entregado

notestring

Hasta 500 caracteres · Predeterminado: ""

receivedBystringobligatorio

Hasta 150 caracteres

Respuesta 200

Resultado de la operación.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
statusstringobligatorio

Valores: pendiente, preparando, listo, entregado

updatedAtstring · nullobligatorio

Formato: date-time

Enlace a este endpoint
Solicitud
cURL
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.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.
Respuesta · 200
{
  "success": true,
  "data": {
    "status": "pendiente",
    "updatedAt": null
  }
}

Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.

GET/webhook-deliveries

Consultar 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.

Autenticaciónx-istmo-commerce-keyPermiso: orders:read

Parámetros de consulta

afterstring

nextCursor previo. Orden UUID ascendente; no es un cursor de sincronización incremental.

Formato: uuid

limitinteger

Mínimo: 1 · Máximo: 100 · Predeterminado: 50

No requiere cuerpo de solicitud.

Respuesta 200

Operación correcta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
itemsarrayobligatorio
Ver campos de items
eventobjectobligatorio
Ver campos de event
idstringobligatorio

Formato: uuid

versionstringobligatorio

Valores: 1

integrationIdstringobligatorio

Formato: uuid

typestringobligatorio

Valores: checkout.reserved, checkout.expirado, checkout.cancelado, checkout.vendido, checkout.invoiced, checkout.fulfillment, transfer.requested, transfer.confirmed, transfer.refund_recorded, invoice.updated

occurredAtstringobligatorio

Formato: date-time

dataobjectobligatorio
Ver campos de data
checkoutIdstringobligatorio
statusstringobligatorio

Valores: pending, retry, processing, delivered, failed, disabled

attemptsintegerobligatorio

Mínimo: 0

httpStatusinteger · nullobligatorio
nextAttemptAtstringobligatorio

Formato: date-time

deliveredAtstring · nullobligatorio

Formato: date-time

nextCursorstring · nullobligatorio

Formato: uuid

Enlace a este endpoint
Solicitud
cURL
curl -X GET "$ISTMO_COMMERCE_BASE_URL/webhook-deliveries" \
  -H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY"
Ejemplo Node.js
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.
Respuesta · 200
{
  "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.

POST/webhook-deliveries/{eventId}/retry

Reintentar 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.

Autenticaciónx-istmo-commerce-keyPermiso: orders:write

Parámetros de ruta

eventIdstringobligatorio

Formato: uuid

No requiere cuerpo de solicitud.

Respuesta 200

Operación correcta.

Ver atributos de la respuesta
successbooleanobligatorio

Valores: true

dataobjectobligatorio
Ver campos de data
idstringobligatorio

Formato: uuid

statusstringobligatorio

Valores: pending, retry, processing

Enlace a este endpoint
Solicitud
cURL
curl -X POST "$ISTMO_COMMERCE_BASE_URL/webhook-deliveries/{eventId}/retry" \
  -H "x-istmo-commerce-key: $ISTMO_COMMERCE_KEY"
Ejemplo Node.js
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.
Respuesta · 200
{
  "success": true,
  "data": {
    "id": "11111111-1111-4111-8111-111111111111",
    "status": "pending"
  }
}

Ejemplo ilustrativo. Sustituye los identificadores por datos de tu integración.