Webhooks
Introducción
Los webhooks de NinoxNet permiten que tu aplicación reciba notificaciones en tiempo real sobre cambios en los datos, sin necesidad de realizar consultas periódicas a la API.
Eventos disponibles
- 🏷️ Cambios en artículos - Actualizaciones de propiedades, stock y precios
- ❌ Desactivación de artículos - Cuando un artículo se desactiva de la integración
Configuración
1. Solicitar webhook
Para habilitar webhooks en tu integración, debes proporcionar:
- URL de endpoint: Donde NinoxNet enviará las notificaciones
- Headers personalizados: Opcionalmente, para autenticación o identificación
- Customización del webhook: Puedes solicitar configuraciones específicas según tus necesidades
2. Configuración de endpoint
Tu endpoint debe:
- ✅ Aceptar requests
POST
- ✅ Responder con status code
200
para confirmar recepción - ✅ Procesar el payload JSON enviado
- ⚡ Responder rápidamente (timeout: 10 segundos)
Si tu endpoint no responde en 10 segundos NinoxNet no enviará el webhook.
Eventos de webhook
📦 Cambio en artículo
Se envía cuando cambian las propiedades de un artículo, su stock o precios. Dependiendo de la configuración del webhook, el payload puede contener:
- Estructura plana (por defecto): Array de registros
ArticuloConCurva[]
- Estructura compleja: Objeto
Articulo
con arrays anidados
Estructura plana (por defecto)
Payload:
ArticuloConCurva[] // Array de variantes (estructura plana)
Ejemplo con una variante:
[
{
"articuloId": 12345,
"codigo": "REMERA-001",
"descripcion": "Remera básica",
"descripcionWeb": "Remera básica de algodón",
"nombre": "REMERA-001 - Remera básica",
"talleColor": 3,
"precio1": 2500.00,
"precio2": 2200.00,
"precio3": 2000.00,
"precio4": 1800.00,
"precio5": 1600.00,
"colorId": 1,
"talleId": 2,
"colorNombre": "Rojo",
"colorCodigo": "RED",
"colorHex": "#FF0000",
"talleNombre": "M",
"talleCodigo": "M",
"unidades": 15,
"etiquetasIds": "1,5,8",
"etiquetasNombres": "Remeras,Básico,Algodón",
"categoriasIds": "2,4",
"categoriasNombres": "Ropa,Casual",
"eliminado": false
}
]
Ejemplo con múltiples variantes:
[
{
"articuloId": 12345,
"codigo": "REMERA-001",
"descripcion": "Remera básica",
"descripcionWeb": "Remera básica de algodón",
"nombre": "REMERA-001 - Remera básica",
"talleColor": 3,
"precio1": 2500.00,
"precio2": 2200.00,
"precio3": 2000.00,
"precio4": 1800.00,
"precio5": 1600.00,
"colorId": 1,
"talleId": 1,
"colorNombre": "Rojo",
"colorCodigo": "RED",
"colorHex": "#FF0000",
"talleNombre": "S",
"talleCodigo": "S",
"unidades": 8,
"etiquetasIds": "1,5,8",
"etiquetasNombres": "Remeras,Básico,Algodón",
"categoriasIds": "2,4",
"categoriasNombres": "Ropa,Casual",
"eliminado": false
},
{
"articuloId": 12345,
"codigo": "REMERA-001",
"descripcion": "Remera básica",
"descripcionWeb": "Remera básica de algodón",
"nombre": "REMERA-001 - Remera básica",
"talleColor": 3,
"precio1": 2500.00,
"precio2": 2200.00,
"precio3": 2000.00,
"precio4": 1800.00,
"precio5": 1600.00,
"colorId": 1,
"talleId": 2,
"colorNombre": "Rojo",
"colorCodigo": "RED",
"colorHex": "#FF0000",
"talleNombre": "M",
"talleCodigo": "M",
"unidades": 15,
"etiquetasIds": "1,5,8",
"etiquetasNombres": "Remeras,Básico,Algodón",
"categoriasIds": "2,4",
"categoriasNombres": "Ropa,Casual",
"eliminado": false
}
]
Estructura compleja (opcional)
Si tu webhook está configurado para recibir la estructura compleja, el payload será un objeto Articulo
directo:
Payload:
Articulo // Objeto con arrays anidados
Ejemplo:
{
"articuloId": 12345,
"codigo": "REMERA-001",
"descripcion": "Remera básica",
"descripcionWeb": "Remera básica de algodón",
"nombre": "REMERA-001 - Remera básica",
"talleColor": 3,
"precio1": 2500.00,
"precio2": 2200.00,
"precio3": 2000.00,
"precio4": 1800.00,
"precio5": 1600.00,
"stockTotal": 23,
"curva": [
{
"articuloId": 12345,
"colorId": 1,
"talleId": 1,
"colorNombre": "Rojo",
"colorCodigo": "RED",
"talleNombre": "S",
"talleCodigo": "S",
"unidades": 8
},
{
"articuloId": 12345,
"colorId": 1,
"talleId": 2,
"colorNombre": "Rojo",
"colorCodigo": "RED",
"talleNombre": "M",
"talleCodigo": "M",
"unidades": 15
}
],
"tags": [
{
"articuloId": 12345,
"articuloTagId": 101,
"tipo": 0,
"tagId": 1,
"tagNombre": "Remeras",
"padreId": null,
"destacada": true
},
{
"articuloId": 12345,
"articuloTagId": 102,
"tipo": 1,
"tagId": 2,
"tagNombre": "Ropa",
"padreId": null,
"destacada": false
},
{
"articuloId": 12345,
"articuloTagId": 103,
"tipo": 1,
"tagId": 4,
"tagNombre": "Casual",
"padreId": 2,
"destacada": false
}
]
}
Para recibir la estructura compleja en lugar de la plana, debes solicitarlo específicamente al configurar tu webhook con nuestro equipo de soporte.
❌ Artículo desactivado
Se envía cuando un artículo se desactiva de la integración. El payload es un objeto simple con solo dos propiedades.
Payload:
{
articuloId: number;
eliminado: true;
}
Ejemplo:
{
"articuloId": 12345,
"eliminado": true
}
Cuando un artículo es desactivado, solo se envían las propiedades articuloId
y eliminado: true
. No se incluyen otras propiedades para optimizar el payload.