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

# Manejo de Errores

> Mejores prácticas para manejar errores de API

## Formato de Respuesta de Error

KillB retorna respuestas de error estandarizadas:

```json theme={null}
{
  "errorCode": "USER.0001",
  "message": ["Usuario no encontrado"],
  "statusCode": "404",
  "arguments": [
    {
      "key": "userId",
      "value": "invalid-id"
    }
  ]
}
```

## Códigos de Estado HTTP

| Estado | Significado            | Acción                           |
| ------ | ---------------------- | -------------------------------- |
| `200`  | Éxito                  | Procesar respuesta               |
| `201`  | Creado                 | Recurso creado exitosamente      |
| `400`  | Solicitud Incorrecta   | Corregir parámetros de solicitud |
| `401`  | No Autorizado          | Actualizar token                 |
| `403`  | Prohibido              | Verificar permisos               |
| `404`  | No Encontrado          | Recurso no existe                |
| `409`  | Conflicto              | Recurso ya existe                |
| `429`  | Demasiadas Solicitudes | Implementar backoff              |
| `500`  | Error del Servidor     | Reintentar con backoff           |

## Códigos de Error Comunes

### Errores de Autenticación

| Código      | Mensaje                | Solución                   |
| ----------- | ---------------------- | -------------------------- |
| `AUTH.0001` | Credenciales inválidas | Verificar email/contraseña |
| `AUTH.0002` | Token expirado         | Actualizar token de acceso |
| `AUTH.0003` | Token inválido         | Re-autenticar              |

### Errores de Usuario

| Código      | Mensaje               | Solución                        |
| ----------- | --------------------- | ------------------------------- |
| `USER.0001` | Usuario no encontrado | Verificar ID del usuario        |
| `USER.0002` | Documento inválido    | Verificar formato del documento |
| `USER.0003` | Email ya existe       | Usar email diferente            |
| `USER.0004` | Usuario menor de edad | Usuario debe tener 18+          |

### Errores de Ramp

| Código      | Mensaje                     | Solución                     |
| ----------- | --------------------------- | ---------------------------- |
| `RAMP.0001` | Cotización expirada         | Crear nueva cotización       |
| `RAMP.0002` | Saldo insuficiente          | Verificar saldo pre-fondeado |
| `RAMP.0003` | Límite del usuario excedido | Actualizar nivel KYC         |
| `RAMP.0004` | Cuenta inválida             | Verificar estado de cuenta   |

## Estrategia de Manejo de Errores

```javascript theme={null}
class KillBAPIError extends Error {
  constructor(response) {
    super(response.message.join(', '));
    this.errorCode = response.errorCode;
    this.statusCode = response.statusCode;
    this.arguments = response.arguments;
  }
}

const makeAPIRequest = async (endpoint, options) => {
  try {
    const response = await fetch(endpoint, options);
    
    if (!response.ok) {
      const error = await response.json();
      throw new KillBAPIError(error);
    }
    
    return await response.json();
    
  } catch (error) {
    if (error instanceof KillBAPIError) {
      // Manejar errores de API
      console.error(`Error de API ${error.errorCode}:`, error.message);
      
      if (error.statusCode === '401') {
        // Token expirado, actualizar
        await refreshToken();
        return makeAPIRequest(endpoint, options);
      }
      
      if (error.errorCode === 'RAMP.0001') {
        // Cotización expirada, obtener nueva
        const newQuote = await getNewQuotation();
        // Reintentar con nueva cotización
      }
    }
    
    throw error;
  }
};
```

## Lógica de Reintento

Implementa backoff exponencial:

```javascript theme={null}
const retryWithBackoff = async (fn, maxRetries = 3) => {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await fn();
    } catch (error) {
      if (i === maxRetries - 1) throw error;
      
      // No reintentar errores de cliente (4xx)
      if (error.statusCode && error.statusCode < 500) {
        throw error;
      }
      
      // Backoff exponencial
      const delay = Math.pow(2, i) * 1000;
      await new Promise(resolve => setTimeout(resolve, delay));
    }
  }
};

// Uso
const user = await retryWithBackoff(() => createUser(userData));
```

## Mensajes Amigables al Usuario

Mapea errores técnicos a mensajes de usuario:

```javascript theme={null}
const getUserMessage = (error) => {
  const messages = {
    'AUTH.0002': 'Tu sesión expiró. Por favor, inicia sesión nuevamente.',
    'USER.0003': 'Este email ya está registrado.',
    'RAMP.0001': 'La cotización de precio expiró. Por favor, intenta nuevamente.',
    'RAMP.0003': 'El monto de transacción excede tu límite. Por favor, verifica tu identidad para aumentar límites.'
  };
  
  return messages[error.errorCode] || 'Ocurrió un error. Por favor, intenta nuevamente.';
};
```

## Próximos Pasos

<CardGroup cols={2}>
  <Card title="Límites de Tasa" icon="gauge" href="/es/resources/rate-limits">
    Comprendiendo límites de tasa de API
  </Card>

  <Card title="Mejores Prácticas" icon="star" href="/es/resources/best-practices">
    Consejos de integración de producción
  </Card>
</CardGroup>
