Integración por API (Zetti / T&S)
Traer ventas automáticamente desde Zetti / T&S por API: configuración, sucursales y control de importaciones.
En esta integración WIBI consulta periódicamente la API del sistema de facturación (Zetti, de T&S) y trae los comprobantes nuevos o modificados. A diferencia del archivo CSV, el cliente no envía nada: su sistema tiene que exponer una API con los endpoints y el formato JSON que se describen acá.
1. Cómo consulta WIBI
- Cada pocos minutos busca los comprobantes emitidos desde la última consulta, y además los modificados (anulaciones posteriores).
- Pide el detalle de cada comprobante nuevo y, si trae cliente, su ficha (teléfonos y domicilio).
- Cada comprobante se procesa una sola vez (se identifica por su
id); las anulaciones posteriores revierten los puntos.
2. Autenticación (OAuth2, password grant)
POST {URL OAuth}/oauth/token
Authorization: Basic base64(client_id:client_secret)
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=USUARIO&password=CLAVE
Respuesta esperada:
{"access_token":"eyJ...","refresh_token":"eyJ...","token_type":"bearer","expires_in":3600}
WIBI renueva con grant_type=refresh_token&refresh_token=... y, si falla, vuelve a pedir con usuario
y clave. Todas las demás llamadas llevan Authorization: Bearer {access_token}.
3. Endpoints que tiene que exponer el sistema
| Endpoint | Oblig. | Uso |
|---|---|---|
POST {URL API}/v2/{nodeId}/sales-receipts/search | Sí | Lista paginada de comprobantes por fecha. |
GET {URL API}/v2/{nodeId}/sales-receipts/{id} | Sí | Detalle de un comprobante con sus renglones. |
GET {URL API}/v2/{nodeId}/customers/{id} | Recom. | Ficha del cliente (teléfonos, domicilio). |
POST {URL API}/{nodeId}/products/groups-search | No | Rubros/grupos de producto para clasificar. |
GET {URL API}/about | No | Prueba de conexión (sin autenticación). |
{nodeId} es el identificador del nodo o empresa que se consulta (se configura en WIBI).
3.1 Búsqueda de comprobantes
POST /v2/{nodeId}/sales-receipts/search?page=1&per_page=50&include_items=true&include_completed=true
&order_field=fechaEmision&ascending_order=true
Content-Type: application/json
{"emissionDateFrom":"2026-10-21T00:00:00.000-0600","emissionDateTo":"2026-10-21T23:59:59.000-0600"}
Para traer cambios posteriores WIBI usa el mismo endpoint con
actualizationDateFrom / actualizationDateTo. La respuesta puede ser una lista o una
página: {"content":[...], "last":true, "totalPages":1}. Cada elemento necesita al menos
id, emissionDate, el tipo de comprobante y el estado.
3.2 Detalle del comprobante
| Campo JSON | Oblig. | Descripción |
|---|---|---|
id | Sí | Identificador único del comprobante. |
emissionDate | Sí | Fecha y hora ISO 8601 con zona (2026-10-21T10:15:00.000-0600). |
codification / receiptNumber | Recom. | Número visible del comprobante. |
valueType {id, name} | Sí | Tipo de comprobante. Si el nombre indica nota de crédito se trata como devolución. |
status {name, description} | Recom. | TEMP / Temporal = no suma puntos hasta confirmarse. Un estado que contenga ANUL = anulado. |
cancelled | Cond. | true si el comprobante está anulado. |
cancelledSaleId | Cond. | En anulaciones: id del comprobante anulado. |
sourceVoucherId | Cond. | En notas de crédito: id de la venta original. |
creationNode {id, name} | Sí | Sucursal que emitió. El id se asocia a un comercio WIBI en el mapa de sucursales. |
total | Recom. | Total del comprobante. Si no viene se suma desde los renglones. |
creationUser {description} | No | Vendedor. |
customer | Sí | Ver tabla de cliente. Sin documento la venta se omite. |
items[] | Sí | Ver tabla de renglones. |
Renglones (items[])
| Campo JSON | Oblig. | Descripción |
|---|---|---|
barcode o product.barCode | Sí | Código de barras (sólo dígitos). |
productId o product.id | Recom. | Id interno del producto. |
name o product.name | Recom. | Descripción. |
quantity | Sí | Mayor a 0 (en notas de crédito se toma el valor absoluto). |
unitPrice | Sí | Precio unitario con impuestos. |
discountAmount | No | Descuento por unidad. |
category | No | Rubro del producto. |
Cliente (customer)
| Campo JSON | Oblig. | Descripción |
|---|---|---|
id | Recom. | Para pedir la ficha completa (/customers/{id}). |
documentNumber | Sí | Identificador del cliente. Se toman sólo los dígitos, hasta 10. |
firstName, lastName | Recom. | Nombre y apellido (o name completo). |
email | Recom. | Email. |
phones[] / phone | Recom. | Teléfonos (areaCode + number); se prefiere el celular. |
birthDate, gender | No | Fecha de nacimiento (ISO) y sexo. |
address {street, number, city, province, postalCode} | No | Domicilio. |
Ejemplo de detalle
{
"id": 554321,
"codification": "B-0003-00012345",
"emissionDate": "2026-10-21T10:15:00.000-0600",
"valueType": {"id": 197, "name": "FACTURA B"},
"status": {"name": "INGRESADO"},
"cancelled": false,
"creationNode": {"id": 2101, "name": "Sucursal Centro"},
"creationUser": {"description": "Juan Pérez"},
"total": 26400.00,
"customer": {
"id": 8812, "documentNumber": "5512345678",
"firstName": "Ana", "lastName": "Gómez", "email": "ana@mail.com",
"phones": [{"type": "CELULAR", "areaCode": "55", "number": "12345678"}]
},
"items": [
{"productId": 9001, "barcode": "7501000000012", "name": "Ibuprofeno 400 mg x 20",
"quantity": 1, "unitPrice": 3500.00, "discountAmount": 0},
{"productId": 9002, "barcode": "7501000000029", "name": "Protector solar FPS 50",
"quantity": 2, "unitPrice": 12000.00, "discountAmount": 600.00}
]
}
4. Configuración en WIBI
En Parámetros > Zetti > Integración Zetti API:
- URL de la API y URL OAuth,
client_id/client_secret, usuario y clave de la API. - Node ID que se consulta.
- Mapa de sucursales: cada
creationNode.idcon su comercio WIBI (0= sucursal excluida).
El botón Ver panel API muestra cada consulta, cuántos comprobantes trajo y los que quedaron con error.
5. Clientes fuera de Argentina
Actualizado el 4 de noviembre de 2026