Saltar al contenido principal

Formato de Respuesta de Error

KillB retorna respuestas de error estandarizadas:
{
  "errorCode": "USER.0001",
  "message": ["Usuario no encontrado"],
  "statusCode": "404",
  "arguments": [
    {
      "key": "userId",
      "value": "invalid-id"
    }
  ]
}

Códigos de Estado HTTP

EstadoSignificadoAcción
200ÉxitoProcesar respuesta
201CreadoRecurso creado exitosamente
400Solicitud IncorrectaCorregir parámetros de solicitud
401No AutorizadoActualizar token
403ProhibidoVerificar permisos
404No EncontradoRecurso no existe
409ConflictoRecurso ya existe
429Demasiadas SolicitudesImplementar backoff
500Error del ServidorReintentar con backoff

Códigos de Error Comunes

Errores de Autenticación

CódigoMensajeSolución
AUTH.0001Credenciales inválidasVerificar email/contraseña
AUTH.0002Token expiradoActualizar token de acceso
AUTH.0003Token inválidoRe-autenticar

Errores de Usuario

CódigoMensajeSolución
USER.0001Usuario no encontradoVerificar ID del usuario
USER.0002Documento inválidoVerificar formato del documento
USER.0003Email ya existeUsar email diferente
USER.0004Usuario menor de edadUsuario debe tener 18+

Errores de Ramp

CódigoMensajeSolución
RAMP.0001Cotización expiradaCrear nueva cotización
RAMP.0002Saldo insuficienteVerificar saldo pre-fondeado
RAMP.0003Límite del usuario excedidoActualizar nivel KYC
RAMP.0004Cuenta inválidaVerificar estado de cuenta

Estrategia de Manejo de Errores

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:
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:
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