KicketKicket
Mi cuenta
Guía · Referencia▾
  • Inicio
  • Primeros pasos
  • Autenticación
  • Paginación y sincronización
  • Errores
  • Límites de uso
  • Webhooks
  • Conciliación
  • Modelo de datos
  • Referencia
  • Descargas
  • Cambios

API de Kicket · v1

  • Inicio
  • Primeros pasos
  • Autenticación
  • Paginación y sincronización
  • Errores
  • Límites de uso
  • Webhooks
  • Conciliación
  • Modelo de datos
  • Referencia
  • Descargas
  • Cambios

Referencia

Cada endpoint con sus parámetros, su respuesta y un ejemplo. Sale del mismo OpenAPI que podés importar en tus herramientas.

Todas las rutas son relativas a https://kicket.club/api/v1. GET / es la base sin barra al final.

Autenticación

  • POST/oauth/token

Cuenta

  • GET/

Sucursales

  • GET/branches

Ventas

  • GET/sales
  • GET/sales/{id}

Pagos

  • GET/payments
  • GET/payment-methods
  • GET/refunds

Reportes

  • GET/reports/daily-sales

Catálogo

  • GET/products
  • GET/products/{id}
  • PATCH/products/{id}
  • GET/categories

Clientes

  • GET/customers
  • GET/customers/{id}

Cajas

  • GET/cash-sessions

Documentación

  • GET/openapi.json

Autenticación

El canje de la credencial por un access token (OAuth 2.0 client credentials).

POST/oauth/token

Pedir un access token

OAuth 2.0 client credentials (RFC 6749 §4.4). Mandá la credencial por Authorization: Basic base64(client_id:client_secret) (recomendado) o en el cuerpo (client_id y client_secret), nunca de las dos formas.

El token dura 3600 segundos: guardalo y reusalo hasta que venza. Sin scope, trae todos los permisos de la credencial; con scope (separados por espacio), sólo esos.

Los errores de esta ruta siguen el formato de OAuth ({ error, error_description }); el límite (429) y la indisponibilidad (503) van como application/problem+json, igual que el resto.

Autenticación: la credencial, por Basic o en el cuerpo.

Cuerpo

application/x-www-form-urlencoded · TokenRequest · Formulario `application/x-www-form-urlencoded` (el estándar). También se acepta JSON.

Ejemplo
grant_type=client_credentials&scope=sales%3Aread+payments%3Aread

Respuesta

200 · El token. (TokenResponse)

Ver ejemplo de respuesta
Respuesta de POST /oauth/token
{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6ImF0K2p3dCJ9.eyJzdWIiOiJrY19saXZlXzhGcTJ6THA0TjdtUjF3WTZ2QjNrIn0.4mQ5…",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "branches:read sales:read payments:read catalog:read cash:read"
}
  • 400 · error de OAuth
  • 401 · error de OAuth
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

Cuenta

Con qué cuenta y en qué entorno habla el token.

GET/

Probar la conexión

Con qué cuenta y en qué entorno está hablando el token. Alcanza con cualquier token válido: es la primera llamada para confirmar que todo quedó bien conectado.

Permiso: cualquier token válido.

Respuesta

200 · La cuenta y el entorno. (ApiIndex)

Ver ejemplo de respuesta
Respuesta de GET /
{
  "object": "api",
  "version": "1",
  "docs_url": "https://kicket.club/desarrolladores",
  "openapi_url": "https://kicket.club/api/v1/openapi.json",
  "account": {
    "id": "65f1c0a2b7e4d91a3c5e7f10",
    "name": "Café Modelo"
  },
  "environment": "live"
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

Sucursales

La casa matriz y sus sucursales.

GET/branches

Listar las sucursales

La casa matriz (is_headquarters: true) y las sucursales que hoy forman parte de la cuenta. Sin paginar: vienen todas, con has_more: false. branch_id filtra; limit y updated_since se aceptan pero NO recortan (una sucursal no tiene updated_at); un cursor es un 400.

Una sucursal que deja la cadena desaparece de este listado y de todos los demás, sin lápida; una que entra aparece con su historia (con updated_at viejo). Compará esta lista en cada corrida: para una nueva, hacé una carga inicial con branch_id y una fecha vieja.

Permiso: branches:read

Parámetros

ParámetroTipoDescripción
limitqueryinteger (1 a 500, por defecto 200)

Cuántos objetos por página: de 1 a 500. Sin limit, 200.

branch_idquerylista de stringseparados por coma

Sucursal (/branches). Una o varias separadas por coma. Sin branch_id, todas las de la cuenta. Una que no es de la cuenta es un 403.

updated_sincequerystring (date-time)

Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por id + updated_at.

Respuesta

200 · Las sucursales. (BranchList)

Ver ejemplo de respuesta
Respuesta de GET /branches
{
  "object": "list",
  "data": [
    {
      "id": "65f1c0a2b7e4d91a3c5e7f10",
      "object": "branch",
      "name": "Café Modelo · Palermo",
      "external_code": "SUC-001",
      "timezone": "America/Argentina/Buenos_Aires",
      "currency": "ARS",
      "country": "AR",
      "active": true,
      "is_headquarters": true
    },
    {
      "id": "65f1c0a2b7e4d91a3c5e7f11",
      "object": "branch",
      "name": "Café Modelo · Belgrano",
      "external_code": "SUC-002",
      "timezone": "America/Argentina/Buenos_Aires",
      "currency": "ARS",
      "country": "AR",
      "active": true,
      "is_headquarters": false
    }
  ],
  "has_more": false,
  "next_cursor": null
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

Ventas

Ventas con sus renglones y sus pagos.

GET/sales

Listar ventas

Cada venta trae sus renglones (items, en árbol) y sus pagos (payments). Orden fijo (updated_at, id) ascendente.

Lo modificado en los últimos 60 segundos todavía no sale (ventana de asentamiento). Con updated_since salen también las anuladas, lo editado después del cierre y las lápidas de lo borrado.

Son las mismas ventas que cuenta Analítica: no incluye el consumo que viene con una entrada ni los vales.

Una página puede traer menos de limit con has_more: true (tiene un tope de unos 4 MB, y status=CANCELED o REFUNDED solos se deciden después de leer): seguí next_cursor. Con updated_since, las lápidas salen sin importar los otros filtros (no se sabe qué estado o canal tenía lo borrado): deduplicá por id. Un parámetro que no existe es un 400.

covers son los cubiertos de la MESA: vienen iguales en cada ronda de la misma cuenta (check_id); no los sumes por venta. Con include=customer, customer puede venir null con customer_id cargado durante un minuto, hasta que se arma el cliente.

Permiso: sales:read

Parámetros

ParámetroTipoDescripción
limitqueryinteger (1 a 500, por defecto 200)

Cuántos objetos por página: de 1 a 500. Sin limit, 200.

cursorquerystring

El next_cursor de la página anterior, tal cual. Sólo vale con los mismos filtros.

branch_idquerylista de stringseparados por coma

Sucursal (/branches). Una o varias separadas por coma. Sin branch_id, todas las de la cuenta. Una que no es de la cuenta es un 403.

updated_sincequerystring (date-time)

Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por id + updated_at.

statusquerylista de uno de: OPEN · CLOSED · CANCELED · REFUNDEDseparados por coma

Estado de la venta. Uno o varios separados por coma.

channelquerylista de uno de: counter · table · qr_table · online · delivery · kiosk · otherseparados por coma

Canal de la venta. Uno o varios separados por coma.

business_datequerystring (date)

Jornada comercial (AAAA-MM-DD): de 06:00 a 06:00 en el huso de cada sucursal.

opened_fromquerystring (date-time)

Abiertas desde (inclusivo).

opened_toquerystring (date-time)

Abiertas hasta (exclusivo).

closed_fromquerystring (date-time)

Cobradas desde (inclusivo).

closed_toquerystring (date-time)

Cobradas hasta (exclusivo).

includequerylista de uno de: items · items.components · payments · customerseparados por coma

customer embebe el cliente en cada venta y exige además customers:read. items, items.components y payments se aceptan y ya vienen siempre.

Respuesta

200 · Una página de ventas. (SaleList)

Ver ejemplo de respuesta
Respuesta de GET /sales
{
  "object": "list",
  "data": [
    {
      "id": "6720a3f1c9e2b4d7a1f3e8c2",
      "object": "sale",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "number": "1043",
      "status": "CLOSED",
      "channel": "table",
      "table": "12",
      "check_id": "6720a1b0c9e2b4d7a1f3e800",
      "business_date": "2026-10-27",
      "opened_at": "2026-10-27T09:15:02.123-03:00",
      "closed_at": "2026-10-27T10:02:47.310-03:00",
      "canceled_at": null,
      "updated_at": "2026-10-27T10:02:48.004-03:00",
      "currency": "ARS",
      "subtotal": 10900,
      "discount_total": 1090,
      "total": 9810,
      "service_fee": 0,
      "tip_total": 1000,
      "delivery_fee": 0,
      "discounts": [
        {
          "type": "code",
          "name": "BIENVENIDA",
          "amount": 1090
        }
      ],
      "customer_id": "cus_8f2a1c9d0e7b4a65c3d1e2f0",
      "cash_session_id": "6720a0c4c9e2b4d7a1f3e7aa",
      "cashier": {
        "id": "stf_1b9e5c2a7d4f8e03a6c2b9d1",
        "name": "Lucía"
      },
      "waiter": {
        "id": "stf_4c7a2e9b1d0f6a58e3b7c2a4",
        "name": "Martín"
      },
      "covers": 2,
      "void_reason": null,
      "ready_at": "2026-10-27T09:24:10.512-03:00",
      "delivered_at": "2026-10-27T09:27:33.900-03:00",
      "items": [
        {
          "object": "sale_item",
          "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
          "parent_item_id": null,
          "product_id": "66b2e47a91c3d05f8e2a4b61",
          "external_code": "CAF-010",
          "modifier_id": null,
          "combo_name": null,
          "quantity": 1,
          "unit": "unit",
          "unit_price": 2800,
          "discount": 280,
          "line_total": 2520,
          "voided": false,
          "voided_at": null,
          "void_reason": null,
          "id": "6720a3f1c9e2b4d7a1f3e8c3",
          "kind": "product",
          "name": "Café con leche"
        },
        {
          "object": "sale_item",
          "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
          "parent_item_id": "6720a3f1c9e2b4d7a1f3e8c3",
          "product_id": null,
          "external_code": null,
          "modifier_id": "a3f9c2e1b7d04",
          "combo_name": null,
          "quantity": 1,
          "unit": "unit",
          "unit_price": 600,
          "discount": 60,
          "line_total": 540,
          "voided": false,
          "voided_at": null,
          "void_reason": null,
          "id": "6720a3f1c9e2b4d7a1f3e8c3:m:a3f9c2e1b7d04",
          "kind": "modifier",
          "name": "Leche de almendras"
        },
        {
          "object": "sale_item",
          "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
          "parent_item_id": "6720a3f1c9e2b4d7a1f3e8c3",
          "product_id": null,
          "external_code": null,
          "modifier_id": "o5e1d7c3a9b20",
          "combo_name": null,
          "quantity": 1,
          "unit": "unit",
          "unit_price": 0,
          "discount": 0,
          "line_total": 0,
          "voided": false,
          "voided_at": null,
          "void_reason": null,
          "id": "6720a3f1c9e2b4d7a1f3e8c3:m:o5e1d7c3a9b20",
          "kind": "modifier",
          "name": "Tamaño: Grande"
        },
        {
          "object": "sale_item",
          "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
          "parent_item_id": null,
          "product_id": "66b2e47a91c3d05f8e2a4b70",
          "external_code": "CMB-002",
          "modifier_id": null,
          "combo_name": "Desayuno clásico",
          "quantity": 1,
          "unit": "unit",
          "unit_price": 7500,
          "discount": 750,
          "line_total": 6750,
          "voided": false,
          "voided_at": null,
          "void_reason": null,
          "id": "6720a3f1c9e2b4d7a1f3e8d0",
          "kind": "combo",
          "name": "Desayuno clásico"
        },
        {
          "object": "sale_item",
          "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
          "parent_item_id": "6720a3f1c9e2b4d7a1f3e8d0",
          "product_id": "66b2e47a91c3d05f8e2a4b62",
          "external_code": "PAN-003",
          "modifier_id": null,
          "combo_name": "Desayuno clásico",
          "quantity": 1,
          "unit": "unit",
          "unit_price": 0,
          "discount": 0,
          "line_total": 0,
          "voided": false,
          "voided_at": null,
          "void_reason": null,
          "id": "6720a3f1c9e2b4d7a1f3e8c4",
          "kind": "combo_component",
          "name": "Medialunas (3)"
        },
        {
          "object": "sale_item",
          "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
          "parent_item_id": "6720a3f1c9e2b4d7a1f3e8d0",
          "product_id": "66b2e47a91c3d05f8e2a4b63",
          "external_code": "BEB-021",
          "modifier_id": null,
          "combo_name": "Desayuno clásico",
          "quantity": 1,
          "unit": "unit",
          "unit_price": 0,
          "discount": 0,
          "line_total": 0,
          "voided": false,
          "voided_at": null,
          "void_reason": null,
          "id": "6720a3f1c9e2b4d7a1f3e8c5",
          "kind": "combo_component",
          "name": "Jugo de naranja"
        },
        {
          "object": "sale_item",
          "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
          "parent_item_id": null,
          "product_id": "66b2e47a91c3d05f8e2a4b64",
          "external_code": "COC-104",
          "modifier_id": null,
          "combo_name": null,
          "quantity": 1,
          "unit": "unit",
          "unit_price": 4500,
          "discount": 0,
          "line_total": 4500,
          "voided": true,
          "voided_at": "2026-10-27T09:31:12.045-03:00",
          "void_reason": "Lo pidió por error",
          "id": "6720a3f1c9e2b4d7a1f3e8c6:v1",
          "kind": "product",
          "name": "Tostado de jamón y queso"
        }
      ],
      "payments": [
        {
          "id": "6720b5d2c9e2b4d7a1f3e901",
          "object": "payment",
          "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
          "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
          "kind": "payment",
          "method_id": "card_debit",
          "method_type": "debit",
          "card_brand": "visa",
          "processor": null,
          "amount": 5000,
          "charged_amount": 5000,
          "currency": "ARS",
          "status": "approved",
          "refunded_amount": 0,
          "external_reference": "000184",
          "created_at": "2026-10-27T10:02:47.310-03:00",
          "updated_at": "2026-10-27T10:02:48.004-03:00"
        },
        {
          "id": "6720b5d2c9e2b4d7a1f3e902",
          "object": "payment",
          "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
          "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
          "kind": "payment",
          "method_id": "cash",
          "method_type": "cash",
          "card_brand": null,
          "processor": null,
          "amount": 4810,
          "charged_amount": 4810,
          "currency": "ARS",
          "status": "approved",
          "refunded_amount": 0,
          "external_reference": null,
          "created_at": "2026-10-27T10:02:47.310-03:00",
          "updated_at": "2026-10-27T10:02:48.004-03:00"
        }
      ]
    },
    {
      "id": "6720c7d8c9e2b4d7a1f3eb21",
      "object": "sale",
      "deleted": true,
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "deleted_at": "2026-10-27T11:40:05.208-03:00",
      "updated_at": "2026-10-27T11:40:05.208-03:00"
    }
  ],
  "has_more": true,
  "next_cursor": "eyJrIjpbIjIwMjYtMTAtMjdUMTM6MDI6NDguMDA0WiIsIjY3MjBhM2YxYzllMmI0ZDdhMWYzZThjMiJdLCJmIjoiOWQ0YyJ9.Hk2…"
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

GET/sales/{id}

Ver una venta

Una venta como está ahora (sin ventana de asentamiento). 404 si no es de la cuenta; 410 si se borró (el cuerpo trae deleted_at).

Permiso: sales:read

Parámetros

ParámetroTipoDescripción
iden la ruta · obligatoriostring

Id del objeto (24 caracteres hexadecimales).

includequerylista de uno de: items · items.components · payments · customerseparados por coma

customer embebe el cliente (exige además customers:read).

Respuesta

200 · La venta. (Sale)

Ver ejemplo de respuesta
Respuesta de GET /sales/{id}
{
  "id": "6720a3f1c9e2b4d7a1f3e8c2",
  "object": "sale",
  "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
  "number": "1043",
  "status": "CLOSED",
  "channel": "table",
  "table": "12",
  "check_id": "6720a1b0c9e2b4d7a1f3e800",
  "business_date": "2026-10-27",
  "opened_at": "2026-10-27T09:15:02.123-03:00",
  "closed_at": "2026-10-27T10:02:47.310-03:00",
  "canceled_at": null,
  "updated_at": "2026-10-27T10:02:48.004-03:00",
  "currency": "ARS",
  "subtotal": 10900,
  "discount_total": 1090,
  "total": 9810,
  "service_fee": 0,
  "tip_total": 1000,
  "delivery_fee": 0,
  "discounts": [
    {
      "type": "code",
      "name": "BIENVENIDA",
      "amount": 1090
    }
  ],
  "customer_id": "cus_8f2a1c9d0e7b4a65c3d1e2f0",
  "cash_session_id": "6720a0c4c9e2b4d7a1f3e7aa",
  "cashier": {
    "id": "stf_1b9e5c2a7d4f8e03a6c2b9d1",
    "name": "Lucía"
  },
  "waiter": {
    "id": "stf_4c7a2e9b1d0f6a58e3b7c2a4",
    "name": "Martín"
  },
  "covers": 2,
  "void_reason": null,
  "ready_at": "2026-10-27T09:24:10.512-03:00",
  "delivered_at": "2026-10-27T09:27:33.900-03:00",
  "items": [
    {
      "object": "sale_item",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "parent_item_id": null,
      "product_id": "66b2e47a91c3d05f8e2a4b61",
      "external_code": "CAF-010",
      "modifier_id": null,
      "combo_name": null,
      "quantity": 1,
      "unit": "unit",
      "unit_price": 2800,
      "discount": 280,
      "line_total": 2520,
      "voided": false,
      "voided_at": null,
      "void_reason": null,
      "id": "6720a3f1c9e2b4d7a1f3e8c3",
      "kind": "product",
      "name": "Café con leche"
    },
    {
      "object": "sale_item",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "parent_item_id": "6720a3f1c9e2b4d7a1f3e8c3",
      "product_id": null,
      "external_code": null,
      "modifier_id": "a3f9c2e1b7d04",
      "combo_name": null,
      "quantity": 1,
      "unit": "unit",
      "unit_price": 600,
      "discount": 60,
      "line_total": 540,
      "voided": false,
      "voided_at": null,
      "void_reason": null,
      "id": "6720a3f1c9e2b4d7a1f3e8c3:m:a3f9c2e1b7d04",
      "kind": "modifier",
      "name": "Leche de almendras"
    },
    {
      "object": "sale_item",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "parent_item_id": "6720a3f1c9e2b4d7a1f3e8c3",
      "product_id": null,
      "external_code": null,
      "modifier_id": "o5e1d7c3a9b20",
      "combo_name": null,
      "quantity": 1,
      "unit": "unit",
      "unit_price": 0,
      "discount": 0,
      "line_total": 0,
      "voided": false,
      "voided_at": null,
      "void_reason": null,
      "id": "6720a3f1c9e2b4d7a1f3e8c3:m:o5e1d7c3a9b20",
      "kind": "modifier",
      "name": "Tamaño: Grande"
    },
    {
      "object": "sale_item",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "parent_item_id": null,
      "product_id": "66b2e47a91c3d05f8e2a4b70",
      "external_code": "CMB-002",
      "modifier_id": null,
      "combo_name": "Desayuno clásico",
      "quantity": 1,
      "unit": "unit",
      "unit_price": 7500,
      "discount": 750,
      "line_total": 6750,
      "voided": false,
      "voided_at": null,
      "void_reason": null,
      "id": "6720a3f1c9e2b4d7a1f3e8d0",
      "kind": "combo",
      "name": "Desayuno clásico"
    },
    {
      "object": "sale_item",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "parent_item_id": "6720a3f1c9e2b4d7a1f3e8d0",
      "product_id": "66b2e47a91c3d05f8e2a4b62",
      "external_code": "PAN-003",
      "modifier_id": null,
      "combo_name": "Desayuno clásico",
      "quantity": 1,
      "unit": "unit",
      "unit_price": 0,
      "discount": 0,
      "line_total": 0,
      "voided": false,
      "voided_at": null,
      "void_reason": null,
      "id": "6720a3f1c9e2b4d7a1f3e8c4",
      "kind": "combo_component",
      "name": "Medialunas (3)"
    },
    {
      "object": "sale_item",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "parent_item_id": "6720a3f1c9e2b4d7a1f3e8d0",
      "product_id": "66b2e47a91c3d05f8e2a4b63",
      "external_code": "BEB-021",
      "modifier_id": null,
      "combo_name": "Desayuno clásico",
      "quantity": 1,
      "unit": "unit",
      "unit_price": 0,
      "discount": 0,
      "line_total": 0,
      "voided": false,
      "voided_at": null,
      "void_reason": null,
      "id": "6720a3f1c9e2b4d7a1f3e8c5",
      "kind": "combo_component",
      "name": "Jugo de naranja"
    },
    {
      "object": "sale_item",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "parent_item_id": null,
      "product_id": "66b2e47a91c3d05f8e2a4b64",
      "external_code": "COC-104",
      "modifier_id": null,
      "combo_name": null,
      "quantity": 1,
      "unit": "unit",
      "unit_price": 4500,
      "discount": 0,
      "line_total": 4500,
      "voided": true,
      "voided_at": "2026-10-27T09:31:12.045-03:00",
      "void_reason": "Lo pidió por error",
      "id": "6720a3f1c9e2b4d7a1f3e8c6:v1",
      "kind": "product",
      "name": "Tostado de jamón y queso"
    }
  ],
  "payments": [
    {
      "id": "6720b5d2c9e2b4d7a1f3e901",
      "object": "payment",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "kind": "payment",
      "method_id": "card_debit",
      "method_type": "debit",
      "card_brand": "visa",
      "processor": null,
      "amount": 5000,
      "charged_amount": 5000,
      "currency": "ARS",
      "status": "approved",
      "refunded_amount": 0,
      "external_reference": "000184",
      "created_at": "2026-10-27T10:02:47.310-03:00",
      "updated_at": "2026-10-27T10:02:48.004-03:00"
    },
    {
      "id": "6720b5d2c9e2b4d7a1f3e902",
      "object": "payment",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "kind": "payment",
      "method_id": "cash",
      "method_type": "cash",
      "card_brand": null,
      "processor": null,
      "amount": 4810,
      "charged_amount": 4810,
      "currency": "ARS",
      "status": "approved",
      "refunded_amount": 0,
      "external_reference": null,
      "created_at": "2026-10-27T10:02:47.310-03:00",
      "updated_at": "2026-10-27T10:02:48.004-03:00"
    }
  ]
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 404 · not_found
  • 410 · gone
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

Pagos

Pagos, medios de pago y devoluciones.

GET/payments

Listar pagos

Los pagos de las ventas, en el orden de su venta: (updated_at de la venta, venta, lugar del pago). El updated_at de cada pago es el de su venta. Los pagos de una venta son un conjunto: cuando cambia el updated_at de la venta, reemplazá el conjunto entero (un pago puede cambiar de id al corregirse el reparto). Una página no parte los pagos de una venta, salvo que una sola venta tenga más pagos que limit.

Una ronda de mesa abierta (OPEN) y una venta que se quedó sin pagos no salen acá: para SINCRONIZAR cobros conviene /sales, que trae los pagos adentro de cada venta. /payments sirve para consultas puntuales (sale_id, method_id, un rango).

Una devolución sale del pago por cuyo MEDIO volvió la plata (la devuelta en efectivo, del pago en efectivo): charged_amount es lo que se cobró con ese medio y refunded_amount lo que volvió; amount es lo que quedó de la venta en ese medio (Σ amount = total). Un cobro de mesa sale repartido en un pago por ronda: concilialo agrupando por el check_id de la venta y method_id. La propina no está en ningún pago (tip_total de cada venta).

Sin lápidas: una venta borrada sale como lápida en /sales y con ella se van sus pagos. created_from es inclusivo y created_to exclusivo: dos ventanas seguidas no se pisan.

Con method_id o created_*, una página puede venir corta (hasta vacía) con has_more: true: seguí next_cursor. Las terminales tienen tipo other en /payment-methods; el tipo real (débito o crédito) va en cada pago.

Permiso: payments:read

Parámetros

ParámetroTipoDescripción
limitqueryinteger (1 a 500, por defecto 200)

Cuántos objetos por página: de 1 a 500. Sin limit, 200.

cursorquerystring

El next_cursor de la página anterior, tal cual. Sólo vale con los mismos filtros.

branch_idquerylista de stringseparados por coma

Sucursal (/branches). Una o varias separadas por coma. Sin branch_id, todas las de la cuenta. Una que no es de la cuenta es un 403.

updated_sincequerystring (date-time)

Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por id + updated_at.

sale_idquerystring

Sólo los de esta venta.

method_idquerylista de stringseparados por coma

Medio de pago (ver /payment-methods). Uno o varios separados por coma.

created_fromquerystring (date-time)

Registrados desde (inclusivo).

created_toquerystring (date-time)

Registrados hasta (exclusivo).

Respuesta

200 · Una página de pagos. (PaymentList)

Ver ejemplo de respuesta
Respuesta de GET /payments
{
  "object": "list",
  "data": [
    {
      "id": "6720b5d2c9e2b4d7a1f3e901",
      "object": "payment",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "kind": "payment",
      "method_id": "card_debit",
      "method_type": "debit",
      "card_brand": "visa",
      "processor": null,
      "amount": 5000,
      "charged_amount": 5000,
      "currency": "ARS",
      "status": "approved",
      "refunded_amount": 0,
      "external_reference": "000184",
      "created_at": "2026-10-27T10:02:47.310-03:00",
      "updated_at": "2026-10-27T10:02:48.004-03:00"
    },
    {
      "id": "6720b5d2c9e2b4d7a1f3e902",
      "object": "payment",
      "sale_id": "6720a3f1c9e2b4d7a1f3e8c2",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "kind": "payment",
      "method_id": "cash",
      "method_type": "cash",
      "card_brand": null,
      "processor": null,
      "amount": 4810,
      "charged_amount": 4810,
      "currency": "ARS",
      "status": "approved",
      "refunded_amount": 0,
      "external_reference": null,
      "created_at": "2026-10-27T10:02:47.310-03:00",
      "updated_at": "2026-10-27T10:02:48.004-03:00"
    }
  ],
  "has_more": false,
  "next_cursor": null
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

GET/payment-methods

Listar medios de pago

El catálogo de medios con las sucursales donde cada uno está habilitado. Las claves (cash, card_debit, mercadopago_qr…) son estables y las mismas en todas las sucursales. Sin paginar: limit y updated_since se aceptan y no recortan; un cursor es un 400. El type de un medio es el method_type de un pago (PaymentMethod.type ≡ Payment.method_type).

Permiso: payments:read

Parámetros

ParámetroTipoDescripción
limitqueryinteger (1 a 500, por defecto 200)

Cuántos objetos por página: de 1 a 500. Sin limit, 200.

branch_idquerylista de stringseparados por coma

Sucursal (/branches). Una o varias separadas por coma. Sin branch_id, todas las de la cuenta. Una que no es de la cuenta es un 403.

updated_sincequerystring (date-time)

Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por id + updated_at.

Respuesta

200 · Los medios de pago. (PaymentMethodList)

Ver ejemplo de respuesta
Respuesta de GET /payment-methods
{
  "object": "list",
  "data": [
    {
      "id": "cash",
      "object": "payment_method",
      "name": "Efectivo",
      "type": "cash",
      "active": true,
      "branch_ids": [
        "65f1c0a2b7e4d91a3c5e7f10",
        "65f1c0a2b7e4d91a3c5e7f11"
      ]
    },
    {
      "id": "card_debit",
      "object": "payment_method",
      "name": "Tarjeta débito",
      "type": "debit",
      "active": true,
      "branch_ids": [
        "65f1c0a2b7e4d91a3c5e7f10",
        "65f1c0a2b7e4d91a3c5e7f11"
      ]
    },
    {
      "id": "mercadopago_qr",
      "object": "payment_method",
      "name": "QR Mercado Pago",
      "type": "qr",
      "active": true,
      "branch_ids": [
        "65f1c0a2b7e4d91a3c5e7f10"
      ]
    }
  ],
  "has_more": false,
  "next_cursor": null
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

GET/refunds

Listar devoluciones

Las devoluciones de las ventas, con el pago que devolvió cada una y su nota de crédito de ARCA si se emitió. Una nota de crédito emitida después de la devolución no mueve su updated_at: para verla, volvé a pedir /refunds?sale_id=. created_from es inclusivo y created_to exclusivo: dos ventanas seguidas no se pisan.

Permiso: payments:read

Parámetros

ParámetroTipoDescripción
limitqueryinteger (1 a 500, por defecto 200)

Cuántos objetos por página: de 1 a 500. Sin limit, 200.

cursorquerystring

El next_cursor de la página anterior, tal cual. Sólo vale con los mismos filtros.

branch_idquerylista de stringseparados por coma

Sucursal (/branches). Una o varias separadas por coma. Sin branch_id, todas las de la cuenta. Una que no es de la cuenta es un 403.

updated_sincequerystring (date-time)

Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por id + updated_at.

sale_idquerystring

Sólo los de esta venta.

created_fromquerystring (date-time)

Desde (inclusivo).

created_toquerystring (date-time)

Hasta (exclusivo).

Respuesta

200 · Una página de devoluciones. (RefundList)

Ver ejemplo de respuesta
Respuesta de GET /refunds
{
  "object": "list",
  "data": [
    {
      "id": "6721c0e1c9e2b4d7a1f3ea10",
      "object": "refund",
      "sale_id": "6721b9a4c9e2b4d7a1f3e9f0",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f11",
      "payment_id": "6721b9a4c9e2b4d7a1f3e9f0:p0",
      "amount": 4200,
      "currency": "ARS",
      "reason": "Producto en mal estado",
      "status": "succeeded",
      "credit_note": {
        "type": "Nota de Crédito B",
        "point_of_sale": 3,
        "number": 1287,
        "issued_at": "2026-10-28T12:10:31.004-03:00"
      },
      "created_at": "2026-10-28T12:09:58.440-03:00",
      "updated_at": "2026-10-28T12:10:31.517-03:00"
    }
  ],
  "has_more": false,
  "next_cursor": null
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

Reportes

Los totales contra los que se concilia.

GET/reports/daily-sales

Total de una jornada

El total de la jornada por sucursal: el MISMO número que muestra Analítica › Reportes › Ventas. Es contra lo que se concilia la suma de /sales (ver «Conciliación» en el portal): no es la suma de total, porque deja afuera lo que pagaron los créditos de entrada y de mesa VIP (ticket_credit, table_credit), las cortesías en $0 y las anuladas (que van en canceled_*).

Permiso: sales:read

Parámetros

ParámetroTipoDescripción
business_datequery · obligatoriostring (date)

Jornada comercial (AAAA-MM-DD).

branch_idquerylista de stringseparados por coma

Sucursal (/branches). Una o varias separadas por coma. Sin branch_id, todas las de la cuenta. Una que no es de la cuenta es un 403.

Respuesta

200 · Un reporte por sucursal. (DailySalesReportList)

Ver ejemplo de respuesta
Respuesta de GET /reports/daily-sales
{
  "object": "list",
  "data": [
    {
      "object": "daily_sales_report",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "business_date": "2026-10-27",
      "currency": "ARS",
      "sales_count": 214,
      "total": 1284650,
      "canceled_count": 3,
      "canceled_total": 15600
    }
  ],
  "has_more": false,
  "next_cursor": null
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

Catálogo

Productos, combos y categorías; el código externo.

GET/products

Listar productos y combos

Productos y combos de cada sucursal, mezclados en el orden (updated_at, id). updated_at es el último cambio de catálogo: vender y agotar stock no lo mueven. Con updated_since, mezcla las lápidas, sin filtrar por categoría, estado ni código (lo borrado ya no se puede mirar): descartá los ids que no conocés.

Un combo nunca está archivado (active siempre true; uno apagado sale con status: hidden), así que type=combo&active=false viene vacío; category_id no trae combos.

Permiso: catalog:read

Parámetros

ParámetroTipoDescripción
limitqueryinteger (1 a 500, por defecto 200)

Cuántos objetos por página: de 1 a 500. Sin limit, 200.

cursorquerystring

El next_cursor de la página anterior, tal cual. Sólo vale con los mismos filtros.

branch_idquerylista de stringseparados por coma

Sucursal (/branches). Una o varias separadas por coma. Sin branch_id, todas las de la cuenta. Una que no es de la cuenta es un 403.

updated_sincequerystring (date-time)

Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por id + updated_at.

typequerylista de uno de: product · comboseparados por coma

Tipo. Uno o varios separados por coma.

activequeryboolean

false trae sólo los archivados.

category_idquerylista de stringseparados por coma

Categoría. Una o varias separadas por coma.

external_codequerystring (hasta 64 caracteres)

Código externo exacto (sin distinguir mayúsculas). Uno solo: un código puede tener comas.

Respuesta

200 · Una página de productos. (ProductList)

Ver ejemplo de respuesta
Respuesta de GET /products
{
  "object": "list",
  "data": [
    {
      "id": "66b2e47a91c3d05f8e2a4b61",
      "object": "product",
      "type": "product",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "chain_product_id": "66a0f1e291c3d05f8e2a3c01",
      "name": "Café con leche",
      "description": "Café de especialidad con leche entera.",
      "category_id": "66b2e2f091c3d05f8e2a4a10",
      "price": 2800,
      "currency": "ARS",
      "active": true,
      "status": "available",
      "external_code": "CAF-010",
      "barcode": "7790895000997",
      "sold_by_weight": false,
      "is_combo": false,
      "combo_slots": [],
      "created_at": "2026-08-03T15:20:11.000-03:00",
      "updated_at": "2026-10-21T18:44:09.371-03:00"
    },
    {
      "id": "66b2e47a91c3d05f8e2a4b70",
      "object": "product",
      "type": "combo",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "chain_product_id": "66a0f1e291c3d05f8e2a3c09",
      "name": "Desayuno clásico",
      "description": "Medialunas con una bebida a elección.",
      "category_id": null,
      "price": 7500,
      "currency": "ARS",
      "active": true,
      "status": "available",
      "external_code": "CMB-002",
      "barcode": null,
      "sold_by_weight": false,
      "is_combo": true,
      "combo_slots": [
        {
          "name": "Medialunas",
          "min": 1,
          "max": 1,
          "options": [
            {
              "product_id": "66b2e47a91c3d05f8e2a4b62",
              "external_code": "PAN-003",
              "name": "Medialunas (3)",
              "quantity": 1,
              "extra_price": 0
            }
          ]
        },
        {
          "name": "Elegí tu bebida",
          "min": 1,
          "max": 1,
          "options": [
            {
              "product_id": "66b2e47a91c3d05f8e2a4b63",
              "external_code": "BEB-021",
              "name": "Jugo de naranja",
              "quantity": 1,
              "extra_price": 0
            },
            {
              "product_id": "66b2e47a91c3d05f8e2a4b61",
              "external_code": "CAF-010",
              "name": "Café con leche",
              "quantity": 1,
              "extra_price": 500
            }
          ]
        }
      ],
      "created_at": "2026-08-10T11:02:45.000-03:00",
      "updated_at": "2026-10-20T09:12:30.918-03:00"
    }
  ],
  "has_more": false,
  "next_cursor": null
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

GET/products/{id}

Ver un producto o combo

Un producto o combo como está ahora. 404 si no es de la cuenta; 410 si se borró.

Permiso: catalog:read

Parámetros

ParámetroTipoDescripción
iden la ruta · obligatoriostring

Id del objeto (24 caracteres hexadecimales).

Respuesta

200 · El producto. (Product)

Ver ejemplo de respuesta
Respuesta de GET /products/{id}
{
  "id": "66b2e47a91c3d05f8e2a4b61",
  "object": "product",
  "type": "product",
  "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
  "chain_product_id": "66a0f1e291c3d05f8e2a3c01",
  "name": "Café con leche",
  "description": "Café de especialidad con leche entera.",
  "category_id": "66b2e2f091c3d05f8e2a4a10",
  "price": 2800,
  "currency": "ARS",
  "active": true,
  "status": "available",
  "external_code": "CAF-010",
  "barcode": "7790895000997",
  "sold_by_weight": false,
  "is_combo": false,
  "combo_slots": [],
  "created_at": "2026-08-03T15:20:11.000-03:00",
  "updated_at": "2026-10-21T18:44:09.371-03:00"
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 404 · not_found
  • 410 · gone
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

PATCH/products/{id}

Cambiar el código externo

Lo único que se escribe en la v1: el código externo de un producto o combo, para vincularlo con tu sistema. null lo borra. Es único por sucursal, sin distinguir mayúsculas: si otro producto de la sucursal ya lo usa, 409.

En la cuenta de PRUEBA no se guarda: la comparten todos los integradores. Se valida todo igual (400, 404, 410 y el 409 contra los códigos de la cuenta de prueba) y la respuesta es el producto como quedaría, pero el producto sigue igual.

Permiso: catalog:write

Parámetros

ParámetroTipoDescripción
iden la ruta · obligatoriostring

Id del objeto (24 caracteres hexadecimales).

Cuerpo

application/json · ProductUpdate · `application/json`. Un campo de más es un 400.

Ejemplo
{
  "external_code": "CAF-010"
}

Respuesta

200 · El producto con el código nuevo. (Product)

Ver ejemplo de respuesta
Respuesta de PATCH /products/{id}
{
  "id": "66b2e47a91c3d05f8e2a4b61",
  "object": "product",
  "type": "product",
  "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
  "chain_product_id": "66a0f1e291c3d05f8e2a3c01",
  "name": "Café con leche",
  "description": "Café de especialidad con leche entera.",
  "category_id": "66b2e2f091c3d05f8e2a4a10",
  "price": 2800,
  "currency": "ARS",
  "active": true,
  "status": "available",
  "external_code": "CAF-010",
  "barcode": "7790895000997",
  "sold_by_weight": false,
  "is_combo": false,
  "combo_slots": [],
  "created_at": "2026-08-03T15:20:11.000-03:00",
  "updated_at": "2026-10-21T18:44:09.371-03:00"
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 404 · not_found
  • 409 · conflict
  • 410 · gone
  • 415 · unsupported_media_type
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

GET/categories

Listar categorías

Las categorías de la carta de cada sucursal (planas: parent_id es siempre null). Con updated_since, mezcla las lápidas.

Permiso: catalog:read

Parámetros

ParámetroTipoDescripción
limitqueryinteger (1 a 500, por defecto 200)

Cuántos objetos por página: de 1 a 500. Sin limit, 200.

cursorquerystring

El next_cursor de la página anterior, tal cual. Sólo vale con los mismos filtros.

branch_idquerylista de stringseparados por coma

Sucursal (/branches). Una o varias separadas por coma. Sin branch_id, todas las de la cuenta. Una que no es de la cuenta es un 403.

updated_sincequerystring (date-time)

Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por id + updated_at.

activequeryboolean

Sólo las activas (true) o las inactivas (false).

Respuesta

200 · Una página de categorías. (CategoryList)

Ver ejemplo de respuesta
Respuesta de GET /categories
{
  "object": "list",
  "data": [
    {
      "id": "66b2e2f091c3d05f8e2a4a10",
      "object": "category",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "name": "Cafetería",
      "active": true,
      "parent_id": null,
      "position": 1,
      "created_at": "2026-08-03T15:02:00.000-03:00",
      "updated_at": "2026-09-14T10:25:41.226-03:00"
    }
  ],
  "has_more": false,
  "next_cursor": null
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

Clientes

Clientes de la cuenta (datos personales).

GET/customers

Listar clientes

Los clientes de la cuenta: una persona es UNA en toda la cuenta (el mismo id en todas las sucursales), identificada por su teléfono o, si no dejó, por su mail. Trae datos personales: pide customers:read, que una credencial no trae si el dueño no lo elige. Sin lápidas: un cliente no se borra.

phone acepta también el número como lo tengas (lo local se interpreta con el país de la casa matriz); un + sin codificar llega como espacio y funciona igual. Un parámetro que no existe es un 400. Una sucursal que se va de la cadena se lleva a sus clientes.

Permiso: customers:read

Parámetros

ParámetroTipoDescripción
limitqueryinteger (1 a 500, por defecto 200)

Cuántos objetos por página: de 1 a 500. Sin limit, 200.

cursorquerystring

El next_cursor de la página anterior, tal cual. Sólo vale con los mismos filtros.

branch_idquerylista de stringseparados por coma

Sucursal (/branches). Una o varias separadas por coma. Sin branch_id, todas las de la cuenta. Una que no es de la cuenta es un 403.

updated_sincequerystring (date-time)

Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por id + updated_at.

phonequerystring

Teléfono en E.164 (+5491155550000).

emailquerystring (email)

Mail exacto (sin distinguir mayúsculas).

Respuesta

200 · Una página de clientes. (CustomerList)

Ver ejemplo de respuesta
Respuesta de GET /customers
{
  "object": "list",
  "data": [
    {
      "id": "cus_8f2a1c9d0e7b4a65c3d1e2f0",
      "object": "customer",
      "name": "Ana Pérez",
      "phone": "+5491155550000",
      "email": "ana.perez@ejemplo.com",
      "branch_ids": [
        "65f1c0a2b7e4d91a3c5e7f10",
        "65f1c0a2b7e4d91a3c5e7f11"
      ],
      "first_seen_at": "2026-09-02T19:41:08.502-03:00",
      "last_purchase_at": "2026-10-27T10:02:47.310-03:00",
      "created_at": "2026-09-02T19:41:09.117-03:00",
      "updated_at": "2026-10-27T10:03:55.020-03:00"
    }
  ],
  "has_more": false,
  "next_cursor": null
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

GET/customers/{id}

Ver un cliente

Un cliente de la cuenta (cus_…). 404 si no es de la cuenta.

Permiso: customers:read

Parámetros

ParámetroTipoDescripción
iden la ruta · obligatoriostring

Id del cliente (cus_ + 24 caracteres hexadecimales).

Respuesta

200 · El cliente. (Customer)

Ver ejemplo de respuesta
Respuesta de GET /customers/{id}
{
  "id": "cus_8f2a1c9d0e7b4a65c3d1e2f0",
  "object": "customer",
  "name": "Ana Pérez",
  "phone": "+5491155550000",
  "email": "ana.perez@ejemplo.com",
  "branch_ids": [
    "65f1c0a2b7e4d91a3c5e7f10",
    "65f1c0a2b7e4d91a3c5e7f11"
  ],
  "first_seen_at": "2026-09-02T19:41:08.502-03:00",
  "last_purchase_at": "2026-10-27T10:02:47.310-03:00",
  "created_at": "2026-09-02T19:41:09.117-03:00",
  "updated_at": "2026-10-27T10:03:55.020-03:00"
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 404 · not_found
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

Cajas

Cajas cerradas con su arqueo.

GET/cash-sessions

Listar cajas cerradas

Las cajas (turnos) cerradas con su arqueo. Nunca una abierta: con el arqueo ciego, su esperado no lo puede ver el equipo. Una caja que se reabre deja de listarse y vuelve, con su cierre nuevo, cuando se vuelve a cerrar. closed_from es inclusivo y closed_to exclusivo; otro parámetro es un 400.

expected es lo VENDIDO por medio (con las claves de /payment-methods); lo que tenía que haber en el cajón es counted_cash − cash_difference. opened_by es quien abrió la caja (no los relevos); closed_by es null en las cajas cerradas antes del 24-sep-2026.

Permiso: cash:read

Parámetros

ParámetroTipoDescripción
limitqueryinteger (1 a 500, por defecto 200)

Cuántos objetos por página: de 1 a 500. Sin limit, 200.

cursorquerystring

El next_cursor de la página anterior, tal cual. Sólo vale con los mismos filtros.

branch_idquerylista de stringseparados por coma

Sucursal (/branches). Una o varias separadas por coma. Sin branch_id, todas las de la cuenta. Una que no es de la cuenta es un 403.

updated_sincequerystring (date-time)

Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por id + updated_at.

closed_fromquerystring (date-time)

Cerradas desde (inclusivo).

closed_toquerystring (date-time)

Cerradas hasta (exclusivo).

Respuesta

200 · Una página de cajas. (CashSessionList)

Ver ejemplo de respuesta
Respuesta de GET /cash-sessions
{
  "object": "list",
  "data": [
    {
      "id": "6720a0c4c9e2b4d7a1f3e7aa",
      "object": "cash_session",
      "branch_id": "65f1c0a2b7e4d91a3c5e7f10",
      "status": "closed",
      "opened_at": "2026-10-27T07:58:10.000-03:00",
      "closed_at": "2026-10-27T16:05:44.517-03:00",
      "opened_by": {
        "id": "stf_1b9e5c2a7d4f8e03a6c2b9d1",
        "name": "Lucía"
      },
      "closed_by": {
        "id": "stf_1b9e5c2a7d4f8e03a6c2b9d1",
        "name": "Lucía"
      },
      "currency": "ARS",
      "opening_cash": 20000,
      "expected": [
        {
          "method_id": "cash",
          "amount": 164350
        },
        {
          "method_id": "card_debit",
          "amount": 212400
        },
        {
          "method_id": "mercadopago_qr",
          "amount": 96800
        }
      ],
      "counted_cash": 184000,
      "cash_difference": -350,
      "sales_count": 87,
      "sales_total": 473550,
      "updated_at": "2026-10-27T16:05:45.002-03:00"
    }
  ],
  "has_more": false,
  "next_cursor": null
}
  • 400 · invalid_request, invalid_cursor
  • 401 · unauthorized
  • 403 · insufficient_scope, forbidden
  • 429 · rate_limited
  • 5xx · internal_error, service_unavailable

Documentación

Este documento.

GET/openapi.json

Este documento

El documento OpenAPI 3.1 de la API. Público: no pide token. Importalo en Postman o Insomnia, o generá un cliente.

Público: no pide token.

Respuesta

200 · El documento OpenAPI.

    Objetos

    Cada campo viene siempre (con null si no hay dato), salvo los marcados como opcionales. Los listados son { object: "list", data, has_more, next_cursor }.

    DeletedObject

    Lápida de un objeto borrado. Aparece sólo en los listados con updated_since, en el mismo orden que los vivos.

    CampoTipoDescripción
    idstring

    Id del objeto que se borró.

    objectuno de: sale · product · category
    deletedtrue
    branch_idstring

    Sucursal dueña del objeto.

    deleted_atstring (date-time)

    Cuándo se borró. ISO 8601 con el huso de la sucursal.

    updated_atstring (date-time)

    Igual a deleted_at: ordena la lápida en la sincronización incremental. ISO 8601 con el huso de la sucursal.

    Problem

    Error en formato RFC 9457 (application/problem+json).

    CampoTipoDescripción
    typestring

    URL del error en la documentación.

    titlestring
    statusinteger
    detailopcionalstring
    codestring

    Código estable del error (invalid_request, rate_limited…).

    request_idstring
    errorsopcionallista de objeto con field, message
    deleted_atopcionalstring (date-time)

    Sólo en el 410 gone: cuándo se borró, con el huso de la sucursal.

    TokenResponse

    CampoTipoDescripción
    access_tokenstring
    token_type"Bearer"
    expires_ininteger

    Segundos hasta que vence (3600).

    scopestring

    Permisos del token, separados por espacio.

    OAuthError

    Error del endpoint de token (RFC 6749 §5.2).

    CampoTipoDescripción
    erroruno de: invalid_request · invalid_client · invalid_grant · unauthorized_client · unsupported_grant_type · invalid_scope
    error_descriptionopcionalstring

    Branch

    CampoTipoDescripción
    idstring

    Id de la sucursal (único en toda la plataforma).

    object"branch"
    namestring
    external_codestring o null

    Código propio que el comercio le asignó a la sucursal.

    timezonestring
    currencystring (hasta 3 caracteres)

    Código ISO 4217 (ARS, USD, UYU…).

    countrystring o null
    activeboolean

    Si hoy forma parte de la cuenta.

    is_headquartersboolean

    La casa matriz (raíz de la cadena) o el local suelto.

    SaleItem

    Renglón de una venta, en árbol: combos con sus componentes y productos con sus modificadores. La plata está en UN solo nivel: la suma de line_total de los renglones no anulados da el total de la venta.

    CampoTipoDescripción
    idstring

    Id del renglón. Estable entre ediciones.

    object"sale_item"
    sale_idstring

    Venta a la que pertenece.

    parent_item_idstring o null

    Renglón padre (el combo de un componente, el producto de un modificador).

    kinduno de: product · combo · combo_component · modifier
    product_idstring o null

    Producto (o combo, si kind es combo). null en modificadores y en lo que llegó sin vincular.

    external_codestring o null

    Código externo VIGENTE del producto o combo.

    modifier_idstring o null

    Id estable del adicional u opción (sólo modifier).

    namestring

    Nombre al momento de la venta.

    combo_namestring o null

    Nombre del combo del que salió el renglón (también en ventas anteriores a parent_item_id).

    quantitynumber

    Hasta 3 decimales. En la venta al peso, en kilos.

    unituno de: unit · kg
    unit_pricenumber

    Precio unitario con IVA, antes de los descuentos de la venta. En la moneda de la sucursal, con hasta 2 decimales.

    discountnumber

    Parte del descuento de la venta que le toca a este renglón. En la moneda de la sucursal, con hasta 2 decimales.

    line_totalnumber

    unit_price × quantity − discount. En la moneda de la sucursal, con hasta 2 decimales.

    voidedboolean

    El renglón se anuló. Siempre presente.

    voided_atstring (date-time) o null

    Cuándo se anuló. ISO 8601 con el huso de la sucursal.

    void_reasonstring o null

    Payment

    Pago de una venta. En las ventas CLOSED y REFUNDED, la suma de amount de los pagos que no están canceled da el total de la venta (salvo la ronda OPEN, sin pagos, y la mesa VIP con faltante sin cobrar). En una CANCELED, los pagos salen approved si la plata quedó en la caja y canceled si nunca se cobró.

    CampoTipoDescripción
    idstring

    Id del pago.

    object"payment"
    sale_idstring

    Venta que paga.

    branch_idstring

    Sucursal.

    kinduno de: payment · credit · on_account · deposit · ticket_credit · table_credit

    payment es plata que entró. Los demás son créditos que cubren parte del total (crédito de empresa, cuenta corriente, seña, consumo de entrada, crédito de mesa).

    method_idstring

    Medio de pago (ver /payment-methods).

    method_typeuno de: cash · debit · credit · transfer · qr · wallet · other
    card_brandstring o null
    processorstring o null

    Terminal o pasarela que procesó el cobro (mercadopago, getnet, nave…).

    amountnumber

    Parte del total de la venta que cubre este pago (con una devolución parcial, lo que QUEDÓ en este medio). En la moneda de la sucursal, con hasta 2 decimales.

    charged_amountnumber o null

    Lo que se cobró de verdad con este medio (incluye servicio, propina y envío en lo online), sin restarle lo devuelto. En la moneda de la sucursal, con hasta 2 decimales.

    currencystring (hasta 3 caracteres)

    Código ISO 4217 (ARS, USD, UYU…).

    statusuno de: approved · partially_refunded · refunded · canceled
    refunded_amountnumber

    Lo devuelto por el medio de este pago. En la moneda de la sucursal, con hasta 2 decimales.

    external_referencestring o null

    Número de operación de la pasarela o la terminal.

    created_atstring (date-time)

    Cuándo se registró. ISO 8601 con el huso de la sucursal.

    updated_atstring (date-time)

    Última modificación. ISO 8601 con el huso de la sucursal.

    SaleDiscount

    CampoTipoDescripción
    typeuno de: table · company · benefit · manual · code · other
    namestring o null
    amountnumber

    Monto descontado. En la moneda de la sucursal, con hasta 2 decimales.

    StaffRef

    Alguien del equipo del local. Nunca trae el mail.

    CampoTipoDescripción
    idstring

    Id opaco de la persona del equipo (estable en la cuenta).

    namestring o null

    Sale

    Una venta: una orden de Kicket. En la mesa, cada ronda es una venta y check_id las agrupa.

    CampoTipoDescripción
    idstring

    Id de la venta (único en toda la plataforma).

    object"sale"
    branch_idstring

    Sucursal.

    numberstring o null

    Número visible de la orden.

    statusuno de: OPEN · CLOSED · CANCELED · REFUNDED

    OPEN: ronda de mesa sin cobrar. CLOSED: cobrada. CANCELED: anulada sin devolver plata. REFUNDED: anulada con devolución total. Una devolución parcial deja CLOSED.

    channeluno de: counter · table · qr_table · online · delivery · kiosk · other
    tablestring o null
    check_idstring o null

    Agrupa las rondas de una misma mesa: cada ronda es una venta.

    business_datestring (date)

    Jornada comercial (corta a las 06:00, como los reportes de Kicket).

    opened_atstring (date-time)

    Apertura. ISO 8601 con el huso de la sucursal.

    closed_atstring (date-time) o null

    Cobro. ISO 8601 con el huso de la sucursal.

    canceled_atstring (date-time) o null

    Anulación. ISO 8601 con el huso de la sucursal.

    updated_atstring (date-time)

    Última modificación (incluye anulaciones y ediciones posteriores al cierre). ISO 8601 con el huso de la sucursal.

    currencystring (hasta 3 caracteres)

    Código ISO 4217 (ARS, USD, UYU…).

    subtotalnumber

    Suma de los renglones antes de los descuentos de la venta. En la moneda de la sucursal, con hasta 2 decimales.

    discount_totalnumber

    Descuentos de la venta. En la moneda de la sucursal, con hasta 2 decimales.

    totalnumber

    Total con IVA, neto de descuentos. No incluye servicio, propina ni envío. En la moneda de la sucursal, con hasta 2 decimales.

    service_feenumber

    Costo de servicio que pagó el cliente. En la moneda de la sucursal, con hasta 2 decimales.

    tip_totalnumber

    Propina. En la moneda de la sucursal, con hasta 2 decimales.

    delivery_feenumber

    Costo de envío. En la moneda de la sucursal, con hasta 2 decimales.

    discountslista de SaleDiscount
    customer_idstring o null

    Cliente de la cuenta (ver /customers). null si fue anónima.

    cash_session_idstring o null

    Caja (turno) donde se cobró.

    cashierStaffRef o null
    waiterStaffRef o null
    coversinteger o null

    Cubiertos de la mesa.

    void_reasonstring o null
    ready_atstring (date-time) o null

    Cuándo el pedido quedó listo. ISO 8601 con el huso de la sucursal.

    delivered_atstring (date-time) o null

    Cuándo se entregó. ISO 8601 con el huso de la sucursal.

    itemslista de SaleItem
    paymentslista de Payment
    customeropcionalCustomer o null

    Sólo con include=customer y el permiso customers:read.

    DailySalesReport

    El número contra el que se concilia la suma de las ventas de una jornada.

    CampoTipoDescripción
    object"daily_sales_report"
    branch_idstring

    Sucursal.

    business_datestring (date)
    currencystring (hasta 3 caracteres)

    Código ISO 4217 (ARS, USD, UYU…).

    sales_countinteger
    totalnumber

    Lo mismo que muestra Analítica › Reportes › Ventas para esa jornada. En la moneda de la sucursal, con hasta 2 decimales.

    canceled_countinteger
    canceled_totalnumber

    Ventas anuladas (no suman al total). En la moneda de la sucursal, con hasta 2 decimales.

    PaymentMethod

    CampoTipoDescripción
    idstring

    Clave estable del medio (cash, card_debit, mercadopago_qr…).

    object"payment_method"
    namestring
    typeuno de: cash · debit · credit · transfer · qr · wallet · other
    activeboolean

    Habilitado en al menos una sucursal.

    branch_idslista de string

    Sucursales donde está habilitado.

    Refund

    CampoTipoDescripción
    idstring

    Id de la devolución.

    object"refund"
    sale_idstring

    Venta.

    branch_idstring

    Sucursal.

    payment_idstring o null
    amountnumber

    Monto devuelto. En la moneda de la sucursal, con hasta 2 decimales.

    currencystring (hasta 3 caracteres)

    Código ISO 4217 (ARS, USD, UYU…).

    reasonstring o null
    statusuno de: pending · succeeded · failed
    credit_noteobjeto con type, point_of_sale, number, issued_at o null

    Nota de crédito de ARCA, si se emitió.

    created_atstring (date-time)

    Alta. ISO 8601 con el huso de la sucursal.

    updated_atstring (date-time)

    Última modificación. ISO 8601 con el huso de la sucursal.

    ComboOption

    CampoTipoDescripción
    product_idstring

    Producto.

    external_codestring o null
    namestring
    quantitynumber
    extra_pricenumber

    Recargo por elegir esta opción. En la moneda de la sucursal, con hasta 2 decimales.

    ComboSlot

    Un paso del combo («Elegí tu bebida»). Los componentes fijos van en un paso con una sola opción.

    CampoTipoDescripción
    namestring
    mininteger
    maxinteger
    optionslista de ComboOption

    Product

    CampoTipoDescripción
    idstring

    Id del producto o combo en la sucursal.

    object"product"
    typeuno de: product · combo
    branch_idstring

    Sucursal.

    chain_product_idstring o null

    Mismo valor para las copias del producto en todas las sucursales de la cadena.

    namestring
    descriptionstring o null
    category_idstring o null
    pricenumber

    Precio vigente con IVA. En la moneda de la sucursal, con hasta 2 decimales.

    currencystring (hasta 3 caracteres)

    Código ISO 4217 (ARS, USD, UYU…).

    activeboolean

    false si está archivado.

    statusuno de: available · hidden · out_of_stock · archived
    external_codestring o null

    Código propio del comercio (único por sucursal). Se edita en Kicket o con PATCH.

    barcodestring o null

    Código de barras del producto (el de fábrica o uno propio; único por sucursal). null si no tiene, y siempre en los combos.

    sold_by_weightboolean
    is_comboboolean
    combo_slotslista de ComboSlot

    Vacío si no es combo.

    created_atstring (date-time)

    Alta. ISO 8601 con el huso de la sucursal.

    updated_atstring (date-time)

    Último cambio de catálogo (el stock no lo mueve). ISO 8601 con el huso de la sucursal.

    ProductUpdate

    CampoTipoDescripción
    external_codestring (hasta 64 caracteres) o null

    Nuevo código externo; null lo borra.

    Category

    CampoTipoDescripción
    idstring

    Id de la categoría.

    object"category"
    branch_idstring

    Sucursal.

    namestring
    activeboolean
    parent_idnull

    Las categorías son planas: siempre null.

    positioninteger o null
    created_atstring (date-time)

    Alta. ISO 8601 con el huso de la sucursal.

    updated_atstring (date-time)

    Última modificación. ISO 8601 con el huso de la sucursal.

    Customer

    Datos personales: requiere el permiso customers:read.

    CampoTipoDescripción
    idstring

    Id del cliente, único en la cuenta (el mismo en todas las sucursales).

    object"customer"
    namestring o null
    phonestring o null

    E.164 con +.

    emailstring o null
    branch_idslista de string

    Sucursales donde compró o se registró.

    first_seen_atstring (date-time) o null

    Primera vez que se lo vio. ISO 8601 con el huso de la sucursal.

    last_purchase_atstring (date-time) o null

    Última compra. ISO 8601 con el huso de la sucursal.

    created_atstring (date-time)

    Alta en la cuenta. ISO 8601 con el huso de la sucursal.

    updated_atstring (date-time)

    Última modificación de sus datos. ISO 8601 con el huso de la sucursal.

    CashSession

    CampoTipoDescripción
    idstring

    Id de la caja (turno).

    object"cash_session"
    branch_idstring

    Sucursal.

    status"closed"

    Sólo se exponen cajas cerradas.

    opened_atstring (date-time)

    Apertura. ISO 8601 con el huso de la sucursal.

    closed_atstring (date-time)

    Cierre. ISO 8601 con el huso de la sucursal.

    opened_byStaffRef o null
    closed_byStaffRef o null
    currencystring (hasta 3 caracteres)

    Código ISO 4217 (ARS, USD, UYU…).

    opening_cashnumber

    Efectivo inicial. En la moneda de la sucursal, con hasta 2 decimales.

    expectedlista de objeto con method_id, amount

    Lo esperado por medio de pago según las ventas.

    counted_cashnumber o null

    Efectivo contado al cerrar. En la moneda de la sucursal, con hasta 2 decimales.

    cash_differencenumber o null

    Contado − esperado en efectivo. En la moneda de la sucursal, con hasta 2 decimales.

    sales_countinteger
    sales_totalnumber

    Total vendido en el turno. En la moneda de la sucursal, con hasta 2 decimales.

    updated_atstring (date-time)

    Última modificación. ISO 8601 con el huso de la sucursal.

    WebhookEvent

    Cuerpo de cada webhook (spec Standard Webhooks). Las cabeceras webhook-id, webhook-timestamp y webhook-signature firman el cuerpo.

    CampoTipoDescripción
    typeuno de: sale.closed · sale.updated · sale.canceled · sale.refunded · sale.deleted · product.updated · product.deleted · test.ping
    timestampstring (date-time)
    dataobject

    El objeto como lo devuelve la API (una venta, un producto o una lápida).

    BranchList

    Las sucursales de la cuenta. Sin paginar: vienen todas.

    CampoTipoDescripción
    object"list"
    datalista de Branch
    has_moreboolean

    true si hay más páginas. Una página puede traer menos de limit (hasta ninguno) y seguir con true.

    next_cursorstring o null

    Pasalo en cursor (con los mismos filtros) para la página siguiente. null si no hay más.

    SaleList

    Ventas. Con updated_since, mezcla lápidas (DeletedObject) en el mismo orden.

    CampoTipoDescripción
    object"list"
    datalista de Sale o DeletedObject
    has_moreboolean

    true si hay más páginas. Una página puede traer menos de limit (hasta ninguno) y seguir con true.

    next_cursorstring o null

    Pasalo en cursor (con los mismos filtros) para la página siguiente. null si no hay más.

    PaymentList

    Pagos, en el orden de su venta.

    CampoTipoDescripción
    object"list"
    datalista de Payment
    has_moreboolean

    true si hay más páginas. Una página puede traer menos de limit (hasta ninguno) y seguir con true.

    next_cursorstring o null

    Pasalo en cursor (con los mismos filtros) para la página siguiente. null si no hay más.

    PaymentMethodList

    Los medios de pago. Sin paginar: vienen todos.

    CampoTipoDescripción
    object"list"
    datalista de PaymentMethod
    has_moreboolean

    true si hay más páginas. Una página puede traer menos de limit (hasta ninguno) y seguir con true.

    next_cursorstring o null

    Pasalo en cursor (con los mismos filtros) para la página siguiente. null si no hay más.

    RefundList

    Devoluciones.

    CampoTipoDescripción
    object"list"
    datalista de Refund
    has_moreboolean

    true si hay más páginas. Una página puede traer menos de limit (hasta ninguno) y seguir con true.

    next_cursorstring o null

    Pasalo en cursor (con los mismos filtros) para la página siguiente. null si no hay más.

    DailySalesReportList

    Un reporte por sucursal pedida.

    CampoTipoDescripción
    object"list"
    datalista de DailySalesReport
    has_moreboolean

    true si hay más páginas. Una página puede traer menos de limit (hasta ninguno) y seguir con true.

    next_cursorstring o null

    Pasalo en cursor (con los mismos filtros) para la página siguiente. null si no hay más.

    ProductList

    Productos y combos. Con updated_since, mezcla lápidas en el mismo orden.

    CampoTipoDescripción
    object"list"
    datalista de Product o DeletedObject
    has_moreboolean

    true si hay más páginas. Una página puede traer menos de limit (hasta ninguno) y seguir con true.

    next_cursorstring o null

    Pasalo en cursor (con los mismos filtros) para la página siguiente. null si no hay más.

    CategoryList

    Categorías. Con updated_since, mezcla lápidas en el mismo orden.

    CampoTipoDescripción
    object"list"
    datalista de Category o DeletedObject
    has_moreboolean

    true si hay más páginas. Una página puede traer menos de limit (hasta ninguno) y seguir con true.

    next_cursorstring o null

    Pasalo en cursor (con los mismos filtros) para la página siguiente. null si no hay más.

    CustomerList

    Clientes de la cuenta.

    CampoTipoDescripción
    object"list"
    datalista de Customer
    has_moreboolean

    true si hay más páginas. Una página puede traer menos de limit (hasta ninguno) y seguir con true.

    next_cursorstring o null

    Pasalo en cursor (con los mismos filtros) para la página siguiente. null si no hay más.

    CashSessionList

    Cajas cerradas.

    CampoTipoDescripción
    object"list"
    datalista de CashSession
    has_moreboolean

    true si hay más páginas. Una página puede traer menos de limit (hasta ninguno) y seguir con true.

    next_cursorstring o null

    Pasalo en cursor (con los mismos filtros) para la página siguiente. null si no hay más.

    ApiIndex

    Con qué cuenta y en qué entorno está hablando el token.

    CampoTipoDescripción
    object"api"
    version"1"
    docs_urlstring

    Este portal.

    openapi_urlstring

    Este documento.

    accountobjeto con id, name

    La cuenta que lee el token.

    environmentuno de: live · test

    live lee la cuenta real; test, la cuenta de prueba.

    TokenRequest

    CampoTipoDescripción
    grant_type"client_credentials"
    scopeopcionalstring

    Permisos pedidos, separados por espacio. Sin él, todos los de la credencial.

    client_idopcionalstring

    Sólo si no mandás la credencial por Authorization: Basic.

    client_secretopcionalstring

    Sólo si no mandás la credencial por Authorization: Basic.

    AnteriorModelo de datosSiguienteDescargas