# Autenticación API - Seguros API

## Resumen

Todas las peticiones a la API (excepto `/health`) requieren autenticación mediante API Key y API Secret.

## Credenciales

Las credenciales se generan desde el panel de administración en la sección "API Keys".

Cada proveedor (DisaShop, etc.) debe tener sus propias credenciales:
- **API Key**: Identificador público de 64 caracteres hexadecimales
- **API Secret**: Clave secreta de 64 caracteres hexadecimales

## Cómo Autenticar

### Headers Requeridos

Todas las peticiones deben incluir los siguientes headers:

```
X-API-Key: tu_api_key_aqui
X-API-Secret: tu_api_secret_aqui
```

### Ejemplo con cURL

```bash
curl -X POST https://www.redbajasusa.com/segurosapi/api/start-transaction \
  -H "Content-Type: application/json" \
  -H "X-API-Key: abc123..." \
  -H "X-API-Secret: xyz789..." \
  -d '{
    "tipo_vehiculo": "automovil",
    "tipo_cobertura": "ley",
    "cedula": "00112345678",
    "telefono": "8095551234",
    "placa": "A123456"
  }'
```

### Ejemplo con JavaScript (Fetch)

```javascript
const response = await fetch('https://www.redbajasusa.com/segurosapi/api/start-transaction', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': 'abc123...',
    'X-API-Secret': 'xyz789...'
  },
  body: JSON.stringify({
    tipo_vehiculo: 'automovil',
    tipo_cobertura: 'ley',
    cedula: '00112345678',
    telefono: '8095551234',
    placa: 'A123456'
  })
});

const data = await response.json();
```

### Ejemplo con PHP

```php
$apiKey = 'abc123...';
$apiSecret = 'xyz789...';

$ch = curl_init('https://www.redbajasusa.com/segurosapi/api/start-transaction');

curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'X-API-Key: ' . $apiKey,
        'X-API-Secret: ' . $apiSecret
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'tipo_vehiculo' => 'automovil',
        'tipo_cobertura' => 'ley',
        'cedula' => '00112345678',
        'telefono' => '8095551234',
        'placa' => 'A123456'
    ])
]);

$response = curl_exec($ch);
$data = json_decode($response, true);
```

## Respuestas de Error de Autenticación

### 401 - Credenciales Faltantes
```json
{
  "success": false,
  "error": "Missing API credentials. Required headers: X-API-Key and X-API-Secret",
  "code": 401
}
```

### 401 - API Key Inválida
```json
{
  "success": false,
  "error": "Invalid API key",
  "code": 401
}
```

### 401 - API Secret Inválido
```json
{
  "success": false,
  "error": "Invalid API secret",
  "code": 401
}
```

### 403 - IP No Autorizada
```json
{
  "success": false,
  "error": "IP address not authorized",
  "code": 403
}
```

### 429 - Límite de Rate Excedido
```json
{
  "success": false,
  "error": "Daily rate limit exceeded",
  "code": 429
}
```

## Límites de Rate

Cada API Key tiene un límite diario de requests configurado (por defecto: 10,000).

El contador se reinicia automáticamente cada día a las 00:00.

## Monitoreo

El administrador puede monitorear:
- Uso diario de cada API Key
- Historial de requests de los últimos 7 días
- Requests exitosos vs fallidos
- Último uso de cada key

## Seguridad

### Buenas Prácticas

1. **Nunca** compartas tus credenciales
2. **Nunca** incluyas las credenciales en código versionado (Git)
3. Usa variables de entorno para almacenar las credenciales
4. Rota las credenciales periódicamente
5. Desactiva keys comprometidas inmediatamente

### Whitelist de IPs (Opcional)

Puedes configurar una lista de IPs permitidas para cada API Key. Esto añade una capa extra de seguridad.

Si se configura, solo las IPs en la lista podrán usar esa key.

## Health Check (Sin Autenticación)

El endpoint `/health` NO requiere autenticación:

```bash
curl https://www.redbajasusa.com/segurosapi/api/health
```

Respuesta:
```json
{
  "success": true,
  "data": {
    "status": "ok",
    "timestamp": "2025-11-04 12:00:00",
    "version": "1.0.0"
  }
}
```

## Soporte

Para problemas con autenticación o para solicitar nuevas API Keys, contacta al administrador del sistema.
