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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre billing_issue_detected_at
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre billing_issue_detected_at_date_comparison_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre expires_at
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre expires_date_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre is_family_shared
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre: family_share_price_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre offer.type
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre: free_trial_price_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre grace_period_expires_at
  • errors: Descripción del error.
error_codeStringNombre corto del error. Siempre grace_period_expires_date_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre grace_period_billing_error
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre grace_period_billing_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre offer.category
  • errors: Descripción del error.
error_codeStringNombre corto del error. Valor posible: missing_offer_id.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre offer.type
  • errors: Descripción del error.
error_codeStringNombre corto del error. Siempre one_time_purchase_trial_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre originally_purchased_at
  • errors: Descripción del error.
error_codeStringNombre corto del error. Siempre originally_purchased_date_error.
status_codeIntegerEstado 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
}

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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre non_field_errors
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Valor posible: paid_access_level_does_not_exist.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre non_field_errors
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Valor posible: profile_does_not_exist.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre non_field_errors
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre profile_paid_access_level_does_not_exist.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre refunded_at
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre refund_date_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre refunded_at
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre refund_fields_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre originally_purchased_at
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre originally_purchased_date_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre non_field_errors
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre revocation_date_more_than_expiration_date.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre store_transaction_id
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre store_transaction_id_error.
status_codeIntegerEstado 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ámetroTipoDescripción
errorsObject
  • source: (string) Siempre revoke_at.
  • errors: Una descripción del error.
error_codeStringNombre corto del error. Siempre value_error.
status_codeIntegerEstado 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
}