GET /shipping/v1.0/merchants/{merchantId}/deliveryAvailabilities?latitude={lat}&longitude={lng}| Parâmetro | Localização | Tipo | Obrigatório | Descrição |
|---|---|---|---|---|
merchantId | path | uuid | Sim | ID do merchant (sua loja) |
latitude | query | float | Sim | Latitude do endereço de entrega (ex: -23.55) |
longitude | query | float | Sim | Longitude do endereço de entrega (ex: -46.63) |
curl -X GET "https://merchant-api.ifood.com.br/shipping/v1.0/merchants/{merchantId}/deliveryAvailabilities?latitude=-23.5505&longitude=-46.6333" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json"200 OKid como quoteId ao criar o pedido. A cotação é válida por ~24 horas.| Campo | Tipo | Descrição |
|---|---|---|
id | uuid | ID da cotação (use como quoteId ao criar pedido) |
expirationAt | datetime | Validade da cotação em UTC (~24h). Solicitar após é inválido. |
createdAt | datetime | Data de criação da cotação em UTC |
distance | integer | Distância de entrega em metros |
preparationTime | integer | Tempo de preparo sugerido em segundos |
quote.grossValue | decimal | Valor bruto da entrega em reais |
quote.discount | decimal | Desconto aplicado em reais |
quote.raise | decimal | Acréscimo aplicado em reais |
quote.netValue | decimal | Valor líquido = grossValue - discount + raise |
deliveryTime.min | integer | Tempo mínimo estimado de entrega em segundos |
deliveryTime.max | integer | Tempo máximo estimado de entrega em segundos |
hasPaymentMethods | boolean | Indica se há métodos de pagamento disponíveis |
paymentMethods[].id | uuid | ID único do método de pagamento |
paymentMethods[].brand | string | Bandeira do cartão (ex: Visa, Mastercard) |
paymentMethods[].liability | string | Responsável pelo pagamento (ex: IFOOD) |
paymentMethods[].paymentType | string | Tipo de pagamento (ex: OFFLINE para pagamento na entrega) |
paymentMethods[].method | string | Método: CREDIT, DEBIT ou CASH |
{
"id": "57cd1046-2e06-446f-a2dd-18a518212c3c",
"expirationAt": "2023-08-18T19:49:06Z",
"createdAt": "2023-08-17T19:49:06Z",
"distance": 3000,
"preparationTime": 60,
"quote": {
"grossValue": 7.99,
"discount": 0,
"raise": 0,
"netValue": 7.99
},
"deliveryTime": {
"min": 1200,
"max": 1800
},
"hasPaymentMethods": true,
"paymentMethods": [
{
"id": "21c65a8c-f29e-463f-b0bd-240edeb593c4",
"brand": "Visa",
"liability": "IFOOD",
"paymentType": "OFFLINE",
"method": "CREDIT"
},
{
"id": "93c1c7c7-61f1-4dd9-bb84-62a03254701d",
"liability": "IFOOD",
"paymentType": "OFFLINE",
"method": "CASH"
}
]
}400 Bad Request| Código | Descrição | Ação |
|---|---|---|
BadRequest | Problema na requisição | Verifique formato de latitude e longitude |
BadRequestMerchant | Sua loja está indisponível | Verifique status da loja no painel |
DeliveryDistanceTooHigh | Endereço a mais de ~10km | Confirme coordenadas com cliente |
OffOpeningHours | Fora do horário de operação | Tente novamente no horário comercial |
OriginNotFound | Loja não encontrada | Registre sua loja nas áreas iFood |
ServiceAreaMismatch | Endereço fora da cobertura | Confirme se a região tem entrega iFood |
HighDemand | Logística saturada | Tente novamente em minutos |
MerchantStatusAvailability | Sua conta tem pendências | Contate o suporte |
InvalidPaymentMethods | Forma de pagamento não suportada | Use outro método |
NRELimitExceeded | Limite de entregadores atingido | Aguarde conclusão de entregas |
UnavailableFleet | Frota indisponível | Tente novamente mais tarde |
500 Internal Server Errorid retornado para rastreamentocustomer.phone.type="CUSTOMER" com número válidocustomer.phone.type="STORE"DELIVERY_DROP_CODE_REQUESTEDmetadata.CODE do eventoPOST /shipping/v1.0/merchants/{merchantId}/orderscurl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/merchants/{merchantId}/orders" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"customer": {
"name": "João Silva",
"phone": {
"countryCode": "55",
"areaCode": "11",
"number": "999999999",
"type": "CUSTOMER"
}
},
"delivery": {
"merchantFee": 5.99,
"quoteId": "57cd1046-2e06-446f-a2dd-18a518212c3c",
"deliveryAddress": {
"postalCode": "01310100",
"streetNumber": "100",
"streetName": "Avenida Paulista",
"neighborhood": "Bela Vista",
"city": "São Paulo",
"state": "SP",
"country": "BR",
"coordinates": {
"latitude": -23.5505,
"longitude": -46.6333
}
}
},
"items": [{
"id": "item-1",
"name": "Hambúrguer",
"quantity": 1,
"unitPrice": 25.00,
"price": 25.00,
"optionsPrice": 0,
"totalPrice": 25.00
}],
"payments": {
"methods": [{
"method": "CREDIT",
"type": "OFFLINE",
"value": 30.99,
"card": {
"brand": "Visa"
}
}]
}
}'202 Accepted{
"id": "522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8",
"trackingUrl": "https://meupedido.ifood.com.br/522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8"
}id (uuid) - ID único do pedido criado (use para futuras operações)trackingUrl (string) - URL de rastreamento compartilhável com clientetrackingUrl com o cliente para acompanhar entregaid retornadoDELIVERY_DROP_CODE_REQUESTED, DELIVERY_IN_TRANSIT, DELIVERY_CONCLUDED| Campo | Tipo | Descrição |
|---|---|---|
customer.name* | string | Nome (máx. 50 caracteres) |
customer.phone.type | string | CUSTOMER (padrão) ou STORE |
customer.phone.countryCode* | string | Código do país (2 dígitos). Ex: 55 |
customer.phone.areaCode* | string | DDD (2 dígitos). Ex: 11 |
customer.phone.number* | string | Telefone (7-9 dígitos) |
customer.phone.type="STORE"| Campo | Tipo | Descrição |
|---|---|---|
delivery.merchantFee* | float | Taxa do parceiro |
delivery.preparationTime | integer | Tempo de preparo (segundos) |
delivery.quoteId | uuid | ID da cotação |
delivery.deliveryAddress.postalCode* | string | CEP (8 dígitos) |
delivery.deliveryAddress.streetNumber* | string | Número |
delivery.deliveryAddress.streetName* | string | Logradouro (máx. 50 caracteres) |
delivery.deliveryAddress.complement | string | Complemento (máx. 50 caracteres) |
delivery.deliveryAddress.reference | string | Referência (máx. 70 caracteres) |
delivery.deliveryAddress.neighborhood* | string | Bairro (máx. 50 caracteres) |
delivery.deliveryAddress.city* | string | Cidade (2-50 caracteres) |
delivery.deliveryAddress.state* | string | UF (2 letras). Ex: SP |
delivery.deliveryAddress.country* | string | País (2 letras). Ex: BR |
delivery.deliveryAddress.coordinates.latitude* | float | Latitude |
delivery.deliveryAddress.coordinates.longitude* | float | Longitude |
| Campo | Tipo | Descrição |
|---|---|---|
items[].id* | uuid | ID do item |
items[].name* | string | Nome (máx. 50 caracteres) |
items[].externalCode | string | Código externo |
items[].quantity* | integer | Quantidade (> 0) |
items[].unitPrice* | float | Preço unitário (≥ 0) |
items[].price* | float | Preço total (quantity * unitPrice) |
items[].optionsPrice* | float | Preço dos complementos (≥ 0) |
items[].totalPrice* | float | Total (price + optionsPrice) |
| Campo | Tipo | Descrição |
|---|---|---|
payments.methods[].method* | string | CREDIT, DEBIT ou CASH |
payments.methods[].type* | string | OFFLINE |
payments.methods[].value* | float | Valor |
payments.methods[].card.brand* | string | Bandeira (se CREDIT/DEBIT) |
payments.methods[].cash.changeFor* | float | Troco (se CASH) |
payments (processado pelo merchant)| Campo | Tipo | Descrição |
|---|---|---|
displayId | string | ID amigável (máx. 4 caracteres). Ex: A4BC |
metadata | object | Informações adicionais (máx. 20 caracteres) |
delivery.preparationTime (em segundos) controla quando o entregador será alocado. Isso é crítico para a experiência do cliente.| Cenário | Problema | Impacto |
|---|---|---|
| Muito curto | Entregador chega antes do pedido pronto | Cliente espera, entregador ocioso |
| Muito longo | Entregador aguarda sem propósito | Inchaço na fila, alocação ineficiente |
| Correto | Entregador e pedido prontos simultaneamente | Operação ótima, cliente satisfeito |
{
"delivery": {
// Não enviar preparationTime ou enviar 0
}
}{
"delivery": {
"preparationTime": 900 // 15 minutos em segundos
}
}preparationTime no tempo médio de preparo do seu negóciopreparationTime sugerido - use como referênciaDados do seu negócio:
- Tempo médio de preparo: 12 minutos
- Variação típica: ±2 minutos
- Margem de segurança: +3 minutos
Recomendação:
preparationTime = (12 + 3) * 60 = 900 segundos (15 minutos)salesChannel="POS" (use o id retornado)DELIVERY_DROP_CODE_REQUESTED - Código de confirmação necessárioDELIVERY_IN_TRANSIT - Entregador saiu para entregarDELIVERY_CONCLUDED - Entrega concluídaDELIVERY_CANCELLED - Entrega canceladaid do pedido em endpoint de tracking para obter localização400 Bad Request| Código | Descrição | Ação Recomendada |
|---|---|---|
| BadRequest | Dados inválidos na requisição | Verifique todos os campos obrigatórios (marcados com *) |
| BadRequestCustomer | Cliente indisponível ou inválido | Verifique nome, telefone do cliente |
| BadRequestMerchant | Sua loja está indisponível | Verifique status da loja no painel |
| DeliveryDistanceTooHigh | Endereço fora da cobertura | Confirme coordenadas com cliente |
| HighDemand | Logística saturada neste momento | Tente novamente em alguns minutos |
| MerchantEasyDeliveryDisabled | Serviço não habilitado para sua loja | Ative o serviço no painel iFood |
| OffOpeningHours | Fora do horário de operação | Aguarde o horário comercial |
| OriginNotFound | Loja não localizada na área logística | Registre sua loja nas áreas iFood |
| PaymentMethodNotFound | Método de pagamento não suportado | Use método disponível (CREDIT, DEBIT ou CASH) |
| PaymentTotalInvalid | Valor de pagamento ≠ total do pedido | Verifique soma dos itens + entrega |
| ServiceAreaMismatch | Endereço fora da área de serviço | Confirme cobertura iFood na região |
| NRELimitExceeded | Limite de entregadores simultâneos | Aguarde conclusão de entregas em andamento |
500 Internal Server ErrortrackingUrl) para confirmar/alterar endereço de forma segura.Requisitos:customer.phone.type="STORE"POST /shipping/v1.0/orders/{orderId}/userConfirmAddresscurl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/userConfirmAddress" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json"202 AcceptedPOST /shipping/v1.0/orders/{orderId}/deliveryAddressChangeRequest| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
streetNumber | string | Não | Número (ex: 200) |
streetName | string | Sim | Logradouro (ex: Rua das Flores) |
complement | string | Não | Complemento (ex: Apto 42) |
neighborhood | string | Sim | Bairro (ex: Centro) |
city | string | Sim | Cidade (ex: São Paulo) |
state | string | Sim | Estado (ex: SP, 2 letras) |
country | string | Sim | País (ex: BR, 2 letras) |
reference | string | Não | Referência (ex: Perto da estação) |
coordinates.latitude | float | Sim | Latitude do novo endereço |
coordinates.longitude | float | Sim | Longitude do novo endereço |
curl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/deliveryAddressChangeRequest" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"streetNumber": "200",
"streetName": "Rua das Flores",
"complement": "Apto 42",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"country": "BR",
"reference": "Perto da estação",
"coordinates": {
"latitude": -23.5510,
"longitude": -46.6340
}
}'202 Accepted| Restrição | Limite | Consequência |
|---|---|---|
| Distância máxima | 500m da coordenada original | Alterações maiores são rejeitadas |
| Prazo para resposta | 15 minutos | Após isso, rejeição automática |
| Mudança de região | Não permitido | Gera evento automático de negação |
POST /shipping/v1.0/orders/{orderId}/acceptDeliveryAddressChangecurl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/acceptDeliveryAddressChange" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json"200 OKmetadata.action="region-mismatch".POST /shipping/v1.0/orders/{orderId}/denyDeliveryAddressChangecurl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/denyDeliveryAddressChange" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json"202 Accepted| Código | Status | Descrição | Ação |
|---|---|---|---|
| BadRequest | 400 | Parâmetros inválidos | Verifique coordenadas, nome da rua, cidade |
| OrderNotFound | 404 | Pedido não encontrado ou expirado (>8h) | Pedido é válido por até 8 horas |
| ChangeAddressOperationConflict | 409 | Operação em conflito | Já existe outra alteração pendente |
| ChangeAddressOperationNotStarted | 409 | Nenhuma alteração pendente | Não há solicitação para aceitar/rejeitar |
| MaxDistanceHigherThanAllowed | 400 | Alteração > 500m da coordenada original | Solicitação fora do limite permitido |
| RegionMismatch | 400 | Novo endereço em região diferente | Endereço em cobertura iFood diferente |
salesChannel="POS"). O processo é em duas etapas: obter motivos válidos e enviar cancelamento.GET /shipping/v1.0/orders/{orderId}/cancellationReasonscurl -X GET "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/cancellationReasons" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json"200 OK[
{
"cancelCodeId": "817",
"description": "O cliente cancelou o pedido"
},
{
"cancelCodeId": "818",
"description": "Impossível preparar o pedido"
}
]cancelCodeId (string) - Código único do motivo (use no cancelamento)description (string) - Descrição legível para exibir ao operadorPOST /shipping/v1.0/orders/{orderId}/cancel| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
reason | string | Sim | Texto explicativo do cancelamento (para logs) |
cancellationCode | integer | Sim | Código obtido em 4.1 (ex: 817) |
curl -X POST "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/cancel" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"reason": "Cliente solicitou cancelamento via chat",
"cancellationCode": 817
}'{
"reason": "Cliente solicitou cancelamento via chat",
"cancellationCode": 817
}202 AcceptedCANCELLED - Cancelamento confirmado com sucessoCANCELLATION_REQUEST_FAILED - Falha no cancelamento (ex: entregador já saiu)| Nível | Descrição | Quando ocorre | Recomendação |
|---|---|---|---|
| LOW | Confiança baixa | Cliente inválido ou alteração negada | Solicitar confirmação extra do cliente |
| MODERATE | Confiança moderada | Telefone fixo (validação mais fraca) | Monitorar atentamente |
| HIGH | Confiança alta | Telefone móvel válido | Processamento padrão |
| VERY_HIGH | Confiança muito alta | Telefone válido + endereço confirmado | Priorizar, menos risco |
| Regra | Descrição | Impacto |
|---|---|---|
| customer_phone_valid | Telefone móvel válido (11+ dígitos, tipo CUSTOMER) | Aumenta confiança |
| customer_phone_is_fixed | Telefone fixo (8 dígitos) | Confiança intermediária |
| customer_address_confirmed | Cliente confirmou o endereço | Aumenta muito |
| customer_address_change_requested | Cliente solicitou mudança de endereço | Reduz (pode indicar erro inicial) |
| merchant_address_change_approved | Você aprovou a mudança | Melhora o score |
| merchant_address_change_denied | Você rejeitou a mudança | Reduz significativamente |
Cenário 1: Sem validação
`customer_phone_valid`=false
→ Score: LOW (alto risco)
Cenário 2: Telefone fixo apenas
`customer_phone_is_fixed`=true
→ Score: MODERATE
Cenário 3: Telefone móvel válido
`customer_phone_valid`=true
→ Score: HIGH
Cenário 4: Telefone + Endereço confirmado
`customer_phone_valid`=true +
`customer_address_confirmed`=true
→ Score: VERY_HIGH (máxima confiança)
Cenário 5: Alteração aprovada
`customer_phone_valid`=true +
`merchant_address_change_approved`=true
→ Score: VERY_HIGH
Cenário 6: Alteração rejeitada
`customer_phone_valid`=true +
`customer_address_change_requested`=true +
`merchant_address_change_denied`=true
→ Score: LOW (desconfiança)GET /shipping/v1.0/orders/{orderId}/safeDeliverycurl -X GET "https://merchant-api.ifood.com.br/shipping/v1.0/orders/{orderId}/safeDelivery" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-H "Content-Type: application/json"200 OK{
"rules": {
"customer_address_change_requested": false,
"customer_address_confirmed": true,
"customer_phone_is_fixed": false,
"customer_phone_valid": true,
"merchant_address_change_approved": false,
"merchant_address_change_denied": false
},
"score": "VERY_HIGH"
}score (enum) - Nível: LOW, MODERATE, HIGH, VERY_HIGHrules.* (boolean) - Cada regra verdadeira ou falsa| Evento | Impacto | Novo Score |
|---|---|---|
| Cliente confirma endereço | Aumenta confiança | Pode subir para VERY_HIGH |
| Cliente solicita alteração | Reduz (erro inicial?) | Pode cair para MODERATE/LOW |
| Você aprova alteração | Aumenta confiança | Pode voltar para VERY_HIGH |
| Você rejeita alteração | Reduz muito | Cai para LOW |
| Tempo passa | Alguns dados expiram | Score pode cair ao longo do tempo |
1. Pedido criado → Score HIGH
↓ (Cliente confirma endereço)
2. Antes de entregar → Score VERY_HIGH
↓ (Use para decisões críticas)
3. Aloque recursos ou aplique validações extras se LOW