Atualizar um cupom
Atualiza parcialmente um cupom existente: você envia apenas os campos que quer mudar, e tudo o que ficar de fora permanece exatamente como estava. Use esta operação para ligar/desligar uma campanha, c
Atualiza parcialmente um cupom existente: você envia apenas os campos que quer mudar, e tudo o que ficar de fora permanece exatamente como estava. Use esta operação para ligar/desligar uma campanha, corrigir o desconto, estender a janela de validade ou apertar as regras de elegibilidade — sem precisar recriar o cupom (o id continua o mesmo).
PATCH /v1/coupons/{couponId}
Como funciona
O PATCH é uma atualização parcial (em contraste com PUT, que substituiria o objeto inteiro). Na prática:
- Campos enviados são sobrescritos pelo novo valor.
- Campos omitidos ficam intactos — não viram
nullnem voltam ao padrão. - Para limpar uma restrição opcional (ex.: remover o teto de carrinho), envie o campo explicitamente como
nullquando o cupom o aceitar.
O servidor valida o corpo, aplica as mudanças de forma atômica (ou tudo ou nada) e responde com 200 OK trazendo o objeto completo e já atualizado — incluindo o novo updatedAt. Não há estado intermediário nem processamento assíncrono: quando a resposta chega, a mudança já está valendo para os próximos checkouts.
Importante
Este PATCH ajusta as regras de uso do cupom: usageLimit (teto total de resgates), limitOneUsePerCustomer e usageQuantity (regra de quantidade de uso por cliente, quando aplicável). Envie só os campos que quer alterar.
Cupons usam o prefixo de ID dis_ (de discount). Trate o id como uma string opaca — não faça parsing. Veja Convenções.
Quando usar (e quando não)
- Pausar/retomar uma campanha: alterne
enabledem vez de excluir e recriar o cupom — você preserva oid, o histórico e o código. - Estender ou encurtar a validade: ajuste
initDate/endDate. - Endurecer regras: suba o
minCartAmount, reduza ousageLimit, ativelimitOneUsePerCustomer.
Quando não usar:
- Para desativar temporariamente, prefira
enabled: falsea excluir — a exclusão é permanente: o código deixa de existir e não pode mais ser aplicado. - Para criar um cupom novo, use Criar. O
PATCHexige um cupom já existente.
Requisição
Headers
| Cabeçalho | Obrigatório | Descrição |
|---|---|---|
SelectKey | Sim | Sua chave de API. Em produção começa com sl_live_; em sandbox, com sl_test_. Nunca use Authorization: Bearer/Basic. Veja Autenticação. |
Content-Type: application/json | Sim | O corpo é JSON. |
X-Idempotency-Key | Recomendado | Torna a escrita segura para repetir em caso de timeout/retry. Veja Idempotência. |
Parâmetro de caminho
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
couponId | string | Sim | ID público do cupom a atualizar (ex.: dis_01hqzvabc). |
Corpo
Todos os campos de configuração são opcionais — envie só o que quer alterar. A única exceção é o id, que identifica o cupom no corpo e acompanha o couponId do caminho.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | string | Sim | ID público do cupom (mesmo valor de couponId). Padrão ^[a-z]+_[A-Za-z0-9]+$. |
name | string | Não | Nome de exibição do cupom. |
enabled | boolean | Não | Liga (true) ou desliga (false) o cupom. |
code | string | Não | Código que o cliente digita no checkout (ex.: BLACKFRIDAY25). |
type | enum | Não | Tipo de desconto: flat (valor fixo em centavos) ou percentage (percentual). |
value | number (≥ 0) | Não | Valor do desconto. Se type=flat, é o valor em centavos (500 = R$ 5,00). Se type=percentage, é o percentual (25 = 25%). |
minCartAmount | integer (≥ 0) | Não | Valor mínimo do carrinho, em centavos, para o cupom valer. |
maxCartAmount | integer (≥ 0) | Não | Teto opcional de valor do carrinho, em centavos. |
usageLimit | integer (≥ 0) | Não | Número máximo de resgates no total. |
limitOneUsePerCustomer | boolean | Não | Restringe a 1 uso por cliente. |
usageQuantity | integer (≥ 0) | Não | Regra de quantidade de uso por cliente (quando aplicável). |
initDate | string (date-time) | Não | Início da validade, em ISO 8601 UTC. |
endDate | string (date-time) | Não | Fim da validade, em ISO 8601 UTC. |
allowedItemIds | array | Não | Restringe o cupom a produtos/itens específicos (por ID). |
allowedCustomerIds | array | Não | Restringe o cupom a clientes específicos (por ID). |
minCartItems | integer (≥ 0) | Não | Quantidade mínima de itens no carrinho. |
maxCartItems | integer (≥ 0) | Não | Quantidade máxima de itens elegíveis. |
isCumulative | boolean | Não | Permite acumular com outros descontos. |
Atenção
value é sempre inteiro em centavos quando type=flat. R$ 30,00 de desconto fixo é 3000, não 30. Para 30% use type=percentage com value=30. Misturar os dois é o erro de integração mais comum em cupons.
Exemplo — pausar uma campanha
curl -X PATCH "https://api.selectwin.io/v1/coupons/dis_01hqzvabc" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: 2f1c9b7e-coupon-pause-01" \
-d '{
"id": "dis_01hqzvabc",
"enabled": false
}'Exemplo — ajustar desconto e estender validade
curl -X PATCH "https://api.selectwin.io/v1/coupons/dis_01hqzvabc" \
-H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
-H "Content-Type: application/json" \
-d '{
"id": "dis_01hqzvabc",
"name": "Black Friday 30%",
"type": "percentage",
"value": 30,
"enabled": true,
"endDate": "2026-12-31T23:59:59Z"
}'Resposta
200 OK — o corpo é o objeto completo do cupom já com as alterações aplicadas e o updatedAt renovado.
{
"id": "dis_01hqzvabc",
"name": "Black Friday 30%",
"enabled": true,
"code": "BLACKFRIDAY25",
"type": "percentage",
"value": 30,
"minCartAmount": 10000,
"maxCartAmount": null,
"usageLimit": 100,
"limitOneUsePerCustomer": true,
"initDate": "2026-04-01T00:00:00.000Z",
"endDate": "2026-12-31T23: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"
}Campos-chave da resposta:
| Campo | Tipo | Descrição |
|---|---|---|
id | string | ID do cupom (inalterado pela atualização). |
type | string | flat ou percentage. |
value | integer | Desconto (centavos se flat; percentual se percentage). |
usageQuantity | integer | Regra de quantidade de uso por cliente (quando aplicável). |
updatedAt | string (date-time) | Renovado a cada atualização — use para confirmar que o PATCH foi aplicado. |
createdAt | string (date-time) | Permanece o da criação. |
A resposta de cupom traz o objeto completo (diferente das listagens, que são projeções leves). Cupons não incluem
merchantnem_links.
Erros
Trate sempre pelo error.code (estável), nunca pela message. Veja o Catálogo de Códigos de Erro e Tratamento de Erros.
error.code | HTTP | Quando ocorre |
|---|---|---|
couponIdIsInvalid | 400 | O couponId/id não tem o formato válido (dis_…). |
couponIdNotFound | 404 | Nenhum cupom com esse ID na sua conta. |
couponCreateItemIdIsInvalid | 400 | Algum ID em allowedItemIds não existe / é inválido. |
couponCreateCustomerIdIsInvalid | 400 | Algum ID em allowedCustomerIds não existe / é inválido. |
couponUpdateFailed | 400 | A atualização foi rejeitada (combinação de campos inválida). |
invalidParameters | 400 | Falha de validação genérica — veja error.params para os campos. |
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 violada (entidade não processável). |
tooManyRequests | 429 | Limite de requisições excedido — respeite error.retryAfterMinutes. |
serverError | 500 | Erro interno — repita com backoff. |
Boas práticas
- Envie só o que muda. Como o
PATCHé parcial, um corpo enxuto reduz o risco de sobrescrever sem querer um campo que outra pessoa já ajustou. - Combine
iddo corpo comcouponIddo caminho. Eles devem apontar para o mesmo cupom; divergência leva acouponIdIsInvalid/couponIdNotFound. - Prefira
enabled: falsea excluir para pausas temporárias — você preserva código, histórico eid, e pode religar depois. - Não troque
typesem revervalue. Mudar deflatparapercentage(ou vice-versa) sem ajustarvaluecria descontos absurdos (ex.: 3000% ou R$ 0,30). - Use
X-Idempotency-Keyem escritas automatizadas, para que um retry após timeout não aplique a mudança duas vezes. - Confirme pelo
updatedAtda resposta (ou faça um Read) em vez de assumir sucesso pelo status — assim você lê o estado final real do cupom. - Datas em ISO 8601 UTC (sufixo
Z) e dinheiro em centavos — converta na sua aplicação antes de enviar.
Veja também
- Visão geral de Cupons — modelo do objeto, ciclo de vida e regras.
- Criar cupom — campos obrigatórios na criação.
- Ler cupom — recuperar o estado atual antes de editar.
- Listar cupons — encontrar o
idpor nome/código/status. - Excluir cupom — quando remover de vez em vez de desativar.
- Convenções · Idempotência · Autenticação
How is this guide?