> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gu1.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Estadísticas

> Obtén estadísticas agregadas de eventos por tipo — para seguimiento de comportamiento de usuarios y detección de fraude en gu1, con ejemplos para stats.

## Resumen

Recupera estadísticas agregadas sobre eventos de usuario, agrupados por tipo de evento. Este endpoint proporciona una vista rápida de la distribución de eventos, conteos y timestamps de última ocurrencia, perfecto para construir dashboards y monitorear patrones de actividad de usuarios.

## Endpoint

```
GET https://api.gu1.ai/events/user/stats
```

## Autenticación

Requiere una clave API válida en el encabezado de Authorization:

```bash theme={null}
Authorization: Bearer YOUR_API_KEY
```

## Parámetros de Consulta

<ParamField query="user_id" type="string">
  Filtra estadísticas por identificador de usuario. Si no se proporciona, devuelve estadísticas de todos los usuarios en tu organización.

  Ejemplo: `?user_id=user_12345`
</ParamField>

## Respuesta

<ResponseField name="success" type="boolean">
  Indica si la solicitud fue exitosa
</ResponseField>

<ResponseField name="stats" type="array">
  Array de objetos de estadísticas agrupados por tipo de evento

  <ResponseField name="stats[].event_type" type="string">
    El tipo de evento (ej., "LOGIN\_SUCCESS", "TRANSFER\_SUCCESS")
  </ResponseField>

  <ResponseField name="stats[].count" type="number">
    Número total de eventos de este tipo
  </ResponseField>

  <ResponseField name="stats[].last_occurrence" type="string">
    Timestamp del evento más reciente de este tipo (ISO 8601)
  </ResponseField>
</ResponseField>

## Ejemplos

### Obtener Estadísticas para Todos los Usuarios

<CodeGroup>
  ```bash cURL theme={null}
  curl https://api.gu1.ai/events/user/stats \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://api.gu1.ai/events/user/stats', {
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY'
    }
  });

  const data = await response.json();
  console.log(data.stats);
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      'https://api.gu1.ai/events/user/stats',
      headers={'Authorization': 'Bearer YOUR_API_KEY'}
  )

  data = response.json()
  print(data['stats'])
  ```
</CodeGroup>

### Obtener Estadísticas para Usuario Específico

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api.gu1.ai/events/user/stats?user_id=user_12345" \
    -H "Authorization: Bearer YOUR_API_KEY"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    'https://api.gu1.ai/events/user/stats?user_id=user_12345',
    {
      headers: {
        'Authorization': 'Bearer YOUR_API_KEY'
      }
    }
  );

  const data = await response.json();
  console.log(data.stats);
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      'https://api.gu1.ai/events/user/stats',
      headers={'Authorization': 'Bearer YOUR_API_KEY'},
      params={'user_id': 'user_12345'}
  )

  data = response.json()
  print(data['stats'])
  ```
</CodeGroup>

## Ejemplo de Respuesta

```json theme={null}
{
  "success": true,
  "stats": [
    {
      "event_type": "LOGIN_SUCCESS",
      "count": 45,
      "last_occurrence": "2026-01-30T14:30:00Z"
    },
    {
      "event_type": "LOGIN_FAILED",
      "count": 3,
      "last_occurrence": "2026-01-30T08:15:00Z"
    },
    {
      "event_type": "TRANSFER_SUCCESS",
      "count": 12,
      "last_occurrence": "2026-01-30T12:00:00Z"
    },
    {
      "event_type": "PROFILE_UPDATED",
      "count": 2,
      "last_occurrence": "2026-01-25T10:30:00Z"
    },
    {
      "event_type": "PASSWORD_CHANGE",
      "count": 1,
      "last_occurrence": "2026-01-20T16:45:00Z"
    }
  ]
}
```

## Respuestas de Error

### 401 Unauthorized

```json theme={null}
{
  "success": false,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid or missing API key"
  }
}
```

### 403 Forbidden

```json theme={null}
{
  "success": false,
  "error": {
    "code": "FORBIDDEN",
    "message": "Insufficient permissions to read events"
  }
}
```

### 500 Internal Server Error

```json theme={null}
{
  "success": false,
  "error": {
    "code": "STATS_FETCH_FAILED",
    "message": "Failed to fetch event statistics"
  }
}
```

## Casos de Uso

### Resumen de Dashboard

Construye un dashboard mostrando la distribución de eventos:

```javascript theme={null}
async function buildEventDashboard(userId) {
  const response = await fetch(
    `https://api.gu1.ai/events/user/stats?user_id=${userId}`,
    {
      headers: { 'Authorization': `Bearer ${API_KEY}` }
    }
  );

  const data = await response.json();

  // Agrupa por categoría
  const authEvents = data.stats.filter(s =>
    ['LOGIN_SUCCESS', 'LOGIN_FAILED', 'LOGOUT'].includes(s.event_type)
  );

  const transferEvents = data.stats.filter(s =>
    ['TRANSFER_SUCCESS', 'TRANSFER_FAILED'].includes(s.event_type)
  );

  return {
    authentication: {
      total: authEvents.reduce((sum, e) => sum + e.count, 0),
      events: authEvents
    },
    transfers: {
      total: transferEvents.reduce((sum, e) => sum + e.count, 0),
      events: transferEvents
    }
  };
}
```

### Monitoreo de Fraude

Monitorea patrones de actividad sospechosa:

```javascript theme={null}
async function detectSuspiciousActivity(userId) {
  const response = await fetch(
    `https://api.gu1.ai/events/user/stats?user_id=${userId}`,
    {
      headers: { 'Authorization': `Bearer ${API_KEY}` }
    }
  );

  const data = await response.json();
  const alerts = [];

  // Verifica intentos de inicio de sesión fallidos
  const failedLogins = data.stats.find(s => s.event_type === 'LOGIN_FAILED');
  if (failedLogins && failedLogins.count > 5) {
    alerts.push({
      type: 'HIGH_FAILED_LOGINS',
      count: failedLogins.count,
      lastOccurrence: failedLogins.last_occurrence
    });
  }

  // Verifica actividad de transferencias
  const transfers = data.stats.find(s => s.event_type === 'TRANSFER_SUCCESS');
  if (transfers && transfers.count > 10) {
    alerts.push({
      type: 'HIGH_TRANSFER_VOLUME',
      count: transfers.count,
      lastOccurrence: transfers.last_occurrence
    });
  }

  return alerts;
}
```

### Reporte de Actividad de Usuario

Genera reportes de actividad:

```javascript theme={null}
async function generateActivityReport(userId) {
  const response = await fetch(
    `https://api.gu1.ai/events/user/stats?user_id=${userId}`,
    {
      headers: { 'Authorization': `Bearer ${API_KEY}` }
    }
  );

  const data = await response.json();

  const report = {
    userId,
    generatedAt: new Date().toISOString(),
    totalEvents: data.stats.reduce((sum, s) => sum + s.count, 0),
    eventsByType: data.stats.map(s => ({
      type: s.event_type,
      count: s.count,
      lastActivity: s.last_occurrence
    })),
    mostRecentActivity: data.stats.reduce((latest, s) =>
      new Date(s.last_occurrence) > new Date(latest.last_occurrence)
        ? s
        : latest
    )
  };

  return report;
}
```

### Métricas de Análisis

Calcula métricas clave:

```javascript theme={null}
async function calculateMetrics(userId) {
  const response = await fetch(
    `https://api.gu1.ai/events/user/stats?user_id=${userId}`,
    {
      headers: { 'Authorization': `Bearer ${API_KEY}` }
    }
  );

  const data = await response.json();

  // Calcula tasas de éxito
  const loginSuccess = data.stats.find(s => s.event_type === 'LOGIN_SUCCESS')?.count || 0;
  const loginFailed = data.stats.find(s => s.event_type === 'LOGIN_FAILED')?.count || 0;
  const loginSuccessRate = loginSuccess / (loginSuccess + loginFailed) * 100;

  const transferSuccess = data.stats.find(s => s.event_type === 'TRANSFER_SUCCESS')?.count || 0;
  const transferFailed = data.stats.find(s => s.event_type === 'TRANSFER_FAILED')?.count || 0;
  const transferSuccessRate = transferSuccess / (transferSuccess + transferFailed) * 100;

  return {
    loginSuccessRate: loginSuccessRate.toFixed(2) + '%',
    transferSuccessRate: transferSuccessRate.toFixed(2) + '%',
    totalLogins: loginSuccess + loginFailed,
    totalTransfers: transferSuccess + transferFailed
  };
}
```

### Análisis Comparativo

Compara actividad entre usuarios:

```javascript theme={null}
async function compareUsers(userIds) {
  const userStats = await Promise.all(
    userIds.map(async userId => {
      const response = await fetch(
        `https://api.gu1.ai/events/user/stats?user_id=${userId}`,
        {
          headers: { 'Authorization': `Bearer ${API_KEY}` }
        }
      );
      const data = await response.json();
      return {
        userId,
        totalEvents: data.stats.reduce((sum, s) => sum + s.count, 0),
        stats: data.stats
      };
    })
  );

  // Ordena por actividad total
  return userStats.sort((a, b) => b.totalEvents - a.totalEvents);
}
```

## Ejemplos de Visualización

### Preparación de Datos para Gráficos

Prepara datos para gráficos:

```javascript theme={null}
async function prepareChartData(userId) {
  const response = await fetch(
    `https://api.gu1.ai/events/user/stats?user_id=${userId}`,
    {
      headers: { 'Authorization': `Bearer ${API_KEY}` }
    }
  );

  const data = await response.json();

  // Para gráfico circular
  const pieData = data.stats.map(s => ({
    name: s.event_type,
    value: s.count
  }));

  // Para gráfico de barras
  const barData = data.stats.map(s => ({
    category: s.event_type,
    count: s.count
  }));

  return { pieData, barData };
}
```

## Próximos Pasos

<CardGroup cols={2}>
  <Card title="Listar Eventos" icon="list" href="/es/api-reference/events/list">
    Consulta eventos individuales
  </Card>

  <Card title="Crear Evento" icon="plus" href="/es/api-reference/events/create">
    Rastrea nuevos eventos
  </Card>

  <Card title="Listar por Entidad" icon="user" href="/es/api-reference/events/list-by-entity">
    Obtén eventos para entidad específica
  </Card>

  <Card title="Análisis" icon="chart-line" href="/es/use-cases/transaction-monitoring/overview">
    Construye dashboards de análisis
  </Card>
</CardGroup>
