Foody Delivery API v1.2
A Foody Delivery disponibiliza uma API que permite que outros sistemas se conectem à plataforma e automatizem diversas ações relacionadas aos pedidos.
O que é possível fazer via API
- Inserir novos pedidos diretamente na Foody Delivery;
- Alterar o status de pedidos, como pronto, finalizado, cancelado;
- Consultar os detalhes de um pedido, incluindo informações do cliente, dados da coleta, dados da entrega e muito mais;
- Consultar detalhes de pedidos em um intervalo de datas;
- Acompanhar em tempo real a localização dos entregadores que estão em rota de entrega.
Em resumo: a API da Foody Delivery permite que empresas integrem seus sistemas para gerenciar pedidos e entregas de forma prática e automatizada.
O que tem de novo nesta versão?
- Check Updates é um novo método disponível para verificar periodicamente (polling) os updates dos pedidos dentro da Foody Delivery.
- Update Status é um método exclusivo para mudar o status dos pedidos;
- Tracking novo método para acessar a geolocalização do entregador do pedido;
- O formato das datas agora está mais completo incluindo o time zone (fuso horário), no formato yyyy-MM-dd’T’HH:mm:ssX;
- Exemplo: dia 22/06/2020, hora 21:30:01 e fuso Brasília (-03:00) seria equivalente a 2020-06-22T21:30:01-03:00.
- Campo ifoodLocalizer: para pedidos que vem do IFood, você pode informar o localizador do pedido no IFood. Assim o entregador consegue confirmar a entrega do pedido no IFood através do app da Foody Delivery;
- Campo postalCode: possibilidade de enviar o CEP de entrega pela propriedade deliveryAddress.postalCode – Esta propriedade não é obrigatória, mas caso esteja presente no payload (estrutura de dados), precisa ser um CEP válido;
- RateLimit: 100 requisições/minuto.
- Campo deliveryDueDate: para envio do prazo de entrega no formato yyyy-MM-dd’T’HH:mm:ssX. Esta propriedade não é obrigatória, mas caso esteja presente no payload (estrutura de dados), precisa ser no formato yyyy-MM-dd’T’HH:mm:ssX, exemplo, 2020-06-22T21:30:01-03:00.
Headers
- Authorization: <token de autorização>
- Content-Type: application/json;charset=UTF-8
Token de autorização
Para obter o token de autorização você precisa acessar Menu ➡ Minha Conta ➡ APIs e Hooks e copiar o token da tela.
Adicionar pedido (Order)
Ao cadastrar um novo pedido na Foody Delivery, nem todas as informações ficam disponíveis imediatamente. Alguns dados só são preenchidos automaticamente pelo sistema depois, como por exemplo:
- Data de entrega
- Entregador (courier)
No momento da criação você vê apenas as informações básicas. Os detalhes finais são completados pela Foody Delivery após o processamento.
Rota (url): https://app.foodydelivery.com/rest/1.2/orders
Method: POST
Payload Request (estrutura de dados para requisição)
{
"id": "301",
"status": "open",
"deliveryFee": 5.0,
"paymentMethod": "money",
"notes": "semcebola",
"courierFee": 4.0,
"orderTotal": 84.5,
"orderDetails": "1xpizzadecalabresa",
"deliveryPoint": {
"address": "RuaJoséNeves,590",
"street": "RuaJoséNeves",
"houseNumber": "590",
"postalCode": "04650-140",
"coordinates": {
"lat": -23.657821664941558,
"lng": -46.67431259551918
},
"city": "SãoPaulo",
"region": "SP",
"country": "BR",
"complement": "sala03"
},
"customer": {
"customerPhone": "+5511987521144",
"customerName": "JosédaSilva",
"customerEmail": "nome@empresa.com"
},
"date": "2020-06-18T14:13:27-03:00",
"deliveryDueDate": "2020-06-18T15:13:27-03:00"
}
Payload Response (estrutura de dados de resposta):
{
"uid": "0afa5b6c-135f-4e9a-9d00-5ff64c97d30a",
"id": "301",
"status": "open",
"deliveryFee": 5.0,
"paymentMethod": "money",
"notes": "semcebola",
"courierFee": 4.0,
"orderTotal": 84.5,
"orderDetails": "1xpizzadecalabresa",
"deliveryPoint": {
"address": "RuaJoséNeves,590",
"street": "RuaJoséNeves",
"houseNumber": "590",
"postalCode": "04650-140",
"coordinates": {
"lat": -23.657821664941558,
"lng": -46.67431259551918
},
"city": "SãoPaulo",
"region": "SP",
"country": "BR",
"complement": "sala03"
},
"customer": {
"customerPhone": "+5511987521144",
"customerName": "JosédaSilva",
"customerEmail": "nome@empresa.com"
},
"date": "2020-06-18T14:13:27-03:00",
"deliveryDueDate": "2020-06-18T15:13:27-03:00"
}
Parâmetros (propriedades | atributos | campos | chaves | elementos)
Nome | Descrição | Obrigatório | Formato |
---|---|---|---|
id | Identificador do pedido | Sim | Texto com tamanho máximo de 10 caracteres |
date | Data e hora de quando o pedido foi criado | Não | Data no formato:yyyy-MM-dd'T'HH:mm:ssXXX Se este campo não for preenchido, a data corrente é usada. Exemplo: 2020-06-22T21:30:01-03:00 |
deliveryDueDate | Date e hora de prazo de entrega do pedido | Não | Timestamp no formato:yyyy-MM-dd'T'HH:mm:ssXXX Se este campo não for preenchido, será aplicado o prazo de entrega padrão. Exemplo:2020-06-22T21:30:01-03:00 |
status | Situação do pedido | Sim | Texto-Enum, deve ser um dos valores abaixo:open | ready |
deliveryFee | Valor da entrega | Não | Número decimal no formato 00.00 |
paymentMethod | Meio de pagamento do pedido | Não | Texto-Enum, deve ser um dos valores abaixo:money | card | online | on_credit | pixe_wallet |
notes | Observações do pedido | Não | Texto sem limite de caracteres. |
courierFee | Taxa do entregador | Não | Número decimal no formato 00.00 |
orderTotal | Valor total do pedido | Não | Número decimal no formato 00.00 |
orderDetails | Detalhes do pedido (itens, quantidades, preços e etc) | Não | Texto sem limite de caracteres. Preferencialmente deve descrever os itens do pedido de maneira estruturada. Exemplo: 1x Macarrão a bolonhesa | R$ 25,991x Queijo ralado1x Pizza Grande | R$ 30,991/2 Calabresa1/2 Mussarela1x Coca cola 2 litros | R$ 12,49 |
ifoodLocalizer | Localizador do pedido (iFood) | Não | Texto sem limite de caracteres. É importante ressaltar que o iFood atualmente emprega este localizador de pedidos como parte do processo de confirmação de entrega por parte dos entregadores. Esse localizador é composto por oito caracteres. Exemplo: 12345678 |
deliveryPoint | Endereço de entrega do pedido | Sim | Objeto json, veja mais detalhes abaixo. |
deliveryPoint.address | Endereço completo de entrega do pedido | Sim | Texto sem limite de caracteres. Preferencialmente deve estar no formato:[logradouro],[número],[bairro] Exemplo: Avenida Paulista, 1000, Bela Vista |
deliveryPoint.street | Nome da rua da entrega do pedido | Obrigatório somente quando o campo coordinates é preenchido | Texto sem limite de caracteres. |
deliveryPoint.houseNumber | Número da rua da entrega do pedido | Obrigatório somente quando o campo coordinates é preenchido | Texto sem limite de caracteres. |
deliveryPoint.postalCode | CEP da rua da entrega do pedido | Não | Texto no formato:00000-000 ou 00000000 |
deliveryPoint.coordinates | Coordenadas do endereço de entrega do pedido | Não | Campo número (double) com latitude e longitude das coordenadas do ponto exato de entrega. Obs: quando este campo é omitido, a Foody Delivery usa o campo deliveryPoint.address para obter as coordenadas. Use este campo somente quando você tem as coordenadas exatas do ponto de entrega, caso contrário ele deve ser omitido. Ao usá-lo, você também deve preencher outros campos como street, city, region e etc. |
deliveryPoint.city | Nome da cidade da entrega do pedido | Obrigatório somente quando o campo coordinates é preenchido | Texto sem limite de caracteres. |
deliveryPoint.region | Nome do estado da entrega do pedido | Obrigatório somente quando o campo coordinates é preenchido | Texto sem limite de caracteres. |
deliveryPoint.country | Nome do país da entrega do pedido | Obrigatório somente quando o campo coordinates é preenchido | Texto no formato ISO 3166-1 (exemplo: BR para Brasil). |
deliveryPoint.complement | Complemento da entrega do pedido | Não | Texto sem limite de caracteres. |
customer | Cliente do pedido | Não | Objeto json, mais detalhes abaixo. |
customer.customerPhone | Telefone do Cliente | Não | Texto sem limite de caracteres. Preferencialmente no formato internacional: +[país][cidade][número] Exemplo: +5511999998888 |
customer.customerName | Nome do Cliente | Não | Texto sem limite de caracteres. |
customer.customerEmail | Email do Cliente | Não | Texto sem limite de caracteres no formato de email. |
O campo uid que consta no payload da response é o ID do pedido na Foody Delivery, este campo deve ser utilizado para resgatar (GET) ou atualizar (PUT) o pedido.
Resgatar pedido (Order)
O payload (estrutura de dados) deste endpoint contém mais informações que os outros métodos (adicionar e atualizar pedido). Isso acontece porque aqui é retornado também informações que são criadas ou atualizadas exclusivamente pela Foody Delivery.
Essas informações extras são adicionadas automaticamente pelo sistema da Foody Delivery para dar mais contexto sobre o pedido e auxiliar no acompanhamento do processo.
Exemplos de dados que podem aparecer:
- courier: dados do entregador que foi atribuído ao pedido (quem vai buscar e entregar).
- collectionPoint: ponto de coleta definido, como a loja, restaurante ou centro de distribuição.
- datas do sistema: registros internos criados automaticamente, como horário de aceite do pedido, momento da coleta, horário de saída para entrega, entre outros.
Esses campos não precisam ser informados manualmente por quem integra com a API. Eles são controlados e gerados pela própria plataforma da Foody Delivery para garantir que todos os pedidos tenham informações consistentes e atualizadas em tempo real.
Rota (Url): https://app.foodydelivery.com/rest/1.2/orders/{uid}
Method: GET
Payload Response (estrutura de dados de resposta):
{
"uid": "0afa5b6c-135f-4e9a-9d00-5ff64c97d30a",
"id": "301",
"status": "delivered",
"deliveryFee": 5,
"paymentMethod": "money",
"notes": "semcebola",
"courierFee": 4,
"orderTotal": 84,
"orderDetails": "1xpizzadecalabresa",
"orderTrackerUrl": "https://app.foodydelivery.com/trk/58f37fe7-ddaf-46db-8918-e34d0b920062",
"despatchMode": "manual",
"deliveryPoint": {
"address": "RuaJoséNeves,590",
"street": "RuaJoséNeves",
"houseNumber": "590",
"postalCode": "04650-140",
"coordinates": {
"lat": -23.657821664941558,
"lng": -46.67431259551918
},
"city": "SãoPaulo",
"region": "SP",
"country": "BRA",
"complement": "sala03"
},
"collectionPoint": {
"name": "DardisBistro",
"address": "RuaJoséNeves,1000,VilaSãoPaulo",
"postalCode": "04650-141",
"coordinates": {
"lat": -23.6563874,
"lng": -46.6705633
},
"city": "SãoPaulo",
"region": "SP",
"country": "BR"
},
"customer": {
"customerPhone": "+5511987521144",
"customerName": "JosédaSilva",
"customerEmail": "nome@empresa.com"
},
"courier": {
"courierPhone": "+5511999999993",
"courierName": "MariaHelena",
"courierType": "internal"
},
"date": "2020-06-18T14:13:27-03:00",
"readyDate": "2020-06-18T14:13:32-03:00",
"despatchDate": "2020-06-18T14:13:35-03:00",
"collectedDate": "2020-06-18T14:13:47-03:00",
"deliveryDate": "2020-06-18T14:13:52-03:00",
"creationDate": "2020-06-18T14:13:27-03:00",
"updateDate": "2020-06-18T14:13:53-03:00",
"deliveryDueDate": "2020-06-18T15:13:27-03:00"
}
Listar pedidos (Orders)
O limite máximo de resultados por requisição é de 500 pedidos, sempre ordenados pelo campo date (data de criação/registro do pedido).
Se sua requisição retornar exatamente 500 pedidos, significa que ainda podem existir outros pedidos além desse limite.
Nesse caso, é necessário fazer uma nova requisição para buscar os próximos resultados.
Como fazer isso:
- Utilize a mesma consulta anterior;
- Ajuste o parâmetro de data inicial (
startDate
) para um valor maior que o campodate
do último pedido retornado na requisição anterior; - Assim, você conseguirá continuar de onde parou e trazer os próximos pedidos, sem repetir nem perder registros.
Dessa forma, você consegue paginar os pedidos de forma segura e garantir que todos os dados sejam recuperados corretamente.
Rota (Url): https://app.foodydelivery.com/rest/1.2/orders/?startDate={startDate}&endDate={endDate}
Method: GET
Parâmetros startDate
e endDate
devem estar no formato yyyy-MM-dd'T'HH:mm:ssXXX
O payload de response é uma lista de pedidos (Orders) sendo cada pedido um objeto idêntico ao resgate individual.
Atualizar pedido (Order)
Rota (Url): https://app.foodydelivery.com/rest/1.2/orders/{uid}
Method: PUT
Os payloads de request e response para esta operação são idênticos ao da operação de adicionar pedido (POST) excluindo os campos uid
e date
.
Atualizar status (Order)
Método para atualizar o status de um pedido. Esse método permite alterar o estado atual de um pedido dentro do sistema da Foody Delivery. Ele é utilizado para indicar mudanças importantes no ciclo de vida do pedido, como quando ele está pronto, foi finalizado ou cancelado.
A atualização de status não é livre:
- Você só pode atualizar um pedido para um dos seguintes estados:
- ready → indica que o pedido foi preparado e está pronto para ser retirado ou entregue;
- closed → indica que o pedido passou por todo o ciclo de vida;
- cancelled → indica que o pedido foi cancelado e não será mais processado.
Essas restrições existem para garantir que o fluxo do pedido siga regras consistentes e compatíveis com a operação da plataforma, evitando transições inválidas ou confusas no acompanhamento.
💡 Exemplo prático:
- Se houve algum problema (como cancelamento pelo cliente ou falta de produto), o status pode ser alterado para cancelled;
- Quando a cozinha finaliza o preparo, o status pode ser atualizado para ready;
- Após o pedido passar por todo o seu ciclo de vida, o status poderá ser atualizado para closed;
Rota (Url): https://app.foodydelivery.com/rest/1.2/orders/updatestatus/{uid}
Method: PUT
Payload Request (estrutura de dados para requisição)
{
"status": "closed"
}
Checar atualizações (Order)
Método para verificar se existe alguma atualização em um conjunto de pedidos. Geralmente ele é usado em um polling para saber quais pedidos sofreram updates. A request deste método deve ser uma lista de UIDs de pedidos.
Não recomendamos o uso de polling, ao invés disso você pode utilizar nossos web-hooks para ser notificado sobre updates, verifique a documentação técnica dos hooks. Agora, se você precisa realmente usar polling, nós recomendamos que ele seja feito a cada 30 segundos ou mais, não mais frequente que isso.
Rota (Url): https://app.foodydelivery.com/rest/1.2/orders/checkupdates
Method: POST
Payload Request (estrutura de dados para requisição)
[
"8530a496-00a9-42ba-ad15-aa4bfe3124b7",
"d10e5858-0bb2-4a66-871b-548221ae673c",
"efdc92dc-3025-45ae-9c37-78ab1d3be831"
]
Payload Response (estrutura de dados de resposta):
[
{
"uid": "8530a496-00a9-42ba-ad15-aa4bfe3124b7",
"updateDate": "2020-06-18T10:40:20-03:00",
"status": "open"
},
{
"uid": "d10e5858-0bb2-4a66-871b-548221ae673c",
"updateDate": "2020-06-18T10:40:27-03:00",
"status": "ready"
},
{
"uid": "efdc92dc-3025-45ae-9c37-78ab1d3be831",
"updateDate": "2020-06-18T10:48:38-03:00",
"status": "onGoing"
}
]
Resgatar geolocalização do entregador
Método para acessar a geolocalização do entregador de um determinado pedido. Esse método permite visualizar a localização em tempo real do entregador associado a um pedido específico.
Caso o entregador esteja realizando uma rota com múltiplos pedidos ao mesmo tempo, a resposta também incluirá a rota completa, mostrando os pontos de coleta (onde ele busca os pedidos) e de entrega (endereços dos clientes).
Com essas informações adicionais, é possível:
- Identificar em qual etapa da rota o entregador se encontra no momento;
- Entender quais paradas já foram concluídas;
- Saber exatamente a ordem de prioridade dos pedidos dentro daquela rota (campo position).
Exemplo prático
Imagine que o entregador tenha 3 entregas programadas na mesma rota:
- Entrega 01 → position 1
- Entrega 02 → position 2
- Entrega 03 → position 3
Se você consultar a entrega 03, o sistema irá retornar:
- A localização atual do entregador em tempo real;
- A informação de que as entregas 01 e 02 ainda precisam ser feitas antes da entrega 03.
Dessa forma, você consegue não apenas ver onde está o entregador, mas também prever quando o pedido realmente será entregue, considerando a sequência da rota.
As informações de geolocalização e rota somente serão retornadas se o pedido consultado estiver com o status onGoing (A caminho).
Rota (Url): https://app.foodydelivery.com/rest/1.2/orders/tracking/{orderuid}
Method: GET
Payload Response (estrutura de dados de resposta):
{
"status": "onGoing",
"courierLocationCoordinates": {
"lat": -23.6563874,
"lng": -46.6705633
},
"pointsToCollect": [
{
"pointId": "5645599001018368",
"pointName": "HamburgueriadoJosé",
"pointType": "company",
"address": "AvenidaPaulista,1300-BelaVista,SãoPaulo-SP,Brasil",
"coordinates": {
"lat": -23.5631708,
"lng": -46.65423770000001
},
"position": 1,
"status": "open"
}
],
"pointsToDelivery": [
{
"pointType": "order",
"address": "RuaBarataRibeiro,161",
"coordinates": {
"lat": -23.556147397573575,
"lng": -46.651863660343565
},
"position": 1,
"status": "open"
}
]
}
Lista de erros
HTTP Status | Error Code | Description |
---|---|---|
400 | E09 | Invalid dates |
400 | E12 | Invalid address format |
400 | E17 | Mandatory property |
400 | E21 | The value for property is not valid |
400 | E22 | Only orders on status open or ready can be updated |
400 | E47 | No tracking data is available for this order |
401 | E19 | Unauthorized access |
403 | E04 | Order Limit exceeded |
403 | E11 | API usage not allowed to Free Plan |
403 | E25 | Need cancellation reason and cancellation reason for courier company, order already collected. |
404 | E20 | Order not found |
429 | EC_B010 | Too many requests, rate limit for this endpoint has been reached |
500 | E18 | Unknown error |
Lista de status
Status do Pedido | Descrição |
---|---|
open | Pedido adicionado no Sistema da Foody |
ready | Pedido pronto para ser despachado |
dispatched | Pedido despachado (atribuído) para entregadores |
accepted | Pedido aceito pelo entregador |
onGoing | Pedido a caminho da entrega |
delivered | Pedido entregue |
closed | Pedido finalizado |
cancelled | Pedido cancelado |
rejected | Pedido rejeitado |
Rate limit
Rota | Url | Endpoint | Limite |
---|---|
POST /rest/1.2/orders | 100 req/min |
PUT /rest/1.2/orders/{uid} | 100 req/min |