# Aplicar código promocional

Aplica un código a una cesta. Cuando se aplica un código promocional, se vuelve a calcular el total de la cesta para reflejar el descuento en toda la cesta o en los artículos seleccionados. También se pueden añadir artículos de bonificación a la cesta. El descuento se aplica al completar la compra, mientras que los artículos de bonificación se conceden tras hacer el pago correctamente. Antes de pagar, el usuario puede eliminar el código promocional, lo que cancela el descuento y elimina los artículos de bonificación de la cesta.

Endpoint: POST /v2/project/{project_id}/promocode/redeem
Version: 2.0.0
Security: AuthForCart

## Path parameters:

  - `project_id` (integer, required)
    ID del proyecto. Encontrará este parámetro en su Cuenta del editor junto al nombre del proyecto y en la barra de direcciones del navegador cuando se trabaja en un proyecto. La URL tiene el siguiente formato: https://publisher.xsolla.com//projects/.
    Example: 44056

## Request fields (application/json):

  - `coupon_code` (string)
    Código único de código promocional. Contiene letras y números.
    Example: "SUMMER2021"

  - `cart` (object,null)

  - `cart.id` (string, required)
    ID de la cesta.

  - `selected_unit_items` (object)
    Clave del juego específica para una plataforma seleccionada por el usuario como bonificación. Transmita el código [received](/es/api/liveops/promotions-coupons/get-coupon-rewards-by-code#promotions-coupons/get-coupon-rewards-by-code/t=response&c=200&path=bonus/item) bonus.item.sku como una clave, y el  bonus.item.unit_items.sku como un valor.

## Response 200 fields (application/json):

  - `cart_id` (string)
    ID de la cesta.
    Example: "cart_id"

  - `price` (object,null)
    Precio de la cesta.
    Example: {"amount":"6150.0000000000000000","amount_without_discount":"6150.0000000000000000","currency":"USD"}

  - `price.amount` (string)
    Example: "6150.0000000000000000"

  - `price.amount_without_discount` (string)
    Example: "6150.0000000000000000"

  - `price.currency` (string)
    Example: "USD"

  - `is_free` (boolean)
    Si el artículo es gratuito.

  - `items` (array)
    Example: [{"attributes":[],"description":"Take it, take it all! All of Xsolla's riches in one Mega Booster.","groups":[{"external_id":"powerups","name":"Power Ups"}],"image_url":"https://cdn.xsolla.net/img/misc/images/e9f2f4a634bc96ea03b5d5ceadd7c55f.png","is_free":false,"name":"Xsolla Booster Mega","price":{"amount":"50.0000000000000000","amount_without_discount":"100.0000000000000000","currency":"USD"},"quantity":123,"sku":"com.xsolla.booster_mega_1","type":"virtual_good","virtual_item_type":"consumable","virtual_prices":[],"promotions":[{"name":"Bonus promotion","date_start":"2020-04-15T16:16:00+03:00","date_end":"2026-04-15T16:16:00+03:00","discount":{"percent":"50.00"},"bonus":[{"quantity":1,"name":"Xsolla Minigun","image_url":"https://cdn.xsolla.net/img/misc/images/2fc5c491a47413a8e8000447889093c2.png","sku":"com.xsolla.minigun_1","type":"virtual_good"}]}],"can_be_bought":true,"vp_rewards":[{"item_id":175232,"sku":"com.xsolla.value_point_1","amount":130,"name":"Value point","image_url":"https://cdn3.xsolla.com/img/misc/images/54c0cf9d345817cdacfdde198db178e0.jpg","is_clan":false},{"item_id":186321,"sku":"com.xsolla.clan_value_point_1","amount":50,"name":"Clan Reward VP 1","image_url":"https://cdn3.xsolla.com/img/misc/images/54c0cf9d345817cdacfdde198db178e0.jpg","is_clan":true}],"limits":{"per_user":{"available":3,"recurrent_schedule":{"interval_type":"weekly","reset_next_date":1746057600},"total":5}},"periods":[{"date_from":"2020-08-11T10:00:00+03:00","date_until":"2020-08-11T20:00:00+03:00"}]}]

  - `items.sku` (string)

  - `items.groups` (array)

  - `items.groups.external_id` (string)

  - `items.groups.name` (string)

  - `items.name` (string,null)

  - `items.type` (string)

  - `items.description` (string)

  - `items.image_url` (string)

  - `items.quantity` (integer)

  - `items.is_free` (boolean)
    Si el artículo es gratuito.

  - `items.promotions` (array)
    Promociones aplicadas para artículos específicos de la cesta. La matriz se devuelve en los siguientes casos:

* Se configura un descuento promocional para un artículo específico.

* Se aplica un código promocional con el parámetro Descuento en artículos seleccionados.

Si no se aplican promociones a nivel de artículo, se devuelve una matriz vacía.

  - `items.promotions.name` (string)

  - `items.promotions.date_start` (string,null)

  - `items.promotions.date_end` (string,null)

  - `items.promotions.discount` (object,null)

  - `items.promotions.discount.percent` (string,null)

  - `items.promotions.discount.value` (string,null)

  - `items.promotions.bonus` (array)

  - `items.promotions.bonus.sku` (string)

  - `items.promotions.bonus.quantity` (integer)

  - `items.promotions.bonus.type` (string)
    Tipo de artículo de bonificación.
    Enum: "virtual_good", "virtual_currency", "bundle", "physical_good", "game_key", "nft"

  - `items.promotions.bonus.name` (string)
    Nombre del artículo de bonificación. No disponible para el tipo de artículo de bonificación physical_good.

  - `items.promotions.bonus.image_url` (string)
    URL de la imagen del artículo de bonificación. No disponible para el tipo de artículo de bonificación physical_good.

  - `items.promotions.bonus.bundle_type` (string)
    Tipo de artículo del lote de bonificación. Disponible solo para el tipo de artículo de bonificación bundle.
    Enum: "standard", "virtual_currency_package"

  - `items.promotions.limits` (object)

  - `items.promotions.limits.per_user` (object)

  - `items.promotions.limits.per_user.available` (integer)

  - `items.promotions.limits.per_user.total` (integer)

  - `items.can_be_bought` (boolean)
    Si es true, el usuario puede comprar un artículo.

  - `items.vp_rewards` (array)
    Lista de recompensas de puntos de valor para este artículo.

  - `items.vp_rewards.item_id` (integer)
    ID único interno del artículo.

  - `items.vp_rewards.sku` (string)
    ID único del punto de valor.

  - `items.vp_rewards.amount` (integer)
    Cantidad de puntos de valor.

  - `items.vp_rewards.name` (string)
    Nombre del punto de valor.

  - `items.vp_rewards.image_url` (string)
    URL de la imagen.

  - `items.vp_rewards.is_clan` (boolean)
    Si el punto de valor se utiliza en las cadenas de recompensas de clanes.

  - `items.loyalty_rewards` (array)
    Puntos de fidelidad que el usuario recibe como recompensa por comprar el artículo.

  - `items.loyalty_rewards.name` (string)
    Nombre de puntos de fidelidad.

  - `items.loyalty_rewards.sku` (string)
    SKU de puntos de fidelidad. Transmita este valor en el parámetro loyalty_point_sku de otras llamadas API, por ejemplo, al crear un pedido pagado con puntos de fidelidad.

  - `items.loyalty_rewards.description` (string)
    Descripción de puntos de fidelidad.

  - `items.loyalty_rewards.image_url` (string,null)
    URL de la imagen.

  - `items.loyalty_rewards.amount` (integer)
    Número de puntos de fidelidad que recibe el usuario por comprar el artículo.

  - `items.limits` (object,null)
    Límites del artículo.

  - `items.limits.per_user` (object,null)
    Límites de artículos para un usuario.

  - `items.limits.per_user.total` (integer)
    Número máximo de artículos que un mismo usuario puede comprar.
    Example: 5

  - `items.limits.per_user.available` (integer)
    Número restante de artículos que el usuario actual puede comprar.
    Example: 3

  - `items.limits.per_user.recurrent_schedule` (any)

  - `items.limits.per_user.limit_exceeded_visibility` (string)
    Determina la visibilidad del artículo en el catálogo tras alcanzar el límite de compra, hasta el siguiente restablecimiento del límite.

Se aplica a los artículos para los que se han configurado restablecimientos periódicos del límite en la matriz recurrent_schedule.

Si no están configurados los restablecimientos del límite, el artículo no aparecerá en el catálogo cuando se haya alcanzado el límite de compra,
 independientemente del valor de limit_exceeded_visibility.

Valores posibles:
- show — El artículo se devuelve en las llamadas API de recuperación del catálogo tras alcanzar el límite de compra. En las llamadas API
de recuperación del catálogo en el lado del cliente, tras alcanzar el límite, el artículo se devuelve con el indicador can_be_bought: false. La
La próxima fecha de restablecimiento se devuelve el día reset_next_date.
- hide — El artículo no se devuelve en las llamadas API de recuperación del catálogo tras alcanzar el límite de compra, hasta que
 se restablezca ese límite.
    Enum: "show", "hide"

  - `items.limits.per_item` (object,null)
    Límites de artículos para un artículo.

  - `items.limits.per_item.total` (integer)
    Número máximo de artículos que pueden comprar todos los usuarios.
    Example: 5

  - `items.limits.per_item.available` (integer)
    Número restante de artículos que todos los usuarios pueden comprar.
    Example: 3

  - `items.periods` (array,null)
    Periodo de venta del artículo.

  - `items.periods.date_from` (string)
    Fecha en la que el artículo especificado estará disponible para la venta.
    Example: "2020-08-11T10:00:00+03:00"

  - `items.periods.date_until` (string,null)
    Fecha en la que el artículo especificado dejará de estar disponible para la venta. Puede ser null.
    Example: "2020-08-11T20:00:00+03:00"

  - `rewards` (object)

  - `rewards.bonus` (array)

  - `rewards.bonus.item` (object)

  - `rewards.bonus.item.sku` (string)
    ID único del artículo. El SKU solo puede contener caracteres alfanuméricos latinos en minúsculas y mayúsculas, puntos, guiones y guiones bajos.
    Example: "game_01"

  - `rewards.bonus.item.name` (string)
    Nombre del artículo.
    Example: "Game name"

  - `rewards.bonus.item.type` (string)
    Tipo de artículo. Valores posibles:virtual_good — artículos virtualesvirtual_currency — moneda virtualbundle — loteunit — paquete de claves de juego
    Example: "unit"

  - `rewards.bonus.item.description` (string)
    Descripción del artículo.
    Example: "Game description"

  - `rewards.bonus.item.image_url` (string)
    URL de la imagen.
    Example: "https://cdn.xsolla.net/img/misc/images/b79342cdf24f0f8557b63c87e8326e62.png"

  - `rewards.bonus.item.unit_items` (array)
    Matriz de claves del juego específicas para cada plataforma. Se utiliza únicamente cuando el tipo de artículo es unit (bonus.item.type = 'unit'). Si el paquete de claves del juego incluye claves específicas para cada plataforma, el usuario puede elegir una de ellas como bonificación.

  - `rewards.bonus.item.unit_items.sku` (string)
    ID único del paquete de claves del juego específico para cada plataforma. Caracteres permitidos  : a–z, A–Z, 0–9, punto (.), guion (-), guion bajo (_). Combine los valores bonus.item.​sku y bonus.item.unit_items.drm_sku. P. ej., si bonus.item.​sku = 'cool_game' y bonus.item.unit_items.drm_sku = 'steam', el valor será cool_game_steam.
    Example: "cool_game_steam"

  - `rewards.bonus.item.unit_items.is_free` (boolean)

  - `rewards.bonus.item.unit_items.type` (string)
    Indica que el artículo es una clave del juego.
    Enum: "game_key"

  - `rewards.bonus.item.unit_items.name` (string)
    Título del juego.
    Example: "Awesome Game"

  - `rewards.bonus.item.unit_items.drm_name` (string)
    Nombre del DRM (gestión de derechos digitales).
    Example: "Steam"

  - `rewards.bonus.item.unit_items.drm_sku` (string)
    ID único de DRM que se usa como sufijo para indicar una clave del juego específica de una plataforma. Caracteres permitidos: a–z, A–Z, 0–9, punto (.), guion (-) y guion bajo (_).
    Example: "steam"

  - `rewards.bonus.quantity` (number)
    Cantidad del artículo.

  - `rewards.discount` (object,null)
    Porcentaje de descuento.
El precio de la cesta se reducirá utilizando un valor calculado utilizando este porcentaje y luego se redondeará al segundo decimal.

  - `rewards.discount.percent` (string)
    Example: "10.00"

  - `rewards.discounted_items` (array,null)
    Lista de artículos con descuento mediante un código promocional.

  - `rewards.discounted_items.sku` (string, required)
    SKU del artículo.

  - `rewards.discounted_items.discount` (object, required)

  - `rewards.discounted_items.discount.percent` (string, required)
    Porcentaje de descuento.

El precio del artículo de la cesta se reducirá utilizando un valor
calculado utilizando este porcentaje y luego se redondeará
al segundo decimal.

  - `rewards.is_selectable` (boolean)
    Si es true, el usuario debe elegir la bonificación antes de canjear un código promocional.

## Response 401 fields (application/json):

  - `statusCode` (integer)
    Example: 401

  - `errorCode` (integer)
    Example: 1501

  - `errorMessage` (string)
    Example: "[0401-1501]: Authorization failed: Provide authorization"

## Response 403 fields (application/json):

  - `statusCode` (integer)
    Example: 403

  - `errorCode` (integer)

  - `errorMessage` (string)
    Example: "Authorization header not sent."

  - `transactionId` (string)
    Example: "x-x-x-x-transactionId-mock-x-x-x"

## Response 404 fields (application/json):

  - `statusCode` (integer)
    Example: 404

  - `errorCode` (integer)
    Example: 4001

  - `errorMessage` (string)
    Example: "[0401-9807]: Enter valid promo code."

## Response 422 fields (application/json):

  - `statusCode` (integer)
    Example: 422

  - `errorCode` (integer)
    Example: 1102

  - `errorMessage` (string)
    Example: "[0401-1102]: Unprocessable Entity. The property `coupon_code` is required"

  - `transactionId` (string)
    Example: "x-x-x-x-transactionId-mock-x-x-x"


