Pular para o conteúdo principal

Criar um pedido

Este guia percorre o fluxo recomendado para criar um pedido pela API: ler o menu, resolver o cliente (e o endereço, para entrega), precificar a entrega se necessário, criar o pedido, adicionar seus itens e pagamento, e tratar as rejeições mais comuns ao longo do caminho.

O fluxo em resumo​

Etapa 1 — ler o menu​

Resolva quais variantes de produto o pedido precisa. Leia o menu completo (GET /v1/menu) ou navegue de forma enxuta: GET /v1/menu/categories, GET /v1/menu/products e GET /v1/menu/products/{id} para as variantes e categorias de modificadores de um produto. Você precisa de um variant_id (e, para qualquer adicional, um modifier_id) para cada item que vai adicionar ao pedido.

Escopo necessário: menu:read

Etapa 2 — encontrar ou criar o cliente (e o endereço)​

GET /v1/clients, filtrado por telefone:

GET /v1/clients?filter[phone_number]=987654321&filter[country_calling_code]=51

Se nenhum cliente corresponder, crie um:

POST /v1/clients
{
"name": "Maria Lopez",
"phone_number": "987654321",
"country_calling_code": "51"
}

Escopos necessários: clients:read (busca), clients:write (criação).

Para um pedido DELIVERY, resolva um endereço de entrega da mesma forma — liste os endereços salvos do cliente ou crie um:

POST /v1/addresses
{
"client_id": "9c8e720f-31b1-485a-85fa-0aaf552faaa9",
"address": "Av. Larco 345",
"latitude": -12.1218,
"longitude": -77.0297
}

Escopos necessários: addresses:read (busca), addresses:write (criação).

Etapa 3 — precificar a entrega (apenas pedidos DELIVERY)​

Não estime a taxa de entrega: resolva-a a partir da própria configuração de preços do merchant. Veja Calcular preços de entrega para o fluxo completo (GET /v1/delivery/pricing + GET /v1/delivery/quote) — ele termina com o delivery_price que você envia abaixo.

Etapa 4 — criar o pedido​

POST /v1/orders

Escopo necessário: orders:write. Header obrigatório: Idempotency-Key — um valor único por tentativa de pedido; repetir a mesma chave com o mesmo corpo reproduz o resultado original em vez de criar um segundo pedido.

curl -X POST https://public-api.olaclick.app/v1/orders \
-H "Authorization: Bearer olk_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 018f1c33-5a2b-7e4d-9c1a-3b6f8e2d4a70" \
-d '{
"service_type": "DELIVERY",
"client_id": "9c8e720f-31b1-485a-85fa-0aaf552faaa9",
"address_id": "6b2f1a04-1c7e-4a2b-9f11-2d8e0b3c4d55",
"delivery_price": 6.5
}'
CampoAplica-se aNotas
service_typetodosDELIVERY, ONSITE, TABLE ou TAKEAWAY. Obrigatório.
statustodosINITIATED (padrão) ou PENDING. Veja abaixo.
client_idtodosUm cliente existente da sua empresa.
table_idsomente TABLERejeitado em qualquer outro service_type.
address_id, delivery_pricesomente DELIVERYRejeitados em qualquer outro service_type.
comment, order_title, packaging_price, scheduled_delivery_datetodosOpcionais.

A resposta (201) é o pedido criado. Veja a Referência da API REST para o shape completo da resposta.

Rascunho (INITIATED) vs PENDING​

Por padrão o pedido é criado como INITIATED — um rascunho que o merchant ainda não vê, e rascunhos nunca são retornados por GET /v1/orders: guarde o id da resposta de criação e leia o rascunho com GET /v1/orders/{id}. Adicione seus itens (e quaisquer descontos ou cupom) enquanto ainda é um rascunho, depois confirme-o com PATCH /v1/orders/{id}/status e {"status": "PENDING"} (ou PREPARING para pular a confirmação do próprio merchant). Confirmar atribui o número diário do pedido e o torna visível para o merchant.

Registrar um pagamento também confirma um rascunho: o primeiro pagamento em um pedido INITIATED (mesmo parcial) o move para PENDING e atribui seu número diário, sem o PATCH. Por isso, adicione itens, descontos e cupons primeiro, e o pagamento por último.

Para pular o rascunho por completo, envie "status": "PENDING" na criação — o pedido é confirmado imediatamente.

Etapa 5 — itens, pagamentos, descontos, cupons​

Adicione todos os itens em uma única chamada:

POST /v1/orders/{id}/combos
{
"combos": [
{
"variant_id": "3f6a9c2e-1b4d-4e7a-8c9f-2d5e7a1b3c40",
"quantity": 2,
"modifiers": [{ "modifier_id": "8e2b4d6f-9a0c-4e1b-85d7-9f2a4c6e8b10", "quantity": 1 }]
}
]
}

Em seguida, registre um pagamento (payment_method_id vem de GET /v1/company/payment-methods):

POST /v1/orders/{id}/payments
{
"payment_method_id": "4a7c9e1b-3d6f-4b2a-9e8c-1f3a5b7d9c20",
"bill_amount": 25.5
}

Um desconto manual:

POST /v1/orders/{id}/discounts
{ "type": "PERCENTAGE", "value": 10, "description": "Loyalty 10%" }

Ou um código de cupom (o pedido precisa ter um client vinculado primeiro):

POST /v1/orders/{id}/coupon
{ "code": "WELCOME10" }

Escopo necessário para tudo acima: orders:write. Todos eles funcionam apenas em pedidos que sua empresa criou pela API (combos, discounts); pagamentos também aceitam pedidos feitos no storefront ou no POS — veja a página de referência de cada endpoint para a regra exata.

Erros 4xx comuns​

StatusCódigoQuando
422validation_failedUm campo não se aplica ao service_type enviado (ex.: table_id em um pedido DELIVERY), um campo obrigatório está ausente, ou um valor está fora do intervalo permitido (ex.: um value de desconto acima de 100 para PERCENTAGE).
400idempotency_key_requiredPOST /v1/orders sem o header Idempotency-Key, ou com ele vazio.
400idempotency_key_invalidA chave tem mais de 255 caracteres.
422idempotency_conflictA mesma Idempotency-Key foi reutilizada com um corpo de requisição diferente.
409idempotency_in_progressUma requisição com essa chave ainda está sendo processada; tente novamente após o header Retry-After.
422order_not_modifiableAção em um pedido de um canal que este endpoint não permite editar (ex.: adicionar itens a um pedido feito em um app de delivery).
422validation_failed (campo status)Cancelar (POST /v1/orders/{id}/cancel com um reason) um pedido que ainda tem pagamentos ativos. Remova os pagamentos primeiro e depois cancele.
422coupon_not_applicableO cupom existe, mas não é elegível para este pedido (limite de uso atingido, uma vez por cliente, service type errado, restrito a novos clientes).
404not_foundId de pedido ou código de cupom desconhecido.
403insufficient_scopeA API key não tem um escopo necessário.

Acompanhar o pedido​

Depois de confirmado, não faça polling por mudanças de status — registre um webhook e deixe a OlaClick enviá-las para você. Veja Receba atualizações de pedidos com webhooks.

Fazendo isso pelo servidor MCP​

FerramentaO que faz
list_products / get_productNavega o menu em busca de variant_ids
get_client / create_clientResolve o cliente
list_addresses / create_addressResolve o endereço de entrega
get_delivery_pricing / get_delivery_quotePrecifica a entrega
create_orderCria o pedido (um idempotency_key é gerado para você se omitido)
add_order_combosAdiciona itens
update_order_statusConfirma ou avança o pedido
add_order_payment / add_order_discount / apply_order_couponPagamentos, descontos, cupons

Escopos necessários: menu:read, clients:read/clients:write, addresses:read/addresses:write, orders:read/orders:write.

Exemplos de prompts:

"Crie um pedido de entrega para o cliente 9c8e720f-31b1-485a-85fa-0aaf552faaa9 com 2 unidades da variante 3f6a9c2e-1b4d-4e7a-8c9f-2d5e7a1b3c40, depois confirme-o"

"Adicione um desconto de fidelidade de 10% ao pedido 7a1e9c3a-4b2d-4f7e-9a1b-3c6d8e2f5a90"

Veja a página do Servidor MCP para todos os parâmetros de cada ferramenta.