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
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.
grant_type=client_credentials&scope=sales%3Aread+payments%3AreadRespuesta
200 · El token. (TokenResponse)
Ver ejemplo de respuesta
{
"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
{
"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ámetro | Tipo | Descripción |
|---|---|---|
limitquery | integer (1 a 500, por defecto 200) | Cuántos objetos por página: de 1 a 500. Sin |
branch_idquery | lista de stringseparados por coma | Sucursal ( |
updated_sincequery | string (date-time) | Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por |
Respuesta
200 · Las sucursales. (BranchList)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
limitquery | integer (1 a 500, por defecto 200) | Cuántos objetos por página: de 1 a 500. Sin |
cursorquery | string | El |
branch_idquery | lista de stringseparados por coma | Sucursal ( |
updated_sincequery | string (date-time) | Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por |
statusquery | lista de uno de: OPEN · CLOSED · CANCELED · REFUNDEDseparados por coma | Estado de la venta. Uno o varios separados por coma. |
channelquery | lista de uno de: counter · table · qr_table · online · delivery · kiosk · otherseparados por coma | Canal de la venta. Uno o varios separados por coma. |
business_datequery | string (date) | Jornada comercial ( |
opened_fromquery | string (date-time) | Abiertas desde (inclusivo). |
opened_toquery | string (date-time) | Abiertas hasta (exclusivo). |
closed_fromquery | string (date-time) | Cobradas desde (inclusivo). |
closed_toquery | string (date-time) | Cobradas hasta (exclusivo). |
includequery | lista de uno de: items · items.components · payments · customerseparados por coma |
|
Respuesta
200 · Una página de ventas. (SaleList)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
iden la ruta · obligatorio | string | Id del objeto (24 caracteres hexadecimales). |
includequery | lista de uno de: items · items.components · payments · customerseparados por coma |
|
Respuesta
200 · La venta. (Sale)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
limitquery | integer (1 a 500, por defecto 200) | Cuántos objetos por página: de 1 a 500. Sin |
cursorquery | string | El |
branch_idquery | lista de stringseparados por coma | Sucursal ( |
updated_sincequery | string (date-time) | Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por |
sale_idquery | string | Sólo los de esta venta. |
method_idquery | lista de stringseparados por coma | Medio de pago (ver |
created_fromquery | string (date-time) | Registrados desde (inclusivo). |
created_toquery | string (date-time) | Registrados hasta (exclusivo). |
Respuesta
200 · Una página de pagos. (PaymentList)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
limitquery | integer (1 a 500, por defecto 200) | Cuántos objetos por página: de 1 a 500. Sin |
branch_idquery | lista de stringseparados por coma | Sucursal ( |
updated_sincequery | string (date-time) | Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por |
Respuesta
200 · Los medios de pago. (PaymentMethodList)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
limitquery | integer (1 a 500, por defecto 200) | Cuántos objetos por página: de 1 a 500. Sin |
cursorquery | string | El |
branch_idquery | lista de stringseparados por coma | Sucursal ( |
updated_sincequery | string (date-time) | Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por |
sale_idquery | string | Sólo los de esta venta. |
created_fromquery | string (date-time) | Desde (inclusivo). |
created_toquery | string (date-time) | Hasta (exclusivo). |
Respuesta
200 · Una página de devoluciones. (RefundList)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
business_datequery · obligatorio | string (date) | Jornada comercial ( |
branch_idquery | lista de stringseparados por coma | Sucursal ( |
Respuesta
200 · Un reporte por sucursal. (DailySalesReportList)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
limitquery | integer (1 a 500, por defecto 200) | Cuántos objetos por página: de 1 a 500. Sin |
cursorquery | string | El |
branch_idquery | lista de stringseparados por coma | Sucursal ( |
updated_sincequery | string (date-time) | Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por |
typequery | lista de uno de: product · comboseparados por coma | Tipo. Uno o varios separados por coma. |
activequery | boolean |
|
category_idquery | lista de stringseparados por coma | Categoría. Una o varias separadas por coma. |
external_codequery | string (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
{
"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ámetro | Tipo | Descripción |
|---|---|---|
iden la ruta · obligatorio | string | Id del objeto (24 caracteres hexadecimales). |
Respuesta
200 · El producto. (Product)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
iden la ruta · obligatorio | string | Id del objeto (24 caracteres hexadecimales). |
Cuerpo
application/json · ProductUpdate · `application/json`. Un campo de más es un 400.
{
"external_code": "CAF-010"
}Respuesta
200 · El producto con el código nuevo. (Product)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
limitquery | integer (1 a 500, por defecto 200) | Cuántos objetos por página: de 1 a 500. Sin |
cursorquery | string | El |
branch_idquery | lista de stringseparados por coma | Sucursal ( |
updated_sincequery | string (date-time) | Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por |
activequery | boolean | Sólo las activas ( |
Respuesta
200 · Una página de categorías. (CategoryList)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
limitquery | integer (1 a 500, por defecto 200) | Cuántos objetos por página: de 1 a 500. Sin |
cursorquery | string | El |
branch_idquery | lista de stringseparados por coma | Sucursal ( |
updated_sincequery | string (date-time) | Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por |
phonequery | string | Teléfono en E.164 ( |
emailquery | string (email) | Mail exacto (sin distinguir mayúsculas). |
Respuesta
200 · Una página de clientes. (CustomerList)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
iden la ruta · obligatorio | string | Id del cliente ( |
Respuesta
200 · El cliente. (Customer)
Ver ejemplo de respuesta
{
"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ámetro | Tipo | Descripción |
|---|---|---|
limitquery | integer (1 a 500, por defecto 200) | Cuántos objetos por página: de 1 a 500. Sin |
cursorquery | string | El |
branch_idquery | lista de stringseparados por coma | Sucursal ( |
updated_sincequery | string (date-time) | Modificados desde este instante (inclusivo), con huso. Trae también las lápidas de lo borrado. Solapá 5 minutos y deduplicá por |
closed_fromquery | string (date-time) | Cerradas desde (inclusivo). |
closed_toquery | string (date-time) | Cerradas hasta (exclusivo). |
Respuesta
200 · Una página de cajas. (CashSessionList)
Ver ejemplo de respuesta
{
"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
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.
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id del objeto que se borró. |
object | uno de: sale · product · category | |
deleted | true | |
branch_id | string | Sucursal dueña del objeto. |
deleted_at | string (date-time) | Cuándo se borró. ISO 8601 con el huso de la sucursal. |
updated_at | string (date-time) | Igual a |
Problem
Error en formato RFC 9457 (application/problem+json).
| Campo | Tipo | Descripción |
|---|---|---|
type | string | URL del error en la documentación. |
title | string | |
status | integer | |
detailopcional | string | |
code | string | Código estable del error ( |
request_id | string | |
errorsopcional | lista de objeto con field, message | |
deleted_atopcional | string (date-time) | Sólo en el 410 |
TokenResponse
| Campo | Tipo | Descripción |
|---|---|---|
access_token | string | |
token_type | "Bearer" | |
expires_in | integer | Segundos hasta que vence (3600). |
scope | string | Permisos del token, separados por espacio. |
OAuthError
Error del endpoint de token (RFC 6749 §5.2).
| Campo | Tipo | Descripción |
|---|---|---|
error | uno de: invalid_request · invalid_client · invalid_grant · unauthorized_client · unsupported_grant_type · invalid_scope | |
error_descriptionopcional | string |
Branch
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id de la sucursal (único en toda la plataforma). |
object | "branch" | |
name | string | |
external_code | string o null | Código propio que el comercio le asignó a la sucursal. |
timezone | string | |
currency | string (hasta 3 caracteres) | Código ISO 4217 (ARS, USD, UYU…). |
country | string o null | |
active | boolean | Si hoy forma parte de la cuenta. |
is_headquarters | boolean | 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.
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id del renglón. Estable entre ediciones. |
object | "sale_item" | |
sale_id | string | Venta a la que pertenece. |
parent_item_id | string o null | Renglón padre (el combo de un componente, el producto de un modificador). |
kind | uno de: product · combo · combo_component · modifier | |
product_id | string o null | Producto (o combo, si |
external_code | string o null | Código externo VIGENTE del producto o combo. |
modifier_id | string o null | Id estable del adicional u opción (sólo |
name | string | Nombre al momento de la venta. |
combo_name | string o null | Nombre del combo del que salió el renglón (también en ventas anteriores a |
quantity | number | Hasta 3 decimales. En la venta al peso, en kilos. |
unit | uno de: unit · kg | |
unit_price | number | Precio unitario con IVA, antes de los descuentos de la venta. En la moneda de la sucursal, con hasta 2 decimales. |
discount | number | Parte del descuento de la venta que le toca a este renglón. En la moneda de la sucursal, con hasta 2 decimales. |
line_total | number |
|
voided | boolean | El renglón se anuló. Siempre presente. |
voided_at | string (date-time) o null | Cuándo se anuló. ISO 8601 con el huso de la sucursal. |
void_reason | string 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ó.
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id del pago. |
object | "payment" | |
sale_id | string | Venta que paga. |
branch_id | string | Sucursal. |
kind | uno de: payment · credit · on_account · deposit · ticket_credit · table_credit |
|
method_id | string | Medio de pago (ver |
method_type | uno de: cash · debit · credit · transfer · qr · wallet · other | |
card_brand | string o null | |
processor | string o null | Terminal o pasarela que procesó el cobro ( |
amount | number | 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_amount | number 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. |
currency | string (hasta 3 caracteres) | Código ISO 4217 (ARS, USD, UYU…). |
status | uno de: approved · partially_refunded · refunded · canceled | |
refunded_amount | number | Lo devuelto por el medio de este pago. En la moneda de la sucursal, con hasta 2 decimales. |
external_reference | string o null | Número de operación de la pasarela o la terminal. |
created_at | string (date-time) | Cuándo se registró. ISO 8601 con el huso de la sucursal. |
updated_at | string (date-time) | Última modificación. ISO 8601 con el huso de la sucursal. |
SaleDiscount
| Campo | Tipo | Descripción |
|---|---|---|
type | uno de: table · company · benefit · manual · code · other | |
name | string o null | |
amount | number | Monto descontado. En la moneda de la sucursal, con hasta 2 decimales. |
StaffRef
Alguien del equipo del local. Nunca trae el mail.
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id opaco de la persona del equipo (estable en la cuenta). |
name | string o null |
Sale
Una venta: una orden de Kicket. En la mesa, cada ronda es una venta y check_id las agrupa.
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id de la venta (único en toda la plataforma). |
object | "sale" | |
branch_id | string | Sucursal. |
number | string o null | Número visible de la orden. |
status | uno de: OPEN · CLOSED · CANCELED · REFUNDED |
|
channel | uno de: counter · table · qr_table · online · delivery · kiosk · other | |
table | string o null | |
check_id | string o null | Agrupa las rondas de una misma mesa: cada ronda es una venta. |
business_date | string (date) | Jornada comercial (corta a las 06:00, como los reportes de Kicket). |
opened_at | string (date-time) | Apertura. ISO 8601 con el huso de la sucursal. |
closed_at | string (date-time) o null | Cobro. ISO 8601 con el huso de la sucursal. |
canceled_at | string (date-time) o null | Anulación. ISO 8601 con el huso de la sucursal. |
updated_at | string (date-time) | Última modificación (incluye anulaciones y ediciones posteriores al cierre). ISO 8601 con el huso de la sucursal. |
currency | string (hasta 3 caracteres) | Código ISO 4217 (ARS, USD, UYU…). |
subtotal | number | Suma de los renglones antes de los descuentos de la venta. En la moneda de la sucursal, con hasta 2 decimales. |
discount_total | number | Descuentos de la venta. En la moneda de la sucursal, con hasta 2 decimales. |
total | number | Total con IVA, neto de descuentos. No incluye servicio, propina ni envío. En la moneda de la sucursal, con hasta 2 decimales. |
service_fee | number | Costo de servicio que pagó el cliente. En la moneda de la sucursal, con hasta 2 decimales. |
tip_total | number | Propina. En la moneda de la sucursal, con hasta 2 decimales. |
delivery_fee | number | Costo de envío. En la moneda de la sucursal, con hasta 2 decimales. |
discounts | lista de SaleDiscount | |
customer_id | string o null | Cliente de la cuenta (ver |
cash_session_id | string o null | Caja (turno) donde se cobró. |
cashier | StaffRef o null | |
waiter | StaffRef o null | |
covers | integer o null | Cubiertos de la mesa. |
void_reason | string o null | |
ready_at | string (date-time) o null | Cuándo el pedido quedó listo. ISO 8601 con el huso de la sucursal. |
delivered_at | string (date-time) o null | Cuándo se entregó. ISO 8601 con el huso de la sucursal. |
items | lista de SaleItem | |
payments | lista de Payment | |
customeropcional | Customer o null | Sólo con |
DailySalesReport
El número contra el que se concilia la suma de las ventas de una jornada.
| Campo | Tipo | Descripción |
|---|---|---|
object | "daily_sales_report" | |
branch_id | string | Sucursal. |
business_date | string (date) | |
currency | string (hasta 3 caracteres) | Código ISO 4217 (ARS, USD, UYU…). |
sales_count | integer | |
total | number | Lo mismo que muestra Analítica › Reportes › Ventas para esa jornada. En la moneda de la sucursal, con hasta 2 decimales. |
canceled_count | integer | |
canceled_total | number | Ventas anuladas (no suman al total). En la moneda de la sucursal, con hasta 2 decimales. |
PaymentMethod
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Clave estable del medio ( |
object | "payment_method" | |
name | string | |
type | uno de: cash · debit · credit · transfer · qr · wallet · other | |
active | boolean | Habilitado en al menos una sucursal. |
branch_ids | lista de string | Sucursales donde está habilitado. |
Refund
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id de la devolución. |
object | "refund" | |
sale_id | string | Venta. |
branch_id | string | Sucursal. |
payment_id | string o null | |
amount | number | Monto devuelto. En la moneda de la sucursal, con hasta 2 decimales. |
currency | string (hasta 3 caracteres) | Código ISO 4217 (ARS, USD, UYU…). |
reason | string o null | |
status | uno de: pending · succeeded · failed | |
credit_note | objeto con type, point_of_sale, number, issued_at o null | Nota de crédito de ARCA, si se emitió. |
created_at | string (date-time) | Alta. ISO 8601 con el huso de la sucursal. |
updated_at | string (date-time) | Última modificación. ISO 8601 con el huso de la sucursal. |
ComboOption
| Campo | Tipo | Descripción |
|---|---|---|
product_id | string | Producto. |
external_code | string o null | |
name | string | |
quantity | number | |
extra_price | number | 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.
| Campo | Tipo | Descripción |
|---|---|---|
name | string | |
min | integer | |
max | integer | |
options | lista de ComboOption |
Product
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id del producto o combo en la sucursal. |
object | "product" | |
type | uno de: product · combo | |
branch_id | string | Sucursal. |
chain_product_id | string o null | Mismo valor para las copias del producto en todas las sucursales de la cadena. |
name | string | |
description | string o null | |
category_id | string o null | |
price | number | Precio vigente con IVA. En la moneda de la sucursal, con hasta 2 decimales. |
currency | string (hasta 3 caracteres) | Código ISO 4217 (ARS, USD, UYU…). |
active | boolean |
|
status | uno de: available · hidden · out_of_stock · archived | |
external_code | string o null | Código propio del comercio (único por sucursal). Se edita en Kicket o con |
barcode | string o null | Código de barras del producto (el de fábrica o uno propio; único por sucursal). |
sold_by_weight | boolean | |
is_combo | boolean | |
combo_slots | lista de ComboSlot | Vacío si no es combo. |
created_at | string (date-time) | Alta. ISO 8601 con el huso de la sucursal. |
updated_at | string (date-time) | Último cambio de catálogo (el stock no lo mueve). ISO 8601 con el huso de la sucursal. |
ProductUpdate
| Campo | Tipo | Descripción |
|---|---|---|
external_code | string (hasta 64 caracteres) o null | Nuevo código externo; |
Category
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id de la categoría. |
object | "category" | |
branch_id | string | Sucursal. |
name | string | |
active | boolean | |
parent_id | null | Las categorías son planas: siempre |
position | integer o null | |
created_at | string (date-time) | Alta. ISO 8601 con el huso de la sucursal. |
updated_at | string (date-time) | Última modificación. ISO 8601 con el huso de la sucursal. |
Customer
Datos personales: requiere el permiso customers:read.
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id del cliente, único en la cuenta (el mismo en todas las sucursales). |
object | "customer" | |
name | string o null | |
phone | string o null | E.164 con |
email | string o null | |
branch_ids | lista de string | Sucursales donde compró o se registró. |
first_seen_at | string (date-time) o null | Primera vez que se lo vio. ISO 8601 con el huso de la sucursal. |
last_purchase_at | string (date-time) o null | Última compra. ISO 8601 con el huso de la sucursal. |
created_at | string (date-time) | Alta en la cuenta. ISO 8601 con el huso de la sucursal. |
updated_at | string (date-time) | Última modificación de sus datos. ISO 8601 con el huso de la sucursal. |
CashSession
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Id de la caja (turno). |
object | "cash_session" | |
branch_id | string | Sucursal. |
status | "closed" | Sólo se exponen cajas cerradas. |
opened_at | string (date-time) | Apertura. ISO 8601 con el huso de la sucursal. |
closed_at | string (date-time) | Cierre. ISO 8601 con el huso de la sucursal. |
opened_by | StaffRef o null | |
closed_by | StaffRef o null | |
currency | string (hasta 3 caracteres) | Código ISO 4217 (ARS, USD, UYU…). |
opening_cash | number | Efectivo inicial. En la moneda de la sucursal, con hasta 2 decimales. |
expected | lista de objeto con method_id, amount | Lo esperado por medio de pago según las ventas. |
counted_cash | number o null | Efectivo contado al cerrar. En la moneda de la sucursal, con hasta 2 decimales. |
cash_difference | number o null | Contado − esperado en efectivo. En la moneda de la sucursal, con hasta 2 decimales. |
sales_count | integer | |
sales_total | number | Total vendido en el turno. En la moneda de la sucursal, con hasta 2 decimales. |
updated_at | string (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.
| Campo | Tipo | Descripción |
|---|---|---|
type | uno de: sale.closed · sale.updated · sale.canceled · sale.refunded · sale.deleted · product.updated · product.deleted · test.ping | |
timestamp | string (date-time) | |
data | object | 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.
| Campo | Tipo | Descripción |
|---|---|---|
object | "list" | |
data | lista de Branch | |
has_more | boolean |
|
next_cursor | string o null | Pasalo en |
SaleList
Ventas. Con updated_since, mezcla lápidas (DeletedObject) en el mismo orden.
| Campo | Tipo | Descripción |
|---|---|---|
object | "list" | |
data | lista de Sale o DeletedObject | |
has_more | boolean |
|
next_cursor | string o null | Pasalo en |
PaymentList
Pagos, en el orden de su venta.
| Campo | Tipo | Descripción |
|---|---|---|
object | "list" | |
data | lista de Payment | |
has_more | boolean |
|
next_cursor | string o null | Pasalo en |
PaymentMethodList
Los medios de pago. Sin paginar: vienen todos.
| Campo | Tipo | Descripción |
|---|---|---|
object | "list" | |
data | lista de PaymentMethod | |
has_more | boolean |
|
next_cursor | string o null | Pasalo en |
RefundList
Devoluciones.
| Campo | Tipo | Descripción |
|---|---|---|
object | "list" | |
data | lista de Refund | |
has_more | boolean |
|
next_cursor | string o null | Pasalo en |
DailySalesReportList
Un reporte por sucursal pedida.
| Campo | Tipo | Descripción |
|---|---|---|
object | "list" | |
data | lista de DailySalesReport | |
has_more | boolean |
|
next_cursor | string o null | Pasalo en |
ProductList
Productos y combos. Con updated_since, mezcla lápidas en el mismo orden.
| Campo | Tipo | Descripción |
|---|---|---|
object | "list" | |
data | lista de Product o DeletedObject | |
has_more | boolean |
|
next_cursor | string o null | Pasalo en |
CategoryList
Categorías. Con updated_since, mezcla lápidas en el mismo orden.
| Campo | Tipo | Descripción |
|---|---|---|
object | "list" | |
data | lista de Category o DeletedObject | |
has_more | boolean |
|
next_cursor | string o null | Pasalo en |
CustomerList
Clientes de la cuenta.
| Campo | Tipo | Descripción |
|---|---|---|
object | "list" | |
data | lista de Customer | |
has_more | boolean |
|
next_cursor | string o null | Pasalo en |
CashSessionList
Cajas cerradas.
| Campo | Tipo | Descripción |
|---|---|---|
object | "list" | |
data | lista de CashSession | |
has_more | boolean |
|
next_cursor | string o null | Pasalo en |
ApiIndex
Con qué cuenta y en qué entorno está hablando el token.
| Campo | Tipo | Descripción |
|---|---|---|
object | "api" | |
version | "1" | |
docs_url | string | Este portal. |
openapi_url | string | Este documento. |
account | objeto con id, name | La cuenta que lee el token. |
environment | uno de: live · test |
|
TokenRequest
| Campo | Tipo | Descripción |
|---|---|---|
grant_type | "client_credentials" | |
scopeopcional | string | Permisos pedidos, separados por espacio. Sin él, todos los de la credencial. |
client_idopcional | string | Sólo si no mandás la credencial por |
client_secretopcional | string | Sólo si no mandás la credencial por |