# iFood Scraper — Anti-Block: Menus, Prices & Reviews (`viralanalyzer/ifood-restaurant-intelligence`) Actor

iFood scraper with URL enrichment. Extract restaurants, menus with prices, reviews and ratings. Pass URLs directly OR search by city. Start FREE.

- **URL**: https://apify.com/viralanalyzer/ifood-restaurant-intelligence.md
- **Developed by:** [viralanalyzer](https://apify.com/viralanalyzer) (community)
- **Categories:** E-commerce, Lead generation
- **Features:** Limited permissions
- **Stats:** 234 total users, 23 monthly users, 99.8% runs succeeded, 0 bookmarks
- **User rating**: 4.05 out of 5 stars

## Pricing

$25.00 / 1,000 restaurant scrapeds

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 — Restaurant Menus, Prices & Reviews

> Extract public restaurant data, menu items with prices, delivery information, and review summaries from iFood, with explicit menu coverage metadata.

***

### 🇺🇸 English

#### What does it do?

Extracts public restaurant data from [iFood](https://www.ifood.com.br). Get restaurant names, ratings, delivery information, menu items exposed by the available sources, and optional review summaries as structured JSON. Menu coverage fields distinguish local truncation, direct catalog responses, and partial search fallback results.

#### ✨ Two Modes

##### 🔗 URL Mode (NEW) — Enrich specific restaurants

Pass one or more valid iFood restaurant URLs to extract structured data without running city/address discovery. This mode is useful when you already know the restaurants to enrich.

```
https://www.ifood.com.br/delivery/sao-paulo-sp/bubblekill-patio-paulista-bela-vista/5024be82-d729-41b9-a64f-d44ba306f232
```

##### 🏙️ Search Mode — Discover restaurants near an address

Set a city and delivery address to discover restaurant cards surfaced by iFood for that location. The Actor processes up to 200 selected restaurants; the actual number and available fields depend on the source response.

***

#### Features

- 🔗 **URL Enrichment** — Paste iFood URLs and extract data directly, no city/address needed
- 🍕 **Restaurant Data** — Name, rating, delivery fee, category, distance, open/closed status
- 📋 **Menu Data & Coverage** — Item names, prices, descriptions, optional EAN/GTIN, images when exposed, plus source and coverage metadata
- ⭐ **Reviews** — Ratings and comments when exposed by the optional reviews source
- 📊 **Price Intelligence** — Average, cheapest, and most expensive prices computed from returned menu items
- 🏙️ **City/Address Search** — Accepts Brazilian city slugs and delivery addresses; results depend on iFood coverage for the location
- 🔍 **Search & Filter** — Filter by cuisine type (pizza, sushi, hamburger, etc.)
- 🛡️ **Proxy Fallback** — Supports a configured Brazilian residential proxy when a direct search run is blocked

***

#### Input

##### Option A — URL Mode (recommended for specific restaurants)

| Parameter | Type | Description |
|-----------|------|-------------|
| `restaurantUrls` | array | List of iFood restaurant URLs to enrich |
| `includeMenu` | boolean | Extract available menu item data (default: `true`) |
| `includeReviews` | boolean | Extract customer reviews (default: `false`) |
| `menuMode` | string | `limited` (default) applies the local cap; `all` removes only that cap |
| `maxMenuItems` | integer | Local item cap in `limited` mode (1-500, default: `50`); ignored in `all` |
| `downloadImages` | boolean | Save images to the Key-Value Store (default: `false`); beta supports this only with `menuMode: "limited"` |

**Example input (URL Mode):**

```json
{
  "restaurantUrls": [
    "https://www.ifood.com.br/delivery/sao-paulo-sp/bubblekill-patio-paulista-bela-vista/5024be82-d729-41b9-a64f-d44ba306f232"
  ],
  "includeMenu": true,
  "menuMode": "limited",
  "maxMenuItems": 30
}
```

##### Option B — Search Mode (discover restaurants near an address)

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `city` | string | `sao-paulo-sp` | City slug (e.g., `rio-de-janeiro-rj`) |
| `address` | string | `Av Paulista 1000` | Delivery address for location context |
| `query` | string | `""` | Search term (e.g., `pizza`, `sushi`) |
| `maxRestaurants` | integer | `5` | Max restaurants to extract (1-200) |
| `includeMenu` | boolean | `true` | Extract available menu item data |
| `includeReviews` | boolean | `false` | Extract customer reviews |
| `menuMode` | string | `limited` | `limited` applies the local cap; `all` removes only that cap |
| `maxMenuItems` | integer | `50` | Local item cap in `limited` mode (1-500); ignored in `all` |
| `downloadImages` | boolean | `false` | Save images to the Key-Value Store; beta supports this only with `menuMode: "limited"` |
| `proxyConfiguration` | object | — | Optional fallback for blocked search runs |

**Example input (Search Mode):**

```json
{
  "city": "sao-paulo-sp",
  "address": "Av Paulista 1000, Sao Paulo",
  "query": "pizza",
  "maxRestaurants": 20,
  "includeMenu": true,
  "menuMode": "all"
}
```

##### Menu coverage contract

- `menuMode: "limited"` returns at most `maxMenuItems` per restaurant.
- `menuMode: "all"` ignores `maxMenuItems` and removes only the Actor's local item cap. It does **not** guarantee a complete external iFood menu.
- A direct `catalog` response with no local truncation is labeled `complete-relative-to-source-response`: complete only relative to the response observed during that run.
- `catalog-search` is a term-search fallback and is always labeled `partial-fallback`, even if its pagination is exhausted.
- Beta safety gate: `menuMode: "all"` cannot be combined with `downloadImages: true`; the Actor rejects that input before scraping. Use `limited` for image downloads or `all` with `downloadImages: false`. `imageDownloadUrl` remains present only for successful downloads.

Use these output fields when evaluating coverage:

| Field | Meaning |
|-------|---------|
| `menuMode` | Requested `limited` or `all` mode |
| `menuSource` | `catalog`, `catalog-search`, or `null` |
| `menuSearchTerms` | Comma-separated terms attempted by the fallback, otherwise `null` |
| `menuCompletenessStatus` | `not-extracted`, `partial-limit-applied`, `partial-fallback`, or `complete-relative-to-source-response` |
| `menuItemsDiscovered` / `menuItemsReturned` | Unique items observed before the local cap / items returned in `menu` |
| `menuTruncated` / `menuLimitApplied` | Whether the local cap truncated results / the applied cap |
| `pagesFetched` | Successful menu-source page responses: `1` for direct catalog, `0` when not requested/not captured; fallback includes successful empty/repeated pages but not failed 429 attempts |
| `stopReason` | Why collection stopped, such as source exhaustion, local limit, repeated page, deadline, rate limit, or page guard |

##### Example City Slugs

These are input examples, not a guarantee of current delivery coverage. Results depend on the address and what iFood exposes during the run.

`sao-paulo-sp` · `rio-de-janeiro-rj` · `belo-horizonte-mg` · `brasilia-df` · `curitiba-pr` · `porto-alegre-rs` · `salvador-ba` · `fortaleza-ce` · `recife-pe` · `campinas-sp` · `goiania-go` · `manaus-am` · `florianopolis-sc` · `vitoria-es` · `guarulhos-sp`

***

#### Output Example

```json
{
  "name": "Bubblekill Pátio Paulista",
  "city": "sao-paulo-sp",
  "url": "https://www.ifood.com.br/delivery/sao-paulo-sp/bubblekill-patio-paulista-bela-vista/5024be82-d729-41b9-a64f-d44ba306f232",
  "category": "Casa de Sucos",
  "distance": "0.9 km",
  "rating": 4.8,
  "reviewsCount": 1540,
  "available": true,
  "deliveryFee": 4.99,
  "minimumOrderValue": 10,
  "currency": "BRL",
  "menuRequested": true,
  "menuMode": "all",
  "menuExtractionStatus": "captured",
  "menuCompletenessStatus": "complete-relative-to-source-response",
  "menuSource": "catalog",
  "menuSearchTerms": null,
  "menuItemsDiscovered": 14,
  "menuItemsReturned": 14,
  "menuTruncated": false,
  "menuLimitApplied": null,
  "pagesFetched": 1,
  "stopReason": "source-response-exhausted",
  "menuItemCount": 14,
  "avgMenuPrice": 23.42,
  "cheapestItem": "Base Leite",
  "cheapestPrice": 18.99,
  "mostExpensiveItem": "Limonada Tutti Frutti",
  "mostExpensivePrice": 43.98,
  "topMenuItems": "Base Água (R$19.99) | Base Chá de Hibisco (R$19.99) | Base Leite (R$18.99)",
  "menu": [
    {
      "ean": "6952202282873",
      "section": "Escolha sua Combinação",
      "name": "Base Água",
      "details": "Base de água - escolha o tamanho do copo",
      "price": 19.99,
      "imageUrl": "https://static-images.ifood.com.br/image/upload/..."
    }
  ],
  "scrapedAt": "2026-03-01T17:15:00.000Z"
}
```

The example abbreviates the `menu` array for readability; the coverage counts describe the full result represented by the example.
The optional `ean` string is included only when the source catalog supplies it.

***

#### Pricing

This actor uses **Pay Per Event (PPE)** pricing:

| Metric | Cost |
|--------|------|
| `restaurant-scraped` | $0.025 per restaurant |

**Example**: 1,000 charged restaurant results generate **$25.00 in PPE event charges**. The $0.025-per-result rate covers PPE events only; Apify platform usage such as compute/memory, proxy traffic, and storage may be charged separately by Apify.

#### Use Cases

- **Market Research** — Analyze restaurant pricing, menu trends, and ratings by area
- **Competitive Intelligence** — Monitor competitor menus, delivery fees, and availability
- **Price Monitoring** — Track menu price changes over time across cities
- **Location Intelligence** — Map restaurant density and categories by neighborhood
- **Food Delivery Analytics** — Build datasets for food industry analysis
- **Business Planning** — Research the market before opening a restaurant or dark kitchen

***

### ✅ Capabilities & Limits

Stated up front, so you do not pay a run to find out.

**Built here:** when the `/catalog` XHR never fires, the menu is re-fetched from inside the loaded page. iFood's PerimeterX returns 403 to the Node network stack even through a residential proxy - only the browser's own TLS fingerprint and PX cookies get through.

| Input / feature | Supported | Notes |
|---|---|---|
| Direct restaurant URLs | ✅ | `restaurantUrls` — skips city/address discovery entirely |
| Search by city | ✅ | `city` in the form `sao-paulo-sp`, `rio-de-janeiro-rj` |
| Address required for search | ⚠️ | iFood needs a delivery address for location context |
| Menu with prices | ✅ | `includeMenu` — subject to source availability and rate limits |
| Guaranteed complete menu | ❌ | `menuTruncated` and `menuCompletenessStatus` tell you when it is partial, instead of pretending it is whole |
| Customer reviews | ✅ | `includeReviews` |
| Menu item photos | ✅ | `downloadImages` saves them to the Key-Value Store |
| Brazilian residential proxy | ⚠️ | optional — start without proxy for the lowest cost |

#### FAQ

**What is the difference between URL Mode and Search Mode?**
URL Mode enriches specific restaurant URLs without city/address discovery. Search Mode collects restaurant cards surfaced by iFood for a city/address context.

**Do I need proxies?**
For URL Mode, start without a proxy. For Search Mode, also start without one and add a Brazilian residential proxy only if a real run is blocked or returns no restaurants. Configure `proxyConfiguration` with `apifyProxyGroups: ["RESIDENTIAL"]` and `apifyProxyCountry: "BR"` for that fallback.

**How should I choose the city?**
Use the city slug from an iFood restaurant URL or a slug such as `sao-paulo-sp`. Search results depend on iFood's current coverage for the delivery address. URL Mode accepts any valid iFood restaurant URL matching the documented format.

**How long does a typical run take?**
Runtime depends on the number of restaurants, requested fields, menu mode, source availability, proxy/network conditions, and fallback pagination. `all` can take longer than `limited`.

**Does `menuMode: "all"` guarantee every menu item?**
No. It removes only the local `maxMenuItems` cap. Check `menuCompletenessStatus`, `menuSource`, counts, pagination, and `stopReason`; `catalog-search` is always partial.

**Can I download images in `all` mode?**
Not in this beta. The Actor rejects `menuMode: "all"` with `downloadImages: true` before scraping. Use `limited` for images or `all` without image downloads.

**What data is NOT available in URL Mode?**
Delivery fee, delivery time, and distance are location-dependent and can be `null` without a delivery context. Availability of other fields also depends on the public source responses observed during the run.

**What data is NOT included?**
The Actor does not access private or logged-in data. When reviews are requested, output can include the public display name and comment exposed by iFood for a review.

**Can I filter restaurants by cuisine?**
Yes! In Search Mode, use the `query` parameter: `"pizza"`, `"sushi"`, `"hambúrguer"`, etc.

***

### 🇧🇷 Português

#### O que faz?

Extrai dados públicos de restaurantes do [iFood](https://www.ifood.com.br). Obtém nomes, notas, informações de entrega, itens de cardápio expostos pelas fontes disponíveis e resumos opcionais de avaliações em JSON estruturado. Os campos de cobertura diferenciam truncamento local, resposta direta do catálogo e fallback parcial por busca.

#### ✨ Dois Modos

##### 🔗 Modo URL (NOVO) — Enriqueça restaurantes específicos

Cole URLs do iFood e extraia os dados diretamente — sem precisar de endereço ou cidade. Ideal para enriquecer uma lista de restaurantes que você já conhece.

##### 🏙️ Modo Busca — Descubra restaurantes perto de um endereço

Informe cidade e endereço de entrega para descobrir os cards de restaurantes exibidos pelo iFood para aquele contexto. O Actor processa até 200 restaurantes selecionados; a quantidade real e os campos disponíveis dependem da resposta da fonte.

***

#### Funcionalidades

- 🔗 **Enriquecimento por URL** — Cole URLs do iFood e extraia dados direto, sem cidade ou endereço
- 🍕 **Dados do Restaurante** — Nome, nota, taxa de entrega, categoria, distância, aberto/fechado
- 📋 **Dados e Cobertura do Cardápio** — Nome, preço, descrição, EAN/GTIN opcional e imagem quando expostos, mais metadados de fonte e cobertura
- ⭐ **Avaliações** — Notas e comentários quando expostos pela fonte opcional de avaliações
- 📊 **Inteligência de Preço** — Média, menor e maior preço calculados sobre os itens retornados
- 🏙️ **Busca por Cidade/Endereço** — Aceita slugs de cidades brasileiras; os resultados dependem da cobertura do iFood no endereço
- 🔍 **Busca por Culinária** — Filtre por tipo (pizza, sushi, hambúrguer, etc.)

***

#### Entrada

##### Opção A — Modo URL (recomendado para restaurantes específicos)

| Parâmetro | Tipo | Descrição |
|-----------|------|-----------|
| `restaurantUrls` | array | Lista de URLs do iFood para enriquecer |
| `includeMenu` | boolean | Extrair os itens de cardápio disponíveis (padrão: `true`) |
| `includeReviews` | boolean | Extrair avaliações (padrão: `false`) |
| `menuMode` | string | `limited` (padrão) aplica o cap local; `all` remove somente esse cap |
| `maxMenuItems` | integer | Cap local em `limited` (1-500, padrão: `50`); ignorado em `all` |
| `downloadImages` | boolean | Salvar imagens no Key-Value Store (padrão: `false`); na beta, somente com `menuMode: "limited"` |

**Exemplo de entrada (Modo URL):**

```json
{
  "restaurantUrls": [
    "https://www.ifood.com.br/delivery/sao-paulo-sp/bubblekill-patio-paulista-bela-vista/5024be82-d729-41b9-a64f-d44ba306f232"
  ],
  "includeMenu": true,
  "menuMode": "limited",
  "maxMenuItems": 30
}
```

##### Opção B — Modo Busca (descobrir restaurantes perto de um endereço)

| Parâmetro | Tipo | Padrão | Descrição |
|-----------|------|--------|-----------|
| `city` | string | `sao-paulo-sp` | Slug da cidade (ex: `rio-de-janeiro-rj`) |
| `address` | string | `Av Paulista 1000` | Endereço de entrega para contexto |
| `query` | string | `""` | Termo de busca (ex: `pizza`, `sushi`) |
| `maxRestaurants` | integer | `5` | Máximo de restaurantes (1-200) |
| `includeMenu` | boolean | `true` | Extrair os itens de cardápio disponíveis |
| `includeReviews` | boolean | `false` | Extrair avaliações |
| `menuMode` | string | `limited` | `limited` aplica o cap local; `all` remove somente esse cap |
| `maxMenuItems` | integer | `50` | Cap local em `limited` (1-500); ignorado em `all` |
| `downloadImages` | boolean | `false` | Salvar imagens no Key-Value Store; na beta, somente com `menuMode: "limited"` |
| `proxyConfiguration` | object | — | Fallback opcional para buscas bloqueadas |

**Exemplo de entrada (Modo Busca):**

```json
{
  "city": "sao-paulo-sp",
  "address": "Rua Tapes 247, Sao Paulo",
  "query": "",
  "maxRestaurants": 20,
  "includeMenu": true,
  "menuMode": "all"
}
```

##### Contrato de cobertura do cardápio

- `menuMode: "limited"` retorna no máximo `maxMenuItems` por restaurante.
- `menuMode: "all"` ignora `maxMenuItems` e remove somente o cap local do Actor. Isso **não** garante o cardápio externo completo do iFood.
- Uma resposta direta de `catalog` sem truncamento local recebe `complete-relative-to-source-response`: completa somente em relação à resposta observada naquela execução.
- `catalog-search` é um fallback por termos e recebe sempre `partial-fallback`, mesmo quando sua paginação se esgota.
- Gate de segurança da beta: `menuMode: "all"` não pode ser combinado com `downloadImages: true`; o Actor rejeita essa entrada antes do scraping. Use `limited` para baixar imagens ou `all` com `downloadImages: false`. `imageDownloadUrl` continua aparecendo apenas em downloads bem-sucedidos.

Use `menuSource`, `menuSearchTerms`, `menuCompletenessStatus`, `menuItemsDiscovered`, `menuItemsReturned`, `menuTruncated`, `menuLimitApplied`, `pagesFetched` e `stopReason` para avaliar a cobertura. `pagesFetched` conta respostas bem-sucedidas da fonte: `1` no catálogo direto, `0` quando o menu não foi solicitado/não capturado; no fallback inclui página vazia ou repetida recebida com sucesso, mas não tentativa 429.

##### Exemplos de Slugs de Cidade

Estes são exemplos de entrada, não garantia de cobertura atual. O resultado depende do endereço e do que o iFood expõe durante a execução.

`sao-paulo-sp` · `rio-de-janeiro-rj` · `belo-horizonte-mg` · `brasilia-df` · `curitiba-pr` · `porto-alegre-rs` · `salvador-ba` · `fortaleza-ce` · `recife-pe` · `campinas-sp` · `goiania-go` · `manaus-am` · `florianopolis-sc` · `vitoria-es` · `guarulhos-sp`

***

#### Preço

- **Pay per result**: US$0.025 por restaurante cobrado
- **1.000 resultados cobrados** = **US$25.00 em eventos PPE**

Os valores acima cobrem somente os eventos PPE. O uso da plataforma Apify, como compute/memória, tráfego de proxy e armazenamento, pode ser cobrado separadamente pela Apify.

***

#### Casos de Uso

- **Pesquisa de Mercado** — Analise preços, cardápios e avaliações por região
- **Inteligência Competitiva** — Monitore concorrentes, cardápios e taxas de entrega
- **Monitoramento de Preços** — Acompanhe mudanças de preço ao longo do tempo
- **Planejamento de Negócios** — Pesquise o mercado antes de abrir um restaurante ou dark kitchen

***

#### Perguntas Frequentes

**Qual a diferença entre Modo URL e Modo Busca?**
O Modo URL enriquece URLs específicas sem descoberta por cidade/endereço. O Modo Busca coleta os cards de restaurantes exibidos pelo iFood para o contexto informado.

**Preciso de proxy?**
Nos dois modos, comece sem proxy. Use um proxy residencial brasileiro apenas se uma execução real for bloqueada ou retornar zero restaurantes. Configure `proxyConfiguration` com `apifyProxyGroups: ["RESIDENTIAL"]` e `apifyProxyCountry: "BR"` nesse fallback.

**Como escolher a cidade?**
Use o slug presente em uma URL do iFood ou um slug como `sao-paulo-sp`. O resultado da busca depende da cobertura atual do iFood no endereço. O Modo URL aceita qualquer URL válida no formato documentado.

**`menuMode: "all"` garante todos os itens?**
Não. Ele remove somente o cap local de `maxMenuItems`. Consulte `menuCompletenessStatus`, `menuSource`, contagens, paginação e `stopReason`; `catalog-search` é sempre parcial.

**Posso baixar imagens no modo `all`?**
Não nesta beta. O Actor rejeita `menuMode: "all"` com `downloadImages: true` antes do scraping. Use `limited` para imagens ou `all` sem download de imagens.

**Alguns campos aparecem como null no Modo URL. Por quê?**
Taxa de entrega, tempo de entrega e distância dependem de contexto de entrega e podem ser `null`. A disponibilidade dos outros campos também depende das respostas públicas observadas durante a execução.

**Posso filtrar por culinária?**
Sim! No Modo Busca, use o parâmetro `query`: `"pizza"`, `"sushi"`, `"hambúrguer"`, etc.

***

### 🔗 Related Actors

Combine with other actors from the [Viral Analyzer](https://apify.com/viralanalyzer) suite:

- [Google Maps BR Scraper](https://apify.com/viralanalyzer/google-maps-br-scraper) — Local business data with reviews and CEP enrichment
- [Review Analyzer & Image Generator](https://apify.com/viralanalyzer/review-analyzer-image-generator) — AI-powered review analysis with shareable visual cards
- [Competitor Intelligence Hub](https://apify.com/viralanalyzer/competitor-intelligence-hub) — Full competitive analysis: pricing, ads, reviews
- [CNPJ Enricher](https://apify.com/viralanalyzer/cnpj-enricher) — Enrich restaurant CNPJs with Receita Federal data
- [Brand Visibility Tracker](https://apify.com/viralanalyzer/brand-visibility-tracker) — Monitor restaurant brand mentions and sentiment

### 📝 Changelog

- **v2.3.9** (2026-08-12) — Added optional source-provided `ean` on menu items; added `menuMode` (`limited`/`all`), explicit menu coverage metadata, and the beta safety gate that rejects `all` with image downloads; corrected the documented public price
- **v2.2** (2026-03-01) — URL enrichment mode (new!), robust autocomplete for search mode, improved category extraction, Brazilian proxy support
- **v1.0** (2025-06-19) — Initial release: restaurant listing, menu extraction, multi-city support, reviews, anti-detection

***

💡 **Need AI analysis on top of this data — sentiment, trend detection and a dashboard, with no API keys to manage?**
[ViralAnalyzer](https://viralanalyzer.com.br) combines this Actor with other data sources and built-in AI. JSON + insights in one call.

# Actor input Schema

## `restaurantUrls` (type: `array`):

List of iFood restaurant URLs to enrich directly. When provided, the actor skips city/address discovery and extracts data from each valid URL. Format: https://www.ifood.com.br/delivery/{city}/{slug}/{uuid}

## `city` (type: `string`):

City to search for restaurants. Use the format: 'sao-paulo-sp', 'rio-de-janeiro-rj', 'belo-horizonte-mg'. Only used in Search Mode (when restaurantUrls is empty).

## `address` (type: `string`):

Full delivery address to set location context (e.g., 'Av Paulista 1000'). Required for iFood to surface restaurants for that location. Only used in Search Mode.

## `query` (type: `string`):

Search term to filter the restaurant cards surfaced by iFood (e.g., 'pizza', 'sushi', 'hamburger'). Leave empty to skip this local filter. Only used in Search Mode.

## `maxRestaurants` (type: `integer`):

Maximum number of restaurants to extract. Lower values reduce search-mode runtime and infrastructure cost.

## `includeMenu` (type: `boolean`):

Whether to extract menu items with prices for each restaurant. Source availability, rate limits, blocking, and fallback behavior can make menu coverage partial; inspect the output coverage metadata.

## `includeReviews` (type: `boolean`):

Whether to extract customer reviews for each restaurant.

## `menuMode` (type: `string`):

Choose 'limited' to return at most maxMenuItems per restaurant, or 'all' to remove that local Actor cap. In 'all' mode, maxMenuItems is ignored. 'All' does not guarantee the complete external iFood menu: source responses, pagination, availability, blocking, rate limits, and the catalog-search fallback can still make results partial. Beta gate: menuMode='all' cannot be combined with downloadImages=true; that input is rejected before scraping.

## `maxMenuItems` (type: `integer`):

Maximum number of menu items returned per restaurant when menuMode='limited'. Ignored when menuMode='all'.

## `downloadImages` (type: `boolean`):

Download menu item photos and save successful downloads to the Key-Value Store with imageDownloadUrl. Requires includeMenu=true. Beta limitation: downloadImages=true is supported only with menuMode='limited'; combining it with menuMode='all' is rejected before scraping. Use limited mode for images or all mode without image downloads.

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

Proxy settings. Start without proxy for the lowest cost. Add a Brazilian residential proxy only if your search-mode run is blocked or returns no restaurants.

## Actor input object example

```json
{
  "restaurantUrls": [
    "https://www.ifood.com.br/delivery/sao-paulo-sp/bubblekill-patio-paulista-bela-vista/5024be82-d729-41b9-a64f-d44ba306f232"
  ],
  "city": "sao-paulo-sp",
  "address": "Av Paulista 1000",
  "query": "pizza",
  "maxRestaurants": 3,
  "includeMenu": true,
  "includeReviews": false,
  "menuMode": "limited",
  "maxMenuItems": 50,
  "downloadImages": false
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset containing the scraped restaurant results. Each item follows the dataset schema; inspect the menu coverage metadata before interpreting menu completeness.

# 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 = {
    "restaurantUrls": [
        "https://www.ifood.com.br/delivery/sao-paulo-sp/bubblekill-patio-paulista-bela-vista/5024be82-d729-41b9-a64f-d44ba306f232"
    ],
    "city": "sao-paulo-sp",
    "address": "Av Paulista 1000",
    "maxRestaurants": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("viralanalyzer/ifood-restaurant-intelligence").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 = {
    "restaurantUrls": ["https://www.ifood.com.br/delivery/sao-paulo-sp/bubblekill-patio-paulista-bela-vista/5024be82-d729-41b9-a64f-d44ba306f232"],
    "city": "sao-paulo-sp",
    "address": "Av Paulista 1000",
    "maxRestaurants": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("viralanalyzer/ifood-restaurant-intelligence").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 '{
  "restaurantUrls": [
    "https://www.ifood.com.br/delivery/sao-paulo-sp/bubblekill-patio-paulista-bela-vista/5024be82-d729-41b9-a64f-d44ba306f232"
  ],
  "city": "sao-paulo-sp",
  "address": "Av Paulista 1000",
  "maxRestaurants": 3
}' |
apify call viralanalyzer/ifood-restaurant-intelligence --silent --output-dataset

```

## MCP server setup

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

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/Dd5SpXWfkz2yqNAuf/builds/K3G16ffkcbtMzTccz/openapi.json
