Oferta pós-compra
Cria, lista, altera e remove as regras de oferta pós-compra do seller, a oferta com desconto mostrada ao cliente logo depois que ele fecha um pedido.
A oferta pós-compra (upsell de um clique) é um produto extra, com desconto, que a vitrine mostra ao cliente na tela de confirmação, depois que o pedido foi feito. Se o cliente aceita dentro de 30 minutos, a plataforma cria um pedido filho só com esse produto (frete zero), sem mexer no pedido original já pago. Se ele ignora ou recusa, a oferta expira.
O seller controla isso por regras: "quando o cliente comprar X, ofereça Y com Z% de desconto". Para cada pedido novo, a plataforma percorre as regras ativas da maior para a menor priority e usa a primeira que combina e cujo produto ofertado esteja disponível e com estoque. Cada pedido recebe no máximo uma oferta.
Os produtos da regra (o ofertado e, no gatilho product, o gatilho) precisam ser do próprio seller.
Campos de uma regra
| Campo | Tipo | Observação |
|---|---|---|
trigger_type | string | product, category ou any. Obrigatório na prática: sem ele a gravação é recusada. |
trigger_ref | uuid | Produto (para product) ou categoria (para category) que dispara a regra. Ignorado em any. Obrigatório em product. |
offer_product_id | uuid | Produto ofertado. Obrigatório. |
discount_percent | integer | Desconto em porcentagem inteira, de 0 a 90. |
priority | integer | Quanto maior, antes a regra é avaliada. Empate: a mais antiga primeiro. |
status | string | active ou paused. Padrão active. |
Listar as regras
/api/v1/vendor/post-purchase-rulesSellerLista as regras de oferta pós-compra do seller
Devolve todas as regras do seller que não foram removidas, da maior priority para a menor. Não há paginação nem filtros.
Exemplo de requisição: listar
curl "$BASE_URL/api/v1/vendor/post-purchase-rules" \
-H "Authorization: Bearer $TOKEN"Resposta: listar
{
"rules": [
{
"id": "db8e6d00-7f7a-4a3a-b864-f184f7e630e1",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"trigger_type": "product",
"trigger_ref": "7a3e1d62-5b0c-4d8a-9c47-2f9f1b6c0a10",
"offer_product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"discount_percent": 15,
"priority": 10,
"status": "active",
"created_at": "2026-10-11T23:47:58.297811Z"
}
],
"total": 1
}Campos da resposta
rulesarray[]) quando não há nenhuma.totalintegerrules[].iduuidrules[].vendor_iduuidrules[].trigger_typestringproductcategoryanyrules[].trigger_refuuidany.rules[].offer_product_iduuidrules[].discount_percentintegerrules[].priorityintegerrules[].statusstringactivepausedrules[].created_atstringCriar uma regra
/api/v1/vendor/post-purchase-rulesSellerCria uma regra de oferta pós-compra
Cria a regra para o seller autenticado. O vendor_id é sempre o seu: qualquer valor enviado no corpo é ignorado.
Uma regra active só é aceita se o produto ofertado puder ser comprado agora (visível na loja, com estoque maior que zero e seller ativo). Para cadastrar a regra antes de o produto estar à venda, crie com status igual a paused.
Corpo da requisição
trigger_typestringobrigatórioproductcategoryanytrigger_refuuidtrigger_type é product (e o produto precisa ser seu). Em category, é o id da categoria; a categoria não é conferida contra o seller.offer_product_iduuidobrigatóriodiscount_percentintegerpadrão: 0priorityintegerpadrão: 0statusstringpadrão: activeactivepausedExemplo de requisição: criar
curl -X POST "$BASE_URL/api/v1/vendor/post-purchase-rules" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"trigger_type": "product",
"trigger_ref": "7a3e1d62-5b0c-4d8a-9c47-2f9f1b6c0a10",
"offer_product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"discount_percent": 15,
"priority": 10
}'Resposta: criar
{
"id": "db8e6d00-7f7a-4a3a-b864-f184f7e630e1",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"trigger_type": "product",
"trigger_ref": "7a3e1d62-5b0c-4d8a-9c47-2f9f1b6c0a10",
"offer_product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"discount_percent": 15,
"priority": 10,
"status": "active",
"created_at": "2026-10-11T23:47:58.297811Z"
}Alterar uma regra
/api/v1/vendor/post-purchase-rules/{id}SellerSubstitui os dados de uma regra do seller
Altera a regra inteira: todos os campos são regravados, e o que você não enviar volta ao padrão (discount_percent e priority viram 0, status vira active). Reenvie sempre o conjunto completo, o mesmo corpo do cadastro. As mesmas validações de posse e de produto à venda da criação valem aqui.
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
trigger_typestringobrigatórioproductcategoryanytrigger_refuuidproduct.offer_product_iduuidobrigatóriodiscount_percentintegerpadrão: 0priorityintegerpadrão: 0statusstringpadrão: activeactivepausedpaused para desligar a regra sem apagá-la.{ "status": "ok" }A resposta não devolve a regra: consulte a lista para ver o resultado.
Remover uma regra
/api/v1/vendor/post-purchase-rules/{id}SellerRemove uma regra do seller
Remove a regra (ela deixa de aparecer na lista e de gerar ofertas). Ofertas que já foram mostradas a clientes continuam valendo até expirar.
Parâmetros de caminho
iduuidobrigatório{ "status": "deleted" }Exemplo de requisição: alterar e remover
# alterar (corpo completo)
curl -X PUT "$BASE_URL/api/v1/vendor/post-purchase-rules/db8e6d00-7f7a-4a3a-b864-f184f7e630e1" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"trigger_type":"any","offer_product_id":"c3f92551-9dda-4fc7-b518-353d1c4e4035","discount_percent":10,"priority":1,"status":"paused"}'
# remover
curl -X DELETE "$BASE_URL/api/v1/vendor/post-purchase-rules/db8e6d00-7f7a-4a3a-b864-f184f7e630e1" \
-H "Authorization: Bearer $TOKEN"Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | Corpo não é JSON. | {"error":"invalid request body","detail":"..."} |
| 400 | Criação sem offer_product_id. | {"error":"invalid rule","detail":"offer_product_id is required"} |
| 400 | trigger_type ausente ou fora dos três valores, ou discount_percent fora de 0 a 90, na criação. | {"error":"invalid rule","detail":"o valor enviado está fora da faixa permitida (campo relacionado a \"purchase_rules_trigger_type\"). Corrija o valor e reenvie."} |
| 400 | Criação de regra active com produto ofertado sem estoque ou fora da loja. | {"error":"invalid rule","detail":"post-purchase: offer product is not currently buyable (draft/out of stock/vendor inactive)"} |
| 400 | Alteração com produto ofertado sem estoque ou fora da loja. | {"error":"offer_product_not_buyable","detail":"..."} |
| 401 | Sem token. | {"error":"authentication required"} |
| 403 | Produto ofertado ou de gatilho não é do seller. | {"error":"product does not belong to this vendor","detail":"product does not belong to this vendor"} |
| 404 | Alteração: regra inexistente ou de outro seller; também qualquer outra falha de validação (veja abaixo). Remoção: regra inexistente. | {"error":"update failed","detail":"sql: no rows in result set"} |