Response to server-side API requests: 400: Bad request
billing_issue_detected_at_date_comparison_error
Un problema de facturación ocurre cuando hay un error durante un intento de renovación de suscripción, por lo que siempre ocurre después de la fecha de la transacción (purchased_at).
Para resolverlo, asegúrate de que la fecha del problema de facturación (billing_issue_detected_at) sea posterior a la fecha de la transacción (purchased_at).
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre billing_issue_detected_at_date_comparison_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "billing_issue_detected_at",
"errors": [
"billing_issue_detected_at must be later than purchased_at."
]
}
],
"error_code": "billing_issue_detected_at_date_comparison_error",
"status_code": 400
}
expires_date_error
Un usuario no puede comprar una suscripción que ya ha expirado. Por lo tanto, la fecha expires_at (cuando expira la suscripción) siempre debe ser posterior a la fecha purchased_at (cuando se realizó la transacción).
Para solucionar esto, comprueba estas fechas y asegúrate de que expires_at sea posterior a purchased_at.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre expires_date_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "expires_at",
"errors": [
"expires_at must be later than purchased_at."
]
}
],
"error_code": "expires_date_error",
"status_code": 400
}
family_share_price_error
La solicitud falló porque el parámetro is_family_shared está establecido en true, lo que significa que el nivel de acceso se comparte con un familiar de forma gratuita. Sin embargo, el parámetro value del objeto Price no está establecido en cero.
Si is_family_shared debe ser true, asegúrate de establecer el parámetro value del objeto Price en 0.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre: family_share_price_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
El perfil no se encuentra
{
"errors": [
{
"source": "is_family_shared",
"errors": [
"If is_family_shared is true, price.value must be 0."
]
}
],
"error_code": "family_share_price_error",
"status_code": 400
}
free_trial_price_error
La solicitud falló porque el parámetro offer_type está configurado como free_trial, pero el parámetro value del objeto Price no está establecido en cero.
Otra razón posible es que el parámetro offer_id se incluyó pero se dejó como null, aunque no puede ser null. En ese caso, proporciona un valor para offer_id o elimina el parámetro por completo.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre: free_trial_price_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
No se encontró el perfil
{
"errors": [
{
"source": "offer_type",
"errors": [
"If offer_type is 'free_trial', price.value must be 0."
]
}
],
"error_code": "free_trial_price_error",
"status_code": 400
}
grace_period_expires_date_error
El período de gracia es tiempo adicional que puedes conceder a tus clientes para renovar su suscripción si no pudieron hacerlo a tiempo, por ejemplo, si su tarjeta de crédito fue rechazada. Esto permite mantener su configuración intacta mientras resuelven el problema. Ofrecer un período de gracia es opcional.
Si ofreces un período de gracia, la fecha de vencimiento del mismo (grace_period_expires_at) debe ser posterior a la fecha de vencimiento de la suscripción (expires_at). De lo contrario, la fecha de vencimiento del período de gracia coincidirá con la de la suscripción. En cualquier caso, el vencimiento del período de gracia no puede ser anterior al de la suscripción.
Para solucionar esto, asegúrate de que la fecha de vencimiento del período de gracia (grace_period_expires_at) sea posterior a la fecha de vencimiento de la suscripción (expires_at).
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre grace_period_expires_date_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "grace_period_expires_at",
"errors": [
"grace_period_expires_at must be later or equal to expires_at."
]
}
],
"error_code": "grace_period_expires_date_error",
"status_code": 400
}
grace_period_billing_error
El inicio de un período de gracia se considera un problema de facturación. Por lo tanto, si el período de gracia ha comenzado (indicado por el parámetro grace_period_expires_at con un valor), su fecha de inicio debe registrarse en el parámetro billing_issue_detected_at.
Para corregir esto, establece el inicio del período de gracia en billing_issue_detected_at o, si el período de gracia aún no ha comenzado, elimina el parámetro grace_period_expires_at.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre grace_period_billing_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "grace_period_billing_error",
"errors": [
"If grace_period_expires_at is specified, billing_issue_detected_at must also be specified."
]
}
],
"error_code": "grace_period_billing_error",
"status_code": 400
}
missing_offer_id
La solicitud falló porque el parámetro offer_category tiene un valor distinto de introductory o offer_type, pero no incluye un offer_id. En ese caso, proporciona un offer_id o elimina offer_category o offer_type de la solicitud.
Otra posible causa es que el parámetro offer_id se haya añadido pero dejado como null, cuando no puede ser nulo. Si es así, asigna un valor a offer_id o elimina el parámetro por completo.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Valor posible: missing_offer_id. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
El perfil no se encuentra
{
"errors": [
{
"source": "offer_category",
"errors": [
"offer_id must be specified for all offer types except 'introductory'."
]
}
],
"error_code": "missing_offer_id",
"status_code": 400
}
one_time_purchase_trial_error
La solicitud falló porque se proporcionó un período de prueba con una compra única. A diferencia de las suscripciones, las compras únicas no pueden tener período de prueba. Para solucionarlo, revisa el campo offer_type en el objeto Offer dentro del objeto One-Time Purchase. El valor de offer_type no puede ser free_trial. Cambia el valor del campo offer_type o usa el objeto Subscription en lugar de One-Time Purchase.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre one_time_purchase_trial_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "offer.type",
"errors": [
"One-time purchase cannot have a trial."
]
}
],
"error_code": "one_time_purchase_trial_error",
"status_code": 400
}
originally_purchased_date_error
En las suscripciones prolongadas se crea una cadena de transacciones. La transacción original es la primera de esa cadena y vincula todas las siguientes. Cada renovación es simplemente una extensión de esa transacción original. Si la transacción es la primera compra, actúa como su propia transacción original.
El timestamp originally_purchased_at indica el momento de la compra original, mientras que purchased_at corresponde al momento de la transacción actual. Por ello, purchased_at nunca puede ser anterior a originally_purchased_at; como máximo, ambos pueden coincidir en la primera transacción.
La solicitud falló porque originally_purchased_at tiene una fecha posterior a purchased_at. Asegúrate de que sea anterior o igual a purchased_at.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre originally_purchased_date_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "originally_purchased_at",
"errors": [
"originally_purchased_at must be earlier than or equal to purchased_at."
]
}
],
"error_code": "originally_purchased_date_error",
"status_code": 400
}
paid_access_level_does_not_exist
La solicitud falló porque el nivel de acceso indicado en la solicitud no se encontró. Verifica que no haya errores tipográficos en access_level_id y que corresponda a la app correcta.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Valor posible: paid_access_level_does_not_exist. |
| status_code | Integer | Estado HTTP. Siempre 404. |
Ejemplo de respuesta
El nivel de acceso no fue encontrado.
{
"errors": [
{
"source": "non_field_errors",
"errors": [
"Paid access level `premium` does not exist"
]
}
],
"error_code": "paid_access_level_does_not_exist",
"status_code": 400
}
profile_does_not_exist
La solicitud falló porque el perfil indicado en el encabezado de la solicitud no se encontró. Comprueba que no haya erratas en el profile_id o customer_user_id que introdujiste en el encabezado de la solicitud, y asegúrate de que corresponde a la app correcta.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Valor posible: profile_does_not_exist. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
El perfil no se encuentra
{
"errors": [
{
"source": "non_field_errors",
"errors": [
"Profile not found"
]
}
],
"error_code": "profile_does_not_exist",
"status_code": 400
}
profile_paid_access_level_does_not_exist
La solicitud falló porque el perfil en la solicitud no coincide con el nivel de acceso especificado. Verifica que el ID de perfil en el encabezado y el ID de nivel de acceso en el cuerpo sean correctos, y asegúrate de que no haya errores tipográficos.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre profile_paid_access_level_does_not_exist. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "non_field_errors",
"errors": [
"Profile `478b2e7f-d557-4b8b-9c5f-cbd46fc2dee2` has no `premium` access level"
]
}
],
"error_code": "profile_paid_access_level_does_not_exist",
"status_code": 400
}
refund_date_error
La solicitud falló porque la fecha de compra (purchased_at) es anterior o igual a la fecha de reembolso (refunded_at). Un reembolso siempre ocurre después de una compra, ya que revierte la transacción.
Para solucionarlo, revisa los parámetros purchased_at y refunded_at y asegúrate de que la fecha de reembolso sea posterior a la fecha de compra.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre refund_date_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "refunded_at",
"errors": [
"refunded_at must be later than purchased_at."
]
}
],
"error_code": "refund_date_error",
"status_code": 400
}
refund_fields_error
La solicitud falló porque incluye cancellation_reason sin una fecha refunded_at, o tiene refunded_at sin un cancellation_reason.
Cuando se establece un reembolso, hay que especificar tanto la fecha como el motivo del reembolso.
Cuerpo
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre refund_fields_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "refunded_at",
"errors": [
"refunded_at and cancellation_reason=refund must be specified together."
]
}
],
"error_code": "refund_fields_error",
"status_code": 400
}
renew_status_changed_date_error
La renovación es una prolongación de una suscripción. El usuario puede cancelar la prolongación de la suscripción y luego volver a prolongarla. La fecha de ambas acciones se almacena en el parámetro renew_status_changed_at, que nunca puede ser anterior a la propia transacción.
Para solucionar el problema, asegúrate de que renew_status_changed_at sea posterior a la fecha de la transacción (purchased_at).
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre originally_purchased_date_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "renew_status_changed_at",
"errors": [
"renew_status_changed_at must be later than purchased_at."
]
}
],
"error_code": "renew_status_changed_date_error",
"status_code": 400
}
revocation_date_more_than_expiration_date
La solicitud falló porque el revoke_at que definiste en la solicitud es posterior al parámetro expires_at del nivel de acceso actual. Si deseas prolongar el nivel de acceso, utiliza la solicitud Conceder nivel de acceso.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre revocation_date_more_than_expiration_date. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "revoke_at",
"errors": [
"Revocation date (2029-08-29 09:33:42+00:00) is more than current expiration date (2028-08-29 09:33:42+00:00)"
]
}
],
"error_code": "revocation_date_more_than_expiration_date",
"status_code": 400
}
store_transaction_id_error
En el caso de suscripciones prorrogadas, se genera una cadena de suscripciones. La transacción original es la primera transacción de esta cadena y la cadena se vincula mediante ella. Las demás transacciones de la cadena son prórrogas. Si la transacción es la primera compra de la cadena de suscripción, puede ser su propia transacción original.
Otro caso es el de una compra única. Nunca crea cadenas porque no puede tener prórrogas. Para ella, el store_transaction_id siempre es igual al store_original_transaction_id.
Tu solicitud falló porque el valor de store_transaction_id del objeto Compra única difiere de su store_original_transaction_id. Para solucionar el problema, haz que sean iguales o cambia el objeto: usa Suscripción en lugar de Compra única.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre store_transaction_id_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": "store_transaction_id",
"errors": [
"store_transaction_id must be equal to store_original_transaction_id for purchase."
]
}
],
"error_code": "store_transaction_id_error",
"status_code": 400
}
value_error
La solicitud falló porque la fecha de revocación especificada está en el pasado. Establece revoke_at en una fecha futura o null para revocar el acceso de inmediato.
Body
| Parámetro | Tipo | Descripción |
|---|---|---|
| errors | Object |
|
| error_code | String | Nombre corto del error. Siempre value_error. |
| status_code | Integer | Estado HTTP. Siempre 400. |
Ejemplo de respuesta
{
"errors": [
{
"source": null,
"errors": [
"Must be greater than the current time or null"
]
}
],
"error_code": "value_error",
"status_code": 400
}