Docs Shipping
Envio de pedidos realizados na plataforma iFood: Este módulo permite que os merchants enviem pedidos feitos na plataforma iFood (Pedidos que já possuem um orderId). Isso é especialmente útil para merchants que possuem seus próprios entregadores, mas que podem precisar do serviço de entrega do iFood em situações de sobrecarga ou falta de entregadores.
Para utilizar esta modalidade de serviço deve ser contratado através do menu Serviços do Portal do Parceiro. Caso contrário, não será possível registrar pedidos, verificar disponibilidade de entrega ou solicitar entregador.
Elegibilidade Esta modalidade de entrega não está disponível para qualquer pedido. O pedido só será elegível quando passar por alguns critérios como:
Para Retirar
)Envio de pedidos realizados através de outros canais de venda: O módulo também permite que os merchants enviem pedidos que foram realizados através de outros canais de venda, como telefone, WhatsApp, aplicativo ou site próprio (Pedidos que não possuem um orderId pré-existente). Para maiores informações sobre o Sob Demanda, acesse https://news.ifood.com.br/entrega-facil-o-delivery-do-ifood-fora-do-app/
Pedidos na plataforma iFood são aqueles que já possuem um orderId, contendo as informações necessárias do restaurante e do cliente para realizar a cotação e solicitação.
Por outro lado, pedidos fora da plataforma iFood não possuem um orderId pré-existente, pois não são originados internamente. Nesse caso, informações adicionais são necessárias para efetuar a cotação e solicitação.
Aplicativos da categoria Logística não estão autorizados a utilizar o serviço para pedidos OFF PLATFORM.
Para utilizar o módulo, o Sob Demanda deve ser contratado através do menu Serviços do Portal do Parceiro. Caso contrário, não será possível registrar pedidos, verificar disponibilidade de entrega ou solicitar entregador.
Esses critérios são aplicáveis somente para integradoras que desejam integrar exclusivamente com o módulo Shipping ao contratar serviços de entrega para pedidos fora da plataforma iFood. Para as integradoras que desejam utilizar também o módulo de Orders, aplica-se o critério de homologação de Orders. Para aquelas que já estão homologadas, apesar de não ser obrigatória, recomenda-se que para utilizar o módulo Shipping a homologação também seja feita, a fim de validar se as requisições estão sendo feitas corretamente e detectar eventuais problemas.
Os detalhes do entregador são entregues através do evento ASSIGN_DRIVER.
É possível rastrear a entrega do pedido através do endpoint /tracking. Além da posição, retorna também o pickupEtaStart e deliveryEtaEnd. Com essas informações o usuário do seu aplicativo, além de ter mais transparência conseguirá, por exemplo, automatizar o início do preparo do pedido e otimizar sua operação.
Campo | Descrição |
---|---|
latitude | Latitude do entregador no momento da consulta. Pode ser null quando ainda não recebemos a posição do entregador. |
longitude | Longitude do entregador no momento da consulta. Pode ser null quando ainda não recebemos a posição do entregador. |
expectedDelivery | Data/hora estimada para entrega do pedido. Pode ser null quando ainda não recebemos a posição do entregador. |
pickupEtaStart | Tempo estimado em segundos até a origem (coleta do pedido). Pode ser 0 ou null quando o entregador chega ao local de coleta ou negativo quando a coleta está atrasada. |
deliveryEtaEnd | Tempo estimado em segundos para entrega do pedido. Pode ser 0 ou null quando o entregador chega ao local de entrega. |
trackDate | Data/hora da consulta. Pode ser null quando ainda não recebemos a posição do entregador. |
O rastreamento só está disponível para pedidos entregues pela logística iFood.
Disponibilidade dos dados e intervalo de consulta Deve ser utilizado somente depois que o evento ASSIGN_DRIVER é gerado e pode ser consultado de 30 em 30 segundos. O endpoint poderá retornar 404 até que todas as informações sobre a entrega estejam disponíveis. Nesse caso você deve fazer uma nova consulta depois de 30 segundos.
Rate Limit Em caso de mau uso, o aplicativo poderá ser bloqueado pelas políticas de rate limit e throttling.
Antes de registrar um pedido de fora do iFood, é importante consultar a disponibilidade de entrega. É possível que o endereço não esteja dentro da área de cobertura e mesmo que o endereço esteja dentro da área , é possível que exista alguma indisponibilidade temporária na região, como raio de entrega reduzido temporariamente. Através dessa consulta é possível obter também a janela de tempo estimada para a entrega do pedido para informar o cliente.
Esse passo não é obrigatório, mas realizar a consulta antes de registrar o pedido evita que erros aconteçam e permitem que a loja se planeje na preparação do pedido.
Para consultar a disponibilidade logística, basta realizar a requisição GET /deliveryAvailabilities passando os seguintes parâmetros:
/shipping/v1.0/merchants/<merchantId>/deliveryAvailabilities?latitude=<latitude>&longitude=<longitude>
Este endpoint retorna o http status code 200 OK caso a logística esteja disponível. O corpo da resposta contém:
OFFLINE
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": "CardBrand",
"liability": "IFOOD",
"paymentType": "OFFLINE",
"method": "CREDIT"
},
{
"liability": "IFOOD",
"paymentType": "OFFLINE",
"method": "CASH",
"id": "93c1c7c7-61f1-4dd9-bb84-62a03254701d"
}
]
}
Este endpoint retorna o http status code 400 Bad Request caso a logística não esteja disponível para entregar o pedido nessa localização ou para esse merchant.
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
BadRequestMerchant | Parceiro indisponível |
DeliveryDistanceTooHigh | O endereço de entrega ultrapassa a área logística atendida pelo iFood |
OffOpeningHours | O pedido está fora do horário de funcionamento da logística iFood |
OriginNotFound | Ainda não entregamos na sua região, pois sua loja está fora da área logística do iFood |
ServiceAreaMismatch | O endereço da entrega está fora da nossa área de cobertura |
HighDemand | A logística iFood está temporariamente indisponível. Por favor, tente novamente mais tarde. |
MerchantStatusAvailability | Restaurante com pendência, acione o Suporte |
InvalidPaymentMethods | A forma de pagamento escolhida pelo cliente não é aceita pela maquininha do iFood |
NRELimitExceeded | Sua loja está com muitos entregadores parceiros aguardando. Libere entregadores para que consiga solicitar a entrega Sob Demanda. |
{
"code": "DeliveryDistanceTooHigh",
"message": "Sob Demanda indisponivel: o endereço da entrega esta a mais de 10 Km da sua loja.",
"details": ["Delivery distance too high"]
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao registrar esse pedido.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
{
"code": "InternalServerError",
"message": "Ops. Houve uma falha. Tente novamente em alguns instantes.",
"details": ["Internal server error"]
}
Para registrar um pedido e solicitar um entregador parceiro, basta realizar a requisição POST /orders passando no corpo as informações do pedido.
Atenção! Um entregador parceiro será alocado automaticamente após o registro com sucesso de um pedido através deste endpoint. Caso não seja possível realizar a entrega, o pedido não é registrado e é retornado um erro.
Para garantir a segurança das entregas evitando casos de extravio do pedido, um código de confirmação de entrega será gerado, esse código é composto pelos 4 últimos dígitos do telefone do consumidor final informado no pedido. O entregador iFood solicitará essa sequência de números ao efetuar a entrega.
Caso não tenha acesso ao telefone do cliente ou não deseje informá-lo, será necessário enviar o customer.phone.type=”STORE”
para que o código de confirmação de entrega não seja solicitado.
Para que o pedido tenha o código de confirmação de entrega habilitado é necessário que o telefone do cliente seja informado e este telefone seja válido, pois somente assim o cliente conseguirá informar o código de confirmação de entrega correto ao entregador iFood.
Atenção! O consumidor final precisa ser informado que o entregador iFood solicitará o código de confirmação, e que esse código refere-se aos 4 últimos dígitos do seu telefone. Caso o consumidor não tenha conhecimento do código no momento da entrega o pedido será cancelado, gerando uma experiência ruim para o cliente e prejuízos para o restaurante.
O código de confirmação será disponibilizado na página de rastreio do iFood para que o consumidor final possa informar o código correto ao entregador iFood.
Para disponibilizar o código de confirmação caso não use a página de rastreio do ifood, será necessário consumir o atributo metadata.CODE
do evento DELIVERY_DROP_CODE_REQUESTED
para que o código seja repassado ao consumidor final. Esse evento será propagado apenas em situações onde o código de confirmação for obrigatório, portanto caso o evento não seja enviado, significa que a confirmação de entrega não será necessária.
Atenção! Quando o código de confirmação de entrega for validado, propagaremos o evento DELIVERY_DROP_CODE_VALIDATION_SUCCESS
caso esse evento não seja enviado o código não terá sido validado.
Seguem abaixo todos os campos do pedido para ser registrado no iFood.
Observação: Campos marcados com asterisco (*) são obrigatórios.
Nome | Tipo | Descrição |
---|---|---|
customer* | object | Dados do cliente. |
customer.name* | string | Informa o nome do cliente. Formato: Livre, com limite de 50 caracteres. |
customer.phone* | object | Dados do telefone do cliente. |
customer.phone.type | string | Tipo do telefone do cliente, pode ser STORE/CUSTOMER. Caso não seja enviado será considerado CUSTOMER. |
customer.phone.countryCode* | string | Específica o código do país. Formato: Um número de 2 dígitos. Ex: 55. Não obrigatório se o customer.phone.type é STORE. |
customer.phone.areaCode* | string | Informa o código de área de uma localidade. Formato: Um número de 2 dígitos. Ex: 41. Não obrigatório se o customer.phone.type é STORE. |
customer.phone.number* | string | Informa o número de telefone do cliente. Formato: Um número de 7 a 9 dígitos Ex: 995663945. Não obrigatório se o customer.phone.type é STORE. |
delivery* | object | Dados de entrega do cliente. |
delivery.merchantFee* | float | Taxa de cobrança realizada pelo parceiro |
delivery.preparationTime | integer | Informa o tempo de preparo do pedido em segundos |
delivery.quoteId | string | ID da cotação solicitada anteriormente para solicitar a entrega |
delivery.deliveryAddress | object | Dados do endereço de entrega do cliente. |
delivery.deliveryAddress.postalCode* | string | Informa o CEP do endereço de entrega do cliente. Formato: Um número de 8 dígitos. Ex: 82510290 |
delivery.deliveryAddress.streetNumber* | string | Informa o número do endereço de entrega do serviço para o cliente. |
delivery.deliveryAddress.streetName* | string | Informa o nome da rua do cliente. Formato: Livre, com limite de 50 caracteres. |
delivery.deliveryAddress.complement | string | Informa o complemento (bloco, apartamento, etc) do cliente. Formato: Livre, com limite de 50 caracteres. |
delivery.deliveryAddress.reference | string | Informa o ponto de referência do cliente. Formato: Livre, com limite de 70 caracteres. |
delivery.deliveryAddress.neighborhood* | string | Informa o bairro do endereço do cliente. Formato: Livre, com limite de 50 caracteres. |
delivery.deliveryAddress.city* | string | Informa a cidade do endereço do cliente.Formato: Livre, com no mínimo 2 e no máximo 50 caracteres. |
delivery.deliveryAddress.state* | string | Informa o estado do endereço do cliente. Formato: Duas letras, representando a sigla do estado correspondente. Ex: PR |
delivery.deliveryAddress.country* | string | Informa o país do endereço do cliente. Formato: Duas letras Ex: BR |
delivery.deliveryAddress.coordinates* | object | Dados das coordenadas do endereço |
delivery.deliveryAddress.coordinates.latitude* | float | Informa a latitude do endereço do cliente. |
delivery.deliveryAddress.coordinates.longitude* | float | Informa a longitude do endereço do cliente. |
items* | array of objects | Dados de cada item do pedido. |
items.id* | uuid | Identificação do item |
items.name* | string | Informa o nome do item Formato: Livre, com limite de 50 caracteres. |
items.externalCode | string | Código do item no seu aplicativo |
items.quantity* | integer | Informa a quantidade do item. Valor deve ser maior que zero |
items.unitPrice* | float | Representa o preço unitário de cada item. Valor deve ser maior ou igual a zero. |
items.options | array of objects | Dados de complemento |
items.options.id* | uuid | Informa a identificador do complemento |
items.options.name* | string | Informa o nome do complemento Formato: Livre, com limite de 50 caracteres. |
items.options.externalCode | string | Código do item no seu aplicativo |
items.options.index* | integer | Informa o index no array das guarnições |
items.options.quantity* | integer | Informa a quantidade daquela guarnição. |
items.options.unitPrice* | float | Informa o preço unitário da guarnição. |
items.options.price* | float | Informa o preço total da guarnição options.price = options.quantity * options.unitPrice. |
items.price* | float | Informa o preço total do produto price = quantity * unitPrice. Valor deve ser maior ou igual a zero. |
items.optionsPrice* | float | Informa o preço total das guarnições. Valor deve ser maior ou igual a zero. |
items.totalPrice* | float | Informa o preço total totalPrice = price + optionsPrice. Valor deve ser maior ou igual a zero. |
payments | object | Informa as formas de pagamento |
payments.methods | array of objects | Métodos de pagamento. Obrigatório em caso de pagamento OFFLINE |
payments.methods.method* | string | CREDIT , DEBIT ou CASH (somente 1 opção) |
payments.methods.type* | string | Tipo de pagamento OFFLINE |
payments.methods.value* | float | Valor pago através do método informado |
payments.methods.card | object | Cartão de Crédito/Débito. Obrigatório caso o payment.methods.method seja CREDIT/DEBIT |
payments.methods.card.brand* | string | Bandeira do cartão de Crédito/Débito |
payments.methods.cash | object | Pagamento em Dinheiro. Obrigatório caso o payment.methods.method seja CASH |
payments.methods.cash.changeFor* | float | Troco para quanto. Valor em dinheiro físico que o driver deverá receber. |
displayId | string | Id amigável para facilitar a identificação do pedido pela loja e driver. Formato: Até 4 dígitos alfanuméricos. Ex: A4BC |
metadata | object | Metadados para informações adicionais, necessário, a identificação do pedido.Ex: M3019, idPDV501248, identificadorPOS Formato: Limite de 20 |
metadata.prop1* | Dictionary<string, string> | Informações adicionais |
{
"customer": {
"name": "Customer Name",
"phone": {
"type": "CUSTOMER",
"countryCode": "55",
"areaCode": "11",
"number": "999999999"
}
},
"delivery": {
"merchantFee": 0,
"preparationTime": 900,
"quoteId": "3d2a7e2c-34ad-4b72-9ee5-79cec2b482a7",
"deliveryAddress": {
"postalCode": "69923000",
"streetNumber": "100",
"streetName": "Ramal Bujari",
"complement": "",
"neighborhood": "Centro",
"city": "Bujari",
"state": "AC",
"country": "BR",
"reference": "Perto da padaria",
"coordinates": {
"latitude": -9.822159,
"longitude": -67.948475
}
}
},
"items": [
{
"id": "7b956744-38f6-418a-90fa-22676b53e6d1",
"name": "Produto Teste",
"externalCode": "123456",
"quantity": 1,
"unitPrice": 1,
"price": 1,
"optionsPrice": 0,
"totalPrice": 1,
"options": []
}
],
"payments": {
"methods": [
{
"method": "CREDIT",
"type": "OFFLINE",
"value": 1,
"card": {
"brand": "CardBrand"
}
}
]
},
"displayId": "AB3D",
"metadata": {
"additionalProp1": "string"
}
}
Pagamentos offline o entregador irá receber o valor do pedido na entrega via maquininha do iFood ou em dinheiro a depender do método enviado, é necessário enviar o objeto de payment.
É necessário que a cotação tenha esse método de pagamento na lista de paymentMethods
, caso contrário será retornado um erro.
Para pagamentos online não processamos pagamentos online, esse pagamento é arrecadado pelo Merchant, logo não é necessário o envio do objeto payment.
Para melhorar a eficiência e a satisfação do cliente, o campo delivery.preparationTime
pode ser utilizado para indicar o tempo necessário para preparar o pedido antes da alocação do entregador. Este campo é opcional e, quando não for enviado, o modelo atual de alocação imediata será mantido.
Como utilizar o Tempo de Preparo
delivery.preparationTime
não for enviado, a alocação do entregador ocorrerá imediatamente após a confirmação do pedido, seguindo o modelo atual.delivery.preparationTime
for enviado, a alocação do entregador será realizada apenas após o tempo de preparo especificado. Neste caso o campo delivery.preparationTime
deverá ser enviado com o valor correspondente ao tempo necessário em segundos. Por exemplo, se o tempo de preparo for de 15 minutos, envie delivery.preparationTime=900
. Isso permite que o restaurante tenha o tempo necessário para preparar o pedido antes que o entregador seja alocado.Atenção! É importante que o tempo de preparo informado seja o mais preciso possível para evitar atrasos na entrega e garantir uma boa experiência para o cliente. Informar um tempo de preparo incorreto pode resultar em uma experiência ruim para o cliente e prejuízos para o restaurante, como o fechamento por acúmulo de entregadores.
O campo metadata, permite adicionar informações complementares ao pedido, essas informações não são repassadas ao app do driver ou ao gestor de pedidos.
/shipping/v1.0/merchants/<merchantId>/orders
Este endpoint retorna o http status code 202 Accepted caso o pedido seja registrado com sucesso e o entregador parceiro alocado sem problemas. O corpo da resposta contém:
{
"id": "522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8",
"trackingUrl": "https://meupedido.ifood.com.br/522e4d7e-0ce1-44f3-8cc7-73a9f190a5e8"
}
O pedido de fora do iFood registrado é disponibilizado no polling?
Sim. O pedido que foi registrado para ser entregue por um dos entregadores parceiros do iFood é processado pela nossa infraestrutura e disponibilizado no polling da API de Order. O campo salesChannel ="POS"
identifica pedidos que foram importados e vieram de outro canal de aquisição.
É possível rastrear um pedido entregue pelo Sob Demanda? Sim. Após o pedido ser registrado com sucesso, é retornado o ID do pedido, que pode ser consultado no endpoint de tracking da API de Order.
Este endpoint retorna o http status code 400 Bad Request caso a logística não esteja disponível para entregar o pedido ou ocorra alguma falha ao registrar esse pedido.
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
BadRequestCustomer | Cliente indisponível |
BadRequestMerchant | Parceiro indisponível |
DeliveryDistanceTooHigh | O endereço de entrega ultrapassa a área logística atendida pelo iFood |
HighDemand | A logística iFood está temporariamente indisponível. Por favor, tente novamente mais tarde |
MerchantEasyDeliveryDisabled | Serviço não habilitado |
OffOpeningHours | O pedido está fora do horário de funcionamento da logística iFood |
OriginNotFound | Ainda não entregamos na sua região, pois sua loja está fora da área logística do iFood |
PaymentMethodNotFound | Método de pagamento não encontrado |
PaymentTotalInvalid | O valor pago através do método informado não coincide com o valor total da compra (os valores de “value” e “totalPrice” não batem) |
ServiceAreaMismatch | O endereço da entrega está fora da nossa área de cobertura |
NRELimitExceeded | Sua loja está com muitos entregadores parceiros aguardando. Libere entregadores para que consiga solicitar a entrega Sob Demanda. |
{
"code": "DeliveryDistanceTooHigh",
"message": "Sob Demanda indisponivel: o endereço da entrega esta a mais de 10 Km da sua loja.",
"details": ["Delivery distance too high"]
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao registrar esse pedido.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
{
"code": "InternalServerError",
"message": "Ops. Houve uma falha. Tente novamente em alguns instantes.",
"details": ["Internal server error"]
}
Através deste fluxo o cliente poderá confirmar o seu endereço ou solicitar a alteração do mesmo. Nos casos em que houver alteração do endereço de entrega, ocorrerá um processo de validação pelo parceiro, onde será deliberada a aprovação ou recusa da solicitação.
Os clientes que acompanham seus pedidos por meio da página de rastreio fornecida pelo iFood têm a opção de confirmar o endereço de entrega ou solicitar a sua alteração. Para que isso seja possível, é necessário que o pedido não tenha sido criado com o atributo customer.phone.type=”STORE”.
Atenção! Certifique-se de enviar o número correto do telefone do cliente, utilizado como WhatsApp, para que o código de confirmação de alteração (OTP) seja enviado. Esse procedimento é fundamental para garantir a segurança do parceiro, do cliente e da entrega.
Os parceiros que optarem por criar a sua própria experiência de confirmação ou solicitação de alteração do endereço de entrega devem implementar os endpoints responsáveis por este fluxo.
Atenção! Neste fluxo, o iFood não realiza nenhum processo de confirmação de alteração com envio de um código OTP. A responsabilidade de validar e garantir este processo fica a cargo do parceiro.
Para confirmar o endereço basta realizar a requisição POST /userConfirmAddress passando os seguintes parâmetros:
/shipping/v1.0/orders/<orderId>/userConfirmAddress
Esse endpoint retorna HTTP Status 202, sem nada no corpo da resposta O polling receberá um evento de DELIVERY_ADDRESS_CHANGE_USER_CONFIRMED quando a solicitação for um sucesso.
Este endpoint retorna o http status code 400 Bad Request caso os parâmetros esperados não sejam fornecidos.
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
{
"code": "BadRequest",
"message": "Houve um problema na leitura de informações. Verifique as informações enviadas.",
"details": ["Campo 'OrderID' deve estar no formato uuid."]
}
Este endpoint retorna o http status code 404 Not Found caso o pedido não seja encontrado, esteja concluído ou cancelado, ou tenha sido criado a mais de 8 horas.
Nome | Descrição |
---|---|
OrderNotFound | Pedido não encontrado |
{
"code": "OrderNotFound",
"message": "Pedido não encontrado.",
"details": []
}
Este endpoint retorna o http status code 409 Operation Conflict caso ocorra um conflito na operação, como tentar confirmar o endereço de um pedido com alteração pendente/confirmada/rejeitada.
Nome | Descrição |
---|---|
ChangeAddressOperationConflict | Conflito nas operações de alteração de endereço. |
{
"code": "ChangeAddressOperationConflict",
"message": "Existe um conflito na confirmação/solicitação de alteração de endereço desse pedido, ela já pode ter o endereço confirmado pelo cliente, ou uma solicitação de alteração pendente/concluida",
"details": []
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao registrar esse pedido.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
Quando for solicitada uma alteração do endereço de entrega, um evento DELIVERY_ADDRESS_CHANGE_REQUESTED será gerado e enviado por meio do polling. Este evento indica que foi solicitada a alteração do endereço, e o novo endereço solicitado estará disponível no atributo metadata.address.
Importante! Após o envio da solicitação de alteração do endereço de entrega, o parceiro terá até 15 minutos para aceitar ou rejeitar a solicitação. Caso nenhuma ação seja tomada dentro desse prazo, a solicitação será rejeitada automaticamente.
Para solicitar a alteração de endereço basta realizar a requisição POST /deliveryAddressChangeRequest passando os seguintes parâmetros:
Os parâmetros marcados com * são obrigatórios
/shipping/v1.0/orders/<orderId>/deliveryAddressChangeRequest
Esse endpoint retorna HTTP Status 202, sem nada no corpo da resposta O polling receberá um evento de DELIVERY_ADDRESS_CHANGE_REQUESTED quando a solicitação for um sucesso.
Este endpoint retorna o http status code 400 Bad Request caso os parâmetros esperados não sejam fornecidos.
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
MaxDistanceHigherThanAllowed | Caso a alteração de endereço passe de 500m. |
{
"code": "BadRequest",
"message": "Houve um problema na leitura de informações. Verifique as informações enviadas.",
"details": [
"Campo 'StreetName' é obrigatório.",
"Campo 'Neighborhood' é obrigatório.",
"Campo 'City' é obrigatório.",
"Campo 'State' é obrigatório.",
"Campo 'Country' é obrigatório.",
"Campo 'Latitude' é obrigatório.",
"Campo 'Longitude' é obrigatório."
]
}
Este endpoint retorna o http status code 404 Not Found caso o pedido não seja encontrado, esteja concluído ou cancelado, ou tenha sido criado a mais de 8 horas.
Nome | Descrição |
---|---|
OrderNotFound | Pedido não encontrado |
{
"code": "OrderNotFound",
"message": "Pedido não encontrado.",
"details": []
}
Este endpoint retorna o http status code 409 Operation Conflict caso ocorra um conflito na operação, como tentar confirmar o endereço de um pedido com alteração pendente/confirmada/rejeitada.
Nome | Descrição |
---|---|
ChangeAddressOperationConflict | Conflito nas operações de alteração de endereço. |
{
"code": "ChangeAddressOperationConflict",
"message": "Existe um conflito na confirmação/solicitação de alteração de endereço desse pedido, ela já pode ter o endereço confirmado pelo cliente, ou uma solicitação de alteração pendente/concluida",
"details": []
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao registrar esse pedido.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
Para aprovar a alteração de endereço basta realizar a requisição POST /acceptDeliveryAddressChange passando os seguintes parâmetros:
/shipping/v1.0/orders/<orderId>/acceptDeliveryAddressChange
Esse endpoint retorna HTTP Status 202, sem nada no corpo da resposta O polling receberá um evento de DELIVERY_ADDRESS_CHANGE_ACCEPTED quando a solicitação for um sucesso.
Este endpoint retorna o http status code 400 Bad Request caso os parâmetros esperados não sejam fornecidos.
Quando o erro tiver o nome RegionMismatch um evento DELIVERY_ADDRESS_CHANGE_DENIED será gerado automaticamente com o metadata.action="region-mismatch"
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
RegionMismatch | The new address is not in the same region as the original |
{
"code": "BadRequest",
"message": "Houve um problema na leitura de informações. Verifique as informações enviadas.",
"details": ["Campo 'OrderID' deve estar no formato uuid."]
}
Este endpoint retorna o http status code 404 Not Found caso o pedido não seja encontrado, esteja concluído ou cancelado, ou tenha sido criado a mais de 8 horas.
Nome | Descrição |
---|---|
OrderNotFound | Pedido não encontrado |
{
"code": "OrderNotFound",
"message": "Pedido não encontrado.",
"details": []
}
Este endpoint retorna o http status code 409 Operation Conflict caso ocorra um conflito na operação, como tentar confirmar o endereço de um pedido com alteração pendente/confirmada/rejeitada.
Nome | Descrição |
---|---|
ChangeAddressOperationConflict | Conflito nas operações de alteração de endereço. |
ChangeAddressOperationNotStarted | Não existe uma alteração de endereço pendente. |
{
"code": "ChangeAddressOperationConflict",
"message": "Existe um conflito na confirmação/solicitação de alteração de endereço desse pedido, ela já pode ter o endereço confirmado pelo cliente, ou uma solicitação de alteração pendente/concluida",
"details": []
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao registrar esse pedido.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
Para rejeitar a alteração de endereço basta realizar a requisição POST /denyDeliveryAddressChange passando os seguintes parâmetros:
/shipping/v1.0/orders/<orderId>/denyDeliveryAddressChange
Esse endpoint retorna HTTP Status 202, sem nada no corpo da resposta O polling receberá um evento de DELIVERY_ADDRESS_CHANGE_DENIED quando a solicitação for um sucesso.
Este endpoint retorna o http status code 400 Bad Request caso os parâmetros esperados não sejam fornecidos.
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
{
"code": "BadRequest",
"message": "Houve um problema na leitura de informações. Verifique as informações enviadas.",
"details": ["Campo 'OrderID' deve estar no formato uuid."]
}
Este endpoint retorna o http status code 404 Not Found caso o pedido não seja encontrado, esteja concluído ou cancelado, ou tenha sido criado a mais de 8 horas.
Nome | Descrição |
---|---|
OrderNotFound | Pedido não encontrado |
{
"code": "OrderNotFound",
"message": "Pedido não encontrado.",
"details": []
}
Este endpoint retorna o http status code 409 Operation Conflict caso ocorra um conflito na operação, como tentar confirmar o endereço de um pedido com alteração pendente/confirmada/rejeitada.
Nome | Descrição |
---|---|
ChangeAddressOperationConflict | Conflito nas operações de alteração de endereço. |
ChangeAddressOperationNotStarted | Não existe uma alteração de endereço pendente. |
{
"code": "ChangeAddressOperationConflict",
"message": "Existe um conflito na confirmação/solicitação de alteração de endereço desse pedido, ela já pode ter o endereço confirmado pelo cliente, ou uma solicitação de alteração pendente/concluida",
"details": []
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao registrar esse pedido.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
Para cancelar uma solicitação de entrega para pedidos que não são da plataforma iFood, é crucial entender algumas condições. Primeiramente, apenas os pedidos com o atributo salesChannel
definido como POS
podem ser cancelados. Qualquer pedido que não se enquadre neste contexto não poderá ser cancelado através do módulo de Shipping. Caso um motorista já tenha sido designado para o pedido, a responsabilidade pelo cancelamento deixa de ser do módulo de Shipping e passa a ser do módulo de Orders. Para obter mais informações sobre o processo de cancelamento e as responsabilidades envolvidas, consulte a documentação do iFood no Guia de Cancelamento de Pedido, disponível através do seguinte link: Guia de Cancelamento de Pedido iFood.
Para obter a lista de códigos de cancelamento válidos para um pedido, você pode usar o endpoint GET /cancellationReasons.
Para realizar o cancelamento, você deve fazer uma requisição para o endpoint POST /cancel, passando os seguintes parâmetros:
/shipping/v1.0/orders/<orderId>/cancel
Esse endpoint retorna HTTP Status 202, sem nada no corpo da resposta O polling receberá um evento de CANCELLATION_REQUESTED quando a solicitação for um sucesso e posteriormente os eventos de CANCELLED ou CANCELLATION_REQUEST_FAILED em caso de sucesso ou falha.
Este endpoint retorna o http status code 400 Bad Request caso os parâmetros esperados não sejam fornecidos.
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
{
"code": "BadRequest",
"message": "Houve um problema na leitura de informações. Verifique as informações enviadas.",
"details": ["Campo 'OrderID' deve estar no formato uuid."]
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao solicitar o cancelamento da entrega.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
{
"code": "InternalServerError",
"message": "Ops. Houve uma falha. Tente novamente em alguns instantes.",
"details": ["Internal server error"]
}
Para aprimorar a segurança da sua entrega, desenvolvemos um conjunto de regras que nos permitem qualificar o nível de confiança na entrega. Essa qualificação é baseada nos parâmetros informados durante a criação do pedido e na alteração ou confirmação do endereço realizadas pelo cliente após a criação do pedido.
Nome | Descrição |
---|---|
LOW | Nível de confiança baixo |
MODERATE | Nível de confiança moderado |
HIGH | Nível de confiança alto |
VERY_HIGH | Nível de confiança muito alto |
Nome | Descrição |
---|---|
customer_phone_valid | Para ser válido o telefone informado deve conter o valor do atributo diferente de customer.phone.type="STORE" , sem números repetidos ou em sequência e possuir mais do que 11 dígitos. |
customer_phone_is_fixed | O telefone é um telefone fixo com 8 dígitos. |
customer_address_confirmed | O endereço da entrega foi confirmado pelo cliente final. |
customer_address_change_requested | O cliente final solicitou a alteração do endereço da entrega. |
customer_address_change_approved | O parceiro aprovou a alteração do endereço da entrega. |
customer_address_change_denied | O parceiro rejeitou a alteração do endereço da entrega. |
Pedido com customer_phone_is_valid:false
terá um score LOW
.
Pedido com customer_phone_is_fixed:true
terá um score MODERATE
.
Pedido com customer_phone_is_fixed:true
e customer_address_confirmed:true
teria um score VERY_HIGH
.
Pedido com customer_phone_is_valid:true
terá um score HIGH
.
Pedido com customer_phone_is_valid:true
e customer_address_change_requested:true
e merchant_address_change_approved:true
terá um score VERY_HIGH
.
Pedido com customer_phone_is_valid:true
e customer_address_change_requested:true
e merchant_address_change_denied:true
terá um score LOW
.
O nível de confiança na entrega pode ser alterado após a criação do pedido. Ações realizadas após a criação do pedido, como a confirmação do endereço ou a solicitação de alteração de endereço, têm um impacto direto no nível de confiança na entrega.
Para descobrir qual o nível de confiança na entrega do seu pedido, basta enviar a requisição GET /safeDelivery passando os seguintes parâmetros.
/shipping/v1.0/orders/:orderId/safeDelivery
Este endpoint retorna o http status code 200 OK caso o pedido seja elegível a segurança na entrega. O corpo da resposta contém:
[string]boolean
contendo a regra e situação.rules
.{
"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"
}
Este endpoint retorna o http status code 400 Bad Request caso os parâmetros esperados não sejam fornecidos.
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
OrderWithoutSafeDelivery | Pedido não possui regras de confiança na entrega |
BadRequest
{
"code": "BadRequest",
"message": "Houve um problema na leitura de informações. Verifique as informações enviadas.",
"details": ["Campo 'OrderID' deve estar no formato uuid."]
}
OrderWithoutSafeDelivery
{
"code": "OrderWithoutSafeDelivery",
"message": "Pedido sem regras de confiança na entrega.",
"details": []
}
Este endpoint retorna o http status code 404 Not Found caso o pedido não seja encontrado.
Nome | Descrição |
---|---|
OrderNotFound | Pedido não encontrado |
{
"code": "OrderNotFound",
"message": "Pedido não encontrado.",
"details": []
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao consultar esse pedido.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
{
"code": "InternalServerError",
"message": "Ops. Houve uma falha. Tente novamente em alguns instantes.",
"details": ["Internal server error"]
}
Antes de registrar uma solicitação de entrega é importante consultar a cotação/disponibilidade de entrega. É possível que o endereço não esteja dentro da área de cobertura e mesmo que o endereço esteja dentro da área, é possível que exista alguma indisponibilidade temporária na região, como raio de entrega reduzido temporariamente. Através dessa consulta é possível obter também a janela de tempo estimada para a entrega do pedido para informar o cliente.
Esse passo não é obrigatório, mas realizar a consulta antes de registrar o pedido evita que erros aconteçam e permitem que a loja se planeje na preparação do pedido.
Para consultar a cotação da logística para um pedido pré-existente dentro da plataforma iFood, basta realizar a requisição GET /deliveryAvailabilities passando os seguintes parâmetros:
/shipping/v1.0/orders/<orderId>/deliveryAvailabilities
Este endpoint retorna o http status code 200 OK caso a logística esteja disponível. O corpo da resposta contém:
OFFLINE
CREDIT
ou DEBIT
{
"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": "CardBrand",
"liability": "IFOOD",
"paymentType": "OFFLINE",
"method": "CREDIT"
}
]
}
Este endpoint retorna o http status code 400 Bad Request caso a logística não esteja disponível para entregar o pedido nessa localização ou para esse merchant.
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
BadRequestMerchant | Parceiro indisponível |
DeliveryDistanceTooHigh | O endereço de entrega ultrapassa a área logística atendida pelo iFood |
OffOpeningHours | O pedido está fora do horário de funcionamento da logística iFood |
OriginNotFound | Ainda não entregamos na sua região, pois sua loja está fora da área logística do iFood |
ServiceAreaMismatch | O endereço da entrega está fora da nossa área de cobertura |
HighDemand | A logística iFood está temporariamente indisponível. Por favor, tente novamente mais tarde |
MerchantStatusAvailability | Restaurante com pendência, acione o Suporte |
InvalidPaymentMethods | A forma de pagamento escolhida pelo cliente não é aceita pela maquininha do iFood |
SaturatedOfflinePayment | No momento, a opção de pagamento na entrega está indisponível |
NRELimitExceeded | Sua loja está com muitos entregadores parceiros aguardando. Libere entregadores para que consiga solicitar a entrega Sob Demanda. |
{
"code": "DeliveryDistanceTooHigh",
"message": "Sob Demanda indisponivel: o endereço da entrega esta a mais de 10 Km da sua loja.",
"details": ["Delivery distance too high"]
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao registrar esse pedido.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
{
"code": "InternalServerError",
"message": "Ops. Houve uma falha. Tente novamente em alguns instantes.",
"details": ["Internal server error"]
}
Para solicitar o entregador concordando com a cotação retornada, utilize o seguinte endpoint POST /requestDriver passando no corpo as informações do pedido.
Esse endpoint é assíncrono. Quando sua requisição for processada você receberá um evento REQUEST_DRIVER confirmando que a requisição foi feita e em seguida o resultado da solicitação, que pode ser: REQUEST_DRIVER_SUCCESS
ou REQUEST_DRIVER_FAILED
.
Atenção! Um entregador parceiro será alocado automaticamente após a solicitação através deste endpoint. Caso não seja possível realizar a entrega, a solicitação de entrega não é registrada e é retornado um erro.
/shipping/v1.0/orders/<orderId>/requestDriver
Este endpoint retorna o http status code 202 Accepted caso o solicitação seja registrada com sucesso.
Este endpoint retorna o http status code 400 Bad Request caso a logística não esteja disponível para entregar o pedido ou ocorra alguma falha ao registrar esse pedido.
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
BadRequestCustomer | Cliente indisponível |
BadRequestMerchant | Parceiro indisponível |
DeliveryDistanceTooHigh | O endereço de entrega ultrapassa a área logística atendida pelo iFood |
HighDemand | A logística iFood está temporariamente indisponível. Por favor, tente novamente mais tarde |
MerchantEasyDeliveryDisabled | Serviço não habilitado |
OffOpeningHours | O pedido está fora do horário de funcionamento da logística iFood |
OriginNotFound | Ainda não entregamos na sua região, pois sua loja está fora da área logística do iFood |
ServiceAreaMismatch | O endereço da entrega está fora da nossa área de cobertura |
MerchantStatusAvailability | Restaurante com pendência, acione o Suporte |
InvalidPaymentMethods | A forma de pagamento escolhida pelo cliente não é aceita pela maquininha do iFood |
SaturatedOfflinePayment | No momento, a opção de pagamento na entrega está indisponível |
NRELimitExceeded | Sua loja está com muitos entregadores parceiros aguardando. Libere entregadores para que consiga solicitar a entrega Sob Demanda. |
{
"code": "DeliveryDistanceTooHigh",
"message": "Sob Demanda indisponivel: o endereço da entrega esta a mais de 10 Km da sua loja.",
"details": ["Delivery distance too high"]
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao registrar esse pedido.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
{
"code": "InternalServerError",
"message": "Ops. Houve uma falha. Tente novamente em alguns instantes.",
"details": ["Internal server error"]
}
Para cancelar a solicitação de um entregador iFood sem a necessidade de cancelar o pedido, o cancelamento da entrega deve ser realizado através do endpoint POST /orders/{id}/cancelRequestDriver.
O cancelamento só será efetuado se ele for solicitado antes do aceite do entregador, neste caso nenhuma taxa será cobrada da loja. Caso seja necessário realizar o cancelamento após do aceite do entregador, deve seguir as regras estabelecidas em Cancelamento de pedido.
O endpoint é assíncrono. Quando sua requisição for processada a loja receberá um evento DELIVERY_CANCELLATION_REQUEST_ACCEPTED, em caso de sucesso, ou DELIVERY_CANCELLATION_REQUEST_REJECTED, em caso de falha. Veja todos os detalhes desses eventos nessa seção.
Importante A ação é irreversível. Após cancelar a solicitação de um entregador, não será possível reverter esse serviço. Para que um novo entregador seja solicitado, uma nova solicitação de entregador deve ser realizada.
/shipping/v1.0/orders/<orderId>/cancelRequestDriver
Esse endpoint retorna HTTP Status 202, sem nada no corpo da resposta O polling receberá um evento de DELIVERY_CANCELLATION_REQUESTED quando a solicitação for enviada com sucesso.
Este endpoint retorna o http status code 400 Bad Request caso os parâmetros esperados não sejam fornecidos.
Nome | Descrição |
---|---|
BadRequest | Houve um problema ao solicitar a entrega. Verifique as informações enviadas |
{
"code": "BadRequest",
"message": "Houve um problema ao solicitar a entrega. Verifique as informações enviadas.",
"details": ["Campo 'OrderID' deve estar no formato uuid."]
}
Este endpoint retorna o http status code 500 Internal Server Error caso ocorra alguma falha ao solicitar o cancelamento da entrega.
Nome | Descrição |
---|---|
InternalServerError | Erro interno do servidor |
{
"code": "InternalServerError",
"message": "Ops. Houve uma falha. Tente novamente em alguns instantes.",
"details": ["Internal server error"]
}