Manejo de errores
Documentación de la API · Zypher Global
Introducción
Autenticación
Sandbox
Cobro PIX (BRL)
Cobro SPEI (MXN)
Cobro USDT
Retiro PIX (clave)
Retiro BR Code
Retiro SPEI (MXN)
Retiro USDT
Splits (reparto)
Consultar Saldo
Convertir Moneda
Consultar Transacciones
Webhooks
Manejo de errores
Toda falla de la API devuelve un cuerpo JSON estandarizado con un mensaje legible y un error_code estable. El estado HTTP también refleja el error (no siempre 200). Maneja los errores por error_code, NO cambia entre idiomas ni versiones.
Formato del error
HTTP 422
{
"ok": false,
"error": "Chave PIX não encontrada.",
"error_code": "pix_key_not_found"
}
ok— siemprefalseen caso de error.error— mensaje legible (localizado por idioma). Bueno para mostrar/registrar; NO lo uses para lógica.error_code— slug estable para manejar por código (switch/if). Es la fuente de la verdad.
Estado HTTP
- 400 — solicitud inválida (datos/campos).
- 401 — credenciales ausentes o inválidas.
- 403 — sin permiso, IP no autorizada o recurso desactivado.
- 422 — dato rechazado en el procesamiento (ej.: clave no encontrada, saldo insuficiente).
- 429 — demasiados intentos. Espera e inténtalo de nuevo.
- 500 / 503 — error interno o servicio temporalmente no disponible.
El estado también viene en el header
X-App-Error-Code (compatibilidad con clientes que solo leen cabeceras).Códigos de error
El mismo error_code puede aparecer en rutas distintas. Maneja siempre por el código.
Autenticación y acceso
missing_credentials401— Client ID/Secret ausentes en la cabecera.invalid_credentials401— Client ID/Secret inválidos.key_inactive403— Clave de API inactiva.permission_denied403— La clave no tiene el permiso requerido (cashin/cashout/balance).ip_not_configured403— Cash-out sin IP en la allowlist de la clave.ip_not_allowed403— IP de origen fuera de la allowlist (o no IPv4).invalid_account403— Cuenta asociada a la clave inválida.rate_limited429— Demasiadas solicitudes en poco tiempo.
Clave / receptor (PIX)
pix_key_not_found422— La clave PIX no existe en el DICT.pix_key_invalid422— Clave PIX con formato inválido.pix_key_type_invalid422— Tipo de clave no aceptado para este destino.invalid_document422— CPF/CNPJ inválido o no coincide con la clave.name_mismatch422— Nombre/documento del receptor no coincide con la clave.recipient_cannot_receive422— La cuenta de destino no puede recibir (cerrada/inactiva).destination_blocked422— Clave o cuenta de destino bloqueada/suspendida.
Monto y saldo
insufficient_balance400— Saldo insuficiente para el monto + la tarifa.amount_below_min422— Monto por debajo del mínimo permitido.amount_above_limit422— Monto por encima del límite permitido.amount_unavailable422— Ningún riel cubre ese monto ahora, intenta un monto menor.invalid_amount422— Monto inválido o cero.
Procesamiento / proveedor
duplicate422— Operación duplicada (verifica si ya fue procesada).unauthorized403— Operación no autorizada por el proveedor.maintenance503— Servicio en mantenimiento.provider_unavailable422— Servicio no disponible o timeout, puedes reintentar.cashin_failed422— Falla genérica al generar el cobro.cashout_failed422— Falla genérica en el retiro (contacta al soporte).
Cuenta / permisos
kyc_required403— Cuenta sin verificación de documentos (KYC).currency_not_supported400— Moneda no soportada (usa BRL, MXN, ARS, COP o USDT).currency_not_enabled403— Moneda no habilitada para esta cuenta, habla con soporte.phone_required422— Teléfono del comprador obligatorio en el cash-in COP (NEQUI/BRE-B).
Conversión
invalid_request400— Campos amount/from/to ausentes o inválidos.conversion_failed500— Falla al ejecutar la conversión (no se debitó nada).conversion_in_progress409— Ya hay una conversión en curso con ese external_id, espera, no reenvíes.
Consulta / estado
missing_reference400— Faltó el identificador (request_number / e2e / transaction_id).deposit_not_found404— Ningún depósito para el identificador indicado.withdrawal_not_found404— Ningún retiro para el identificador indicado.
Reintentables:
provider_unavailable y rate_limited son transitorios, puedes repetir la misma solicitud (con el mismo external_id para no duplicar). Los demás son definitivos: corrige el dato antes de reenviar.Ejemplo de manejo
JavaScript
const r = await fetch(url, opts);
const data = await r.json();
if (!data.ok) {
switch (data.error_code) {
case 'pix_key_not_found':
case 'pix_key_invalid':
// pedir outra chave ao usuário
break;
case 'insufficient_balance':
// avisar saldo
break;
case 'provider_unavailable':
case 'rate_limited':
// retentar com backoff (mesmo external_id)
break;
default:
// mostrar data.error e logar
}
}
¿Esta página fue útil?
