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

Pedidos fora da plataforma iFood

Esta seção explica como integrar pedidos realizados fora da plataforma iFood (não possuem orderId pré-existente) ao serviço de entrega Sob Demanda.
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. Cancelar pedido (opcional)POST /orders/{orderId}/cancelCANCELLATION_REQUESTED202 AcceptedClientAPIPolling de Eventos
Antes de registrar o pedido, consulte a disponibilidade de entrega para validar a cobertura e obter estimativas.
  • Validar área de cobertura
  • Identificar indisponibilidade temporária
  • Obter estimativa de tempo e custo
  • Evitar erros no registro
Embora opcional, esta verificação previne erros e permite melhor planejamento operacional.
GET /shipping/v1.0/merchants/{merchantId}/deliveryAvailabilities?latitude={lat}&longitude={lng}
Parâmetros obrigatórios:
  • merchantId (path) - ID do merchant
  • latitude (query) - Latitude do endereço de entrega
  • longitude (query) - Longitude do endereço de entrega

Campos da resposta

CampoTipoDescrição
iduuidID da cotação
expirationAtdatetimeValidade da cotação (UTC)
createdAtdatetimeData de criação (UTC)
distanceintegerDistância em metros
preparationTimeintegerTempo de preparo em segundos
quote.grossValuedecimalValor bruto
quote.discountdecimalDesconto
quote.raisedecimalAcréscimo
quote.netValuedecimalValor líquido
deliveryTime.minintegerTempo mínimo de entrega (segundos)
deliveryTime.maxintegerTempo máximo de entrega (segundos)
hasPaymentMethodsbooleanIndica métodos de pagamento disponíveis
paymentMethods[].methodstringCREDIT, DEBIT ou CASH

Exemplo

{
  "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"
    }
  ]
}

Códigos de erro

CódigoDescrição
BadRequestProblema na requisição. Verifique os dados
BadRequestMerchantMerchant indisponível
DeliveryDistanceTooHighEndereço fora da área de cobertura
OffOpeningHoursFora do horário de funcionamento
OriginNotFoundLoja fora da área logística
ServiceAreaMismatchEndereço fora da área de cobertura
HighDemandLogística temporariamente indisponível
MerchantStatusAvailabilityMerchant com pendência
InvalidPaymentMethodsForma de pagamento não aceita
NRELimitExceededLimite de entregadores atingido
UnavailableFleetFrota indisponível
Registre o pedido para solicitar automaticamente um entregador parceiro.
  • Um entregador será alocado automaticamente após o registro
  • Se a entrega não for possível, o pedido não será registrado
  • Certifique-se de validar os dados antes de enviar
Por segurança, um código de confirmação (4 últimos dígitos do telefone) é gerado automaticamente.

Como funciona

Com código (padrão):
  • Envie customer.phone.type="CUSTOMER" com telefone válido
  • O entregador solicitará o código na entrega
  • Cliente deve ser informado previamente
Sem código:
  • Envie customer.phone.type="STORE"
  • Código não será solicitado
Informe o cliente que o entregador solicitará os 4 últimos dígitos do telefone. Falha na validação pode resultar em cancelamento.

Para parceiros sem página de rastreio iFood

Consuma o evento DELIVERY_DROP_CODE_REQUESTED com metadata.CODE para disponibilizar o código ao cliente.
POST /shipping/v1.0/merchants/{merchantId}/orders
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 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)
Use delivery.preparationTime para atrasar a alocação do entregador.
  • Não enviado: Alocação imediata
  • Enviado: Alocação após o tempo especificado (em segundos)
Informe o tempo mais preciso possível. Tempos incorretos podem resultar em:
  • Atrasos na entrega
  • Experiência ruim para o cliente
  • Possível fechamento por acúmulo de entregadores
{
  "id": "522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8",
  "trackingUrl": "https://meupedido.ifood.com.br/522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8"
}
Integração com polling
CódigoDescrição
BadRequestProblema na requisição
BadRequestCustomerCliente indisponível
BadRequestMerchantMerchant indisponível
DeliveryDistanceTooHighFora da área de cobertura
HighDemandLogística indisponível temporariamente
MerchantEasyDeliveryDisabledServiço não habilitado
OffOpeningHoursFora do horário de funcionamento
OriginNotFoundLoja fora da área logística
PaymentMethodNotFoundMétodo de pagamento não encontrado
PaymentTotalInvalidValor do pagamento não corresponde ao total
ServiceAreaMismatchEndereço fora da cobertura
NRELimitExceededLimite de entregadores atingido
Permite que o cliente confirme ou solicite alteração do endereço de entrega após a criação do pedido.

Com página de rastreio iFood

Cliente usa a página do iFood para confirmar/alterar endereço.Requisitos:
  • Pedido NÃO pode ter customer.phone.type="STORE"
  • Telefone válido é obrigatório para OTP
Envie o telefone correto usado como WhatsApp para receber o código OTP de confirmação.

Sem página de rastreio iFood

Merchant implementa própria experiência usando os endpoints.Nota: iFood não enviará OTP. Validação é responsabilidade do merchant.
POST /shipping/v1.0/orders/{orderId}/userConfirmAddress
Resposta: 202 Accepted
Evento: DELIVERY_ADDRESS_CHANGE_USER_CONFIRMED
POST /shipping/v1.0/orders/{orderId}/deliveryAddressChangeRequest
Parâmetros obrigatórios:
  • streetName, neighborhood, city, state, country
  • coordinates (latitude, longitude)
Prazo para respostaMerchant tem 15 minutos para aceitar/rejeitar. Após isso, rejeição automática.
Limite: Alteração máxima de 500m da coordenada originalEvento: DELIVERY_ADDRESS_CHANGE_REQUESTED
POST /shipping/v1.0/orders/{orderId}/acceptDeliveryAddressChange
Evento: DELIVERY_ADDRESS_CHANGE_ACCEPTEDErro RegionMismatch: Gera evento automático DELIVERY_ADDRESS_CHANGE_DENIED com metadata.action="region-mismatch"
POST /shipping/v1.0/orders/{orderId}/denyDeliveryAddressChange
Evento: DELIVERY_ADDRESS_CHANGE_DENIED
CódigoStatusDescrição
BadRequest400Parâmetros inválidos
OrderNotFound404Pedido não encontrado ou expirado (>8h)
ChangeAddressOperationConflict409Conflito com operação existente
ChangeAddressOperationNotStarted409Nenhuma alteração pendente
MaxDistanceHigherThanAllowed400Alteração > 500m
RegionMismatch400Novo endereço em região diferente
Cancele pedidos com salesChannel="POS".
GET /shipping/v1.0/orders/{orderId}/cancellationReasons
Resposta 200 OK:
[{
  "cancelCodeId": "817",
  "description": "O cliente cancelou o pedido pelo restaurante"
}]
Resposta 204: Pedido não pode mais ser cancelado
POST /shipping/v1.0/orders/{orderId}/cancel
Body:
{
  "reason": "Cliente solicitou cancelamento",
  "cancellationCode": "817"
}
Resposta: 202 AcceptedEventos:
  1. CANCELLATION_REQUESTED
  2. CANCELLED (sucesso) ou CANCELLATION_REQUEST_FAILED (falha)
Sistema de scoring baseado em regras de validação.
NívelDescrição
LOWConfiança baixa
MODERATEConfiança moderada
HIGHConfiança alta
VERY_HIGHConfiança muito alta
RegraDescrição
customer_phone_validTelefone válido (não STORE, >11 dígitos)
customer_phone_is_fixedTelefone fixo (8 dígitos)
customer_address_confirmedEndereço confirmado pelo cliente
customer_address_change_requestedCliente solicitou alteração
merchant_address_change_approvedMerchant aprovou alteração
merchant_address_change_deniedMerchant negou alteração
  • customer_phone_valid:falseLOW
  • customer_phone_is_fixed:trueMODERATE
  • customer_phone_is_fixed:true + customer_address_confirmed:trueVERY_HIGH
  • customer_phone_valid:trueHIGH
  • customer_phone_valid:true + alteração aprovada → VERY_HIGH
  • customer_phone_valid:true + alteração negada → LOW
GET /shipping/v1.0/orders/{orderId}/safeDelivery
Resposta 200 OK:
{
  "rules": {
    "customer_address_change_requested": false,
    "customer_address_confirmed": false,
    "customer_phone_is_fixed": false,
    "customer_phone_valid": true,
    "merchant_address_change_approved": false,
    "merchant_address_change_denied": false
  },
  "score": "HIGH"
}
Erros:
  • 400 OrderWithoutSafeDelivery: Pedido sem regras de confiança
  • 404 OrderNotFound: Pedido não encontrado
O score pode mudar após a criação do pedido baseado nas ações do cliente e merchant.
Esta página foi útil?
Avalie sua experiência no novo Developer portal: