Visão geral
Cupons são descontos promocionais (percentuais ou de valor fixo) que você cria na sua conta e aplica em checkouts e campanhas. Cada cupom tem um código que o cliente digita e regras de elegibilidade (
Cupons são descontos promocionais (percentuais ou de valor fixo) que você cria na sua conta e aplica em checkouts e campanhas. Cada cupom tem um código que o cliente digita e regras de elegibilidade (valor mínimo do carrinho, datas de validade, limites de uso). Esta página explica o modelo do objeto, seu ciclo de vida e todas as operações disponíveis.
O que é um cupom
Um cupom representa uma regra de desconto reutilizável. Você o configura uma vez (tipo, valor, condições) e ele fica disponível para ser aplicado durante a compra. Pense nele como uma "campanha de desconto" persistente: enquanto estiver ativo (enabled: true) e dentro da janela de validade, clientes que informarem o code recebem o abatimento — desde que o carrinho atenda às restrições.
Dois conceitos definem o desconto:
type— como o desconto é calculado. Os únicos valores válidos são"flat"(valor fixo) e"percentage"(percentual). Não existe"percent".value— o tamanho do desconto, e sua unidade depende dotype:- Para
type: "flat",valueé um valor em centavos (500= R$ 5,00 de desconto). - Para
type: "percentage",valueé o percentual (25= 25% de desconto).
- Para
Atenção ao campo value
A mesma propriedade value muda de significado conforme o type. Em flat, são centavos; em percentage, são pontos percentuais. Enviar 25 com type: "flat" cria um desconto de R$ 0,25, não de 25%.
O prefixo do ID de cupom é dis_ (de discount). Como todo ID na API, trate-o como uma string opaca — não faça parsing. Veja Convenções.
Modelo do objeto
O objeto completo é retornado por Create, Read e Update. Listagens retornam uma projeção mais leve (veja Projeção em listas).
{
"id": "dis_01hqzvabc",
"name": "Black Friday 25%",
"enabled": true,
"code": "BLACKFRIDAY25",
"type": "percentage",
"value": 25,
"minCartAmount": 10000,
"maxCartAmount": null,
"usageLimit": 100,
"limitOneUsePerCustomer": true,
"initDate": "2026-04-01T00:00:00.000Z",
"endDate": "2026-04-30T23:59:59.000Z",
"allowedItemIds": null,
"allowedCustomerIds": null,
"usageQuantity": 0,
"minCartItems": 0,
"maxCartItems": 0,
"isCumulative": false,
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z"
}| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador público do cupom (dis_...). Opaco; somente leitura. |
name | string | Nome de exibição do cupom (uso interno/painel). |
enabled | boolean | Se o cupom está ativo. false desativa sem excluir. |
code | string | Código que o cliente informa no checkout (ex.: BLACKFRIDAY25). |
type | string | Tipo de desconto. Enum: "flat" ou "percentage". |
value | integer | Tamanho do desconto: centavos se flat, percentual se percentage. |
minCartAmount | integer | Valor mínimo do carrinho em centavos para o cupom valer. |
maxCartAmount | integer | null | Teto opcional do carrinho em centavos; null = sem teto. |
usageLimit | integer | Número máximo de resgates no total (todos os clientes). |
limitOneUsePerCustomer | boolean | Se true, cada cliente só pode usar o cupom uma vez. |
initDate | string (date-time) | Início da validade, ISO 8601 UTC. |
endDate | string (date-time) | Fim da validade, ISO 8601 UTC. |
allowedItemIds | array | null | Restringe o cupom a IDs de produtos/itens específicos; null = sem restrição. |
allowedCustomerIds | array | null | Restringe a IDs de clientes específicos; null = sem restrição. |
usageQuantity | integer | Regra de quantidade de uso por cliente (quando aplicável). É enviável no corpo de Create/Update. |
minCartItems | integer | Quantidade mínima de itens no carrinho para elegibilidade (0 = sem mínimo). |
maxCartItems | integer | Quantidade máxima de itens no carrinho para elegibilidade (0 = sem máximo). |
isCumulative | boolean | Se o cupom pode ser combinado com outros descontos. |
createdAt | string (date-time) | Quando o cupom foi criado, ISO 8601 UTC. |
updatedAt | string (date-time) | Última atualização, ISO 8601 UTC. |
Importante
Todos os valores monetários (value em flat, minCartAmount, maxCartAmount) são inteiros em centavos. Todas as datas são ISO 8601 em UTC (sufixo Z). Veja Convenções.
Como as restrições se combinam
Para que um cupom seja aplicado a um carrinho, todas as condições configuradas precisam ser satisfeitas ao mesmo tempo:
enabledétruee o momento atual está entreinitDateeendDate;- o subtotal do carrinho é
>= minCartAmounte (se houver teto)<= maxCartAmount; - a quantidade de itens respeita
minCartItems/maxCartItems(quando diferentes de0); - se
allowedItemIds/allowedCustomerIdsestiverem definidos, o item/cliente precisa constar na lista; - o
usageLimitglobal ainda não foi atingido e, selimitOneUsePerCustomerfortrue, aquele cliente ainda não usou.
Quando o cupom passa por todas as checagens, o desconto é calculado a partir de type/value e abatido do valor cobrado.
Ciclo de vida
Um cupom não tem máquina de estados rica como uma transação; seu "estado" efetivo deriva de três coisas: a flag enabled, a janela initDate–endDate e o teto de resgates usageLimit.
- Ativo vs. Inativo é controlado por você via
enabled(use oPATCHpara ligar/desligar sem perder o histórico). - Expirado é automático: depois de
endDate, o cupom deixa de ser aplicável mesmo comenabled: true. - Esgotado é automático: quando o total de resgates atinge
usageLimit, novos resgates são recusados. - Excluído (
DELETE) é permanente e remove o cupom do escopo da conta. Prefiraenabled: falsequando quiser apenas pausar.
Operações
| Operação | Método e caminho | Retorno | Página |
|---|---|---|---|
| Criar | POST /v1/coupons | 201 — objeto completo | Create |
| Listar (paginado) | GET /v1/coupons | 200 — envelope paginado | List |
| Listar todos | GET /v1/coupons/listall | 200 — array de itens leves | List |
| Ler | GET /v1/coupons/{couponId} | 200 — objeto completo | Read |
| Atualizar | PATCH /v1/coupons/{couponId} | 200 — objeto completo | Update |
| Excluir | DELETE /v1/coupons/{couponId} | 200 — confirmação mínima | Delete |
Todas as requisições usam a base URL https://api.selectwin.io/v1 e o header de autenticação SelectKey (chaves de produção começam com sl_live_; em sandbox, com sl_test_). Veja Autenticação.
curl https://api.selectwin.io/v1/coupons/dis_01hqzvabc \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"Projeção em listas
As listagens não devolvem o objeto inteiro — devolvem uma projeção leve com apenas os campos mais usados em telas de catálogo:
id, name, code, type, value, enabled, initDate, endDate, createdAt, updatedAt.
Campos como minCartAmount, usageLimit, usageQuantity, allowedItemIds, allowedCustomerIds, isCumulative não aparecem na lista. Para o objeto completo, faça um Read pelo id.
Há duas formas de listar:
GET /v1/coupons— paginado. Retorna um envelope{ offset, limit, total, page, data, hasMore }e aceita filtros (name,code,type,status, faixas de data) e ordenação. Use no dia a dia. Veja Paginação.GET /v1/coupons/listall— retorna um array direto com todos os cupons da conta (sem envelope de paginação). Útil para exportar/sincronizar o catálogo inteiro; use com parcimônia em contas com muitos cupons.
Erros
Os códigos a seguir são específicos do recurso Cupons (veja o Catálogo de Códigos de Erro). Trate sempre pelo error.code, nunca pela message.
error.code | HTTP | Quando ocorre |
|---|---|---|
couponIdNotFound | 404 | Nenhum cupom com o id/couponId informado (Read, Update, Delete). |
couponIdIsInvalid | 400 | O id não tem o formato prefixo_valor esperado. |
couponCreateItemIdIsInvalid | 400 | Um ID em allowedItemIds não corresponde a um produto/item válido. |
couponCreateCustomerIdIsInvalid | 400 | Um ID em allowedCustomerIds não corresponde a um cliente válido. |
couponCreateFailed | 400 | Falha ao criar o cupom (dados inconsistentes). |
couponUpdateFailed | 400 | Falha ao atualizar o cupom. |
couponDeleteFailed | 400 | Falha ao excluir o cupom. |
Além desses, valem os erros transversais a toda a API:
error.code | HTTP | Quando ocorre |
|---|---|---|
invalidParameters | 400 | Validação de campos falhou (detalhes em error.params). |
unauthorized | 401 | SelectKey ausente, inválida ou revogada. |
forbidden | 403 | Autenticado, mas sem permissão para a operação. |
unprocessableEntity | 422 | Regra de negócio rejeitou a requisição. |
tooManyRequests | 429 | Limite de requisições excedido (respeite error.retryAfterMinutes). |
serverError | 500 | Erro interno — repita com backoff. |
Boas práticas
- Use
codeúnico, curto e legível. É o que o cliente digita; evite ambiguidade (Ovs.0). - Confira a unidade de
value. Centavos paraflat, percentual parapercentage— esse é o erro mais comum ao criar cupons. - Pause em vez de excluir. Para encerrar uma campanha sem perder o cupom e suas regras, faça
PATCH { enabled: false }. Reserve oDELETEpara limpeza definitiva — ele é irreversível. - Defina sempre
initDateeendDate. Janelas explícitas evitam que um cupom de campanha continue válido por engano. - Limite o abuso com
usageLimitelimitOneUsePerCustomer. Combine os dois para campanhas de aquisição (um resgate por cliente, com teto global). - Defina o teto de resgates com
usageLimitpara encerrar a campanha automaticamente quando o orçamento de descontos for atingido. - Valide IDs de restrição antes de enviar. IDs inválidos em
allowedItemIds/allowedCustomerIdsretornamcouponCreateItemIdIsInvalid/couponCreateCustomerIdIsInvalid. - Decida
isCumulativecom cuidado. Permitir empilhamento com outros descontos pode reduzir margens de forma inesperada; o padrão é não acumular (false).
Veja também
- Create — criar um cupom (corpo completo, campos obrigatórios).
- Read — recuperar um cupom pelo ID.
- Update — atualização parcial (
PATCH), inclusive ativar/desativar. - List — listar com filtros, paginação e a variante
listall. - Delete — exclusão permanente.
- Convenções — camelCase, centavos, datas UTC, IDs opacos.
- Catálogo de Códigos de Erro — todos os
error.code. - Paginação — envelope
offset/limit/page/hasMore. - Autenticação — header
SelectKey.
How is this guide?