Políticas de frete
Cria regras que ajustam o frete cotado: somam ou descontam valores, zeram o frete acima de um subtotal, escondem métodos ou limitam as opções.
Uma política de frete muda a lista de opções que o cliente vê depois que os métodos foram cotados, sem editar os métodos. É a ferramenta para campanhas e contingências: "frete grátis acima de R$ 300", "Expressa 10% mais cara no Nordeste", "esconder o SEDEX por uma semana". As políticas ativas rodam em ordem de priority (menor primeiro) e cada uma enxerga o resultado da anterior.
Uma política pode ser restrita a uma área de tarifa (rate_area_id) e a um método (method_code). Sem restrição, vale para todos.
rule_type | O que faz | Campos de params |
|---|---|---|
free_above | Zera o frete (e marca free_shipping) se o subtotal do carrinho for maior ou igual ao mínimo. | min_subtotal_cents (obrigatório, maior que 0) |
markup | Soma um valor ao frete. | value_type (F centavos ou P pontos-base) e value (maior que 0) |
discount | Subtrai um valor do frete, sem passar de zero. | value_type e value, como em markup |
hide_method | Remove o método das opções. | Exige method_code (coluna ou em params) |
limit_options | Limita e ordena as opções: remove as mais lentas que max_transit_days, ordena por sort e mantém só as max primeiras. | max, max_transit_days, sort (price ou transit); ao menos um deles |
Em markup e discount com value_type: "P", value é em pontos-base (1000 = 10%). Com F, é em centavos.
Listar políticas
/api/v1/admin/shipping/policiesAdminLista as políticas de frete
Devolve as políticas ativas e desativadas, ordenadas por prioridade. As apagadas não aparecem.
Exemplo de requisição
curl "$BASE_URL/api/v1/admin/shipping/policies" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"policies": [
{
"id": "605bfa9e-3307-488e-94e5-910561ce03d8",
"name": "Frete grátis acima de R$ 300",
"rule_type": "free_above",
"priority": 100,
"status": "active",
"params": {
"min_subtotal_cents": 30000
}
}
]
}Campos da resposta
policiesarrayPolíticas.
iduuidnamestringrule_typestringpriorityintegerstatusstringactive ou disabled.rate_area_iduuidmethod_codestringparamsobjectCriar uma política
Uma política disabled é um rascunho: pode ser salva incompleta e não altera nenhuma cotação. Uma política active precisa estar completa.
/api/v1/admin/shipping/policiesAdminCria uma política de frete
Exige manage_shipping.
Corpo da requisição
namestringobrigatóriorule_typestringobrigatóriolimit_optionsmarkupdiscountfree_abovehide_methodpriorityinteger0 vira 100. Na alteração, o valor enviado é gravado como está.statusstringactivedisabledactive ou disabled. Qualquer outro texto vira active.rate_area_iduuidmethod_codestringcode do método alvo. Omita (ou *) para valer em todos os métodos.paramsobjectExemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/shipping/policies" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Frete grátis acima de R$ 300",
"rule_type": "free_above",
"params": {
"min_subtotal_cents": 30000
}
}'Resposta
{
"id": "605bfa9e-3307-488e-94e5-910561ce03d8",
"name": "Frete grátis acima de R$ 300",
"rule_type": "free_above",
"priority": 100,
"status": "active",
"params": {
"min_subtotal_cents": 30000
}
}Alterar uma política
Substitui a política inteira: envie todos os campos. O retorno é só uma confirmação.
/api/v1/admin/shipping/policies/{id}AdminAltera uma política de frete
Exige manage_shipping.
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
namestringobrigatóriorule_typestringobrigatóriolimit_optionsmarkupdiscountfree_abovehide_methodpriorityinteger0 vira 100. Na alteração, o valor enviado é gravado como está.statusstringactivedisabledactive ou disabled. Qualquer outro texto vira active.rate_area_iduuidmethod_codestringcode do método alvo. Omita (ou *) para valer em todos os métodos.paramsobjectExemplo de requisição
curl -X PUT "$BASE_URL/api/v1/admin/shipping/policies/$POLICY_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Frete grátis acima de R$ 300",
"rule_type": "free_above",
"params": {
"min_subtotal_cents": 30000
},
"priority": 50,
"status": "disabled"
}'Resposta
{
"message": "updated"
}Apagar uma política
/api/v1/admin/shipping/policies/{id}AdminApaga uma política de frete
Exige manage_shipping. Exclusão lógica.
Parâmetros de caminho
iduuidobrigatórioExemplo de requisição
curl -X DELETE "$BASE_URL/api/v1/admin/shipping/policies/$POLICY_ID" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"message": "deleted"
}Simular as políticas
Mostra o efeito das políticas ativas sobre os métodos ativos da loja, antes e depois, para um CEP e um subtotal. Não grava nada. O "antes" usa o preço fixo (flat_rate) de cada método: métodos cobrados por faixa ou por transportadora aparecem com custo 0. Se a loja não tem nenhum método ativo, a simulação usa métodos de demonstração.
/api/v1/admin/shipping/policies/simulateAdminSimula as políticas de frete
Exige manage_shipping, mesmo sendo só leitura.
Corpo da requisição
postal_codestringsubtotal_centsintegerfree_above.weight_gramsintegerExemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/shipping/policies/simulate" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"postal_code": "01310-100",
"subtotal_cents": 35000
}'Resposta
{
"before": [
{
"method_id": "65d71956-dbae-4df9-a3a3-129ac66f6324",
"method_name": "Entrega Padrão",
"method_code": "entrega_padrao",
"cost": 1500,
"estimated_days": 0,
"min_delivery_days": 0,
"max_delivery_days": 0,
"free_shipping": false,
"is_pickup": false,
"shipping_id": "65d71956-dbae-4df9-a3a3-129ac66f6324",
"shipping": "Entrega Padrão",
"rate_str": "15.00"
}
],
"after": [
{
"method_id": "65d71956-dbae-4df9-a3a3-129ac66f6324",
"method_name": "Entrega Padrão",
"method_code": "entrega_padrao",
"cost": 0,
"estimated_days": 0,
"min_delivery_days": 0,
"max_delivery_days": 0,
"free_shipping": true,
"is_pickup": false,
"shipping_id": "65d71956-dbae-4df9-a3a3-129ac66f6324",
"shipping": "Entrega Padrão",
"rate_str": "0.00"
}
]
}Campos da resposta
beforearrayOpções sem as políticas.
method_iduuidmethod_namestringmethod_codestringcostintegerestimated_daysintegermin_delivery_daysintegermax_delivery_daysintegerfree_shippingbooleanis_pickupbooleanrate_strstringcost em string decimal (campo duplicado). shipping_id e shipping também são aliases.afterarrayErros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token, token inválido ou expirado | {"error":"invalid or expired token"} |
| 403 | Usuário sem o privilégio manage_shipping | {"error":"insufficient privileges","privilege_required_any":["manage_shipping"]} |
| 400 | Corpo que não é JSON; name vazio; rule_type desconhecido; params que não é JSON válido; parâmetros incompletos numa política ativa; política que não existe (alterar e apagar) | {"error":"invalid rule_type: nope"} / {"error":"min_subtotal_cents must be greater than zero"} / {"error":"policy not found"} |
| 500 | Falha ao simular | {"error":"failed to simulate","detail":"..."} |
Mensagens de validação por tipo: free_above: min_subtotal_cents must be greater than zero. markup e discount: value_type must be F or P e value must be greater than zero. hide_method: method_code is required. limit_options: max and max_transit_days cannot be negative, sort must be price or transit e limit_options needs max, max_transit_days or sort.