Puntos finales de la API
Zenovay proporciona varios grupos de puntos finales de API para acceder a tus datos de análisis mediante programación.
Autenticación
Todas las solicitudes de API requieren autenticación. El método depende de la API que uses:
| API | Método de autenticación | Encabezado | Caso de uso |
|---|---|---|---|
| API externa | Clave de API | X-API-Key: YOUR_API_KEY | Integraciones del lado del servidor, integración de análisis |
| API del panel (Conversaciones, Configuración, Incorporación, Equipos, Usuarios) | Bearer JWT | Authorization: Bearer <token> | Operaciones del panel y del servicio interno |
| Widgets | Ninguno (público) | N/A | Widgets incrustables usando código de seguimiento |
| Datos en tiempo real | Ninguno (público) | N/A | Recuento de visitantes en vivo usando código de seguimiento |
Mantén tu clave de API segura. Nunca la expongas en código del lado del cliente ni la confirmes en control de versiones. Obtén tu clave de API en Configuración → Seguridad → Claves de API en el panel.
Consulta Autenticación para obtener detalles sobre la gestión de claves de API.
API externa
URL base: https://api.zenovay.com/api/external/v1
API del lado del servidor para acceder a datos de análisis con autenticación de clave de API (encabezado X-API-Key).
Puntos finales disponibles
| Método | Ruta | Descripción |
|---|---|---|
| GET | /usage | Estadísticas de uso de API |
| GET | /websites | Listar todos los sitios web |
| GET | /websites/:id | Obtener detalles del sitio web |
| GET | /analytics/:websiteId | Resumen de análisis completo |
| GET | /analytics/:websiteId/visitors | Datos de visitantes |
| GET | /analytics/:websiteId/pages | Estadísticas de página |
| GET | /analytics/:websiteId/countries | Datos geográficos |
| GET | /analytics/:websiteId/technology | Desglose de tecnología |
| GET | /heatmaps/:websiteId/pages | Datos de página del mapa de calor |
| GET | /replays/:websiteId/sessions | Datos de reproducción de sesión |
| GET | /errors/:websiteId/groups | Grupos de seguimiento de errores |
Cada punto final tiene una página de referencia dedicada con parámetros, esquemas de respuesta, interfaces de TypeScript y ejemplos de código en cURL, JavaScript, Python y TypeScript.
Consulta también la descripción general de la API externa para una introducción de alto nivel.
Widgets incrustables
URL base: https://api.zenovay.com/widgets
Widgets listos para usar que no requieren autenticación. Usa tu código de seguimiento para identificar el sitio web.
| Método | Ruta | Descripción |
|---|---|---|
| GET | /:trackingCode/realtime | Widget de recuento de visitantes en vivo |
| GET | /:trackingCode/preview | Widget de cronología de 24 horas |
| GET | /:trackingCode/recent | Widget de desglose por país |
Consulta Widgets para obtener ejemplos de incrustación.
Datos en tiempo real
URL base: https://api.zenovay.com/e
Puntos finales JSON públicos para estadísticas en vivo. No se requiere autenticación.
| Método | Ruta | Descripción |
|---|---|---|
| GET | /live/:trackingCode | Recuento actual de visitantes en vivo |
| GET | /realtime/:websiteId | Datos de análisis en tiempo real |
| GET | /stats/:trackingCode | Resumen de estadísticas de visitantes |
| GET | /:trackingCode/status | Verificación de estado de seguimiento |
Consulta Datos en tiempo real para obtener guías de integración.
Límites de velocidad
Los límites de velocidad de la API varían según el plan:
| Plan | Solicitudes por minuto | Límite mensual |
|---|---|---|
| Gratuito | 10 | 1 000 |
| Pro | 30 | 10 000 |
| Escala | 60 | 100 000 |
| Empresa | 120 | 1 000 000 |
Los encabezados de límite de velocidad se incluyen en todas las respuestas:
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Reset: 1642771200
El valor X-RateLimit-Limit refleja el límite por minuto de tu plan (p. ej., 10 para Gratuito, 30 para Pro, 60 para Escala, 120 para Empresa).
Consulta Límites de velocidad para obtener detalles sobre cómo manejar errores de límite de velocidad.
Códigos de error
| Código de estado | Descripción |
|---|---|
| 200 | Éxito |
| 400 | Solicitud incorrecta |
| 401 | No autorizado |
| 403 | Prohibido |
| 404 | No encontrado |
| 429 | Demasiadas solicitudes |
| 500 | Error interno del servidor |
{
"success": true,
"data": { ... },
"timestamp": "2026-02-07T12:00:00.000Z"
}{
"success": false,
"error": {
"message": "The provided API key is missing or invalid",
"code": "UNAUTHORIZED",
"timestamp": "2026-02-07T12:00:00.000Z"
}
}Webhooks
Configura webhooks para recibir notificaciones en tiempo real:
Eventos disponibles
visitor.identified- Cuando se identifica un visitantevisitor.high_value- Cuando la puntuación del visitante llega a 80+event.tracked- Cuando se realiza un seguimiento de cualquier eventogoal.completed- Cuando se completa un objetivovisitor.converted- Cuando un visitante se convierte
Carga útil de webhook
{
"event": "visitor.high_value",
"timestamp": "2025-01-20T15:30:00Z",
"data": {
"visitor_id": "vis_abc123",
"score": 92,
"current_page": "/pricing",
"time_on_site": 420
}
}Descripción general de la API del panel
Los siguientes grupos de API alimentan el panel de Zenovay. Todos los puntos finales requieren un token JWT de portador en el encabezado Authorization. Las respuestas utilizan una envolvente estándar:
{ "success": true, "data": { ... }, "timestamp": "..." }
Permisos basados en roles
Los puntos finales de API de configuración de sitios web aplican acceso basado en funciones. Los roles en orden de privilegio:
| Rol | Nivel | Puede hacer |
|---|---|---|
| propietario | 4 | Acceso completo incluyendo facturación y eliminación |
| administrador | 3 | Administrar configuración, integraciones, miembros del equipo |
| editor | 2 | Editar contenido y configuración básica |
| visualizador | 1 | Acceso de solo lectura |
API de conversaciones
URL base: https://api.zenovay.com/api/conversations
Autenticación: Se requiere JWT de portador. Se verifica la pertenencia al equipo para todas las solicitudes.
Operaciones CRUD para conversaciones con inteligencia artificial dentro de equipos. El parámetro de consulta team_id utiliza de forma predeterminada la organización del usuario autenticado si no se proporciona.
Puntos finales
| Método | Ruta | Descripción |
|---|---|---|
| GET | /conversations?team_id=:teamId | Listar conversaciones de un equipo |
| GET | /conversations/:id | Obtener conversación con mensajes |
| POST | /conversations | Crear una nueva conversación |
| PUT | /conversations/:id | Actualizar una conversación |
| DELETE | /conversations/:id | Eliminar una conversación |
| POST | /conversations/:id/messages | Agregar un mensaje |
GET /conversations
Devuelve conversaciones sin contenido de mensaje para mejorar el rendimiento.
Parámetros de consulta:
team_id(opcional) — utiliza de forma predeterminada la organización del usuario
{
"success": true,
"data": [
{
"id": "uuid",
"team_id": "uuid",
"title": "Analytics Q3 review",
"created_at": "2026-02-01T10:00:00Z",
"updated_at": "2026-02-07T14:30:00Z"
}
]
}GET /conversations/:id
Devuelve la conversación completa incluida la matriz de mensajes.
{
"success": true,
"data": {
"id": "uuid",
"team_id": "uuid",
"title": "Analytics Q3 review",
"messages": [
{ "role": "user", "content": "Show top pages", "timestamp": "2026-02-07T14:30:00Z" },
{ "role": "assistant", "content": "Here are your top pages...", "timestamp": "2026-02-07T14:30:01Z" }
],
"created_at": "2026-02-01T10:00:00Z",
"updated_at": "2026-02-07T14:30:01Z"
}
}POST /conversations
{
"title": "New conversation",
"team_id": "uuid"
}title(obligatorio) — cadena no vacíateam_id(opcional) — utiliza de forma predeterminada la organización del usuario
Respuesta: 201 con la conversación creada (incluye messages: [] vacío).
PUT /conversations/:id
{
"title": "Updated title",
"messages": [...]
}Ambos campos son opcionales. Acepta actualizaciones parciales.
DELETE /conversations/:id
Respuesta: 200 con { "deleted": true }.
POST /conversations/:id/messages
Agrega un mensaje a la conversación. El servidor agrega una timestamp a cada mensaje.
{
"role": "user",
"content": "What were last week's top referrers?"
}role(obligatorio) — rol del mensaje (p. ej.,"user","assistant")content(obligatorio) — texto del mensaje
Respuesta: 201 con la conversación completa actualizada incluyendo todos los mensajes.
API de configuración de sitio web
URL base: https://api.zenovay.com/api/websites
Autenticación: Se requiere JWT de portador. Cada punto final aplica un rol mínimo.
Administra la configuración del sitio web, incluida la configuración general, notificaciones, exclusiones de tráfico, seguimiento de ingresos, dominios y miembros del equipo. Todas las rutas están limitadas por :websiteId.
Puntos finales
| Método | Ruta | Rol mínimo | Descripción |
|---|---|---|---|
| PUT | /:websiteId/general | editor | Actualizar configuración general |
| GET | /:websiteId/notifications | visualizador | Obtener preferencias de notificación |
| PUT | /:websiteId/notifications | editor | Actualizar preferencias de notificación |
| GET | /:websiteId/exclusions | visualizador | Obtener exclusiones de IP y ruta |
| POST | /:websiteId/exclusions/ip | editor | Agregar exclusión de IP |
| DELETE | /:websiteId/exclusions/ip/:exclusionId | editor | Eliminar exclusión de IP |
| POST | /:websiteId/exclusions/path | editor | Agregar exclusión de ruta |
| DELETE | /:websiteId/exclusions/path/:exclusionId | editor | Eliminar exclusión de ruta |
| PUT | /:websiteId/revenue | administrador | Actualizar configuración de ingresos |
| GET | /:websiteId/domains | visualizador | Obtener configuración de dominio |
| PUT | /:websiteId/domains | administrador | Actualizar configuración de dominio |
| GET | /:websiteId/team-members | visualizador | Listar miembros del equipo |
| POST | /:websiteId/team-members | administrador | Invitar a un miembro del equipo |
| PUT | /:websiteId/team-members/:memberId | administrador | Actualizar rol de miembro |
| DELETE | /:websiteId/team-members/:memberId | administrador | Eliminar miembro del equipo |
PUT /:websiteId/general
{
"domain": "example.com",
"name": "My Website",
"timezone": "America/New_York",
"primary_color": "#4F46E5",
"kpi_goal": 10000,
"public_dashboard": true,
"allowed_domains": ["example.com", "www.example.com"]
}{
"success": true,
"data": {
"id": "uuid",
"domain": "example.com",
"name": "My Website",
"timezone": "America/New_York",
"primary_color": "#4F46E5",
"kpi_goal": 10000,
"public_dashboard": true,
"allowed_domains": ["example.com", "www.example.com"],
"updated_at": "2026-02-07T12:00:00Z"
}
}GET /:websiteId/notifications
Devuelve preferencias de notificación. Si no se han establecido, devuelve un objeto predeterminado con solo website_id.
PUT /:websiteId/notifications
Acepta cualquier campo de preferencia de notificación. Utiliza un patrón upsert: crea el registro en la primera llamada, actualiza en llamadas posteriores.
GET /:websiteId/exclusions
Devuelve tanto exclusiones de IP como de ruta en una sola respuesta.
{
"success": true,
"data": {
"ip_exclusions": [
{ "id": "uuid", "website_id": "uuid", "ip_address": "192.168.1.1", "description": "Office IP", "created_at": "..." }
],
"path_exclusions": [
{ "id": "uuid", "website_id": "uuid", "path_pattern": "/admin/*", "description": "Admin pages", "created_at": "..." }
]
}
}POST /:websiteId/exclusions/ip
{
"ip_address": "192.168.1.1",
"description": "Office IP"
}ip_address(obligatorio)description(opcional)
Respuesta: 201. Devuelve 409 si la IP ya está excluida.
POST /:websiteId/exclusions/path
{
"path_pattern": "/admin/*",
"description": "Admin pages"
}path_pattern(obligatorio)description(opcional)
Respuesta: 201. Devuelve 409 si el patrón de ruta ya está excluido.
PUT /:websiteId/revenue
Requiere rol de administrador.
{
"revenue_provider": "stripe",
"revenue_currency": "USD"
}{
"success": true,
"data": {
"id": "uuid",
"revenue_provider": "stripe",
"revenue_currency": "USD",
"updated_at": "2026-02-07T12:00:00Z"
}
}GET /:websiteId/domains
{
"success": true,
"data": {
"primary_domain": "example.com",
"allowed_domains": ["example.com", "www.example.com"],
"verification_status": "verified"
}
}PUT /:websiteId/domains
Requiere rol de administrador.
{
"domain": "example.com",
"allowed_domains": ["example.com", "www.example.com"]
}allowed_domains debe ser una matriz si se proporciona.
GET /:websiteId/team-members
Devuelve miembros del equipo enriquecidos con datos de perfil de usuario.
{
"success": true,
"data": [
{
"id": "membership_uuid",
"user_id": "user_uuid",
"role": "admin",
"created_at": "2026-01-15T10:00:00Z",
"deactivated_at": null,
"user": {
"id": "user_uuid",
"email": "[email protected]",
"full_name": "Jane Doe",
"avatar_url": "https://..."
}
}
]
}POST /:websiteId/team-members
Invita a un usuario por correo electrónico. Requiere rol de administrador.
{
"email": "[email protected]",
"role": "editor"
}email(obligatorio) — debe ser un usuario registrado de Zenovayrole(opcional) — utiliza de forma predeterminada"viewer". Debe ser uno de:owner,admin,editor,viewer
Respuesta: 201. Devuelve 404 si el correo electrónico no se encuentra, 409 si ya es miembro.
PUT /:websiteId/team-members/:memberId
Actualiza el rol de un miembro. Requiere rol de administrador.
{
"role": "admin"
}role(obligatorio) — debe ser uno de:owner,admin,editor,viewer
DELETE /:websiteId/team-members/:memberId
Elimina un miembro del equipo (eliminación lógica). Requiere rol de administrador.
Respuesta: 200 con { "deleted": true }.
API de incorporación
URL base: https://api.zenovay.com/api/onboarding
Autenticación: Se requiere JWT de portador. Limitado al usuario (sin comprobaciones de equipo o rol).
Rastrea el progreso de incorporación del usuario. Cada usuario tiene un único registro de incorporación que persiste entre sesiones.
Puntos finales
| Método | Ruta | Descripción |
|---|---|---|
| GET | /onboarding/progress | Obtener progreso de incorporación |
| POST | /onboarding/progress | Guardar progreso de incorporación |
GET /onboarding/progress
Devuelve el estado de incorporación del usuario. Si no existe un registro, devuelve valores predeterminados.
{
"success": true,
"data": {
"user_id": "uuid",
"current_step": "add_website",
"completed": false,
"data": { "welcomed": true },
"created_at": "2026-02-01T10:00:00Z",
"updated_at": "2026-02-07T14:00:00Z"
}
}POST /onboarding/progress
Utiliza un patrón upsert: crea el registro en la primera llamada, actualiza en llamadas posteriores.
{
"step": "install_tracking",
"data": { "welcomed": true, "website_added": true },
"completed": false
}step— guardado comocurrent_stepen la base de datosdata— objeto JSON arbitrario para almacenar estado específico del pasocompleted— utiliza de forma predeterminadafalse
API de equipos
URL base: https://api.zenovay.com/api/teams
Autenticación: Se requiere JWT de portador. Se verifica la pertenencia al equipo (cualquier miembro activo puede acceder).
Puntos finales de contexto de equipo de solo lectura para permisos, estadísticas de uso y listas de miembros. Para acciones de administración de equipos (invitar, cambios de rol, eliminación), utiliza los puntos finales de miembros del equipo de la API de configuración de sitio web.
Puntos finales
| Método | Ruta | Descripción |
|---|---|---|
| GET | /teams/:id/permissions | Obtener permisos y contexto de plan |
| GET | /teams/:id/usage | Obtener estadísticas de uso del período de facturación actual |
| GET | /teams/:id/members | Listar miembros del equipo con perfiles |
GET /teams/:id/permissions
Devuelve el rol del usuario autenticado, el plan del equipo, los recuentos de uso actual y las banderas de permisos calculadas.
{
"success": true,
"data": {
"team_id": "uuid",
"role": "admin",
"plan": "Pro",
"plan_limits": {
"maxWebsites": 5,
"maxTeamMembers": 5,
"eventsPerMonth": 10000,
"dataRetentionDays": 730
},
"current_usage": {
"websites": 3,
"team_members": 5
},
"permissions": {
"can_manage_billing": false,
"can_manage_team": true,
"can_edit_settings": true,
"can_view": true
}
}
}GET /teams/:id/usage
Devuelve estadísticas de uso del período de facturación actual (mes hasta la fecha).
{
"success": true,
"data": {
"team_id": "uuid",
"plan": "Pro",
"period": {
"start": "2026-02-01T00:00:00.000Z",
"end": "2026-02-07T12:00:00.000Z"
},
"usage": {
"events": 4521,
"events_limit": 10000,
"websites": 3,
"websites_limit": 10,
"team_members": 5,
"team_members_limit": 10
}
}
}GET /teams/:id/members
Devuelve miembros del equipo enriquecidos con datos de perfil de usuario.
{
"success": true,
"data": [
{
"id": "membership_uuid",
"user_id": "user_uuid",
"role": "admin",
"created_at": "2026-01-15T10:00:00Z",
"user": {
"id": "user_uuid",
"email": "[email protected]",
"full_name": "Jane Doe",
"name": "Jane",
"avatar_url": "https://..."
}
}
]
}API de perfil de usuario
URL base: https://api.zenovay.com/api/users
Autenticación: Se requiere JWT de portador. Limitado al usuario (solo perfil propio).
Administra el perfil y la dirección de correo electrónico del usuario autenticado.
Puntos finales
| Método | Ruta | Descripción |
|---|---|---|
| GET | /users/me | Obtener perfil de usuario actual |
| PUT | /users/me | Actualizar perfil (nombre, correo electrónico) |
| PUT | /users/me/email | Actualizar correo electrónico con verificación SSO |
| DELETE | /users/me | Eliminar cuenta de usuario |
| GET | /users/me/usage | Obtener estadísticas de uso |
| GET | /users/me/plan-limits | Obtener límites de plan y características |
PUT /users/me/email
Punto final dedicado para cambios de correo electrónico con detección de proveedor SSO. Si el usuario se registró a través de un proveedor OAuth (Google, GitHub, etc.), la solicitud se rechaza con un mensaje para actualizar el correo electrónico a través de ese proveedor.
{
"email": "[email protected]"
}email(obligatorio) — debe ser un correo electrónico válido, diferente del actual
Respuesta: 200 con el registro de usuario actualizado. Devuelve 400 si el usuario es una cuenta SSO o el correo electrónico no es válido/sin cambios.
Pasos siguientes
Comienza a integrar con la API de Zenovay usando las guías a continuación.
- API externa - Análisis del lado del servidor con autenticación de clave de API
- Widgets - Widgets incrustables prediseñados
- Datos en tiempo real - Puntos finales de datos de visitantes en vivo
- Autenticación - Gestión de claves de API
- Límites de velocidad - Descripción de los límites