Formato de respuesta de error
Todos los errores de la API siguen un formato consistente:
{
"success": false,
"error": "Human-readable error message",
"details": [
{
"field": "amount",
"message": "Must be a positive number"
}
]
}Códigos de estado HTTP
200OKSolicitud exitosa
201CreatedRecurso creado correctamente
400Bad RequestDatos de solicitud inválidos o error de validación
401UnauthorizedAutenticación ausente o inválida
403ForbiddenNo tiene autorización para acceder a este recurso
404Not FoundRecurso no encontrado
429Too Many RequestsLímite de frecuencia excedido
500Internal ErrorError del servidor. Contacte con soporte
| Código | Estado | Descripción |
|---|---|---|
200 | OK | Solicitud exitosa |
201 | Created | Recurso creado correctamente |
400 | Bad Request | Datos de solicitud inválidos o error de validación |
401 | Unauthorized | Autenticación ausente o inválida |
403 | Forbidden | No tiene autorización para acceder a este recurso |
404 | Not Found | Recurso no encontrado |
429 | Too Many Requests | Límite de frecuencia excedido |
500 | Internal Error | Error del servidor. Contacte con soporte |
Errores comunes
Errores de validación (400)
Datos de entrada inválidosEl cuerpo de la solicitud no coincide con el esquema esperado. Compruebe el array para errores de campos específicos.details
{
"success": false,
"error": "Invalid input data",
"details": [
{"path": ["amount"], "message": "Expected number, received string"},
{"path": ["token"], "message": "Invalid enum value. Expected 'USDC' | 'EURC'"}
]
}Monto inválidoEl monto debe estar entre 0.01 y 1.000.000.
Dirección del comerciante inválidaLa no coincide con la dirección del wallet del comerciante.toAddress
Errores de autenticación (401/403)
No se proporcionó tokenEl endpoint protegido requiere autenticación. Incluya el encabezado o .AuthorizationX-API-Key
Token inválido o expiradoEl token JWT ha expirado (duración de 15 min) o está mal formado. Vuelva a autenticarse para obtener un nuevo token.
API key inválidaAPI key no encontrada o ha sido revocada. Compruebe que está usando la clave correcta.
Errores de recurso (404)
Comerciante no encontradoNo existe ningún comerciante con el ID proporcionado. Verifique su .merchantId
Pago no encontradoNo existe ningún pago con el ID proporcionado. Compruebe que el ID del pago es correcto.
El pago ya existeYa existe un pago con este . La API devuelve con los datos del pago existente. Esto previene ataques de doble gasto.txHash200
Códigos de error de la API
Cuando ocurre un error, la respuesta incluye un campo legible por máquina que puede usar para el manejo programático de errores:code
{
"success": false,
"error": "Human-readable message",
"code": "RATE_LIMIT_EXCEEDED",
"retryAfter": 60
}Códigos de error generales
RATE_LIMIT_EXCEEDED429Límite de frecuencia excedido para este endpoint
INVALID_UUID_FORMAT400El parámetro ID no es un UUID válido
MISSING_PARAMETER400Falta un parámetro obligatorio
2FA_REQUIRED403La operación requiere que 2FA esté habilitado
2FA_CODE_REQUIRED400No se proporcionó el código 2FA
2FA_INVALID401El código 2FA es incorrecto o ha expirado
SELF_TRANSFER_NOT_ALLOWED400No se puede retirar a su propio wallet de Fivo
INVALID_MERCHANT_ID400El formato del Merchant ID es inválido
WEBHOOK_LIMIT_REACHED400Número máximo de webhooks por comerciante alcanzado
REFUND_WINDOW_EXPIRED400La ventana de reembolso (180 días) ha expirado
REFUND_EXCEEDS_REMAINING400El monto excede el saldo reembolsable
PAYMENT_NOT_COMPLETED400El pago no está en estado completado
NO_SOURCE_ADDRESS400El pago no tiene dirección de origen
REFUND_NOT_CANCELABLE400El reembolso no está en estado pendiente
| Código | HTTP | Descripción |
|---|---|---|
RATE_LIMIT_EXCEEDED | 429 | Límite de frecuencia excedido para este endpoint |
INVALID_UUID_FORMAT | 400 | El parámetro ID no es un UUID válido |
MISSING_PARAMETER | 400 | Falta un parámetro obligatorio |
2FA_REQUIRED | 403 | La operación requiere que 2FA esté habilitado |
2FA_CODE_REQUIRED | 400 | No se proporcionó el código 2FA |
2FA_INVALID | 401 | El código 2FA es incorrecto o ha expirado |
SELF_TRANSFER_NOT_ALLOWED | 400 | No se puede retirar a su propio wallet de Fivo |
INVALID_MERCHANT_ID | 400 | El formato del Merchant ID es inválido |
WEBHOOK_LIMIT_REACHED | 400 | Número máximo de webhooks por comerciante alcanzado |
REFUND_WINDOW_EXPIRED | 400 | La ventana de reembolso (180 días) ha expirado |
REFUND_EXCEEDS_REMAINING | 400 | El monto excede el saldo reembolsable |
PAYMENT_NOT_COMPLETED | 400 | El pago no está en estado completado |
NO_SOURCE_ADDRESS | 400 | El pago no tiene dirección de origen |
REFUND_NOT_CANCELABLE | 400 | El reembolso no está en estado pendiente |
Códigos de error de blockchain
Estos códigos aparecen en el campo de los pagos fallidos:failure_reason
E001Fondos insuficientes en el wallet del remitente
E002La transacción fue revertida en la cadena
E003Tiempo de espera de red agotado durante la transacción
E004Dirección de wallet inválida
E005Error en la estimación de gas
E006El usuario canceló la transacción
E007Error en la atestación CCTP
E999Error de blockchain desconocido
| Código | Descripción |
|---|---|
E001 | Fondos insuficientes en el wallet del remitente |
E002 | La transacción fue revertida en la cadena |
E003 | Tiempo de espera de red agotado durante la transacción |
E004 | Dirección de wallet inválida |
E005 | Error en la estimación de gas |
E006 | El usuario canceló la transacción |
E007 | Error en la atestación CCTP |
E999 | Error de blockchain desconocido |
Límites de frecuencia
Cuando exceda los límites de frecuencia, recibirá una respuesta 429 con encabezados adicionales:
HTTP/1.1 429 Too Many Requests
Retry-After: 60
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1705312800
{
"success": false,
"error": "Rate limit exceeded",
"message": "Too many requests. Please retry after 1 minute.",
"code": "RATE_LIMIT_EXCEEDED",
"retryAfter": 60,
"context": "general"
}Encabezados de límite de frecuencia
| Encabezado | Descripción |
|---|---|
Retry-After | Segundos a esperar antes de reintentar |
X-RateLimit-Limit | Solicitudes máximas permitidas en la ventana |
X-RateLimit-Remaining | Solicitudes restantes en la ventana actual |
X-RateLimit-Reset | Marca de tiempo Unix de cuándo se restablece el límite |
Límites de frecuencia por endpoint
Endpoints de API Key
200 req / 1 minute
Per: API Key
API general
100 req / 1 minute
Per: IP
Creación de pago (widget)
20 req / 1 minute
Per: IP
Inicio de sesión
5 req / 5 minutes
Per: IP + email
Registro
3 req / 15 minutes
Per: IP
Restablecimiento de contraseña
3 req / 15 minutes
Per: IP + email
Verificación 2FA
5 req / 5 minutes
Per: IP
Retiros
10 req / 10 minutes
Per: IP
Formulario de contacto
3 req / 15 minutes
Per: IP
| Endpoint | Límite | Ventana | Por |
|---|---|---|---|
| Endpoints de API Key | 200 req | 1 minute | API Key |
| API general | 100 req | 1 minute | IP |
| Creación de pago (widget) | 20 req | 1 minute | IP |
| Inicio de sesión | 5 req | 5 minutes | IP + email |
| Registro | 3 req | 15 minutes | IP |
| Restablecimiento de contraseña | 3 req | 15 minutes | IP + email |
| Verificación 2FA | 5 req | 5 minutes | IP |
| Retiros | 10 req | 10 minutes | IP |
| Formulario de contacto | 3 req | 15 minutes | IP |
Buena práctica
Retry-AfterErrores entre cadenas
Los pagos entre cadenas son gestionados del lado del cliente por Bridge Kit en el widget. Si la transferencia falla (por ejemplo, tiempo de espera en la atestación, error en el mint), el widget muestra el error directamente al cliente. Estos errores no llegan a la API del backend.
Si un pago entre cadenas falla después de la transacción de burn, el cliente puede contactar con soporte proporcionando su hash de transacción. Los pagos fallidos almacenan el error en el campo , accesible a través de la API de estado de pago.failure_reason
Detección de fraude
Fivo incluye detección de fraude integrada. Estos errores indican posibles ataques:
Error en la verificación del monto del pagoEl monto declarado no coincide con el monto real de la transacción en blockchain. Esto podría indicar un intento de manipulación de registros de pago.
Seguridad
Ejemplo de manejo de errores
Así es como debe manejar correctamente los errores de la API en su código:
async function createCheckoutSession(data) {
try {
const response = await fetch('https://api.fivo.finance/checkout/sessions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.FIVO_API_KEY
},
body: JSON.stringify(data)
});
const result = await response.json();
if (!response.ok) {
// Handle specific error codes
switch (response.status) {
case 400:
console.error('Validation error:', result.details);
throw new Error('Invalid session data');
case 401:
console.error('Authentication failed');
throw new Error('Please check your API key');
case 429:
const retryAfter = response.headers.get('Retry-After');
console.log(`Rate limited. Retry after ${retryAfter}s`);
throw new Error('Too many requests');
default:
throw new Error(result.error || 'Unknown error');
}
}
return result.data;
} catch (error) {
console.error('Checkout session failed:', error.message);
throw error;
}
}¿Sigue teniendo problemas?
Si encuentra un error no listado aquí, contacte con soporte proporcionando:
- La respuesta de error completa
- Detalles de la solicitud (endpoint, método, cuerpo)
- ID de pago o hash de transacción (si aplica)
- Marca de tiempo de cuándo ocurrió el error