Descripción General
La API de Dodo Payments utiliza códigos de estado HTTP estándar y códigos de error personalizados para indicar el éxito o el fracaso de las solicitudes de la API. Cuando ocurre un error, la API devuelve un código de estado HTTP apropiado y una respuesta JSON que contiene información detallada sobre el error. Cada respuesta de error incluye:- Un código de estado HTTP que indica la categoría general del error
- Un código de error específico que identifica la naturaleza exacta del error
- Un mensaje de error legible por humanos que explica qué salió mal
- Detalles adicionales sobre el error cuando sea aplicable
- Depurar problemas de integración
- Implementar un manejo de errores adecuado en su aplicación
- Proporcionar retroalimentación significativa a los usuarios finales
- Mantener un sistema de procesamiento de pagos robusto
Códigos de Error de API Estándar
| Código de error | Estado HTTP | Descripción |
|---|---|---|
| 400 | Solicitud Incorrecta | La solicitud estaba mal formada o contenía parámetros inválidos |
| 401 | No Autorizado | La autenticación falló o la clave de API es inválida |
| 403 | Prohibido | La clave de API no tiene permiso para acceder al recurso solicitado |
| 404 | No Encontrado | El recurso solicitado no existe |
| 405 | Método No Permitido | El método HTTP no es compatible con este punto final |
| 409 | Conflicto | La solicitud entra en conflicto con el estado actual del recurso |
| 422 | Entidad No Procesable | La solicitud estaba bien formada pero contenía errores semánticos |
| 429 | Demasiadas Solicitudes | Se superó el límite de tasa |
| 500 | Error Interno del Servidor | Ocurrió un error inesperado en nuestros servidores |
| 502 | Puerta de Enlace Incorrecta | El servidor recibió una respuesta inválida de un servidor ascendente |
| 503 | Servicio No Disponible | El servicio está temporalmente no disponible |
| 504 | Tiempo de Espera de la Puerta de Enlace | El servidor agotó el tiempo de espera mientras esperaba una respuesta ascendente |
Formato de Respuesta de Error
Cuando ocurre un error, la API devuelve una respuesta JSON con la siguiente estructura:Referencia de Códigos de Error
-
ACTIVATION_LIMIT_LESS_THAN_CURRENT_AMOUNT- Trigger: Activaciones de clave de licencia: nuevo límite < cantidad de instancias existentes
- Message: El nuevo límite de activación no puede ser menor que la cantidad actual de instancias
-
ADDONS_IN_USAGE_BASED_BILLING_NOT_SUPPORTED- Trigger: Intento de agregar complementos a suscripciones de facturación basada en uso
- Message: Los complementos en las suscripciones no son compatibles con la facturación basada en uso
-
ADDONS_NOT_ALLOWED_FOR_ON_DEMAND- Trigger: Intento de agregar complementos a suscripciones bajo demanda
- Message: No se permiten complementos para suscripciones bajo demanda
-
BRAND_MISMATCH- Trigger: Los artículos del carrito pertenecen a diferentes marcas
- Message: Todos los artículos en el carrito de productos deben pertenecer a la misma marca
-
BRAND_NOT_ENABLED- Trigger: La marca está deshabilitada o no activa
- Message: La marca proporcionada no está habilitada
-
BRAND_SUBMISSION_NOT_ENABLED- Trigger: La función de reenvío de verificación de marca no está habilitada
- Message: El reenvío de verificación de marca no está habilitado
-
CHARGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION- Trigger: Intento de cobrar una suscripción programada para cancelación
- Message: Suscripción programada para cancelación
-
CHECKOUT_SESSION_CONSUMED- Trigger: La sesión de pago ya ha generado un pago
- Message: La sesión de pago ya ha sido consumida
-
DISCOUNT_CODE_ALREADY_EXISTS- Trigger: Creación de código de descuento duplicado
- Message: El código de descuento ya existe
-
DISCOUNT_CODE_EXPIRED- Trigger: Código de descuento pasado su
expires_atfecha - Message: Código de descuento expirado
- Trigger: Código de descuento pasado su
-
DISCOUNT_CODE_USAGE_LIMIT_EXCEEDED- Trigger: Descuento reutilizado después de que se alcanzó
usage_limit - Message: El límite de uso no puede ser menor que times_used / El código de descuento alcanzó el límite de uso
- Trigger: Descuento reutilizado después de que se alcanzó
-
DISCOUNT_NOT_AVAILABLE_FOR_ON_DEMAND- Trigger: Código aplicado a suscripción bajo demanda
- Message: El cupón de descuento no está disponible para suscripciones bajo demanda
-
DISCOUNT_NOT_AVAILABLE_FOR_PRODUCT- Trigger: Código aplicado a producto(s) no relacionados
- Message: El cupón de descuento no está disponible para este producto
-
DUPLICATE_LINE_ITEMS_IN_REQUEST- Trigger: El mismo
item_idaparece dos veces enitems[] - Message: Se especificaron item_ids duplicados en el array de items
- Trigger: El mismo
-
DUPLICATE_METER_IDS_IN_REQUEST- Trigger: El mismo ID de medidor aparece múltiples veces en la solicitud
- Message: No se permiten IDs de medidor duplicados
-
EXCHANGE_RATE_NOT_FOUND- Trigger: No hay tasa de FX para el par de divisas
from → to - Message: No se encontró tasa de cambio para convertir de Currency a Currency
- Trigger: No hay tasa de FX para el par de divisas
-
EXISTING_REFUND_REQUEST_PROCESSING- Trigger: Solicitud de reembolso anterior aún en procesamiento
- Message: Una solicitud de reembolso con estado “Pendiente” aún se está procesando
-
INACTIVE_LICENSE_KEY- Trigger: Estado de clave ≠
ACTIVE - Message: La clave de licencia no está activa
- Trigger: Estado de clave ≠
-
INACTIVE_SUBSCRIPTION_PLAN_CHANGE_NOT_SUPPORTED- Trigger: Cambio de plan en suscripción inactiva
- Message: Cambiar de planes no es compatible con suscripciones inactivas
-
INSUFFICIENT_WALLET_FUNDS- Trigger: Saldo de la billetera < monto de débito
- Message: Fondos insuficientes en la billetera
-
INTEGER_CONVERSION_FAILURE- Trigger: Cualquier conversión de entero ↔ cadena/decimal que falla del lado del servidor
- Message: Fallo en la conversión de entero
-
INTERNAL_SERVER_ERROR- Trigger: Excepciones no capturadas; deberías registrar detalles del lado del servidor
- Message: No hay mensaje público (genérico 500)
-
INVALID_DISCOUNT_CODE- Trigger: El código no existe / no es aplicable
- Message: Código de descuento inválido / El código de descuento no se puede aplicar a ningún producto en el carrito
-
INVALID_PERCENTAGE- Trigger: Monto porcentual > 100% (o 10,000 puntos básicos)
- Message: El monto porcentual no puede ser más de 10000 / El monto del código de descuento no puede ser más de 100%
-
INVALID_QUANTITY- Trigger: Cantidad inválida especificada para precios basados en uso
- Message: Solo se permite 1 cantidad en productos de precio basado en uso
-
INVALID_QUERY_PARAMS- Trigger: Parámetros de consulta mutuamente excluyentes / mal formados
- Message: Los parámetros de consulta solo deben contener time_frame o (start, end)
-
INVALID_REQUEST_BODY- Trigger: JSON mal formado o violación de esquema
- Message: El cuerpo de tu solicitud es inválido. Por favor, verifica tus encabezados de solicitud y objeto.
-
INVALID_REQUEST_PARAMETERS- Trigger: Semántica incorrecta (por ejemplo, fecha en el pasado)
- Message: No se puede cambiar next_billing_date a un tiempo pasado
-
INVALID_SUGGESTED_PRICE- Trigger: Precio PWYW < precio mínimo permitido
- Message: El precio sugerido no puede ser menor que el precio mínimo. En caso de pagar lo que quieras, el precio se considera como el monto mínimo aceptado
-
INVALID_TAX_ID- Trigger: Validación de VAT/GST/TIN fallida
- Message: El ID fiscal es inválido
-
LICENSE_KEY_LIMIT_REACHED- Trigger: Activaciones = límite
- Message: Se alcanzó el límite de activación de la clave de licencia
-
LICENSE_KEY_NOT_FOUND- Trigger: ID de instancia o ID de clave inválido
- Message: La instancia de la clave de licencia no se encontró o no pertenece a esta clave de licencia
-
LINE_ITEM_FULLY_REFUNDED- Trigger: Intento de reembolsar un artículo de línea que ya ha sido reembolsado completamente
- Message: El artículo de línea ha sido reembolsado completamente y no puede ser reembolsado nuevamente.
-
LINE_ITEM_NOT_FOUND- Trigger: ID de artículo no parte del pago referenciado
- Message: El artículo de línea no se encontró en el pago
-
LINE_ITEM_PRORATED- Trigger: Intento de reembolso o actualización en una línea prorrateada
- Message: El artículo de línea no puede ser reembolsado porque es prorrateado
-
LINE_ITEM_REFUND_AMOUNT_TOO_HIGH- Trigger: Monto de reembolso > monto pagado (incl. impuestos)
- Message: El monto de reembolso solicitado para el artículo de línea incluyendo impuestos es que está por encima del monto pagado
-
LINE_ITEM_REFUND_AMOUNT_TOO_LOW- Trigger: Monto de reembolso por debajo del umbral mínimo
- Message: El monto de reembolso solicitado para el artículo de línea es que es demasiado bajo
-
MAXIMUM_KEYS_REACHED- Trigger: Metadata / campos personalizados excedieron 50 pares
- Message: Excede 50 pares clave-valor
-
MERCHANT_NOT_LIVE- Trigger: El negocio aún está en modo de prueba/sandbox
- Message: El comerciante no está en vivo
-
METER_IS_DELETED- Trigger: Intento de usar un medidor eliminado
- Message: El medidor ya ha sido eliminado
-
MISSING_ADDON_IDS- Trigger: La lista de
addon_idestá vacía o IDs desconocidos - Message: Uno o más IDs de producto no existen:
- Trigger: La lista de
-
MISSING_METER_IDS- Trigger: La lista de ID de medidor está vacía o contiene IDs inválidos
- Message: Uno o más IDs de medidor no existen:
-
MISSING_PRODUCT_INFORMATION- Trigger: El producto existe pero falta información obligatoria
- Message: El producto existe pero falta o es inválida otra información obligatoria
-
NEGATIVE_BALANCE_ADJUSTMENT- Trigger: Intento de hacer que el saldo de la billetera sea negativo
- Message: No se permite que el saldo de la billetera sea negativo
-
NO_ELIGIBLE_PAYMENT_METHODS- Trigger: Después de filtrar, no queda nada
- Message: No se encontraron métodos de pago elegibles
-
NO_EXPIRY_ON_SUBSCRIPTION_LICENSE_KEYS- Trigger: Intento de establecer una fecha de caducidad en una clave basada en suscripción
- Message: No se puede establecer la fecha de caducidad para la clave de licencia basada en suscripción
-
NOT_FOUND- Trigger: 404 genérico para cualquier recurso faltante
- Message: Elemento no encontrado (o más específico)
-
ON_DEMAND_PLAN_CHANGE_NOT_SUPPORTED- Trigger: Cambio de plan no permitido para bajo demanda
- Message: Cambiar de planes no es compatible con suscripciones bajo demanda
-
ON_DEMAND_SUBSCRIPTIONS_NOT_ENABLED- Trigger: El negocio tiene la bandera de función desactivada
- Message: Las suscripciones bajo demanda no están habilitadas para este negocio
-
ON_DEMAND_USAGE_BASED_BILLING_NOT_SUPPORTED- Trigger: Intento de usar bajo demanda con facturación basada en uso
- Message: Las suscripciones bajo demanda no son compatibles con la facturación basada en uso
-
PAY_AS_YOU_WANT_AMOUNT_REQUIRED- Trigger: Falta precio para producto PWYW
- Message: El monto es obligatorio para el producto de paga lo que quieras
-
PAYMENT_ALREADY_REFUNDED- Trigger: Reembolso duplicado
- Message: Este pago ya ha sido reembolsado
-
PAYMENT_HAS_BEEN_REFUNDED- Trigger: El pago ha sido reembolsado completamente
- Message: El ID de pago ha sido reembolsado completamente.
-
PAYMENT_NOT_SUCCEEDED- Trigger: Intento de reembolsar/procesar un pago no exitoso
- Message: El pago proporcionado no ha tenido éxito
-
PLAN_CHANGE_NOT_ALLOWED_FOR_SCHEDULED_CANCELLATION- Trigger: Cambio de plan intentado en suscripción programada para cancelación
- Message: Suscripción programada para cancelación
-
PREVIOUS_PAYMENT_PENDING- Trigger: Intento de crear un cargo mientras el anterior está en estado no terminal
- Message: No se puede crear un nuevo cargo ya que el pago anterior aún no ha tenido éxito
-
PRODUCT_CART_EMPTY- Trigger: Se envió un carrito de productos vacío
- Message: product_cart está vacío
-
PRODUCT_IS_DELETED- Trigger: Producto eliminado suavemente
- Message: No hay mensajes
-
REFUND_AMOUNT_EXCEEDS_PAID_AMOUNT- Trigger: Monto de reembolso agregado > monto pagado
- Message: El monto de reembolso calculado es mayor que el monto pagado
-
REFUND_WINDOW_EXPIRED- Trigger: Fuera de la ventana de reembolso permitida
- Message: No se pueden iniciar reembolsos días después de la creación del pago. Contacta a support@dodopayments.com.
-
REQUEST_AMOUNT_BELOW_MINIMUM- Trigger: Monto < mínimo del producto
- Message: El monto no puede ser menor que el monto mínimo especificado para el producto
-
SUBSCRIPTION_EXPIRED- Trigger: Facturación pasada
ends_at - Message: La suscripción ha expirado, no se pueden crear nuevos cargos
- Trigger: Facturación pasada
-
SUBSCRIPTION_INACTIVE- Trigger: Estado ≠
ACTIVE - Message: La suscripción no está activa
- Trigger: Estado ≠
-
SUBSCRIPTION_NOT_ON_DEMAND- Trigger: Se esperaba bajo demanda pero se obtuvo intervalo fijo
- Message: La suscripción ya no es bajo demanda
-
SUBSCRIPTION_PAYMENT_RETRY_LIMIT_EXCEEDED- Trigger: Se excedieron los intentos máximos de reintentos de pago de suscripción
- Message: Se excedió el límite máximo de reintentos de 10 intentos para esta suscripción
-
TOO_MANY_REQUESTS- Trigger: 429 límite de tasa
- Message: No hay mensajes
-
TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT- Trigger: Total del carrito combinado < mínimo del gateway
- Message: Se requiere un monto mínimo de para procesar el pago
-
UNABLE_TO_EDIT_PRIMARY_BRAND- Trigger: Intento de actualizar la marca principal a través de la API regular
- Message: La marca principal no se puede actualizar a través de este punto final de API.
-
UNAUTHORIZED- Trigger: Sin clave de API o token / alcance inválido
- Message: No estás autorizado para realizar esta acción
-
UNSUPPORTED_ACTION- Trigger: Acción no compatible para el tipo de recurso
- Message: Cambiar de planes para suscripciones basadas en uso no es compatible
-
UNSUPPORTED_BILLING_CURRENCY- Trigger: Suscripciones restringidas a USD
- Message: La moneda de facturación que no sea USD no es compatible con las suscripciones
-
UNSUPPORTED_COUNTRY- Trigger: Geo aún no soportado
- Message: El país actualmente no está soportado
-
UNSUPPORTED_CURRENCY- Trigger: Moneda de producto o complemento inválida
- Message: La moneda no es actualmente compatible / Solo se admiten productos en USD e INR actualmente / Solo se admite USD e INR para el precio de complemento / Solo se puede solicitar USD o INR para billing_currency / Moneda no soportada / Moneda inesperada para suscripciones de tarjeta india
-
UNSUPPORTED_DISCOUNT_TYPE- Trigger: Descuentos de monto fijo, etc., aún no están activos
- Message: Solo se admiten códigos de descuento porcentuales por ahora
-
UNSUPPORTED_PAYMENT_CURRENCY- Trigger: Moneda de pago bloqueada para conector
- Message: La transacción en INR no es compatible con esta transacción
-
UNSUPPORTED_TAX_CATEGORY- Trigger: Cadena de categoría fiscal no en enum
- Message: La categoría actualmente no está soportada
-
UNSUCCESSFUL_PAYMENT_ID- Trigger: El ID de pago hace referencia a un pago no exitoso
- Message: El ID de pago tiene un estado no exitoso.
-
ZERO_AMOUNT_PAYMENT_REFUND_NOT_ALLOWED- Trigger: Intento de reembolsar un pago de monto cero
- Message: No se puede reembolsar un pago con monto de moneda cero
Mejores Prácticas
- Siempre maneje los errores de manera adecuada en su aplicación
- Implemente un registro de errores adecuado
- Use mensajes de error apropiados para los usuarios finales
- Implemente lógica de reintento para errores transitorios
- Contacte al soporte para problemas no resueltos