Cupons: escrita
Cria, altera e apaga cupons de desconto, com as regras de valor, validade e margem mínima.
Use estas operações para publicar uma campanha vinda de um sistema de marketing, ligar ou desligar um código ou remover um cupom que não vale mais. As três mexem direto no que o cliente enxerga no checkout, então a alteração vale na hora.
Antes de gravar, a plataforma confere o tipo e o valor. Se a loja tem uma margem mínima configurada, também confere se o desconto não leva os produtos de menor margem abaixo dela: nesse caso responde 422 margin_floor.
/api/v2/couponsAdminCriar um cupom
Cria um cupom. Se code vier vazio, a plataforma gera um código aleatório. O código é guardado em maiúsculas e sem espaços nas pontas.
Cabeçalhos
AuthorizationstringobrigatórioBearer <JWT de administrador>.Content-Typestringobrigatórioapplication/json.X-Margin-OverridestringCorpo da requisição
typestringobrigatóriofixedpercentagefree_shippingvalueintegerobrigatóriofixed, centavos, maior que zero. Em percentage, pontos-base de 1 a 10000 (1500 = 15%). Em free_shipping é ignorado.codestringmin_orderintegerpadrão: 00 é sem mínimo.max_usesintegerpadrão: 00 é ilimitado.max_per_userintegerpadrão: 00 é ilimitado.starts_atstringexpires_atstringis_activebooleanpadrão: truedescriptionstringvendor_iduuid/api/v2/coupons/{id}AdminAlterar um cupom
Alteração parcial: só os campos enviados mudam. Os campos têm o mesmo significado da criação.
Parâmetros de caminho
idintegerobrigatórioCorpo da requisição
codestringtypestringfixedpercentagefree_shippingtype e value é validado e, se os dois vierem, conferido contra a margem mínima.valueintegertype, veja o aviso abaixo.min_orderintegermax_usesintegermax_per_userintegerstarts_atstringexpires_atstringis_activebooleandescriptionstringvendor_iduuid/api/v2/coupons/{id}AdminApagar um cupom
Apaga o cupom de vez (não há lixeira). Para só impedir novos usos, prefira PUT com "is_active": false.
Parâmetros de caminho
idintegerobrigatórioExemplo de requisição
curl -X POST "$BASE_URL/api/v2/coupons" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"code": "INVERNO10",
"type": "percentage",
"value": 1000,
"min_order": 5000,
"max_uses": 100,
"max_per_user": 1,
"expires_at": "2026-12-31T23:59:59Z",
"description": "Campanha de inverno"
}'Para ligar ou desligar um código:
curl -X PUT "$BASE_URL/api/v2/coupons/79" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "percentage",
"value": 1000,
"is_active": false
}'Resposta
{
"data": {
"id": 80,
"vendor_id": null,
"code": "INVERNO10",
"type": "percentage",
"value": 1000,
"min_order": 5000,
"max_uses": 100,
"used_count": 0,
"max_per_user": 1,
"starts_at": null,
"expires_at": "2026-12-31T23:59:59Z",
"is_active": true,
"description": "Campanha de inverno",
"created_at": "2026-10-11T21:09:59.968204Z",
"updated_at": "2026-10-11T21:09:59.968204Z"
}
}{
"data": {
"id": 80,
"vendor_id": null,
"code": "INVERNO10",
"type": "percentage",
"value": 1000,
"min_order": 5000,
"max_uses": 100,
"used_count": 0,
"max_per_user": 1,
"starts_at": null,
"expires_at": "2026-12-31T23:59:59Z",
"is_active": false,
"description": "Campanha de inverno",
"created_at": "2026-10-11T21:09:59.968204Z",
"updated_at": "2026-10-11T21:10:04.318101Z"
}
}Sem corpo.
Os campos da resposta são os mesmos de Cupons: consulta.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo que não é JSON | {"error":{"code":"bad_request","message":"invalid request body","details":"..."}} |
| 400 | type inválido | {"error":{"code":"bad_request","message":"invalid voucher type: x (must be fixed, percentage, or free_shipping)"}} |
| 400 | fixed com valor zero ou negativo | {"error":{"code":"bad_request","message":"fixed voucher value must be positive (in centavos)"}} |
| 400 | percentage fora de 1 a 10000 | {"error":{"code":"bad_request","message":"percentage voucher value must be 1-10000 basis points (0.01%-100%)"}} |
| 404 | Cupom inexistente (PUT, DELETE) | {"error":{"code":"not_found","message":"coupon not found"}} |
| 409 | Código já existe | {"error":{"code":"conflict","message":"coupon code already exists"}} |
| 422 | Desconto fere a margem mínima | {"error":{"code":"margin_floor","message":"...","details":{...}}} |
As mensagens de erro desta tabela voltam em inglês, como no servidor.