A YOM pode delegar ao sistema do cliente o cálculo do custo de entrega de um pedido. Quando um comércio ou um vendedor cota ou confirma um pedido, a YOM envia uma requisição HTTP POST ao endpoint do cliente com o detalhe do Order. O cliente responde com o custo líquido da entrega, ou indica que não pode cotá-la.
<aside> 📝
O cliente só precisa expor o endpoint e informar à YOM sua URL. Nenhuma outra configuração é necessária.
</aside>
A consulta ocorre em quatro momentos, sempre de forma síncrona:
Um mesmo pedido gera, portanto, mais de uma chamada: pelo menos uma ao cotar na tela e outra ao confirmá-lo.
<aside> ⚠️
A consulta é totalmente omitida quando o comércio não tem código no sistema do cliente. Sem order.externalId não há cotação e o pedido é criado com entrega em 0.
</aside>
POST <tu_dominio>/webhooks/yom/order/delivery-price
Corpo da requisição
{
"order": { ... }
}
A entidade order, dentro da chave order do corpo.
| Campo | Tipo | Obrigatoriedade | Descrição | Exemplos |
|---|---|---|---|---|
externalId |
📝 Texto | 🟢 Obrigatório | Código do Comércio no sistema do cliente. É o único campo cuja ausência impede a consulta. | "10023456" |
domain |
📝 Texto | 🟢 Obrigatório | Domínio do cliente ao qual o pedido pertence. | "cliente.youorder.me" |
shippingAddress |
📝 Objeto → ShippingAddress | 🟢 Obrigatório | Endereço de entrega do pedido. Ver detalhe abaixo. | |
products |
🔡 Lista de Objetos | 🟢 Obrigatório | Linhas do pedido, com sku, quantity e pricing. Úteis para cotar por peso ou volume. |
|
pricing |
📝 Objeto | 🟢 Obrigatório | Totais do pedido. Na ida, pricing.shipping viaja com seus valores padrão em 0. |
{"totalPrice": 35880} |
estimatedDeliverAt |
📅 Data | ⚪ Opcional | Data de entrega planejada, no formato ISO 8601. | "2026-09-18T00:00:00.000Z" |
distributionCenterId |
🆔 ObjectId | ⚪ Opcional | Centro de distribuição associado ao pedido. | "650a1b2c3d4e5f6a7b8c9d99" |
commerceId |
||||
commerceName |
📝 Texto | ⚪ Opcional | Identificador e nome do Comércio na YOM. | "Minimarket Los Aromos" |
sellerId |
🔡 Lista de Textos | ⚪ Opcional | Identificadores do ou dos Vendedores associados ao pedido. | ["186"] |
type |
📝 Texto | ⚪ Opcional | Tipo de pedido. | |
"order" → pedido |
||||
"quote" → cotação |
"order" |
|||
observation |
📝 Texto | ⚪ Opcional | Observação do pedido. | "Entregar por la mañana" |
O objeto order.shippingAddress, com o destino da entrega.
| Campo | Tipo | Obrigatoriedade | Descrição | Exemplos |
|---|---|---|---|---|
address |
📝 Texto | 🟢 Obrigatório | Rua e número do endereço de entrega. | "Av. Siempre Viva 742" |
commune |
📝 Texto | 🟢 Obrigatório | Comuna de destino. É o campo que a maioria das tarifas usa para determinar a cobertura. | "Maipú" |
city |
📝 Texto | ⚪ Opcional | Cidade de destino. | "Santiago" |
name |
||||
phone |
📝 Texto | ⚪ Opcional | Nome e telefone de quem recebe a entrega. | "Bodega central" |
metadata.coordinates |
📝 Objeto | ⚪ Opcional | Coordenadas do destino, com latitude e longitude. |
{"latitude": -33.5110, "longitude": -70.7580} |
metadata.administrativeAreaLevel1 |
📝 Objeto | ⚪ Opcional | Região ou província do destino; o nome viaja em longName. |
{"longName": "Región Metropolitana"} |
metadata.country |
📝 Objeto | ⚪ Opcional | País do destino; o nome viaja em longName. |
{"longName": "Chile"} |
<aside> ℹ️
Nas cotações prévias o pedido ainda não existe: é um rascunho montado com o que está na tela. Apenas os campos marcados como obrigatórios estão garantidos; o restante pode chegar vazio ou ausente.
</aside>
O endpoint deve responder 200 com Content-Type: application/json.
| Campo | Tipo | Obrigatoriedade | Descrição | Exemplos |
|---|---|---|---|---|
transportationCost |
🔢 Número | 🟢 Obrigatório | Custo da entrega sem imposto. É o campo que a YOM valida para decidir se houve cotação. | |
O valor 0 é válido e significa entrega grátis. |
1500 |
|||
netValue |
🔢 Número | 🟢 Obrigatório | Custo da entrega sem imposto. É o valor que é guardado no pedido e o que viaja ao sistema do cliente. Deve coincidir com transportationCost. |
1500 |
netTaxedValue |
🔢 Número | 🟢 Obrigatório | Custo da entrega com imposto incluído. É o valor exibido ao comprador. | 1785 |
taxesApplied.code |
🔢 Número | ⚪ Opcional | Código do imposto aplicado à entrega. | 14 |
taxesApplied.value |
🔢 Número | ⚪ Opcional | Taxa do imposto expressa como fração, não como porcentagem. | |
0.19 equivale a 19%. |
0.19 |
<aside> 🚨
O campo netValue deve vir sempre. A YOM valida transportationCost, mas guarda netValue: uma resposta que traz o primeiro e omite o segundo é aceita como cotação válida e deixa o pedido com entrega em 0, sem nenhum erro visível. É a falha mais frequente ao conectar uma integração nova.
</aside>
{
"transportationCost": 1500,
"netValue": 1500,
"netTaxedValue": 1785,
"taxesApplied": {"code": 14, "value": 0.19}
}
{
"transportationCost": 0,
"netValue": 0,
"netTaxedValue": 0,
"taxesApplied": {"code": 14, "value": 0.19}
}
Uma resposta 200 que não inclua transportationCost é interpretada como se não tivesse havido cotação. O pedido é criado da mesma forma, com entrega em 0, salvo se o cliente tiver ativada a exigência de cotação.
{}
Quando a entrega não pode ser cotada por uma razão de negócio — comuna fora de cobertura, peso máximo excedido, janela de entrega indisponível —, o endpoint deve responder um status 4xx com a explicação no corpo. A YOM a captura e a exibe ao usuário tal como está.
O texto é buscado, nesta ordem, em errors.message, detail ou message; se o corpo for texto simples, é usado por completo.
HTTP/1.1 422
Content-Type: application/json
{
"message": "No existen parámetros de despacho hacia la comuna de destino."
}
O usuário vê esse mesmo texto na tela e o pedido não avança.
<aside> 🛑
Um 5xx nunca é interpretado como rejeição. Um erro de servidor é uma falha de infraestrutura, não uma decisão de negócio: é traduzido para um erro genérico que o comprador não consegue resolver. Para comunicar um motivo é preciso responder 4xx.
</aside>
POST <https://api.cliente.com/webhooks/yom/order/delivery-price>
Content-Type: application/json
Accept: application/json
x-auth-token: 6a5a8ee27726337b51c72405
origin: legacy.youorder.me
{
"order": {
"externalId": "10023456",
"domain": "cliente.youorder.me",
"commerceId": "6412f0a1b2c3d4e5f6a7b8c9",
"commerceName": "Minimarket Los Aromos",
"distributionCenterId": "64aa11bb22cc33dd44ee55ff",
"estimatedDeliverAt": "2026-09-18T00:00:00.000Z",
"type": "order",
"status": "pending",
"shippingAddress": {
"name": "Bodega central",
"address": "Av. Siempre Viva 742",
"commune": "Maipú",
"city": "Santiago",
"metadata": {
"coordinates": {"latitude": -33.5110, "longitude": -70.7580},
"administrativeAreaLevel1": {"longName": "Región Metropolitana"},
"country": {"longName": "Chile"}
}
},
"products": [
{"sku": "SKU-001", "quantity": 12, "pricing": {"totalPrice": 35880}}
],
"pricing": {
"totalPrice": 35880,
"netTotalPrice": 30151,
"finalTotalPrice": 35880,
"shipping": {"netValue": 0, "netTaxedValue": 0}
}
}
}
curl -X POST \
'<https://api.cliente.com/webhooks/yom/order/delivery-price>' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'x-auth-token: 6a5a8ee27726337b51c72405' \
-d '{"order": { ... }}'
<aside> ⏱️
O endpoint deve responder em menos de 30 segundos. Passados 60 segundos a conexão é cortada e a cotação se perde.
</aside>
order inclui campos adicionais aos descritos neste documento. Recomenda-se usar apenas os campos necessários e tolerar o surgimento de novos campos.