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 licencias: nuevo límite < recuento de instancias existentes
- Message: El nuevo límite de activaciones no puede ser menor que el recuento actual de instancias
-
ADDONS_IN_USAGE_BASED_BILLING_NOT_SUPPORTED- Trigger: Intento de agregar complementos a suscripciones de facturación por uso
- Message: No se admiten complementos en suscripciones para facturación por uso
-
ADDONS_NOT_ALLOWED_FOR_ON_DEMAND- Trigger: Intento de agregar complementos a suscripciones on-demand
- Message: No se permiten complementos para suscripciones on demand
-
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 está 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 suscripción programada para cancelación
- Message: Suscripción programada para cancelación
-
CHECKOUT_SESSION_CONSUMED- Trigger: La sesión de checkout ya generó un pago
- Message: La sesión de checkout ya fue 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: El código de descuento expiró
- Trigger: Código de descuento pasado su
-
DISCOUNT_CODE_USAGE_LIMIT_EXCEEDED- Trigger: Descuento reutilizado después de que
usage_limitse alcanzó - 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
-
DISCOUNT_NOT_AVAILABLE_FOR_ON_DEMAND- Trigger: Código aplicado a suscripción on-demand
- Message: El cupón de descuento no está disponible para suscripciones on demand
-
DISCOUNT_NOT_AVAILABLE_FOR_PRODUCT- Trigger: Código aplicado a producto(s) no relacionado(s)
- Message: El cupón de descuento no está disponible para este producto
-
DUPLICATE_LINE_ITEMS_IN_REQUEST- Trigger: Mismo
item_idaparece dos veces enitems[] - Message: Se especificaron item_ids duplicados en el array de items
- Trigger: Mismo
-
DUPLICATE_METER_IDS_IN_REQUEST- Trigger: 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 tipo de cambio FX para el par de divisas
from → to - Message: No se encontró tasa de cambio para convertir de Currency a Currency
- Trigger: No hay tipo de cambio FX para el par de divisas
-
EXISTING_REFUND_REQUEST_PROCESSING- Trigger: Solicitud de reembolso anterior aún en proceso
- Message: Una solicitud de reembolso con estado “Pending” aún está en proceso
-
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: No se admite cambiar planes para suscripciones inactivas
-
INSUFFICIENT_WALLET_FUNDS- Trigger: Saldo de billetera < monto de débito
- Message: Fondos insuficientes en la billetera
-
INTEGER_CONVERSION_FAILURE- Trigger: Cualquier conversión entero ↔ cadena/decimal que falla del lado del servidor
- Message: Error de conversión de entero
-
INTERNAL_SERVER_ERROR- Trigger: Excepciones no capturadas; debe registrar detalles del lado del servidor
- Message: No hay mensaje público (500 genérico)
-
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 puede aplicarse 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 superior al 100%
-
INVALID_QUANTITY- Trigger: Cantidad inválida especificada para precios basados en uso
- Message: Solo se permite 1 cantidad en productos con precio basado en uso
-
INVALID_QUERY_PARAMS- Trigger: Parámetros de consulta mutuamente exclusivos / mal formados
- Message: Los parámetros de consulta deben contener solo time_frame o (start, end)
-
INVALID_REQUEST_BODY- Trigger: JSON malformado o violación de esquema
- Message: El cuerpo de su solicitud no es válido. Verifique los encabezados y el objeto de la solicitud.
-
INVALID_REQUEST_PARAMETERS- Trigger: Semántica incorrecta (por ejemplo, fecha en el pasado)
- Message: No se puede cambiar next_billing_date a una fecha pasada
-
INVALID_SUGGESTED_PRICE- Trigger: Precio PWYW < precio mínimo permitido
- Message: El precio sugerido no puede ser inferior al precio mínimo. En el caso de pay what you want, el precio se considera el monto mínimo aceptado
-
INVALID_TAX_ID- Trigger: Falló la validación de VAT/GST/TIN
- Message: El ID fiscal no es válido
-
LICENSE_KEY_LIMIT_REACHED- Trigger: Activaciones = límite
- Message: Se alcanzó el límite de activaciones de la clave de licencia
-
LICENSE_KEY_NOT_FOUND- Trigger: ID de instancia o ID de clave inválido
- Message: No se encontró la instancia de la clave de licencia o no pertenece a esta clave
-
LINE_ITEM_FULLY_REFUNDED- Trigger: Intento de reembolsar un ítem ya completamente reembolsado
- Message: El artículo ya se ha reembolsado completamente y no puede reembolsarse más.
-
LINE_ITEM_NOT_FOUND- Trigger: El ID del artículo no forma parte del pago referenciado
- Message: No se encontró el artículo en el pago
-
LINE_ITEM_PRORATED- Trigger: Reembolso o actualización intentando aplicarse a una línea prorrateada
- Message: El artículo no puede reembolsarse porque está prorrateado
-
LINE_ITEM_REFUND_AMOUNT_TOO_HIGH- Trigger: Monto de reembolso > monto pagado (incluido impuestos)
- Message: El monto solicitado para el artículo , incluyendo impuestos, es , lo cual excede el monto pagado
-
LINE_ITEM_REFUND_AMOUNT_TOO_LOW- Trigger: Monto de reembolso por debajo del umbral mínimo
- Message: El monto solicitado para el artículo es , lo cual es demasiado bajo
-
MAXIMUM_KEYS_REACHED- Trigger: Metadatos / campos personalizados excedieron 50 pares
- Message: Supera los 50 pares clave-valor
-
MERCHANT_NOT_LIVE- Trigger: El negocio aún está en modo de prueba/sandbox
- Message: El comerciante no está en producción
-
METER_IS_DELETED- Trigger: Intento de usar un medidor eliminado
- Message: El medidor ya ha sido eliminado
-
MISSING_ADDON_IDS- Trigger: Lista
addon_idvacía o IDs desconocidos - Message: Uno o más IDs de producto no existen:
- Trigger: Lista
-
MISSING_METER_IDS- Trigger: Lista de IDs de medidor 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 otra información obligatoria o es inválida
-
NEGATIVE_BALANCE_ADJUSTMENT- Trigger: Intento de dejar el saldo de la billetera 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 vencimiento en clave basada en suscripción
- Message: No se puede establecer fecha de vencimiento para clave de licencia basada en suscripción
-
NOT_FOUND- Trigger: 404 genérico por cualquier recurso faltante
- Message: Elemento no encontrado (o más específico)
-
ON_DEMAND_PLAN_CHANGE_NOT_SUPPORTED- Trigger: No se permite intercambio de planes para on-demand
- Message: No se admite cambiar planes para suscripciones on demand
-
ON_DEMAND_SUBSCRIPTIONS_NOT_ENABLED- Trigger: El negocio tiene la bandera de funciones desactivada
- Message: Las suscripciones on demand no están habilitadas para este negocio
-
ON_DEMAND_USAGE_BASED_BILLING_NOT_SUPPORTED- Trigger: Intento de usar on-demand con facturación por uso
- Message: Las suscripciones On Demand no son compatibles con facturación por uso
-
PAY_AS_YOU_WANT_AMOUNT_REQUIRED- Trigger: Falta precio para producto PWYW
- Message: El monto es obligatorio para productos pay as you want
-
PAYMENT_ALREADY_REFUNDED- Trigger: Reembolso duplicado
- Message: Este pago ya ha sido reembolsado
-
PAYMENT_HAS_BEEN_REFUNDED- Trigger: El pago ha sido totalmente reembolsado
- Message: El ID de pago ha sido reembolsado completamente.
-
PAYMENT_NOT_SUCCEEDED- Trigger: Intento de reembolsar/procesar pago fallido
- Message: El pago proporcionado no se ha completado con é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 cargo mientras el anterior está en estado no terminal
- Message: No se puede crear un nuevo cargo porque el pago anterior aún no tuvo éxito
-
PRODUCT_CART_EMPTY- Trigger: Carrito de productos vacío enviado
- Message: product_cart está vacío
-
PRODUCT_IS_DELETED- Trigger: Producto borrado suavemente
- Message: Sin mensajes
-
REFUND_AMOUNT_EXCEEDS_PAID_AMOUNT- Trigger: Monto agregado de reembolsos > monto pagado
- Message: El monto calculado del reembolso es mayor que el monto pagado
-
REFUND_WINDOW_EXPIRED- Trigger: Fuera de la ventana permitida de reembolso
- Message: No se pueden iniciar reembolsos días después de la creación del pago. Contacte 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 posterior a
ends_at - Message: Suscripción expirada no puede crear nuevos cargos
- Trigger: Facturación posterior a
-
SUBSCRIPTION_INACTIVE- Trigger: Estado ≠
ACTIVE - Message: La suscripción no está activa
- Trigger: Estado ≠
-
SUBSCRIPTION_NOT_ON_DEMAND- Trigger: Se esperaba on-demand pero se obtuvo intervalo fijo
- Message: La suscripción ya no es on demand
-
SUBSCRIPTION_PAYMENT_RETRY_LIMIT_EXCEEDED- Trigger: Reintentos de pago de suscripción exceden intentos máximos
- Message: Se superó el límite máximo de reintentos de 10 intentos para esta suscripción
-
TOO_MANY_REQUESTS- Trigger: Límite de tasa 429
- Message: Sin mensajes
-
TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT- Trigger: Total combinado del carrito < 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 mediante este endpoint de API.
-
UNAUTHORIZED- Trigger: No hay clave API o token / alcance inválido
- Message: No está autorizado para realizar esta acción
-
UNSUPPORTED_ACTION- Trigger: Acción no compatible para el tipo de recurso
- Message: No se admite cambiar planes para suscripciones basadas en uso
-
UNSUPPORTED_BILLING_CURRENCY- Trigger: Suscripciones restringidas a USD
- Message: No se admite moneda de facturación distinta al USD para 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 compatible actualmente / Solo se admiten productos en USD e INR actualmente / Solo se admite USD e INR para el precio del complemento / Solo se puede solicitar USD o INR para billing_currency / Moneda no compatible / Moneda inesperada para suscripciones con tarjeta india
-
UNSUPPORTED_DISCOUNT_TYPE- Trigger: Descuentos de monto fijo, etc., aún no activos
- Message: Por ahora solo se admiten códigos de descuento porcentuales
-
UNSUPPORTED_PAYMENT_CURRENCY- Trigger: Moneda de pago bloqueada para el conector
- Message: No se admite transacción en INR para esta transacción
-
UNSUPPORTED_TAX_CATEGORY- Trigger: Cadena de categoría fiscal no está en el 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 con monto cero
- Message: No se puede reembolsar un pago con monto monetario 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