Saltar al contenido
WIBI Centro de ayuda

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

Sistemas que no son Zetti: para conectarse por esta vía hay que implementar los mismos endpoints y respuestas que la API de T&S (autenticación OAuth2, búsqueda y detalle de comprobantes, clientes). Si el sistema sólo puede exportar archivos, la integración por archivo CSV es más simple.

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

EndpointOblig.Uso
POST {URL API}/v2/{nodeId}/sales-receipts/searchSí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-searchNoRubros/grupos de producto para clasificar.
GET {URL API}/aboutNoPrueba 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 JSONOblig.Descripción
idSíIdentificador único del comprobante.
emissionDateSíFecha y hora ISO 8601 con zona (2026-10-21T10:15:00.000-0600).
codification / receiptNumberRecom.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.
cancelledCond.true si el comprobante está anulado.
cancelledSaleIdCond.En anulaciones: id del comprobante anulado.
sourceVoucherIdCond.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.
totalRecom.Total del comprobante. Si no viene se suma desde los renglones.
creationUser {description}NoVendedor.
customerSíVer tabla de cliente. Sin documento la venta se omite.
items[]SíVer tabla de renglones.

Renglones (items[])

Campo JSONOblig.Descripción
barcode o product.barCodeSíCódigo de barras (sólo dígitos).
productId o product.idRecom.Id interno del producto.
name o product.nameRecom.Descripción.
quantitySíMayor a 0 (en notas de crédito se toma el valor absoluto).
unitPriceSíPrecio unitario con impuestos.
discountAmountNoDescuento por unidad.
categoryNoRubro del producto.

Cliente (customer)

Campo JSONOblig.Descripción
idRecom.Para pedir la ficha completa (/customers/{id}).
documentNumberSíIdentificador del cliente. Se toman sólo los dígitos, hasta 10.
firstName, lastNameRecom.Nombre y apellido (o name completo).
emailRecom.Email.
phones[] / phoneRecom.Teléfonos (areaCode + number); se prefiere el celular.
birthDate, genderNoFecha de nacimiento (ISO) y sexo.
address {street, number, city, province, postalCode}NoDomicilio.

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.id con 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

Las mismas restricciones que el CSV: el documento se reduce a dígitos (hasta 10), así que en México conviene usar el celular a 10 dígitos o un número de tarjeta en lugar de CURP/RFC; y el código de barras tiene que ser numérico.

Actualizado el 4 de noviembre de 2026