Trinio
Documentação

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

HeaderTipoObrigatórioDescrição
x-trinio-merchant-idstringSimMerchant ID (ULID)
x-trinio-visitor-idstringNãoIdentificador 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

JSON
{
  "orderForm": {
    "orderFormId": "abc123def456",
    "items": [
      { "id": "1234", "quantity": 1, "seller": "1" },
      { "id": "5678", "quantity": 2, "seller": "1" }
    ],
    "shippingData": {
      "address": {
        "postalCode": "22071060",
        "country": "BRA"
      }
    },
    "sellers": [{ "id": "1" }],
    "totalizers": [],
    "value": 0
  },
  "leanShipping": false
}
CampoTipoObrigatórioDescrição
orderFormobjectSimVTEX OrderForm completo. Use o mesmo formato retornado pela API VTEX /api/checkout/pub/orderForm.
leanShippingboolNãoQuando 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

JSON
{
  "data": {
    "shippingMethods": [
      {
        "index": 0,
        "label": "Normal",
        "shippingType": "DELIVERY",
        "merchantShippingMethodId": "Normal",
        "value": 2500,
        "deliveryTime": "5bd",
        "estimatedDeliveryDate": "2026-05-07T00:00:00+00:00",
        "selected": false,
        "hasMultiplePackages": false,
        "numberOfPackages": 1,
        "packages": [
          {
            "merchantShippingMethodId": "Normal",
            "itemIds": ["1234", "5678"],
            "shippingType": "DELIVERY",
            "label": "Normal",
            "value": 2500,
            "deliveryTime": "5bd",
            "estimatedDeliveryDate": "2026-05-07T00:00:00+00:00"
          }
        ],
        "availableDeliveryWindows": [],
        "metadata": [],
        "postalCode": "22071060",
        "source": "order_router"
      }
    ],
    "routerResult": [
      {
        "name": "shipping-cap",
        "engine": "default",
        "conditionsMet": true,
        "applied": true,
        "methodsAdded": 0,
        "methodsRemoved": 0,
        "methodsModified": 1
      }
    ],
    "experiment": {
      "routerId": "reserva-rules",
      "experimentId": "reserva-router-test-ab",
      "variantId": "variant-a",
      "cohort": "all-users"
    }
  }
}

Campos da Response

shippingMethods

Opções de frete geradas pelo motor de roteamento. Cada opção representa uma estratégia completa de fulfillment.

CampoTipoDescrição
indexintÍndice da opção de frete na lista
labelstringLabel de exibição para o cliente
shippingTypestringDELIVERY, PICKUP ou SCHEDULED (ver tabela abaixo)
merchantShippingMethodIdstringID do método de envio na plataforma do merchant (ex: ID na VTEX)
valueintCusto total do frete em centavos (ex: 2500 = R$25,00)
originalValueintValor original antes de caps/descontos, em centavos. Presente apenas quando houve ajuste.
deliveryTimestringTempo estimado de entrega (5bd = 5 dias úteis, 1d = 1 dia, 1h = 1 hora, 1bh = 1 hora útil)
estimatedDeliveryDatestringData estimada de entrega (ISO 8601). Pode estar ausente.
selectedboolSe esta opção está selecionada
hasMultiplePackagesboolSe o pedido é dividido em múltiplos pacotes
numberOfPackagesintNúmero de pacotes desta opção
packagesarrayLista de pacotes nesta opção (ver detalhe abaixo)
availableDeliveryWindowsarrayJanelas de entrega disponíveis (relevante para SCHEDULED)
pickupPointAddressobjectEndereço do ponto de retirada (apenas para PICKUP)
postalCodestringCEP de destino
sourcestringOrigem da opção: order_router, freight_quoter ou platform
requiresCouponSubsidyboolSe 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.

CampoTipoDescrição
merchantShippingMethodIdstringID do método de envio na plataforma do merchant para este pacote
itemIdsarraySKU IDs incluídos neste pacote
shippingTypestringTipo de envio do pacote (DELIVERY, PICKUP, SCHEDULED)
labelstringLabel do pacote
valueintCusto do frete deste pacote em centavos
originalValueintValor original antes de caps/descontos, em centavos. Presente apenas quando houve ajuste.
deliveryTimestringEstimativa de entrega deste pacote
estimatedDeliveryDatestringData estimada de entrega deste pacote (ISO 8601)
courierIdstringID do courier na plataforma do merchant
dockIdstringID do dock/depósito na plataforma do merchant
pickupPointIdstringID do ponto de retirada (apenas para PICKUP)
pickupPointWorkingHoursarrayHorários de funcionamento do ponto de retirada
availableDeliveryWindowsarrayJanelas 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.

CampoTipoDescrição
namestringNome da regra
enginestringEngine que executou a regra
conditionsMetboolSe as condições da regra foram satisfeitas pelo orderForm
appliedboolSe a regra efetivamente foi aplicada (algumas regras podem atender condições mas não aplicar)
methodsAddedintQuantas opções de frete foram adicionadas pela regra
methodsRemovedintQuantas opções de frete foram removidas pela regra
methodsModifiedintQuantas opções de frete foram modificadas pela regra
detailsobjectDetalhes 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.

CampoTipoDescrição
routerIdstringIdentificador do conjunto de regras que executou (ex.: reserva-rules, reserva-no-rules)
experimentIdstringIdentificador do experimento no GrowthBook
variantIdstringVariante atribuída ao usuário (ex.: variant-a, variant-b)
cohortstringCoorte 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)

ValorDescrição
DELIVERYEntrega padrão no endereço
PICKUPRetirada em ponto de coleta
SCHEDULEDEntrega 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.
  • shippingMethods pode 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 usar routerId/experimentId/variantId/cohort para taggear eventos de analytics e fechar o loop conversão ↔ variante.
  • O orderForm enviado deve ser o objeto VTEX completo. Campos não usados pelas regras do merchant podem ser omitidos, mas items, shippingData.address.postalCode e sellers são tipicamente necessários.

Exemplo: cURL

Bash
curl -s -X POST https://prod.trinio.ai/v1/orders-api/router/ \
  -H "Content-Type: application/json" \
  -H "x-trinio-merchant-id: <YOUR_MERCHANT_ID>" \
  -d '{
    "orderForm": {
      "orderFormId": "abc123def456",
      "items": [
        {"id": "1234", "quantity": 1, "seller": "1"},
        {"id": "5678", "quantity": 2, "seller": "1"}
      ],
      "shippingData": {
        "address": {
          "postalCode": "22071060",
          "country": "BRA"
        }
      },
      "sellers": [{"id": "1"}],
      "totalizers": [],
      "value": 0
    },
    "leanShipping": false
  }' | jq .

Erros

StatusDescrição
400orderForm inválido ou body malformado
500Falha ao gerar opções de frete (erro interno no motor de roteamento)