Buscar na documentação
ctrl+4K
Módulos
Authentication
Merchant
Catalog
Order
Events
Logistics
Shipping
Review
Financial
Soluções

Pedidos fora da plataforma iFood

Use esta documentação para criar pedidos fora da plataforma iFood e contratar logística Sob Demanda simultaneamente. Ideal para integradoras e sistemas que criam seus próprios pedidos.
O fluxo consiste em 5 etapas principais:
  1. Verificar disponibilidade - Valide cobertura e obtenha cotação
  2. Registrar pedido - Crie o pedido e aloque entregador
  3. Gerenciar endereço - Confirme ou altere endereço de entrega
  4. Cancelar pedido - Cancele conforme necessário
  5. Monitorar confiança - Rastreie o nível de segurança da entrega
ClientAPIPolling de Eventos1. Verificar disponibilidadeGET /merchants/{merchantId}/deliveryAvailabilitiesCotação e janelas de entrega2. Registrar pedidoPOST /merchants/{merchantId}/ordersEvento de código de confirmaçãoID do pedido + URL rastreio3. Gerenciar endereçoPOST /orders/{orderId}/[userConfirmAddress | deliveryAddressChangeRequest]DELIVERY_ADDRESS_CHANGE_*`202 Accepted`4. Cancelar pedidoPOST /orders/{orderId}/cancelCANCELLATION_REQUESTED`202 Accepted`ClientAPIPolling de Eventos
Antes de criar o pedido, verifique se a entrega está disponível para o endereço fornecido. Este endpoint retorna a cotação com preço e tempo estimado.
GET /shipping/v1.0/merchants/{merchantId}/deliveryAvailabilities?latitude={lat}&longitude={lng}
ParâmetroLocalizaçãoTipoObrigatórioDescrição
merchantIdpathuuidSimID do merchant (sua loja)
latitudequeryfloatSimLatitude do endereço de entrega (ex: -23.55)
longitudequeryfloatSimLongitude 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"
A cotação foi obtida com sucesso. Use o id como quoteId ao criar o pedido. A cotação é válida por ~24 horas.

Campos da resposta

CampoTipoDescrição
iduuidID da cotação (use como quoteId ao criar pedido)
expirationAtdatetimeValidade da cotação em UTC (~24h). Solicitar após é inválido.
createdAtdatetimeData de criação da cotação em UTC
distanceintegerDistância de entrega em metros
preparationTimeintegerTempo de preparo sugerido em segundos
quote.grossValuedecimalValor bruto da entrega em reais
quote.discountdecimalDesconto aplicado em reais
quote.raisedecimalAcréscimo aplicado em reais
quote.netValuedecimalValor líquido = grossValue - discount + raise
deliveryTime.minintegerTempo mínimo estimado de entrega em segundos
deliveryTime.maxintegerTempo máximo estimado de entrega em segundos
hasPaymentMethodsbooleanIndica se há métodos de pagamento disponíveis
paymentMethods[].iduuidID único do método de pagamento
paymentMethods[].brandstringBandeira do cartão (ex: Visa, Mastercard)
paymentMethods[].liabilitystringResponsável pelo pagamento (ex: IFOOD)
paymentMethods[].paymentTypestringTipo de pagamento (ex: OFFLINE para pagamento na entrega)
paymentMethods[].methodstringMétodo: CREDIT, DEBIT ou CASH

Exemplo de resposta

{
  "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"
    }
  ]
}
Neste exemplo: distância de 3km, preço de R$ 7,99, tempo estimado de 20-30 minutos, e métodos de pagamento disponíveis (Visa e dinheiro).
A entrega não está disponível. Verifique o código de erro para entender o motivo.
Para soluções detalhadas de cada erro, consulte Boas práticas e troubleshooting.

Códigos de erro

CódigoDescriçãoAção
BadRequestProblema na requisiçãoVerifique formato de latitude e longitude
BadRequestMerchantSua loja está indisponívelVerifique status da loja no painel
DeliveryDistanceTooHighEndereço a mais de ~10kmConfirme coordenadas com cliente
OffOpeningHoursFora do horário de operaçãoTente novamente no horário comercial
OriginNotFoundLoja não encontradaRegistre sua loja nas áreas iFood
ServiceAreaMismatchEndereço fora da coberturaConfirme se a região tem entrega iFood
HighDemandLogística saturadaTente novamente em minutos
MerchantStatusAvailabilitySua conta tem pendênciasContate o suporte
InvalidPaymentMethodsForma de pagamento não suportadaUse outro método
NRELimitExceededLimite de entregadores atingidoAguarde conclusão de entregas
UnavailableFleetFrota indisponívelTente novamente mais tarde

Erro temporário no servidor. Tente novamente em alguns segundos.O que fazer: Implemente retry com backoff exponencial. Após 3-5 tentativas sem sucesso, registre em log e notifique o suporte.
Registre um novo pedido e aloque automaticamente um entregador iFood para pedidos criados fora da plataforma.Entenda como o sistema funciona:
  • Um entregador é alocado automaticamente após o registro bem-sucedido
  • Se a entrega não for viável, o pedido não será criado
  • Valide todos os dados antes de enviar para evitar rejeições
  • O registro é uma operação assíncrona; use o id retornado para rastreamento
Por segurança, um código de confirmação é gerado automaticamente. O entregador solicitará este código ao cliente para validar a identidade.

Dois modos disponíveis

Modo 1: Com código (padrão - recomendado)
  • Envie customer.phone.type="CUSTOMER" com número válido
  • O código será os 4 últimos dígitos do telefone
  • Entregador solicitará o código antes de entregar
  • Mais seguro; recomendado para entregas de alto valor
Modo 2: Sem código (apenas com autorização)
  • Envie customer.phone.type="STORE"
  • Código não será solicitado
  • Apenas validação de presença
  • Use quando cliente não pode fornecer validação

Informar o cliente

Informe previamente ao cliente que o entregador solicitará validação (código ou confirmação). Falha ou recusa pode resultar em cancelamento sem reembolso.

Para integradoras sem página de rastreio iFood

Se sua plataforma não usa a página de rastreio do iFood, implemente:
  1. Escute o evento DELIVERY_DROP_CODE_REQUESTED
  2. Extraia o código de metadata.CODE do evento
  3. Exiba ao cliente via SMS, email ou app
  4. Comunique ao entregador para solicitar validação
Fluxo: Monitorar eventos → Extrair código → Notificar cliente → Entregador valida
POST /shipping/v1.0/merchants/{merchantId}/orders
curl -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"
        }
      }]
    }
  }'
Pedido criado com sucesso. Um entregador está sendo alocado.
{
  "id": "522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8",
  "trackingUrl": "https://meupedido.ifood.com.br/522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8"
}
Campos retornados:
  • id (uuid) - ID único do pedido criado (use para futuras operações)
  • trackingUrl (string) - URL de rastreamento compartilhável com cliente
Próximas ações:
  • Compartilhe a trackingUrl com o cliente para acompanhar entrega
  • Monitore eventos de entrega via polling com o id retornado
  • Implemente listeners para eventos como DELIVERY_DROP_CODE_REQUESTED, DELIVERY_IN_TRANSIT, DELIVERY_CONCLUDED
Campos obrigatórios marcados com *

Customer (Cliente)

CampoTipoDescrição
customer.name*stringNome (máx. 50 caracteres)
customer.phone.typestringCUSTOMER (padrão) ou STORE
customer.phone.countryCode*stringCódigo do país (2 dígitos). Ex: 55
customer.phone.areaCode*stringDDD (2 dígitos). Ex: 11
customer.phone.number*stringTelefone (7-9 dígitos)
* Não obrigatório se customer.phone.type="STORE"

Delivery (Entrega)

CampoTipoDescrição
delivery.merchantFee*floatTaxa do parceiro
delivery.preparationTimeintegerTempo de preparo (segundos)
delivery.quoteIduuidID da cotação
delivery.deliveryAddress.postalCode*stringCEP (8 dígitos)
delivery.deliveryAddress.streetNumber*stringNúmero
delivery.deliveryAddress.streetName*stringLogradouro (máx. 50 caracteres)
delivery.deliveryAddress.complementstringComplemento (máx. 50 caracteres)
delivery.deliveryAddress.referencestringReferência (máx. 70 caracteres)
delivery.deliveryAddress.neighborhood*stringBairro (máx. 50 caracteres)
delivery.deliveryAddress.city*stringCidade (2-50 caracteres)
delivery.deliveryAddress.state*stringUF (2 letras). Ex: SP
delivery.deliveryAddress.country*stringPaís (2 letras). Ex: BR
delivery.deliveryAddress.coordinates.latitude*floatLatitude
delivery.deliveryAddress.coordinates.longitude*floatLongitude

Items (Itens)

CampoTipoDescrição
items[].id*uuidID do item
items[].name*stringNome (máx. 50 caracteres)
items[].externalCodestringCódigo externo
items[].quantity*integerQuantidade (> 0)
items[].unitPrice*floatPreço unitário (≥ 0)
items[].price*floatPreço total (quantity * unitPrice)
items[].optionsPrice*floatPreço dos complementos (≥ 0)
items[].totalPrice*floatTotal (price + optionsPrice)

Payments (Pagamentos)

Pagamento Offline:
CampoTipoDescrição
payments.methods[].method*stringCREDIT, DEBIT ou CASH
payments.methods[].type*stringOFFLINE
payments.methods[].value*floatValor
payments.methods[].card.brand*stringBandeira (se CREDIT/DEBIT)
payments.methods[].cash.changeFor*floatTroco (se CASH)
Pagamento Online: Não enviar o objeto payments (processado pelo merchant)

Outros campos

CampoTipoDescrição
displayIdstringID amigável (máx. 4 caracteres). Ex: A4BC
metadataobjectInformações adicionais (máx. 20 caracteres)
O parâmetro delivery.preparationTime (em segundos) controla quando o entregador será alocado. Isso é crítico para a experiência do cliente.

Por que o tempo de preparação importa

Um timing incorreto resulta em problemas operacionais sérios:
CenárioProblemaImpacto
Muito curtoEntregador chega antes do pedido prontoCliente espera, entregador ocioso
Muito longoEntregador aguarda sem propósitoInchaço na fila, alocação ineficiente
CorretoEntregador e pedido prontos simultaneamenteOperação ótima, cliente satisfeito

Como usar

Opção 1: Alocação imediata (padrão)
{
  "delivery": {
    // Não enviar preparationTime ou enviar 0
  }
}
→ Entregador alocado imediatamenteOpção 2: Alocação retardada (recomendado)
{
  "delivery": {
    "preparationTime": 900  // 15 minutos em segundos
  }
}
→ Entregador alocado após 15 minutos

Melhores práticas

  1. Use dados reais: Base o preparationTime no tempo médio de preparo do seu negócio
  2. Consulte a cotação: O endpoint de disponibilidade retorna preparationTime sugerido - use como referência
  3. Ajuste iterativamente: Monitore se entregadores chegam cedo/tarde e ajuste
  4. Adicione margem: Considere picos - é melhor entregar um pouco atrasado do que perder pedidos

Exemplo prático

Dados 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)
Após criar o pedido com sucesso, implemente monitoramento de eventos:
  • Fonte: Polling de eventos
  • Filtro: Pedidos com salesChannel="POS" (use o id retornado)
  • Eventos críticos:
    • DELIVERY_DROP_CODE_REQUESTED - Código de confirmação necessário
    • DELIVERY_IN_TRANSIT - Entregador saiu para entregar
    • DELIVERY_CONCLUDED - Entrega concluída
    • DELIVERY_CANCELLED - Entrega cancelada
  • Rastreamento: Use o id do pedido em endpoint de tracking para obter localização

Requisição inválida ou serviço indisponível.
Para soluções detalhadas de cada erro, consulte Boas práticas e troubleshooting.
CódigoDescriçãoAção Recomendada
BadRequestDados inválidos na requisiçãoVerifique todos os campos obrigatórios (marcados com *)
BadRequestCustomerCliente indisponível ou inválidoVerifique nome, telefone do cliente
BadRequestMerchantSua loja está indisponívelVerifique status da loja no painel
DeliveryDistanceTooHighEndereço fora da coberturaConfirme coordenadas com cliente
HighDemandLogística saturada neste momentoTente novamente em alguns minutos
MerchantEasyDeliveryDisabledServiço não habilitado para sua lojaAtive o serviço no painel iFood
OffOpeningHoursFora do horário de operaçãoAguarde o horário comercial
OriginNotFoundLoja não localizada na área logísticaRegistre sua loja nas áreas iFood
PaymentMethodNotFoundMétodo de pagamento não suportadoUse método disponível (CREDIT, DEBIT ou CASH)
PaymentTotalInvalidValor de pagamento ≠ total do pedidoVerifique soma dos itens + entrega
ServiceAreaMismatchEndereço fora da área de serviçoConfirme cobertura iFood na região
NRELimitExceededLimite de entregadores simultâneosAguarde conclusão de entregas em andamento

Erro temporário no servidor. Tente novamente em alguns segundos.O que fazer: Implemente retry com backoff exponencial. Após 3-5 tentativas sem sucesso, registre em log e notifique o suporte.
Gerencie mudanças de endereço após o pedido ser criado. O cliente pode confirmar o endereço ou solicitar uma alteração.

Opção A: Com página de rastreio iFood (recomendado)

Cliente usa a página do iFood (trackingUrl) para confirmar/alterar endereço de forma segura.Requisitos:
  • Pedido NÃO pode ter customer.phone.type="STORE"
  • Telefone válido é obrigatório (recebe OTP por SMS)
  • Use URL retornada na criação do pedido
Fluxo: Cliente acessa URL → Recebe OTP via SMS → Valida endereço → ConfirmaVantagem: iFood gerencia segurança, OTP, validação

Opção B: Sem página de rastreio iFood (integração custom)

Sua plataforma implementa própria interface de confirmação/alteração usando os endpoints.Requisitos:
  • Você gerencia a interface do usuário
  • Responsabilidade sua validar e implementar segurança
Fluxo: Cliente confirma na sua app → Você chama endpoints → Monitora eventosNota: iFood não envia OTP. Você escolhe como validar (senha, OTP próprio, etc).
Segurança: Se usar OTP, implemente validação adequada. Endereços incorretos resultam em falhas de entrega.
Usado quando cliente confirma que o endereço fornecido está correto (sem mudanças).
POST /shipping/v1.0/orders/{orderId}/userConfirmAddress

Exemplo de requisição

curl -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"

Resposta - 202 Accepted

Confirmação registrada com sucesso.Evento gerado: DELIVERY_ADDRESS_CHANGE_USER_CONFIRMEDMonitore este evento para ser informado quando cliente confirmar.
Cliente pode solicitar mudança do endereço de entrega após criação do pedido (máximo 500m da coordenada original).
POST /shipping/v1.0/orders/{orderId}/deliveryAddressChangeRequest

Parâmetros

ParâmetroTipoObrigatórioDescrição
streetNumberstringNãoNúmero (ex: 200)
streetNamestringSimLogradouro (ex: Rua das Flores)
complementstringNãoComplemento (ex: Apto 42)
neighborhoodstringSimBairro (ex: Centro)
citystringSimCidade (ex: São Paulo)
statestringSimEstado (ex: SP, 2 letras)
countrystringSimPaís (ex: BR, 2 letras)
referencestringNãoReferência (ex: Perto da estação)
coordinates.latitudefloatSimLatitude do novo endereço
coordinates.longitudefloatSimLongitude do novo endereço

Exemplo de requisiçã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
    }
  }'

Resposta - 202 Accepted

Solicitação de alteração registrada. Seu sistema deve responder em até 15 minutos.Evento gerado: DELIVERY_ADDRESS_CHANGE_REQUESTEDMonitore este evento para ser notificado da solicitação e oferecer opções ao cliente.

Restrições importantes

RestriçãoLimiteConsequência
Distância máxima500m da coordenada originalAlterações maiores são rejeitadas
Prazo para resposta15 minutosApós isso, rejeição automática
Mudança de regiãoNão permitidoGera evento automático de negação
Seu sistema aprova a mudança de endereço solicitada pelo cliente.
POST /shipping/v1.0/orders/{orderId}/acceptDeliveryAddressChange

Exemplo de requisição

curl -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"

Resposta 200 OK

Alteração aceita com sucesso.Evento gerado: DELIVERY_ADDRESS_CHANGE_ACCEPTEDNota especial: Se o novo endereço cair em outra região, iFood automaticamente nega com evento DELIVERY_ADDRESS_CHANGE_DENIED e metadata.action="region-mismatch".
Seu sistema rejeita a mudança de endereço solicitada (quando não viável, por exemplo).
POST /shipping/v1.0/orders/{orderId}/denyDeliveryAddressChange

Exemplo de requisição

curl -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"

Resposta - 202 Accepted

Rejeição registrada com sucesso.Evento gerado: DELIVERY_ADDRESS_CHANGE_DENIED
CódigoStatusDescriçãoAção
BadRequest400Parâmetros inválidosVerifique coordenadas, nome da rua, cidade
OrderNotFound404Pedido não encontrado ou expirado (>8h)Pedido é válido por até 8 horas
ChangeAddressOperationConflict409Operação em conflitoJá existe outra alteração pendente
ChangeAddressOperationNotStarted409Nenhuma alteração pendenteNão há solicitação para aceitar/rejeitar
MaxDistanceHigherThanAllowed400Alteração > 500m da coordenada originalSolicitação fora do limite permitido
RegionMismatch400Novo endereço em região diferenteEndereço em cobertura iFood diferente
Cancele pedidos criados fora da plataforma (salesChannel="POS"). O processo é em duas etapas: obter motivos válidos e enviar cancelamento.Antes de cancelar, consulte os motivos válidos. Você não pode hardcoding motivos.
GET /shipping/v1.0/orders/{orderId}/cancellationReasons

Exemplo de requisição

curl -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"

Resposta 200 OK

Lista de motivos válidos para this pedido específico.
[
  {
    "cancelCodeId": "817",
    "description": "O cliente cancelou o pedido"
  },
  {
    "cancelCodeId": "818",
    "description": "Impossível preparar o pedido"
  }
]
Campos:
  • cancelCodeId (string) - Código único do motivo (use no cancelamento)
  • description (string) - Descrição legível para exibir ao operador

Resposta - 204 No Content

Pedido não pode mais ser cancelado (já entregue, cancelado, etc). Nenhuma ação necessária.
Após obter os motivos válidos, envie o cancelamento com o código e razão.
POST /shipping/v1.0/orders/{orderId}/cancel

Parâmetros

CampoTipoObrigatórioDescrição
reasonstringSimTexto explicativo do cancelamento (para logs)
cancellationCodeintegerSimCódigo obtido em 4.1 (ex: 817)

Exemplo de requisição

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
  }'
Body:
{
  "reason": "Cliente solicitou cancelamento via chat",
  "cancellationCode": 817
}

Resposta - 202 Accepted

Cancelamento registrado. Monitore eventos para confirmação.Sequência de eventos:
  1. CANCELLATION_REQUESTED - Cancelamento solicitado
  2. CANCELLED - Cancelamento confirmado com sucesso
  3. CANCELLATION_REQUEST_FAILED - Falha no cancelamento (ex: entregador já saiu)
Monitore via polling para saber o resultado final.
Sistema de scoring automático que calcula o nível de confiança de cada entrega baseado em fatores de validação do cliente e endereço.Use o score para: Tomar decisões operacionais (ex: pedir confirmação adicional para LOW, priorizar HIGH/VERY_HIGH).
NívelDescriçãoQuando ocorreRecomendação
LOWConfiança baixaCliente inválido ou alteração negadaSolicitar confirmação extra do cliente
MODERATEConfiança moderadaTelefone fixo (validação mais fraca)Monitorar atentamente
HIGHConfiança altaTelefone móvel válidoProcessamento padrão
VERY_HIGHConfiança muito altaTelefone válido + endereço confirmadoPriorizar, menos risco
O score é calculado combinando os seguintes fatores:
RegraDescriçãoImpacto
customer_phone_validTelefone móvel válido (11+ dígitos, tipo CUSTOMER)Aumenta confiança
customer_phone_is_fixedTelefone fixo (8 dígitos)Confiança intermediária
customer_address_confirmedCliente confirmou o endereçoAumenta muito
customer_address_change_requestedCliente solicitou mudança de endereçoReduz (pode indicar erro inicial)
merchant_address_change_approvedVocê aprovou a mudançaMelhora o score
merchant_address_change_deniedVocê rejeitou a mudançaReduz 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}/safeDelivery

Exemplo de requisição

curl -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"

Resposta 200 OK

Score calculado com detalhes das regras avaliadas.
{
  "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"
}
Interpretação:
  • Cliente tem telefone móvel válido ✓
  • Cliente confirmou o endereço ✓
  • Nenhuma alteração pendente ✓
  • Score = VERY_HIGH (máxima confiança)
Campos:
  • score (enum) - Nível: LOW, MODERATE, HIGH, VERY_HIGH
  • rules.* (boolean) - Cada regra verdadeira ou falsa

Resposta - 400 OrderWithoutSafeDelivery

Pedido não tem regras de confiança aplicáveis (criado antes do sistema).

Resposta - 404 OrderNotFound

Pedido não existe ou expirou (máximo 8 horas).
O score não é estático - muda conforme as ações ocorrem:

Quando o score muda

EventoImpactoNovo Score
Cliente confirma endereçoAumenta confiançaPode subir para VERY_HIGH
Cliente solicita alteraçãoReduz (erro inicial?)Pode cair para MODERATE/LOW
Você aprova alteraçãoAumenta confiançaPode voltar para VERY_HIGH
Você rejeita alteraçãoReduz muitoCai para LOW
Tempo passaAlguns dados expiramScore pode cair ao longo do tempo

Melhor prática

Consulte o score próximo ao horário de entrega (não apenas na criação):
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
Exemplo de uso operacional:
  • Score VERY_HIGH → Entrega padrão, sem validação extra
  • Score HIGH → Monitoramento normal
  • Score MODERATE → Considere contato prévio com cliente
  • Score LOW → Requeira confirmação adicional antes de entregar
Integração concluída?
  1. Implemente polling de eventos para monitorar entrega em tempo real
  2. Consulte a guia de rastreamento de entregas para localização em tempo real
  3. Revise o fluxo completo de pedidos para entender ciclo de vida
Pronto para produção?
  1. Teste todos os cenários (sucesso, falha, cancelamento, alteração de endereço)
  2. Implemente alertas e monitoramento de erros
  3. Configure retry automático com backoff exponencial
  4. Prepare documentação interna e treinamento de operadores
Dúvidas?
Esta página foi útil?
Avalie sua experiência no novo Developer portal: