Un cupón, promoción o descuento de la plataforma.
type)personal — códigos de un solo uso (uno por cliente).batch — un único código reutilizable (promo_code).promo — sin código; se aplica automáticamente a quien cumpla las condiciones.gift_card — no descuenta la orden, acredita saldo al cliente (como una recarga).status)pending (en configuración) → generating (enviado; ya no se editan los parámetros, se están
aplicando) → ready (listo para arrancar en starts_at) → running (activo, se puede canjear)
→ finished (expirado). Endpoints: set-ready, set-finished, update (solo pending),
update-running (solo running).
price_e2 — descuento fijo (× 100); price_prc — descuento porcentual (fracción 0–1).applies_to — sobre qué se calcula: total | subtotal | base_price | service | delivery.min_purchase_e2 — compra mínima para poder aplicarlo.total_count / spent_count — máximo de canjes y canjes ya realizados.starts_at / ends_at — vigencia (si ends_at es null, no expira).target_type + targets)target_type define el tipo de objetivos del cupón: company, city, branch_group, branch,
good. Los objetivos concretos se gestionan como CouponTarget (PUT/DELETE coupons/{id}/targets/{targetId}). Los cupones también pueden usar descuentos por reglas
(config.fee_rules) en lugar de targets.
config)Objeto con condiciones y ajustes finos del cupón; los config_* del modelo son el acceso tipado.
| Clave | Tipo | Descripción |
|---|---|---|
limit |
int|null | Máximo de usos por cliente |
amount_limit_e2 |
int|null | Tope de descuento por uso (× 100) |
max_discount_e2 |
int|null | Tope de descuento acumulado del cupón (× 100) |
max_purchase_e2 |
int|null | Compra máxima para poder aplicarlo (× 100) |
usable_in_promos |
bool | Se puede combinar con promociones automáticas |
avoid_same_target_promos |
bool | No acumular con otra promo del mismo objetivo |
users_registered_since / users_registered_until |
date|null | Solo clientes registrados en ese rango |
min_purchase_count / max_purchase_count |
int|null | Compras previas del cliente exigidas |
last_purchase_min_days / last_purchase_max_days |
int|null | Días desde la última compra del cliente |
join_last_purchase_count |
bool | Contar compras de todas las marcas de la company |
purchase_condition_mode |
string | Nivel al que se cuentan las compras previas: company | branch_group | branch |
only_deliveries |
bool | Solo aplica a órdenes con envío |
is_cashback |
bool | Se acredita como cashback en vez de descontar al instante |
is_fixed |
bool | Descuento fijo (no proporcional al monto) |
receiver |
string|null | Destinatario del cashback |
days |
array | Días de la semana en que aplica |
hour_beg / hour_end |
string | Franja horaria en que aplica (HH:MM) |
branch_id |
int|null | Restringe el cupón a una sucursal |
company_assumption_prc |
float | Porcentaje del descuento asumido por la company (fracción 0–1) |
fee_rules |
array | Descuentos por reglas (alternativa a los targets) |
apply_for_unit |
bool | Aplicar el descuento por unidad del producto |
apply_after_tax |
bool | Aplicar el descuento después de impuestos |
custom_discount_tag |
string|null | Etiqueta a mostrar para este descuento |
internal_code |
string|null | Código interno de referencia |
source_whitelist |
array | Orígenes de orden permitidos (Ridery, WhatsApp, …) |
target_blacklist |
array | Objetivos excluidos del cupón |
collision_slot |
int | Franja de colisión para evitar solapes entre promociones |
| Atributo | Tipo | Descripción |
|---|---|---|
id |
int |
|
name |
string |
Nombre para identificar el cupón |
promo_code |
string\|null |
Código de canje; solo en cupones batch |
type |
string |
personal | batch | promo | gift_card |
status |
string |
pending | generating | ready | running | finished |
price_e2 |
int |
Descuento fijo (× 100) |
price_prc |
float |
Descuento porcentual (fracción 0–1) |
min_purchase_e2 |
int |
Compra mínima para aplicar el cupón (× 100) |
total_count |
int |
Máximo de canjes permitidos (0 = ilimitado) |
spent_count |
int |
Canjes realizados |
starts_at |
datetime\|null |
Fecha/hora programada de inicio |
ends_at |
datetime\|null |
Fecha/hora programada de fin; null = no expira |
created_at |
datetime\|null |
|
updated_at |
datetime\|null |
|
deleted_at |
datetime\|null |
|
company_id |
int |
Company dueña del cupón |
branch_id |
int\|null |
Sucursal a la que se restringe el cupón, si aplica |
applies_to |
string |
total | subtotal | base_price | service | delivery |
target_type |
string |
Tipo de objetivos del cupón (company | city | branch_group | branch | good) |
branch_group_id |
int\|null |
Comercio (marca) del cupón, si aplica |
config |
array |
Condiciones y ajustes del cupón (ver "Configuración") |
whitelist |
array\|null |
Lista de clientes habilitados (cupones con whitelist) |
loop_config |
array\|null |
Configuración de repetición automática del cupón (renovación periódica) |
activePromos |
ActivePromo> |
Índice de promociones activas derivadas del cupón |
allLogs |
ApiLog> |
|
branch |
Branch\|null |
|
branchGroup |
BranchGroup\|null |
|
company |
Company |
|
company_assumption |
float |
Porcentaje del descuento asumido por la company (= config.company_assumption_prc) |
config_amount_limit_e2 |
int\|null |
Tope de descuento por uso (× 100) |
config_apply_after_tax |
bool\|null |
Aplicar el descuento después de impuestos |
config_apply_for_unit |
bool |
Aplicar el descuento por unidad del producto |
config_avoid_same_target_promos |
bool\|null |
No acumular con otra promo del mismo objetivo |
config_branch_id |
int\|null |
Sucursal a la que restringe el cupón |
config_collision_slot |
int\|null |
Franja de colisión para evitar solapes |
config_custom_discount_tag |
string\|null |
Etiqueta a mostrar para el descuento |
config_days |
array |
Días de la semana en que aplica |
config_fee_rules |
array |
Descuentos por reglas |
config_hours_beg |
string |
Inicio de la franja horaria (HH:MM) |
config_hours_end |
string |
Fin de la franja horaria (HH:MM) |
config_internal_code |
string\|null |
Código interno de referencia |
config_is_cashback |
bool\|null |
Se acredita como cashback |
config_is_fixed |
bool\|null |
Descuento fijo (no proporcional) |
config_join_last_purchase_count |
bool |
Contar compras de todas las marcas de la company |
config_last_purchase_max_days |
int\|null |
Máximo de días desde la última compra |
config_last_purchase_min_days |
int\|null |
Mínimo de días desde la última compra |
config_limit |
int\|null |
Máximo de usos por cliente |
config_max_discount_e2 |
int\|null |
Tope de descuento acumulado del cupón (× 100) |
config_max_purchase_count |
int\|null |
Máximo de compras previas del cliente |
config_max_purchase_e2 |
int\|null |
Compra máxima para poder aplicarlo (× 100) |
config_min_purchase_count |
int\|null |
Mínimo de compras previas del cliente |
config_only_deliveries |
bool\|null |
Solo aplica a órdenes con envío |
config_order |
Order\|null |
Orden asociada a la condición de compra (interno) |
config_purchase_condition_mode |
string\|null |
Nivel al que se cuentan las compras previas |
config_receiver |
string\|null |
Destinatario del cashback |
config_registered_since |
datetime\|null |
Solo clientes registrados desde esta fecha |
config_registered_until |
datetime\|null |
Solo clientes registrados hasta esta fecha |
config_source_whitelist |
array |
Orígenes de orden permitidos |
config_target_blacklist |
array |
Objetivos excluidos del cupón |
config_usable_in_promos |
bool\|null |
Se puede combinar con promociones automáticas |
couponTargets |
CouponTarget> |
Objetivos concretos del cupón |
couponTickets |
CouponTicket> |
Tickets/códigos generados del cupón |
couponUsages |
CouponUsage> |
Canjes del cupón |
has_ruled_discounts |
bool |
El cupón usa descuentos por reglas (config.fee_rules) |
lastUsage |
CouponUsage\|null |
Último canje registrado |
logs |
ApiLog> |
|
mapped_target_blacklist |
array |
Objetivos excluidos, resueltos a sus nombres |
mapped_target_names |
array |
Objetivos del cupón, resueltos a sus nombres |
mapped_whitelist |
array |
Whitelist resuelta a datos de cliente |
total_assumed_discount_e2 |
int |
Descuento total asumido por la company (× 100) |
total_discount_e2 |
int |
Descuento total otorgado por el cupón (× 100) |
{
"id": 45,
"name": "3% de descuento en tu envío",
"promo_code": null,
"type": "personal",
"status": "finished",
"price_e2": 0,
"price_prc": 0.03,
"min_purchase_e2": 1000,
"total_count": 15,
"spent_count": 0,
"starts_at": "2020-09-02 14:43:50",
"ends_at": null,
"created_at": "2020-09-02 14:27:25",
"updated_at": "2022-06-02 16:32:54",
"deleted_at": null,
"branch_id": null,
"applies_to": "delivery",
"target_type": "branch_group",
"branch_group_id": null,
"config": {
"limit": null,
"amount_limit_e2": null,
"max_discount_e2": null,
"max_purchase_e2": null,
"usable_in_promos": true,
"users_registered_since": null,
"users_registered_until": null,
"min_purchase_count": null,
"max_purchase_count": null,
"last_purchase_min_days": null,
"last_purchase_max_days": null,
"join_last_purchase_count": false,
"only_deliveries": false,
"is_cashback": false,
"is_fixed": false,
"company_assumption_prc": 0,
"days": [],
"hour_beg": "00:00",
"hour_end": "00:00",
"fee_rules": [],
"apply_for_unit": true,
"apply_after_tax": false,
"custom_discount_tag": null,
"source_whitelist": [],
"target_blacklist": [],
"purchase_condition_mode": "company",
"avoid_same_target_promos": false,
"collision_slot": 1000,
"human_amount_limit_e2": 0,
"human_max_discount_e2": 0,
"human_max_purchase_e2": 0,
"human_company_assumption_prc": 0
},
"whitelist": null,
"loop_config": null,
"human_price_e2": 0,
"human_price_prc": 3,
"human_min_purchase_e2": 10
}
Crea un nuevo cupón o descuento.
El parámetro type especifica el tipo de cupón a ser creado. Este valor no podrá ser modificado.
total_count hayan disponibles para el canje. Cada código
puede ser utilizado una única vez.promo_code. El código puede ser
canjeado más de una vez, hasta agotarse el total_count.El cupón se crea en estado pending. Antes de guardarlo se validan las combinaciones de
parámetros (config, applies_to, target_type, type); combinaciones incompatibles se
rechazan.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/coupons |
Authorization |
{
"name": "string|max:80",
"promo_code": "required_if:type,batch|string|min:5|max:20|regex:/^[0-9a-zA-Z]{5,20}$/",
"type": "required|string|in:personal,batch,promo,gift_card",
"price_e2": "integer|min:0",
"price_prc": "numeric|between:0.0000,1.0000",
"min_purchase_e2": "integer|min:0",
"total_count": "required|integer|min:0",
"applies_to": "string|in:total,subtotal,base_price,service,delivery",
"target_type": "string|in:company,city,branch_group,good",
"human_price_e2": "numeric|min:0.0",
"human_price_prc": "numeric|between:0.00,100.00",
"human_min_purchase_e2": "numeric|min:0.0",
"whitelist": [
"integer|exists:clients,id"
],
"config": {
"limit": "nullable|integer",
"amount_limit_e2": "nullable|integer|min:1",
"max_discount_e2": "nullable|integer",
"max_purchase_e2": "nullable|integer|min:1",
"usable_in_promos": "boolean",
"avoid_same_target_promos": "boolean",
"users_registered_since": "date",
"users_registered_until": "date",
"min_purchase_count": "nullable|integer",
"max_purchase_count": "nullable|integer",
"last_purchase_min_days": "nullable|integer",
"last_purchase_max_days": "nullable|integer",
"join_last_purchase_count": "nullable|boolean",
"only_deliveries": "boolean",
"is_cashback": "boolean",
"is_fixed": "boolean",
"company_assumption_prc": "numeric|min:0|max:100",
"days": "array",
"hour_beg": "string",
"hour_end": "string",
"apply_for_unit": "boolean",
"apply_after_tax": "boolean",
"custom_discount_tag": "nullable|string|max:10",
"source_whitelist": "array",
"target_blacklist": "array",
"purchase_condition_mode": "string|in:company,branch_group,branch",
"collision_slot": "nullable|integer|min:0|max:999999",
"fee_rules": [
{
"is_enabled": "boolean",
"name": "required|string|max:32",
"label": "string|max:32",
"description": "string",
"layer": "integer|min:0|max:255",
"price_min_e2": "integer|min:0",
"human_price_min_e2": "numeric|min:0.0",
"price_max_e2": "integer",
"human_price_max_e2": "numeric",
"hour_beg": {
"string": true,
"regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"hour_end": {
"string": true,
"regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"conditions": "array",
"payment_methods": [
"required|string"
],
"payment_currencies": [
"required|string"
]
}
]
}
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF316 |
400 | El cupón no admite ese target_type. |
EF320 |
400 | Un cupón personal no puede tener total_count ilimitado. |
EF328 |
400 | El cupón no puede tener a la vez descuento propio y descuentos por reglas. |
EF333 |
400 | Combinación de configuración no soportada. |
Crear cupón de un comercio
Crea un Coupon acotado a un branch_group (marca). Se crea en estado pending y se
validan las combinaciones de parámetros como en el endpoint de creación de company.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/branch-groups/{branchGroupId}/coupons |
Authorization |
{
"name": "string|max:80",
"promo_code": "required_if:type,batch|string|min:5|max:20|regex:/^[0-9a-zA-Z]{5,20}$/",
"type": "required|string|in:personal,batch,promo,gift_card",
"price_e2": "integer|min:0",
"price_prc": "numeric|between:0.0000,1.0000",
"min_purchase_e2": "integer|min:0",
"total_count": "required|integer|min:0",
"applies_to": "string|in:total,subtotal,base_price,service,delivery",
"target_type": "string|in:company,city,branch_group,good",
"human_price_e2": "numeric|min:0.0",
"human_price_prc": "numeric|between:0.00,100.00",
"human_min_purchase_e2": "numeric|min:0.0",
"whitelist": [
"integer|exists:clients,id"
],
"config": {
"limit": "nullable|integer",
"amount_limit_e2": "nullable|integer|min:1",
"max_discount_e2": "nullable|integer",
"max_purchase_e2": "nullable|integer|min:1",
"usable_in_promos": "boolean",
"avoid_same_target_promos": "boolean",
"users_registered_since": "date",
"users_registered_until": "date",
"min_purchase_count": "nullable|integer",
"max_purchase_count": "nullable|integer",
"last_purchase_min_days": "nullable|integer",
"last_purchase_max_days": "nullable|integer",
"join_last_purchase_count": "nullable|boolean",
"only_deliveries": "boolean",
"is_cashback": "boolean",
"is_fixed": "boolean",
"company_assumption_prc": "numeric|min:0|max:100",
"days": "array",
"hour_beg": "string",
"hour_end": "string",
"apply_for_unit": "boolean",
"apply_after_tax": "boolean",
"custom_discount_tag": "nullable|string|max:10",
"source_whitelist": "array",
"target_blacklist": "array",
"purchase_condition_mode": "string|in:company,branch_group,branch",
"collision_slot": "nullable|integer|min:0|max:999999",
"fee_rules": [
{
"is_enabled": "boolean",
"name": "required|string|max:32",
"label": "string|max:32",
"description": "string",
"layer": "integer|min:0|max:255",
"price_min_e2": "integer|min:0",
"human_price_min_e2": "numeric|min:0.0",
"price_max_e2": "integer",
"human_price_max_e2": "numeric",
"hour_beg": {
"string": true,
"regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"hour_end": {
"string": true,
"regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"conditions": "array",
"payment_methods": [
"required|string"
],
"payment_currencies": [
"required|string"
]
}
]
}
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF316 |
400 | El cupón no admite ese target_type. |
EF320 |
400 | Un cupón personal no puede tener total_count ilimitado. |
EF328 |
400 | El cupón no puede tener a la vez descuento propio y descuentos por reglas. |
EF333 |
400 | Combinación de configuración no soportada. |
{info} Soporta: Paginación Filters Carga dinámica
Devuelve la lista de cupones y promociones.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/coupons |
Authorization |
{info} Soporta: Carga dinámica
Detalles de un Cupón
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/coupons/{couponId} |
Authorization |
Actualizar cupón.
Requiere status=pending
Modifica los parámetros del cupón. Si se cambia el target_type, todos los targets que hayan sido previamente configurados se perderán.
| Método | URI | Cabeceras |
|---|---|---|
| PATCH | /companies/{companyId}/coupons/{couponId} |
Authorization |
{
"name": "string|max:80",
"price_e2": "integer|min:0",
"price_prc": "numeric|between:0.0000,1.0000",
"min_purchase_e2": "integer|min:0",
"total_count": "integer|min:0",
"applies_to": "string|in:total,subtotal,base_price,service,delivery",
"target_type": "string|in:company,city,branch_group,good",
"human_price_e2": "numeric|min:0.0",
"human_price_prc": "numeric|between:0.00,100.00",
"human_min_purchase_e2": "numeric|min:0.0",
"whitelist": [
"integer|exists:clients,id"
],
"config": {
"limit": "nullable|integer",
"amount_limit_e2": "nullable|integer|min:1",
"max_discount_e2": "nullable|integer",
"max_purchase_e2": "nullable|integer|min:1",
"usable_in_promos": "boolean",
"avoid_same_target_promos": "boolean",
"users_registered_since": "date",
"users_registered_until": "date",
"min_purchase_count": "nullable|integer",
"max_purchase_count": "nullable|integer",
"last_purchase_min_days": "nullable|integer",
"last_purchase_max_days": "nullable|integer",
"join_last_purchase_count": "nullable|boolean",
"only_deliveries": "boolean",
"is_cashback": "boolean",
"is_fixed": "boolean",
"company_assumption_prc": "numeric|min:0|max:100",
"days": "array",
"hour_beg": "string",
"hour_end": "string",
"apply_for_unit": "boolean",
"apply_after_tax": "boolean",
"custom_discount_tag": "nullable|string|max:10",
"source_whitelist": "array",
"target_blacklist": "array",
"purchase_condition_mode": "string|in:company,branch_group,branch",
"collision_slot": "nullable|integer|min:0|max:999999",
"fee_rules": [
{
"is_enabled": "boolean",
"name": "required|string|max:32",
"label": "string|max:32",
"description": "string",
"layer": "integer|min:0|max:255",
"price_min_e2": "integer|min:0",
"human_price_min_e2": "numeric|min:0.0",
"price_max_e2": "integer",
"human_price_max_e2": "numeric",
"hour_beg": {
"string": true,
"regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"hour_end": {
"string": true,
"regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"conditions": "array",
"payment_methods": [
"required|string"
],
"payment_currencies": [
"required|string"
]
}
]
}
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF301 |
400 | El cupón no está en estado pending. |
EF316 |
400 | El cupón no admite ese target_type. |
EF328 |
400 | El cupón no puede tener a la vez descuento propio y descuentos por reglas. |
EF333 |
400 | Combinación de configuración no soportada. |
Requiere: status=pending
Agrega un objetivo al cupón. Aplica a los target_type = branch_group,branch. Según el target_type, se debe especificar el targetId correspondiente a vincular. Por ejemplo, si se desea vincular un Branch id=12, el cupón debe tener target_type=branch y se dede consumir este endpoint usando como parámetro path {targetId}=12.
| Método | URI | Cabeceras |
|---|---|---|
| PUT | /companies/{companyId}/coupons/{couponId}/targets/{targetId} |
Authorization |
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF301 |
400 | El cupón no está en estado pending. |
EF316 |
400 | El objetivo no es compatible con el target_type del cupón. |
Requiere: status=pending
Quita un objetivo al cupón. Aplica a los target_type = branch_group,branch. Según el target_type, se debe especificar el targetId correspondiente a desvincular. Por ejemplo, si se desea desvincular un Branch id=12 vinculado, el cupón debe tener target_type=branch y se dede consumir este endpoint usando como parámetro path {targetId}=12.
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{companyId}/coupons/{couponId}/targets/{targetId} |
Authorization |
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF301 |
400 | El cupón no está en estado pending. |
Elimina un cupón
Requiere: status!=running
Si se desea eliminar un cupón en ejecución, hay que finalizarlo primero
| Método | URI | Cabeceras |
|---|---|---|
| DELETE | /companies/{companyId}/coupons/{couponId} |
Authorization |
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF304 |
400 | El cupón está en ejecución; hay que finalizarlo primero. |
Restaura un cupón eliminado.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/coupons/{couponId}/restore |
Authorization |
Este endpoint verifica si el código promocional es válido para aplicarse en una Orden. En caso afirmativo, se devuelve el Cupón con los datos del mismo, lo que permite mostrar información de descuentos aplicables.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/coupons/check |
Authorization |
{
"coupon_code": "required|string|min:5|max:20",
"subtotal_e2": "required|integer|min:1",
"subtotal_full_e2": "integer|min:0",
"base_price_e2": "integer|min:1",
"delivery_e2": "integer|min:0",
"client_id": "integer",
"items": [
{
"good_id": "required|integer|exists:goods,id",
"quantity": "required|integer|min:1",
"provider_id": "integer",
"properties": [
{
"property_id": "required|integer",
"value": "required|string"
}
]
}
],
"goods": [
"integer"
],
"good_ids": {
"string": true,
"regex": "/^[0-9]+(,[0-9]+)*$/"
},
"time": {
"string": true,
"regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"datetime": "date|after:now",
"use_local_tz": "boolean"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF312 |
400 | El código no es válido o ya fue utilizado. |
EF323 |
400 | El código es de gift card; se canjea desde el perfil, no en el checkout. |
EF309 |
400 | El cupón agotó su límite de usos. |
EF310 |
400 | El subtotal supera el máximo permitido por el cupón. |
EF311 |
400 | El subtotal no alcanza el mínimo exigido por el cupón. |
EF313 |
400 | El cupón no es válido para ese comercio. |
EF317 |
400 | El cupón no se puede aplicar a productos que ya están en promoción. |
EF322 |
400 | El cliente no cumple una condición del cupón (compras previas, antigüedad, etc.). |
EF324 |
400 | El cupón no aplica a órdenes de retiro en tienda. |
EF325 |
400 | El cupón no aplica en el día seleccionado. |
EF326 |
400 | El cupón solo aplica dentro de una franja horaria. |
EF327 |
400 | El cliente no está en la lista de habilitados del cupón. |
EF331 |
400 | El origen de la orden no está permitido para el cupón. |
EF332 |
400 | El comercio está en la lista de exclusión del cupón. |
En caso de un código de GiftCard válido, el monto de la Giftcard se convierte en Saldo dentro del App. Nótese que los código de tipo PromoCode usan su propio endpoint para su verificación.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/coupons/redeem |
Authorization |
{
"coupon_code": "required|string|min:5|max:20",
"redeem": "boolean"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF312 |
400 | El código no es válido o ya fue canjeado. |
Este endpoint verifica si el código promocional es válido para aplicarse en una Orden del comercio especificado. En caso afirmativo, se devuelve el Cupón con los datos del mismo, lo que permite mostrar información de descuentos aplicables.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/branches/{branchId}/coupons/check |
Authorization |
{
"coupon_code": "required|string|min:5|max:20",
"subtotal_e2": "required|integer|min:1",
"subtotal_full_e2": "integer|min:0",
"base_price_e2": "integer|min:1",
"delivery_e2": "integer|min:0",
"client_id": "integer",
"items": [
{
"good_id": "required|integer|exists:goods,id",
"quantity": "required|integer|min:1",
"provider_id": "integer",
"properties": [
{
"property_id": "required|integer",
"value": "required|string"
}
]
}
],
"goods": [
"integer"
],
"good_ids": {
"string": true,
"regex": "/^[0-9]+(,[0-9]+)*$/"
},
"time": {
"string": true,
"regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"datetime": "date|after:now",
"use_local_tz": "boolean"
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF312 |
400 | El código no es válido o ya fue utilizado. |
EF313 |
400 | El cupón no es válido para ese comercio. |
EF309 |
400 | El cupón agotó su límite de usos. |
EF310 |
400 | El subtotal supera el máximo permitido por el cupón. |
EF311 |
400 | El subtotal no alcanza el mínimo exigido por el cupón. |
EF322 |
400 | El cliente no cumple una condición del cupón. |
EF325 |
400 | El cupón no aplica en el día seleccionado. |
EF326 |
400 | El cupón solo aplica dentro de una franja horaria. |
EF327 |
400 | El cliente no está en la lista de habilitados del cupón. |
Requiere status=running
Modifica los parámetros del cupón cuando ya el cupón está running
| Método | URI | Cabeceras |
|---|---|---|
| PATCH | /companies/{companyId}/coupons/{couponId}/update-running |
Authorization |
{
"name": "string|max:64",
"ends_at": "date|after:starts_at|after:now",
"timezone": {
"string": true,
"regex": "/^[\+\-]([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"min_purchase_e2": "integer|min:0",
"human_min_purchase_e2": "numeric|min:0.0",
"whitelist": [
"integer|exists:clients,id"
],
"config": {
"limit": "nullable|integer",
"amount_limit_e2": "nullable|integer|min:1",
"max_discount_e2": "nullable|integer",
"max_purchase_e2": "nullable|integer|min:1",
"usable_in_promos": "boolean",
"avoid_same_target_promos": "boolean",
"min_purchase_count": "nullable|integer",
"max_purchase_count": "nullable|integer",
"last_purchase_min_days": "nullable|integer",
"last_purchase_max_days": "nullable|integer",
"join_last_purchase_count": "nullable|boolean",
"only_deliveries": "boolean",
"company_assumption_prc": "numeric|min:0|max:100",
"custom_discount_tag": "nullable|string|max:10",
"source_whitelist": "array",
"target_blacklist": "array",
"purchase_condition_mode": "string|in:company,branch_group,branch",
"fee_rules": [
{
"is_enabled": "boolean",
"name": "required|string|max:32",
"label": "string|max:32",
"description": "string",
"layer": "integer|min:0|max:255",
"price_min_e2": "integer|min:0",
"human_price_min_e2": "numeric|min:0.0",
"price_max_e2": "integer",
"human_price_max_e2": "numeric",
"hour_beg": {
"string": true,
"regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"hour_end": {
"string": true,
"regex": "/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
},
"conditions": "array",
"payment_methods": [
"required|string"
],
"payment_currencies": [
"required|string"
]
}
]
}
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF305 |
400 | El cupón no está en estado running. |
Requiere: status=pending
Finaliza la configuración del cupón y lo prepara para su inicio. Este endpoint realiza las comprobaciones necesarias para garantizar que todos los parámetros establecidos son válidos.
Una vez enviado, un cupón no podrá volver a ser modificado. Su status para a ser "generating", en el cual se realizan las optimizaciones y cambios necesarios para aplicar el cupón en la fecha establecida. una vez terminada la fase de "generating", el cupón pasa automáticamente al status=ready, indicando que el cupón está listo para iniciar en la fecha programada. Llegado el momento, el cupón iniciará automáticamente con el status=running.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/coupons/{couponId}/set-ready |
Authorization |
{
"starts_at": "date",
"ends_at": "date|after:starts_at|after:now",
"coupon_length": "integer|min:5|max:20",
"timezone": {
"string": true,
"regex": "/^[\+\-]([0-1][0-9]|2[0-3]):[0-5][0-9]$/"
}
}
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF301 |
400 | El cupón no está en estado pending. |
EF308 |
400 | El cupón no tiene un precio de descuento configurado. |
EF315 |
400 | El cupón no tiene objetivos (targets) configurados. |
EF333 |
400 | Combinación de configuración no soportada. |
Permite mostrar la lista de códigos de un cupón.
Los códigos de cupón son generados en la fase de "generating". Si se consume en una fase anterior, siempre devolverá vacío.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/coupons/{couponId}/codes |
Authorization |
{info} Soporta: Paginación Filters Carga dinámica
Muestra el listado de códigos de cupón disponibles para el canje. No aplica para type=promo
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/coupons/{couponId}/available-tickets |
Authorization |
{info} Soporta: Paginación Filters Carga dinámica
Muestra el listado de canjes/usos de un cupón/promoción.
| Método | URI | Cabeceras |
|---|---|---|
| GET | /companies/{companyId}/coupons/{couponId}/used-tickets |
Authorization |
Requiere: status=running
Permite finalizar un cupón antes de que expire, o cupones que no tienen una fecha de finalización especificada. Un cupón finalizado no podrá procesar más canjes.
| Método | URI | Cabeceras |
|---|---|---|
| POST | /companies/{companyId}/coupons/{couponId}/set-finished |
Authorization |
| Código | HTTP | Cuándo ocurre |
|---|---|---|
EF305 |
400 | El cupón no está en estado running. |
activePromos HasMany ActivePromoallLogs HasMany ApiLogbranch BelongsTo BranchbranchGroup BelongsTo BranchGroupcompany BelongsTo CompanycouponTargets HasMany CouponTargetcouponTickets HasMany CouponTicketcouponUsages HasMany CouponUsagelastUsage HasOne CouponUsagelogs HasMany ApiLog