# iFood Scraper - Brazil Food Delivery Prices (`rolezeiro/ifood-scraper`) Actor

Scrape dishes and restaurants from iFood, Brazil's #1 food delivery app. Search by keyword and location: dish prices and discounts, store rating, delivery fee, delivery time and distance.

- **URL**: https://apify.com/rolezeiro/ifood-scraper.md
- **Developed by:** [Lucas Bueno](https://apify.com/rolezeiro) (community)
- **Categories:** E-commerce, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 90.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## iFood Scraper

Extract dishes, products and stores from [iFood](https://www.ifood.com.br), Brazil's largest food delivery app, and export them to JSON, CSV or Excel. Search by keyword (pizza, sushi, açaí, a drink brand...) and by delivery location, and get dish prices and discounts, store rating, delivery fee, delivery time and distance, exactly as a customer at that address sees them.

Fast and lightweight: it reads iFood's own search, 100 dishes per request, without opening a browser.

### What data you get

**Dishes and products** (default output), one row per dish found:

| Field | Example |
|---|---|
| `name`, `description` | Pizza Grande (8 fatias) até 2 Sabores |
| `price` | 69.9 (BRL) |
| `priceIsStartingFrom` | `true` when the dish is priced by options and iFood shows "a partir de" |
| `originalPrice` | 99.9, the price before the discount (`null` if no discount) |
| `minimumPrice`, `hasOptions` | lowest price with options, for dishes with add-ons |
| `menuSection`, `taxonomy` | "Pizzas Salgadas", \["PIZZAS", "PIZZAS"] |
| `ean` | barcode, for supermarket and pharmacy products when available |
| `imageUrl` | dish photo |
| `merchantName`, `merchantCategory`, `merchantUrl`, `merchantId` | Pizzaria Piciocchi Pizza Mooca, Pizza |
| `merchantRating`, `merchantRatingCount` | 4.8, 3813 |
| `deliveryFee` | 21.99 (0 = free delivery) |
| `deliveryTimeMin`, `deliveryTimeMax` | 43, 58 (minutes) |
| `distanceKm` | 7.54 |
| `citySlug` | sao-paulo-sp |
| `searchTerm`, `searchLatitude`, `searchLongitude` | the search that found it |

**Stores**, one row per store (each store once across all searches): `name`, `category`, `rating`, `ratingCount`, `deliveryFee`, `deliveryTimeMin`, `deliveryTimeMax`, `distanceKm`, `isOpen`, `features` (delivery, takeout, scheduling), `logoUrl`, `citySlug`, `url`, `id`.

No personal data (customer names, phone numbers or emails) is collected.

### Use cases

- Menu price monitoring of competitors in a neighborhood
- Delivery fee and delivery time studies by area
- Discount and promotion tracking
- Restaurant and store lists by category for market mapping and B2B prospecting
- Product price and availability checks for brands sold through iFood (drinks, groceries, pharmacy)

### How to use

1. **Search terms:** what you would type in the iFood search box, e.g. `pizza`, `hambúrguer`, `poke`, `heineken`.
2. **Locations:** `latitude,longitude` (e.g. `-23.5617,-46.6560`) or a Brazilian state capital name (`São Paulo`, `Rio de Janeiro`, `Belo Horizonte`, `Recife`... all 27 capitals). iFood lists the stores that deliver to that point.
3. **Output:** dishes and products, or stores.

Each term is searched at each location. iFood returns at most about 1,000 dishes per term and location; to cover a whole city, add points in several neighborhoods and more specific terms.

Keep the default Brazilian residential proxy: iFood blocks many datacenter IPs and limits how many requests each IP can make.

#### Input example

Every pizza and burger place that delivers to Avenida Paulista (São Paulo) and to central Recife, one row per store:

```json
{
  "searchTerms": ["pizza", "hambúrguer"],
  "locations": ["-23.5617,-46.6560", "Recife"],
  "outputType": "merchants",
  "maxItems": 1000
}
```

#### Tips

- **Whole city:** iFood lists stores that deliver to a point (in our tests, half were within 5 km and almost all within 15 km). For a big city, add one location per region, e.g. São Paulo's north, south, east and west zones as coordinates.
- **More stores per area:** add more terms (`lanche`, `marmita`, `japonesa`, `açaí`, `mercado`, `farmácia`...). In "Stores" output each store is saved once, however many terms find it.
- **Brands and products:** search a brand name (`coca-cola`, `heineken`) to see which stores sell it and at what price.

### Output example

**Dishes and products:**

```json
{
  "type": "item",
  "id": "0e6e2c16-1684-4bfc-b18a-0d3afd72107e",
  "name": "Pizza Grande ( 8 fatias) até 2 Sabores",
  "price": 69.9,
  "priceIsStartingFrom": false,
  "originalPrice": 99.9,
  "hasOptions": true,
  "menuSection": "< As mais vendidas >",
  "merchantName": "Pizzaria Piciocchi Pizza Mooca",
  "merchantCategory": "Pizza",
  "merchantRating": 4.8,
  "merchantRatingCount": 3813,
  "deliveryFee": 21.99,
  "deliveryTimeMin": 43,
  "deliveryTimeMax": 58,
  "distanceKm": 7.54,
  "citySlug": "sao-paulo-sp",
  "merchantUrl": "https://www.ifood.com.br/delivery/sao-paulo-sp/pizzaria-piciocchi-pizza-mooca-vila-bertioga/42e0069f-7cb6-4058-b703-2aa395465233",
  "searchTerm": "pizza"
}
```

**Stores:**

```json
{
  "type": "merchant",
  "id": "8194302d-26be-49db-8615-90ba5d5d94e9",
  "name": "Spazio Burguer Zn",
  "url": "https://www.ifood.com.br/delivery/recife-pe/spazio-burguer-zn-casa-forte/8194302d-26be-49db-8615-90ba5d5d94e9",
  "category": "Lanches",
  "rating": 4.7,
  "ratingCount": 375,
  "deliveryFee": 16.99,
  "deliveryTimeMin": 21,
  "deliveryTimeMax": 36,
  "distanceKm": 4.8,
  "isOpen": true,
  "features": ["DELIVERY", "TAKEOUT", "SCHEDULING", "IMMEDIATE_ORDER", "TRACEABLE", "TRACKING"],
  "citySlug": "recife-pe",
  "searchTerm": "hamburguer"
}
```

### Pricing

**$1.50 per 1,000 results**: you pay per dish or store saved, with no start fee. Duplicates are never charged. For example, 1,000 stores across two cities cost $1.50. Set a spending limit on the run and the Actor stops by itself when it reaches it.

### FAQ

**Can I get the full menu or the store's CNPJ and address?** Not yet. This Actor reads iFood's search, which returns the dishes that match your terms and the store summary. Full menus and store details are planned.

**Why do prices and fees depend on the location?** iFood shows each customer the stores that deliver to their address, with fees and times for that distance. The Actor searches from the points you give, so the data matches what a customer there sees.

**Why did I get at most ~1,000 dishes per search?** That is the limit of iFood's search. Use more locations or more specific terms.

**Can I search any city?** Yes, with coordinates (`latitude,longitude`; right-click a spot in Google Maps to copy them). The 27 state capitals can also be typed by name.

**How fast is it?** About 1,000 dishes or stores per minute.

**Is the data in Portuguese?** Prices and numbers are plain numbers. Dish names, descriptions and categories keep the original Portuguese values from iFood.

**Something broke or a field is missing?** Open an issue in the Issues tab. The Actor is tested against the live site every day.

# Actor input Schema

## `searchTerms` (type: `array`):

What to search for, exactly as in the iFood app search box. E.g. pizza, hambúrguer, sushi, açaí, coca-cola. Each term is searched at each location.

## `locations` (type: `array`):

Delivery points to search from. Use "latitude,longitude" (e.g. -23.5617,-46.6560) or the name of a Brazilian state capital (e.g. São Paulo, Rio de Janeiro, Recife). iFood shows the stores that deliver to that point, so prices, fees and times are as seen by a customer there. To cover a whole city, add several points in different neighborhoods.

## `outputType` (type: `string`):

Dishes: one row per dish or product found, with its store. Stores: one row per store (each store once), for store lists and market mapping.

## `maxItems` (type: `integer`):

Maximum number of results (dishes or stores) in total. iFood returns at most about 1,000 dishes per term and location; use more terms or locations for more.

## `proxyConfiguration` (type: `object`):

Proxy used for requests. Brazilian residential proxy is recommended: iFood blocks many datacenter IPs and rate-limits each IP.

## Actor input object example

```json
{
  "searchTerms": [
    "pizza"
  ],
  "locations": [
    "São Paulo"
  ],
  "outputType": "items",
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}
```

# Actor output Schema

## `dishes` (type: `string`):

Dishes and products found, with their store (output "Dishes and products").

## `stores` (type: `string`):

Stores found, one row each (output "Stores").

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "pizza"
    ],
    "locations": [
        "São Paulo"
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rolezeiro/ifood-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["pizza"],
    "locations": ["São Paulo"],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("rolezeiro/ifood-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "pizza"
  ],
  "locations": [
    "São Paulo"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BR"
  }
}' |
apify call rolezeiro/ifood-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rolezeiro/ifood-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hB0hsjbWQr92tl6hy/builds/p2Kwsvij2cfpdflA2/openapi.json
