Saltar al contenido principal
15 min de lectura

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:

APIMétodo de autenticaciónEncabezadoCaso de uso
API externaClave de APIX-API-Key: YOUR_API_KEYIntegraciones del lado del servidor, integración de análisis
API del panel (Conversaciones, Configuración, Incorporación, Equipos, Usuarios)Bearer JWTAuthorization: Bearer <token>Operaciones del panel y del servicio interno
WidgetsNinguno (público)N/AWidgets incrustables usando código de seguimiento
Datos en tiempo realNinguno (público)N/ARecuento 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étodoRutaDescripción
GET/usageEstadísticas de uso de API
GET/websitesListar todos los sitios web
GET/websites/:idObtener detalles del sitio web
GET/analytics/:websiteIdResumen de análisis completo
GET/analytics/:websiteId/visitorsDatos de visitantes
GET/analytics/:websiteId/pagesEstadísticas de página
GET/analytics/:websiteId/countriesDatos geográficos
GET/analytics/:websiteId/technologyDesglose de tecnología
GET/heatmaps/:websiteId/pagesDatos de página del mapa de calor
GET/replays/:websiteId/sessionsDatos de reproducción de sesión
GET/errors/:websiteId/groupsGrupos 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étodoRutaDescripción
GET/:trackingCode/realtimeWidget de recuento de visitantes en vivo
GET/:trackingCode/previewWidget de cronología de 24 horas
GET/:trackingCode/recentWidget 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étodoRutaDescripción
GET/live/:trackingCodeRecuento actual de visitantes en vivo
GET/realtime/:websiteIdDatos de análisis en tiempo real
GET/stats/:trackingCodeResumen de estadísticas de visitantes
GET/:trackingCode/statusVerificació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:

PlanSolicitudes por minutoLímite mensual
Gratuito101 000
Pro3010 000
Escala60100 000
Empresa1201 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 estadoDescripción
200Éxito
400Solicitud incorrecta
401No autorizado
403Prohibido
404No encontrado
429Demasiadas solicitudes
500Error interno del servidor
Envolvente de respuesta correctaJSON
{
"success": true,
"data": { ... },
"timestamp": "2026-02-07T12:00:00.000Z"
}
Envolvente de respuesta de errorJSON
{
"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 visitante
  • visitor.high_value - Cuando la puntuación del visitante llega a 80+
  • event.tracked - Cuando se realiza un seguimiento de cualquier evento
  • goal.completed - Cuando se completa un objetivo
  • visitor.converted - Cuando un visitante se convierte

Carga útil de webhook

Carga útil de webhookJSON
{
"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:

RolNivelPuede hacer
propietario4Acceso completo incluyendo facturación y eliminación
administrador3Administrar configuración, integraciones, miembros del equipo
editor2Editar contenido y configuración básica
visualizador1Acceso 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étodoRutaDescripción
GET/conversations?team_id=:teamIdListar conversaciones de un equipo
GET/conversations/:idObtener conversación con mensajes
POST/conversationsCrear una nueva conversación
PUT/conversations/:idActualizar una conversación
DELETE/conversations/:idEliminar una conversación
POST/conversations/:id/messagesAgregar 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
Respuesta 200JSON
{
"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.

Respuesta 200JSON
{
"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

Cuerpo de la solicitudJSON
{
"title": "New conversation",
"team_id": "uuid"
}
  • title (obligatorio) — cadena no vacía
  • team_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

Cuerpo de la solicitudJSON
{
"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.

Cuerpo de la solicitudJSON
{
"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étodoRutaRol mínimoDescripción
PUT/:websiteId/generaleditorActualizar configuración general
GET/:websiteId/notificationsvisualizadorObtener preferencias de notificación
PUT/:websiteId/notificationseditorActualizar preferencias de notificación
GET/:websiteId/exclusionsvisualizadorObtener exclusiones de IP y ruta
POST/:websiteId/exclusions/ipeditorAgregar exclusión de IP
DELETE/:websiteId/exclusions/ip/:exclusionIdeditorEliminar exclusión de IP
POST/:websiteId/exclusions/patheditorAgregar exclusión de ruta
DELETE/:websiteId/exclusions/path/:exclusionIdeditorEliminar exclusión de ruta
PUT/:websiteId/revenueadministradorActualizar configuración de ingresos
GET/:websiteId/domainsvisualizadorObtener configuración de dominio
PUT/:websiteId/domainsadministradorActualizar configuración de dominio
GET/:websiteId/team-membersvisualizadorListar miembros del equipo
POST/:websiteId/team-membersadministradorInvitar a un miembro del equipo
PUT/:websiteId/team-members/:memberIdadministradorActualizar rol de miembro
DELETE/:websiteId/team-members/:memberIdadministradorEliminar miembro del equipo

PUT /:websiteId/general

Cuerpo de la solicitud (todos los campos opcionales)JSON
{
"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"]
}
Respuesta 200JSON
{
"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.

Respuesta 200JSON
{
"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

Cuerpo de la solicitudJSON
{
"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

Cuerpo de la solicitudJSON
{
"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.

Cuerpo de la solicitud (ambos opcionales)JSON
{
"revenue_provider": "stripe",
"revenue_currency": "USD"
}
Respuesta 200JSON
{
"success": true,
"data": {
  "id": "uuid",
  "revenue_provider": "stripe",
  "revenue_currency": "USD",
  "updated_at": "2026-02-07T12:00:00Z"
}
}

GET /:websiteId/domains

Respuesta 200JSON
{
"success": true,
"data": {
  "primary_domain": "example.com",
  "allowed_domains": ["example.com", "www.example.com"],
  "verification_status": "verified"
}
}

PUT /:websiteId/domains

Requiere rol de administrador.

Cuerpo de la solicitud (ambos opcionales)JSON
{
"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.

Respuesta 200JSON
{
"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.

Cuerpo de la solicitudJSON
{
"email": "[email protected]",
"role": "editor"
}
  • email (obligatorio) — debe ser un usuario registrado de Zenovay
  • role (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.

Cuerpo de la solicitudJSON
{
"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étodoRutaDescripción
GET/onboarding/progressObtener progreso de incorporación
POST/onboarding/progressGuardar progreso de incorporación

GET /onboarding/progress

Devuelve el estado de incorporación del usuario. Si no existe un registro, devuelve valores predeterminados.

Respuesta 200JSON
{
"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.

Cuerpo de la solicitud (todos los campos opcionales)JSON
{
"step": "install_tracking",
"data": { "welcomed": true, "website_added": true },
"completed": false
}
  • step — guardado como current_step en la base de datos
  • data — objeto JSON arbitrario para almacenar estado específico del paso
  • completed — utiliza de forma predeterminada false

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étodoRutaDescripción
GET/teams/:id/permissionsObtener permisos y contexto de plan
GET/teams/:id/usageObtener estadísticas de uso del período de facturación actual
GET/teams/:id/membersListar 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.

Respuesta 200JSON
{
"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).

Respuesta 200JSON
{
"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.

Respuesta 200JSON
{
"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étodoRutaDescripción
GET/users/meObtener perfil de usuario actual
PUT/users/meActualizar perfil (nombre, correo electrónico)
PUT/users/me/emailActualizar correo electrónico con verificación SSO
DELETE/users/meEliminar cuenta de usuario
GET/users/me/usageObtener estadísticas de uso
GET/users/me/plan-limitsObtener 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.

Cuerpo de la solicitudJSON
{
"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.

¿Fue útil esta página?