Simulation API
POST /v1/orders-api/vtex/cart/simulation/
Simula um carrinho VTEX e executa o motor de roteamento de pedidos. Retorna a resposta original da simulação VTEX junto com as opções de frete geradas pelo router, mantendo ambos os resultados separados.
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. Se ausente, o backend gera um e devolve no header de resposta. Ver Visitor ID e consistência A/B. |
Request Body
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
cartSimulation.items | array | Sim | Produtos a simular |
cartSimulation.items[].id | string | Sim | SKU ID |
cartSimulation.items[].quantity | string | Sim | Quantidade |
cartSimulation.items[].seller | string | Sim | Seller ID |
cartSimulation.postalCode | string | Sim | CEP de entrega |
cartSimulation.country | string | Sim | Código do país (ex: BRA) |
cartSimulation.clientProfileData | object | Não | Identidade do cliente. Necessário para promoções cluster-based (ex: frete grátis prime). Ver Identidade do cliente. |
cartSimulation.clientProfileData.email | string | Não | E-mail do usuário logado. Repassado à VTEX para resolver clusters do Master Data CL. |
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 |
Identidade do cliente
Este endpoint chama a simulação stateless da VTEX (/api/checkout/pub/orderForms/simulation), que não tem contexto de sessão de checkout. Toda informação que a engine de preços/promoções precisa para identificar o usuário deve vir explicitamente no body.
Quando clientProfileData.email é necessário:
- O merchant tem uma promoção (frete grátis, desconto, etc.) condicionada a um Customer Cluster do Master Data — ex.: "clientes Prime ganham frete grátis".
- Esse tipo de regra é resolvido na VTEX por identidade do cliente, não por sales channel, price table ou cookie. Sem o email no body, a VTEX simula como visitante anônimo e ignora a regra.
Quando pode ser omitido:
- Simulação sem usuário logado.
- Merchant sem promoções cluster-based — preços/SLAs dependem apenas de SKU, CEP e sales channel.
Response
Headers de resposta:
| Header | Descrição |
|---|---|
x-trinio-visitor-id | Identificador de visitante usado para atribuir o usuário a uma variante de A/B. Ecoado do header da requisição quando enviado; gerado (ULID) quando ausente. Reenviar em chamadas subsequentes ao /v1/orders-api/router/ para manter a mesma variante. |
Body:
Campos da Response
cartSimulation
Resposta original da simulação VTEX, sem modificações. Contém toda a informação logística retornada pela API /api/checkout/pub/orderForms/simulation da VTEX.
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 |
label | string | Label de exibição para o cliente |
shippingType | string | DELIVERY, PICKUP ou SCHEDULED |
totalPrice | int | Custo total do frete em centavos (ex: 2500 = R$25,00) |
deliveryTime | string | Tempo estimado de entrega (5bd = 5 dias úteis, 1d = 1 dia) |
estimatedDeliveryDate | string | Data estimada de entrega (ISO 8601) |
selected | bool | Se esta opção está selecionada |
hasMultiplePackages | bool | Se o pedido é dividido em múltiplos pacotes |
packages | array | Lista de pacotes nesta opção de frete |
packages[]
| Campo | Tipo | Descrição |
|---|---|---|
itemIds | array | SKU IDs incluídos neste pacote |
label | string | Label do pacote |
value | int | Custo do frete deste pacote em centavos |
deliveryTime | string | Estimativa de entrega deste pacote |
estimatedDeliveryDate | string | Data estimada de entrega deste pacote |
sla | object | Objeto SLA original da VTEX com todos os campos (id, name, deliveryChannel, price, etc.) |
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
cartSimulationnunca é modificada pelo motor de roteamento. É retornada exatamente como recebida da VTEX.shippingMethodspode ser vazio ([]) se o router não conseguir gerar opções.- Regras de roteamento são aplicadas por merchant. Se um merchant possui regras customizadas (ex: shipping cap), elas são aplicadas apenas aos
shippingMethods.
Visitor ID e consistência A/B
A atribuição de regras de roteamento (que pode estar sob teste A/B por merchant) é feita inteiramente no backend a partir de um identificador opaco de visitante. Você não precisa saber se há experimento ativo nem qual regra está rodando, mas precisa propagar o identificador entre chamadas para que o mesmo carrinho/cliente caia na mesma variante do A/B.
Como funciona:
- Na chamada inicial (tipicamente
/v1/orders-api/vtex/cart/simulation/), você pode enviarx-trinio-visitor-idcom um valor estável que você mantém (ex.: UUID anônimo gerado no client). Não use identificadores pessoais (customer ID, e-mail, CPF, etc.) — headers podem ser logados em access logs, traces e ferramentas de observability, o que viraria vazamento de PII. - Quando você não envia, o backend gera um ULID e devolve no header de resposta
x-trinio-visitor-id. - Armazene esse valor e reenvie como header
x-trinio-visitor-idem chamadas subsequentes — tipicamente no/v1/orders-api/router/no momento do checkout.
Por que isso importa: sem propagar o mesmo ID, o usuário pode receber uma variante diferente do A/B entre /v1/orders-api/vtex/cart/simulation/ e /v1/orders-api/router/ — vendo opções de frete que não casam com o que será efetivamente aplicado ao pedido.
Persistência sugerida no client: localStorage no browser, Keychain/EncryptedSharedPreferences em mobile, ou seu próprio mecanismo de sessão server-side.
Integração via Trinio Checkout SDK (plugin VTEX): se você usa o plugin VTEX da Trinio, passe o valor retornado no header x-trinio-visitor-id desta API na prop trinioVisitorId do createCheckout. O plugin propagará automaticamente nas chamadas subsequentes ao /v1/orders-api/router/. Veja trinioVisitorId na doc do SDK.
Exemplos: cURL
Sem identidade (anônimo)
Com identidade (resolve promoções cluster-based)
Propagando o visitor ID entre /v1/orders-api/vtex/cart/simulation/ e /v1/orders-api/router/
Erros
| Status | Descrição |
|---|---|
| 400 | Body inválido ou campos obrigatórios ausentes |
| 500 | Falha na simulação VTEX ou erro no motor de roteamento |