Order Routing API
POST /v1/orders-api/router/
Aplica o motor de roteamento de pedidos sobre um VTEX OrderForm e retorna as opções de frete geradas, junto com os resultados detalhados das regras de roteamento aplicadas (auditoria por execução).
Diferente da Simulation API, que simula um carrinho a partir de itens, a Order Routing API recebe um orderForm já existente — tipicamente o retornado pela API VTEX /api/checkout/pub/orderForm — e o processa diretamente.
Headers
| Header | Tipo | Obrigatório | Descrição |
|---|---|---|---|
x-trinio-merchant-id | string | Sim | Merchant ID (ULID) |
x-trinio-visitor-id | string | Não | Identificador opaco de visitante para manter a atribuição A/B sticky entre requests. Reenvie o valor recebido no header x-trinio-visitor-id da resposta de /v1/orders-api/vtex/cart/simulation/. Ver Visitor ID e consistência A/B. |
Request Body
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
orderForm | object | Sim | VTEX OrderForm completo. Use o mesmo formato retornado pela API VTEX /api/checkout/pub/orderForm. |
leanShipping | bool | Não | Quando true, retorna no máximo duas opções de entrega — a mais rápida (label: "Mais rápida") e a mais econômica (label: "Mais econômica") — em vez de todas as SLAs disponíveis. Opções de pickup não são afetadas. Quando a SLA mais rápida e a mais barata coincidem, apenas uma opção é retornada. Default: false. |
Response
Campos da Response
shippingMethods
Opções de frete geradas pelo motor de roteamento. Cada opção representa uma estratégia completa de fulfillment.
| Campo | Tipo | Descrição |
|---|---|---|
index | int | Índice da opção de frete na lista |
label | string | Label de exibição para o cliente |
shippingType | string | DELIVERY, PICKUP ou SCHEDULED (ver tabela abaixo) |
merchantShippingMethodId | string | ID do método de envio na plataforma do merchant (ex: ID na VTEX) |
value | int | Custo total do frete em centavos (ex: 2500 = R$25,00) |
originalValue | int | Valor original antes de caps/descontos, em centavos. Presente apenas quando houve ajuste. |
deliveryTime | string | Tempo estimado de entrega (5bd = 5 dias úteis, 1d = 1 dia, 1h = 1 hora, 1bh = 1 hora útil) |
estimatedDeliveryDate | string | Data estimada de entrega (ISO 8601). Pode estar ausente. |
selected | bool | Se esta opção está selecionada |
hasMultiplePackages | bool | Se o pedido é dividido em múltiplos pacotes |
numberOfPackages | int | Número de pacotes desta opção |
packages | array | Lista de pacotes nesta opção (ver detalhe abaixo) |
availableDeliveryWindows | array | Janelas de entrega disponíveis (relevante para SCHEDULED) |
pickupPointAddress | object | Endereço do ponto de retirada (apenas para PICKUP) |
postalCode | string | CEP de destino |
source | string | Origem da opção: order_router, freight_quoter ou platform |
requiresCouponSubsidy | bool | Se o frontend precisa aplicar um cupom para cobrir a diferença entre originalValue e value |
packages[]
Cada opção de frete é composta por um ou mais pacotes. Em opções single-package há apenas um item neste array; em multi-package, vários.
| Campo | Tipo | Descrição |
|---|---|---|
merchantShippingMethodId | string | ID do método de envio na plataforma do merchant para este pacote |
itemIds | array | SKU IDs incluídos neste pacote |
shippingType | string | Tipo de envio do pacote (DELIVERY, PICKUP, SCHEDULED) |
label | string | Label do pacote |
value | int | Custo do frete deste pacote em centavos |
originalValue | int | Valor original antes de caps/descontos, em centavos. Presente apenas quando houve ajuste. |
deliveryTime | string | Estimativa de entrega deste pacote |
estimatedDeliveryDate | string | Data estimada de entrega deste pacote (ISO 8601) |
courierId | string | ID do courier na plataforma do merchant |
dockId | string | ID do dock/depósito na plataforma do merchant |
pickupPointId | string | ID do ponto de retirada (apenas para PICKUP) |
pickupPointWorkingHours | array | Horários de funcionamento do ponto de retirada |
availableDeliveryWindows | array | Janelas de entrega disponíveis para o pacote (relevante para SCHEDULED) |
routerResult
Trace das regras executadas pelo motor de roteamento — útil para debug e auditoria. Cada item descreve uma regra avaliada, se as condições foram atendidas, se ela efetivamente alterou as opções de frete, e quantos métodos foram adicionados/removidos/modificados.
| Campo | Tipo | Descrição |
|---|---|---|
name | string | Nome da regra |
engine | string | Engine que executou a regra |
conditionsMet | bool | Se as condições da regra foram satisfeitas pelo orderForm |
applied | bool | Se a regra efetivamente foi aplicada (algumas regras podem atender condições mas não aplicar) |
methodsAdded | int | Quantas opções de frete foram adicionadas pela regra |
methodsRemoved | int | Quantas opções de frete foram removidas pela regra |
methodsModified | int | Quantas opções de frete foram modificadas pela regra |
details | object | Detalhes adicionais específicos da regra (formato livre) |
experiment
Metadados da variante A/B que efetivamente rodou neste request. Presente apenas quando o backend atribuiu o usuário a uma variante (kill switch ligado para o merchant + alguma regra do experimento aplicada). Permite ao cliente taggear eventos de analytics (ex.: Mixpanel checkout_completed) com a variante que afetou a decisão de routing.
| Campo | Tipo | Descrição |
|---|---|---|
routerId | string | Identificador do conjunto de regras que executou (ex.: reserva-rules, reserva-no-rules) |
experimentId | string | Identificador do experimento no GrowthBook |
variantId | string | Variante atribuída ao usuário (ex.: variant-a, variant-b) |
cohort | string | Coorte do experimento, quando configurada |
Quando o usuário não foi atribuído a uma variante (sem experimento ativo para o merchant, ou kill switch desligado), o campo experiment é omitido da response (não vem com valores vazios).
Tipos de Frete (shippingType)
| Valor | Descrição |
|---|---|
DELIVERY | Entrega padrão no endereço |
PICKUP | Retirada em ponto de coleta |
SCHEDULED | Entrega agendada (com janelas de entrega disponíveis) |
Notas
- O endpoint é público (não exige JWT), mas o header
x-trinio-merchant-idé obrigatório. shippingMethodspode vir vazio ([]) caso nenhuma regra produza opções aplicáveis ao orderForm informado.routerResulté sempre retornado (mesmo que vazio) e reflete o trace da execução para a request — útil para debug, mas não obrigatório de processar no cliente.experimenté retornado somente quando o backend atribuiu uma variante de A/B testing. O cliente deve usarrouterId/experimentId/variantId/cohortpara taggear eventos de analytics e fechar o loop conversão ↔ variante.- O
orderFormenviado deve ser o objeto VTEX completo. Campos não usados pelas regras do merchant podem ser omitidos, masitems,shippingData.address.postalCodeesellerssão tipicamente necessários.
Exemplo: cURL
Erros
| Status | Descrição |
|---|---|
| 400 | orderForm inválido ou body malformado |
| 500 | Falha ao gerar opções de frete (erro interno no motor de roteamento) |