Skip to content

Transporte e Cotizações no Admin

Visão Geral

O gerenciamento logístico no carrinho administrativo permite que o operador simule custos e prazos de entrega em tempo real para o cliente.

Este processo é essencial para a transparência da venda assistida, permitindo que a melhor opção de frete seja negociada e selecionada antes da conversão do carrinho em pedido.

O ecossistema de frete no admin opera em dois tempos: 1. Simulação (POST /quote): O sistema consulta as tabelas de frete e transportadoras integradas para o destino informado, retornando uma lista de opções candidatas. 2. Efetivação (PUT /shipping): O operador seleciona uma das opções retornadas, consolidando o valor de entrega no total do carrinho.

---

Particionamento Logístico (orders[])

Um diferencial crítico da plataforma Uappi v3 é o tratamento de pedidos multi-origem.

Caso o carrinho contenha produtos armazenados em diferentes centros de distribuição, o sistema particionará a resposta em múltiplos objetos dentro do array orders[].

Nesses casos, a cotação e a seleção do frete devem ser feitas de forma independente para cada "ordem" simulada, garantindo a precisão dos prazos e custos por armazém.

---

Pontos de Retirada (Pickup Points)

Além da entrega convencional, a API suporta modalidades de "Clique e Retire".

Quando uma transportadora permite esta modalidade, o sistema retorna os shippingPickupPointId disponíveis, que devem ser informados no momento da seleção final para garantir o correto direcionamento da mercadoria.

Entidades Envolvidas

  • Shipping Options: Lista dinâmica de transportadoras que atendem ao CEP de destino, contendo valor do frete (shippingValue) e tempo de trânsito em dias úteis ou corridos.
  • Shipping Table: Identificador da regra de frete no backend que rege o cálculo (tabela de preços, contrato com Correios, transportadoras privadas, etc.).
  • Target Zip Code: O CEP de destino, que serve como chave primária para a consulta nas tabelas de faixas de CEP.

Notas e Considerações

Resiliência de Cotação

O processo de cotação frequentemente depende de web services externos (transportadoras e hubs logísticos).

O erro UAPPI_STORE_CART_QUOTE_ATTEMPT_FAILED sinaliza que o sistema não conseguiu obter resposta desses serviços.

Nestes cenários, o operador pode tentar uma nova cotação ou verificar se os dados de peso e dimensões dos produtos no catálogo estão preenchidos corretamente.

---

Invalidação Automática

Qualquer alteração na composição de itens do carrinho (adição, remoção ou mudança de quantidade) invalida automaticamente as seleções de frete anteriores.

Isso ocorre porque o peso cubado e o valor total do carrinho são variáveis críticas para o cálculo de frete e concessão de benefícios como "Frete Grátis".

Cotação de Frete do Carrinho (Admin)

POST /carts/{cartId}/quote

Consulta as transportadoras e opções de entrega disponíveis para o destino informado, considerando o peso e dimensões dos itens no carrinho.

Descrição

Este endpoint realiza a simulação logística para o carrinho administrativo.

Ao informar um CEP de destino, o sistema aciona o motor de fretes da Uappi, que consulta tabelas internas e integradores externos para retornar todas as modalidades de entrega compatíveis com a carga atual.

A resposta desta chamada popula o array shippingOptions dentro de cada ordem simulada (orders[]).

É importante notar que a cotação é uma operação de consulta: ela não altera a escolha final de frete do carrinho, apenas apresenta as possibilidades para que o operador possa negociar prazos e valores com o cliente.

---

Validação de Endereço

Embora o carrinho possa ter um endereço formal já vinculado, este endpoint permite realizar cotações rápidas apenas com o targetZipCode.

Isso é útil para simulações preliminares antes de o operador realizar o vínculo definitivo do cliente ou do endereço ao carrinho.

---

Escopo de Acesso

A cotação é considerada uma operação de escrita de contexto, exigindo a permissão CART_WRITE.

Isso ocorre porque os resultados da cotação são persistidos temporariamente no estado do carrinho para permitir a seleção subsequente sem a necessidade de uma nova chamada aos integradores.

Parâmetros

Headers Obrigatórios

HeaderValorDescrição
AuthorizationBearer {token}Token do usuário autenticado na API privada com escopo CART_WRITE.
Content-Typeapplication/jsonTipo de conteúdo da requisição.

Parâmetros da URL

ParâmetroTipoObrigatórioDescrição
cartIdstringSimToken identificador único do carrinho administrativo.

Parâmetros do Corpo

ParâmetroTipoObrigatórioDescrição
targetCountryCodestringSimCódigo ISO do país com 3 caracteres (ex: BRA).
targetZipCodestringSimCEP ou código postal para o cálculo do frete.

Exemplo de Requisição

1curl --request POST \
2 --url '{{MAIN_URL}}/carts/CART123/quote' \
3 --header 'Authorization: Bearer SEU_TOKEN_AQUI' \
4 --header 'Content-Type: application/json' \
5 --data '{
6 "targetCountryCode": "BRA",
7 "targetZipCode": "01310100"
8 }'

✅ Resposta de Sucesso

HTTP Status: 200 OK

1{
2 "status": true,
3 "data": {
4 "id": "CART-8f42dce0-20f0-4c4c-bb4f-9f8a16f6f471",
5 "currencyId": "BRL",
6 "countryCode": "BRA",
7 "quoteZipcode": "01310100",
8 "subtotalValue": 259.9,
9 "shippingValue": 0,
10 "discountValue": 0,
11 "additionValue": 0,
12 "totalValue": 259.9,
13 "discountPreview": {
14 "cashDiscount": null,
15 "pointSystem": null
16 },
17 "installments": [],
18 "requestedProductMap": [
19 {
20 "productId": 1,
21 "quantity": 2,
22 "code": "PROMO-ADMIN",
23 "upsellId": null,
24 "productPairOfferId": null
25 }
26 ],
27 "discountMap": {
28 "promotion": [],
29 "coupon": null,
30 "customer-wallet": null,
31 "point-system": null
32 },
33 "customer": null,
34 "addresses": [],
35 "orders": [
36 {
37 "orderId": 1,
38 "quoteId": "quote-01",
39 "distance": 12.5,
40 "subtotalValue": 259.9,
41 "shippingValue": 0,
42 "discountValue": 0,
43 "additionValue": 0,
44 "totalValue": 259.9,
45 "service": false,
46 "storage": null,
47 "items": [],
48 "additions": [],
49 "discounts": [],
50 "shippingOptions": [
51 {
52 "shippingTableId": 55,
53 "shippingPickupPointId": 0,
54 "label": "Entrega Expressa",
55 "shippingValue": 25.50,
56 "beginShippingTime": 1,
57 "endShippingTime": 2,
58 "shippingTimeType": "days",
59 "selected": false,
60 "details": null
61 }
62 ]
63 }
64 ],
65 "errors": [],
66 "isMerged": false,
67 "createdAt": "2026-05-05 10:00:00",
68 "updatedAt": "2026-05-05 10:45:00"
69 }
70}

⚠️ Possíveis erros:

Atenção: a seguir estão destacados os principais erros que podem ocorrer neste endpoint.

Código InternoCódigo HttpDescrição
UAPPI_STORE_CART_NOT_FOUND404O carrinho administrativo informado não foi encontrado.
UAPPI_STORE_CART_QUOTE_ATTEMPT_FAILED502Falha na comunicação com o motor de fretes ou transportadoras externas.
UAPPI_STORE_CART_EMPTY400Não é possível cotar frete para um carrinho sem itens.
UAPPI_STORE_CART_USER_MISMATCH403O operador não tem permissão para realizar cotações neste carrinho.
UAPPI_STORE_CART_ORDER_EXISTS403O carrinho já foi convertido em pedido e sua logística não pode mais ser alterada.
UAPPI_STORE_ZIPCODE_RANGE_NO_COVERAGE409Não há entrega disponível para o CEP informado.

Seleção de Frete no Carrinho (Admin)

PUT /carts/{cartId}/shipping

Define a transportadora e a modalidade de entrega escolhidas para os pedidos do carrinho administrativo.

Descrição

Após a realização da cotação, o operador deve utilizar este endpoint para efetivar a escolha do frete.

Esta ação fixa os valores e prazos de entrega no carrinho, sendo um passo obrigatório para que o sistema consiga calcular o valor total final (Grand Total) e habilitar as opções de pagamento.

A seleção deve ser feita por cartOrderId, permitindo que o operador escolha diferentes transportadoras para diferentes origens logísticas (armazéns) dentro do mesmo carrinho.

Se uma transportadora do tipo "Retirada" for selecionada, o identificador do ponto de coleta (shippingPickupPointId) também deve ser enviado.

---

Consistência Logística

A API valida se a shippingTableId enviada estava de fato presente nos resultados da última cotação realizada para aquele carrinho.

Tentar forçar um ID de tabela de frete que não foi retornado pela cotação resultará em erro, garantindo que apenas opções logísticas válidas e disponíveis sejam aplicadas.

---

Persistência da Escolha

Uma vez selecionado, o frete permanece fixo até que ocorra uma mudança na composição de itens do carrinho ou uma nova cotação seja solicitada.

A resposta desta chamada retorna o objeto do carrinho com o status selected: true na opção escolhida, permitindo que a interface administrativa destaque a transportadora selecionada.

Parâmetros

Headers Obrigatórios

HeaderValorDescrição
AuthorizationBearer {token}Token do usuário autenticado na API privada com escopo CART_WRITE.
Content-Typeapplication/jsonTipo de conteúdo da requisição.

Parâmetros da URL

ParâmetroTipoObrigatórioDescrição
cartIdstringSimToken identificador único do carrinho administrativo.

Parâmetros do Corpo

ParâmetroTipoObrigatórioDescrição
ordersarraySimLista de objetos contendo as definições de frete por ordem.
orders[].cartOrderIdintegerSimID da ordem/particionamento dentro do carrinho.
orders[].shippingTableIdintegerSimID da tabela de frete/transportadora selecionada.
orders[].shippingPickupPointIdintegerNãoID do ponto de retirada (obrigatório para modalidades de retirada).

Exemplo de Requisição

1curl --request PUT \
2 --url '{{MAIN_URL}}/carts/CART123/shipping' \
3 --header 'Authorization: Bearer SEU_TOKEN_AQUI' \
4 --header 'Content-Type: application/json' \
5 --data '{
6 "orders": [
7 {
8 "cartOrderId": 1,
9 "shippingTableId": 5
10 }
11 ]
12 }'

✅ Resposta de Sucesso

HTTP Status: 200 OK

1{
2 "status": true,
3 "data": {
4 "id": "CART-8f42dce0-20f0-4c4c-bb4f-9f8a16f6f471",
5 "currencyId": "BRL",
6 "countryCode": "BRA",
7 "quoteZipcode": "01310100",
8 "subtotalValue": 259.9,
9 "shippingValue": 25.5,
10 "discountValue": 0,
11 "additionValue": 0,
12 "totalValue": 285.4,
13 "discountPreview": {
14 "cashDiscount": null,
15 "pointSystem": null
16 },
17 "installments": [],
18 "requestedProductMap": [
19 {
20 "productId": 1,
21 "quantity": 2,
22 "code": "PROMO-ADMIN",
23 "upsellId": null,
24 "productPairOfferId": null
25 }
26 ],
27 "discountMap": {
28 "promotion": [],
29 "coupon": null,
30 "customer-wallet": null,
31 "point-system": null
32 },
33 "customer": null,
34 "addresses": [],
35 "orders": [
36 {
37 "orderId": 1,
38 "quoteId": "quote-01",
39 "distance": 12.5,
40 "subtotalValue": 259.9,
41 "shippingValue": 25.5,
42 "discountValue": 0,
43 "additionValue": 0,
44 "totalValue": 285.4,
45 "service": false,
46 "storage": null,
47 "items": [],
48 "additions": [],
49 "discounts": [],
50 "shippingOptions": [
51 {
52 "shippingTableId": 55,
53 "shippingPickupPointId": 0,
54 "label": "Entrega Expressa",
55 "shippingValue": 25.50,
56 "beginShippingTime": 1,
57 "endShippingTime": 2,
58 "shippingTimeType": "days",
59 "selected": true,
60 "details": null
61 }
62 ]
63 }
64 ],
65 "errors": [],
66 "isMerged": false,
67 "createdAt": "2026-05-05 10:00:00",
68 "updatedAt": "2026-05-05 10:50:00"
69 }
70}

⚠️ Possíveis erros:

Atenção: a seguir estão destacados os principais erros que podem ocorrer neste endpoint.

Código InternoCódigo HttpDescrição
UAPPI_STORE_CART_NOT_FOUND404O carrinho administrativo informado não foi encontrado.
UAPPI_STORE_CART_INVALID_ORDER_ID400O cartOrderId informado não existe ou não pertence a este carrinho.
UAPPI_STORE_CART_INVALID_SHIPPING_OPTION400A shippingTableId informada não é válida para esta ordem ou não estava na última cotação.
UAPPI_STORE_CART_PICKUP_POINT_ID_IS_REQUIRED400A transportadora exige um ponto de retirada, mas o ID não foi enviado.
UAPPI_STORE_CART_ORDER_EXISTS403O carrinho já possui pedido finalizado e não permite alteração de frete.

Uappi é a melhor opção para o crescimento da sua loja!

;