Consulte opções de entrega em tempo real usando a Shopify Ajax API com resolução flexível de variantes. A API aceita variantId, handle + options, productUrl + options, sku e também carrinho com múltiplas linhas, sem integração direta com a API da Frenet.
Versão 3.0
Escopo Brasil
Formato JSON / UTF-8
Resolução variantId · handle · productUrl · sku
GETPOSTOPTIONS
01
Visão geral
A Quote Shipping API permite consultar opções de frete para um item isolado ou para um carrinho com múltiplas variantes. O fluxo é completamente server-side: cada request cria uma sessão isolada de carrinho, resolve o CEP, adiciona os itens na Shopify, consulta as tarifas e limpa o carrinho antes do encerramento da execução.
Entrada recomendada
productUrl + options + cep
País suportado
Brasil
Linhas por request
Até 20
Quantidade por linha
Até 50
ℹO endpoint agora suporta múltiplas variantes, deduplicação de linhas repetidas, resolução por URL do produto e SKU global quando a Storefront API estiver configurada.
02
Arquitetura do fluxo
1
Recepção e validaçãoCliente envia cep e uma ou mais linhas de carrinho. A API aceita variantId, handle, productUrl, sku, options, option1, option2 e option3.
2
Normalização do carrinhoConverte a entrada em items[], aplica validações, soma variantes repetidas e limita a requisição a no máximo 20 linhas e 50 unidades por linha.
3
Resolução da varianteResolve a variante por prioridade: variantId → handle/productUrl + sku → handle/productUrl + options → handle/productUrl em produto univariado → sku global via Storefront API.
4
Resolução de CEPResolve a UF via ViaCEP com timeout de 3,5s. Em caso de falha, tenta BrasilAPI como fallback.
5
Sessão isolada na ShopifyAbre uma sessão isolada de carrinho usando cookies em memória. O carrinho é limpo no início e também no encerramento da requisição.
6
Adição ao carrinhoAdiciona todas as linhas normalizadas via /cart/add.js em uma única sessão de carrinho.
7
Consulta assíncrona de freteChama /cart/prepare_shipping_rates.json e faz polling em /cart/async_shipping_rates.json por até 10 tentativas de 1s.
8
Fallback síncrono e respostaSe o fluxo assíncrono não retornar tarifas, faz fallback para /cart/shipping_rates.json. Depois normaliza os fretes, aplica excludePickup se necessário e devolve o JSON padronizado.
03
Modos de resolução de variantes
A API aceita várias formas de identificar a variante. Para operação, o formato mais amigável é productUrl + options. O formato por variantId continua disponível para integrações técnicas e retrocompatibilidade.
Modo
Entrada mínima
resolved_by
Quando usar
Direto por variante
variantId
variantId
Integrações técnicas ou quando o ID já é conhecido
Handle + SKU
handle + sku
handle+sku
SKU conhecido dentro de um produto específico
Product URL + SKU
productUrl + sku
productUrl+sku
Mesmo cenário acima, mas usando URL do produto
Handle + options
handle + options ou option1/2/3
handle+options
Quando cor/tamanho são conhecidos
Product URL + options
productUrl + options ou option1/2/3
productUrl+options
Modo recomendado para o time de atendimento
Handle puro
handle
handle
Só funciona quando o produto tem uma única variante utilizável
Product URL pura
productUrl
productUrl
Mesmo comportamento do handle puro
SKU global
sku
sku
Exige SHOPIFY_STOREFRONT_ACCESS_TOKEN e SKU único na loja
✓Recomendação operacional: usar productUrl + options ou handle + option1/option2. Isso elimina a necessidade de descobrir variantId manualmente.
04
Dependências
Dependência
Uso
Obrigatória
Observação
Shopify Ajax API
Sessão de carrinho e cálculo de frete
Sim
Usa /cart/add.js, prepare_shipping_rates e async_shipping_rates
Shopify Product .js
Resolução de variantes por handle
Quando usar handle/productUrl
Usa /products/{handle}.js
ViaCEP
Resolução principal do CEP
Não
Primeira tentativa
BrasilAPI
Fallback do CEP
Não
Usada quando ViaCEP falha
Shopify Storefront API
Busca global por SKU
Opcional
Só necessária para sku sem handle/productUrl
Vercel / Serverless
Hospedagem da função
Sim
Não faz parte do contrato HTTP
05
Configuração do ambiente
Variável
Obrigatória
Exemplo
Descrição
SHOPIFY_STORE_URL
Sim
https://www.usereise.com.br
URL base da loja Shopify
API_TOKEN
Opcional
reise_frete_2026_9xK7mP4Q
Se preenchida, exige Bearer Token em todas as chamadas
SHOPIFY_STOREFRONT_ACCESS_TOKEN
Opcional
shpat_ou_storefront_token
Habilita busca global por sku
SHOPIFY_STOREFRONT_API_TOKEN
Opcional
alias do token
Alias aceito no código para o mesmo token de Storefront
SHOPIFY_STOREFRONT_API_VERSION
Opcional
2025-10
Versão da Storefront API. Default: 2025-10
⚠Sem SHOPIFY_STORE_URL, a API responde 500. Sem Storefront token, a API continua funcionando, mas o modo de resolução por sku global fica indisponível.
Se API_TOKEN não estiver configurada, o endpoint fica público
Não há escopos, refresh token nem expiração no código atual
08
Endpoint principal
Método
Rota
Auth
Descrição
GET
/api/quote-shipping
Bearer opcional
Consulta simples via query string. Recomendado só para requests de uma linha.
POST
/api/quote-shipping
Bearer opcional
Consulta por JSON, incluindo múltiplos itens.
OPTIONS
/api/quote-shipping
Não
Preflight CORS
09
Parâmetros
O endpoint aceita dois formatos principais: payload simples e payload com items[]. Quando items[] é enviado, a cotação passa a considerar o carrinho inteiro.
Campos de topo
Campo
Tipo
Obrigatório
Default
Descrição
cep / zip
string
Sim
—
CEP brasileiro. A API remove não numéricos e exige 8 dígitos.
excludePickup
boolean / string
Não
false
Quando true, remove opções de retirada/pickup do retorno.
items / lines
array
Não
—
Lista de linhas do carrinho. Quando omitida, a API tenta resolver a linha a partir do próprio payload de topo.
quantity / qty
integer
Não
1
Quantidade da linha quando o payload simples é usado.
Campos aceitos em cada item
Campo
Obrigatório
Aliases
Descrição
variantId
Não
variant_id, id
Identificação direta da variante.
handle
Não
productHandle
Handle do produto Shopify.
productUrl
Não
product_url, url
URL da página do produto. A API extrai o handle automaticamente.
sku
Não
—
SKU da variante. Pode ser usado junto com handle/productUrl ou de forma global.
options
Não
selectedOptions
Objeto, array ou JSON string com as opções nomeadas da variante.
option1, option2, option3
Não
—
Formas posicionais de informar as opções da variante.
cor, color, tamanho, size
Não
—
Atalhos para opções nomeadas comuns.
quantity
Não
qty
Quantidade da linha. Deve ser inteiro entre 1 e 50.
ℹSe items[] contiver variantes repetidas, a API soma as quantidades e devolve deduplicated=true dentro de cart.
Parâmetros efetivamente utilizados e metadados de execução
cart
object
raiz
Carrinho efetivamente cotado após deduplicação
warnings
array
raiz
Avisos não bloqueantes da resolução
rates
array
raiz
Lista de opções de frete
cart.items
array
cart
Linhas finais usadas na cotação
cart.deduplicated
boolean
cart
Indica se houve consolidação de variantes repetidas
cart.resolved_items
array
cart
Explica como cada linha foi resolvida
input.mode
string
input
Modo de entrada: single_legacy ou multi_items
input.resolution_methods
array
input
Métodos de resolução aplicados às linhas
name, price_brl, delivery_days
string / number
rates[]
Campos mais indicados para exibição ao usuário final
12
Respostas de erro
HTTP
Mensagem típica
Quando ocorre
400
cep is required and must have 8 digits
CEP ausente ou inválido
400
items must be an array
Campo items inválido
400
items exceeds the maximum allowed lines per request (20)
Mais de 20 linhas no carrinho
400
items[0].quantity must be an integer >= 1
Quantidade inválida
400
No variant matched the provided options for handle "..."
Opções não encontraram nenhuma variante
400
More than one variant matched the provided options...
Opções insuficientes para desambiguar
400
handle "..." requires options because the product has multiple variants
Handle puro em produto multivariado
400
Global sku lookup requires SHOPIFY_STOREFRONT_ACCESS_TOKEN...
SKU global sem token da Storefront API
401
Unauthorized
Token ausente ou incorreto
404
Could not load product for handle: ...
Handle inexistente ou produto indisponível
405
Method not allowed
Método não suportado
500
Missing SHOPIFY_STORE_URL environment variable
Variável de ambiente obrigatória ausente
13
Limites operacionais
Timeouts
ViaCEP3,5s
BrasilAPI3,5s
Shopify request10s
Product lookup10s
Polling assíncrono
Tentativas10
Intervalo1s por tentativa
Fallbackshipping_rates.json
Validação
CEP8 dígitos exatos
Linhas por request20
Quantidade por linha50
Não implementado
Rate limit server-side❌
Cache nativo❌
CORS restrito❌ (aberto *)
14
Segurança
⚠Ative API_TOKEN em todos os ambientes públicos. Não exponha o token em front-end público e avalie restringir CORS quando a API sair do ambiente controlado.
A API cria uma sessão isolada por request e limpa o carrinho antes e depois
store_url aparece na resposta. Remova esse campo caso ele não seja necessário para clientes externos
A busca global por SKU depende de token de Storefront API e deve ser usada quando o SKU for realmente único
Para evitar abuso, é recomendado adicionar rate limiting no edge ou via gateway
15
Troubleshooting
Sintoma
Possível causa
Ação recomendada
401 Unauthorized
Token ausente ou incorreto
Revisar API_TOKEN e header Authorization
400 CEP
CEP inválido
Revisar entrada e remover formatação incorreta
404 handle
Handle inexistente ou URL de produto inválida
Conferir o slug do produto e se a URL contém /products/{handle}
400 options
Opções insuficientes ou incorretas
Usar option1/option2 ou passar os nomes exatos das opções do produto
400 sku
SKU global sem token ou SKU duplicado
Adicionar Storefront token ou informar handle/productUrl junto do SKU
No shipping rates
Sem opções de frete para o CEP ou regras logísticas específicas
Testar outro CEP, revisar pickup e conferir regras logísticas da loja
Resposta lenta
Latência do polling assíncrono ou dos serviços de CEP
Monitorar tempo de resposta e considerar cache para combinações recorrentes
source = Frenet
Origem das tarifas configurada na Shopify
Comportamento esperado
16
Checklist de homologação
Validar variantId direto com um CEP local e um CEP de outro estado
Validar handle + option1/option2 em um produto com múltiplas variantes
Validar productUrl + options com o mesmo produto usado pelo time de atendimento
Validar um payload com items[] contendo mais de uma linha
Validar deduplicação enviando a mesma variante duas vezes
Validar excludePickup=true e excludePickup=false
Validar erro 401 com token incorreto
Validar erro 400 para opções insuficientes
Validar SKU global somente se a Storefront API estiver configurada
Confirmar se o agente interpreta corretamente price_brl, delivery_days e cart.resolved_items
✓Para exibir ao usuário final, prefira name + price_brl + delivery_days. Para depuração e auditoria, use cart.resolved_items e input.resolution_methods.