Saltar al contenido principal
Todos los errores comparten el mismo formato:
{
  "error": "insufficient_funds",
  "message": "account balance is not enough for this operation"
}
  • error: código estable en snake_case — úsalo en tu lógica.
  • message: explicación legible — puede cambiar, no lo parsees.

Códigos por categoría

Autenticación y permisos

HTTPerrorSignificado
401unauthorizedCredencial ausente o inválida
401invalid_credentialsEmail o contraseña incorrectos (login)
403account_requiredEl endpoint exige credencial de cuenta
403org_admin_requiredEl endpoint exige credencial de administrador
403forbiddenNivel de credencial no permitido
403account_blockedLa cuenta no está activa
403service_disabledEl servicio no está habilitado para tu cuenta (consulta GET /v1/services)
403org_suspendedEl servicio está suspendido; contacta al equipo de CBPay
403company_onlyFunción solo para cuentas empresa
403company_requiredFunción solo para cuentas empresa (ej. wallets segregadas)
403human_session_requiredLa operación maneja llave privada (import/export de wallet segregada) y exige sesión de usuario con 2FA — las API keys no se permiten

OTP / 2FA

Detalle y flujo completo en seguridad y 2FA.
HTTPerrorSignificado
403otp_requiredLa acción exige OTP: verifica un desafío y reintenta con X-OTP-Token
403otp_invalidToken OTP inválido, expirado o ya usado
403session_requiredLos desafíos OTP requieren sesión de usuario, no API key
403phone_binding_cooldownTeléfono enlazado hace menos de 24 h sin verificación
401invalid_codeEl código no coincide
401invalid_pending_tokenEl token intermedio del login expiró; vuelve a iniciar sesión
400invalid_action / invalid_channelAcción o canal fuera de catálogo
409phone_requiredLa cuenta no tiene teléfono (PATCH /v1/me)
409otp_phone_missingEl login exige OTP y la cuenta no tiene teléfono; contacta a tu operador
409challenge_not_pendingEl desafío expiró o ya se usó; crea uno nuevo
429too_many_attemptsLímite de envíos o verificaciones; espera unos minutos
503otp_unavailableServicio de verificación no disponible (la acción queda bloqueada, nunca se salta el OTP)

Login social (OAuth)

Detalle y flujo completo en login social.
HTTPerrorSignificado
400invalid_providerProveedor fuera de google/apple/microsoft/facebook
400provider_not_configuredTu organización no tiene ese proveedor habilitado
401invalid_credentialLa credencial del proveedor es inválida, expiró o es de otra app
409email_conflictYa existe una cuenta con ese email; entra con tu método actual y vincula el proveedor
409identity_takenEse proveedor ya está vinculado a otra cuenta
409last_login_methodNo puedes desvincular tu único método de acceso

Validación (400)

errorSignificado
invalid_jsonBody no es JSON válido o tiene campos desconocidos
invalid_typetype debe ser person o company
invalid_email / invalid_display_nameCampo requerido inválido
weak_passwordContraseña menor a 8 caracteres
invalid_roleRol de miembro inválido
unknown_orgSlug de organización incorrecto (usa cbpay)
invalid_requestFaltan country/currency
idempotency_key_requiredFalta la clave de idempotencia
beneficiary_requiredFalta el beneficiario del payout
invalid_amountMonto no es un decimal positivo válido
recipient_required / self_transferDestino de transferencia inválido
invalid_chain / invalid_assetRed o activo no soportado
to_address_requiredFalta dirección destino del retiro
invalid_payloadFalta un campo requerido (ej. enabled en monitoreo AML, external_customer_id en verificaciones)
liveness_already_completedLa prueba de vida de esa verificación ya fue superada
invalid_event_type / weak_secret / invalid_callback_urlSuscripción de webhook inválida
invalid_phoneTeléfono no normalizable a E.164 (contactos y to_phone)
batch_too_largeImport de contactos con más de 1.000 entradas (pagina la subida)
invalid_status / invalid_kyc_status / invalid_direction / reason_required / account_id_required / invalid_service / invalid_feeValidaciones de administración

Dinero y estado (402 / 404 / 409 / 422)

HTTPerrorSignificado
402insufficient_fundsSaldo disponible insuficiente
404not_foundRecurso inexistente (o de otra cuenta)
404recipient_not_foundDestino de transferencia inexistente
409duplicateEl recurso ya existe
403verification_requiredTu cuenta aún no aprobó su verificación de identidad (persona=KYC, empresa=KYB); hasta entonces solo puedes fondear — pide tu link en POST /v1/me/verification/link
422verification_requiredLa operación exige el verification_id de una verificación aprobada del tercero (alta banking de terceros, tarjeta designada)
422verification_not_approvedLa verificación referenciada aún no está aprobada
422verification_kind_mismatchEl kind de la verificación no calza con el producto (KYC ⇒ persona/INDIVIDUAL, KYB ⇒ empresa/COMPANY)
422verification_invalidReferenciaste una verificación de onboarding propio donde se exige la de un tercero
403company_account_requiredLa verificación de terceros (links/submissions KYC-KYB) es solo para cuentas empresa
409already_verifiedPediste link de onboarding con la cuenta ya verificada
409no_screeningRescreen/monitoreo AML sin un screening previo
409no_banking_customerOperación banking sin perfil bancario creado (POST /v1/banking/customer primero)
409banking_customer_existsLa cuenta ya tiene perfil bancario (es uno por cuenta)
422currency_not_supportedSin tasa FX para esa moneda
422core_rejectedEl procesador rechazó la operación
422recipient_unavailableLa cuenta destino no puede recibir
422recipient_ambiguousMás de una cuenta comparte el teléfono de to_phone (usa to_account_id o to_email)
422contact_not_linkedEl contacto no tiene cuenta CBPay asociada para transferirle
422no_saved_destinationEl contacto no tiene destino guardado para ese corredor/chain
422wallet_limit_reachedUna cuenta persona intentó crear una segunda wallet en la misma red
422insufficient_gasLa wallet segregada no tiene gas nativo (TRX/ETH) para el fee de red; fondea la dirección y reintenta
409idempotency_conflictOtra creación/envío de wallet con la misma clave sigue en curso; reintenta con la misma clave
409card_limit_reachedUna cuenta persona intentó crear una segunda tarjeta del mismo tipo
409card_cancelledLa tarjeta ya está cancelada y no se puede modificar
409card_not_pendingSolo tarjetas en pending_activation se pueden activar
409cardholder_kyc_pendingEl titular designado requiere documentos de identidad
400invalid_occupationoccupation no es un código del catálogo (GET /v1/cards/catalog/occupations)
400invalid_kind_of_businesskind_of_business no es un código del catálogo (GET /v1/cards/catalog/business-activities)
400invalid_settlement_assetsettlement_asset no es USDT, USDC, BTC ni GOLD
400settlement_asset_disabledTu organización tiene deshabilitado ese asset como origen de settlement
422settlement_limit_exceededLa operación supera el límite por operación de los assets volátiles (BTC/GOLD); usa USDT/USDC o divide la operación
422settlement_daily_limit_exceededLa cuenta superó su volumen de 24 h en assets volátiles (BTC/GOLD); usa USDT/USDC o reintenta más tarde
400invalid_pairSwap con la misma moneda de origen y destino
400amount_too_smallEl monto del swap no alcanza la unidad mínima de la moneda destino
400swap_asset_disabledUna de las monedas del swap está deshabilitada para tu organización

Servicio (5xx)

HTTPerrorSignificado
500internal_errorError inesperado; reintenta con la misma clave de idempotencia
502rates_unavailableTasas FX temporalmente no disponibles
502core_unavailableProcesador temporalmente no disponible
502compliance_unavailableScreening AML temporalmente no disponible
503verifications_unavailableVerificación de identidad temporalmente no disponible (la comisión se reembolsó)
503org_credential_missingServicio en configuración; contacta al soporte de CBPay
503withdrawals_unavailableRetiros on-chain no habilitados para el corredor
503pricing_unavailablePrecio de ejecución de BTC/GOLD no disponible o desactualizado; reintenta más tarde o liquida en USDT/USDC
503export_unavailableEl export de llaves privadas de wallets segregadas no está habilitado en este entorno

Cómo manejarlos

  • 4xx de validación: corrige el request. No reintentes igual.
  • 402: fondea la cuenta y reintenta (clave de idempotencia nueva solo si la operación nunca se creó).
  • 5xx / timeouts: reintenta con la misma clave de idempotencia; la operación nunca se duplicará.
Última modificación el 11 de julio de 2026