# iFood Scraper Brasil: Leads de Restaurantes com CNPJ (`paulovitor18/ifood-brasil-restaurantes-cnpj`) Actor

Os outros scrapers de iFood entregam cardápio e preço. Este entrega o CNPJ: cada restaurante vira cadastro de empresa, com CNPJ validado, endereço com CEP, telefone e MCC. Na amostra de 70 lojas em 4 cidades, 70 vieram com CNPJ. Você só paga a linha entregue com CNPJ.

- **URL**: https://apify.com/paulovitor18/ifood-brasil-restaurantes-cnpj.md
- **Developed by:** [MoreLock](https://apify.com/paulovitor18) (community)
- **Categories:** Lead generation, E-commerce, Business
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$30.00 / 1,000 estabelecimento entregue com cnpjs

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## iFood Scraper Brasil: Leads de Restaurantes com CNPJ

Os outros scrapers de iFood entregam cardápio, preço e avaliação, que é dado de consumidor. Este entrega **dado de empresa**: para cada restaurante, o CNPJ validado, o endereço cadastral completo com CEP, o telefone e o código de segmento (MCC). É a diferença entre saber que existe uma pizzaria em Campinas e poder abrir cadastro, rodar um crédito ou cruzar o CNPJ com a Receita Federal.

### Leads de restaurantes do iFood com CNPJ: o que sai de cada linha

Uma adquirente que vende maquininha para food service precisa de restaurantes com CNPJ validado para abrir conta sem retrabalho. Busca por cidade e recebe a lista com CNPJ validado, razão social, endereço completo com CEP, telefone e MCC. Um registro real:

Saída real da execução `n1yiKEJuaoBFKhYA8` (só a lista de horários foi encurtada):

```json
{
  "merchant_id": "0ddb58dd-65e0-4ce8-ade9-8539646de962",
  "nome": "Sorriso Churrasco & Pizza",
  "cnpj": "58.543.539/0001-77",
  "cnpj_digitos": "58543539000177",
  "enriquecido": true,
  "mcc": "5812",
  "telefone": "1932425676",
  "telefone_ddd": "19",
  "endereco": {
    "logradouro": "Rua Doutor Miguel Penteado",
    "numero": "953",
    "bairro": "Jardim Guanabara",
    "cidade": "CAMPINAS",
    "uf": "SP",
    "cep": "13070118",
    "latitude": -22.885435,
    "longitude": -47.071411
  },
  "tipo": "RESTAURANT",
  "categoria_principal": "Comida Brasileira",
  "categoria_codigo": "BRA",
  "categorias": [
    "Comida Brasileira",
    "Cozinha Rápida",
    "Lanches",
    "Carnes",
    "Comida Variada",
    "Comida Contemporânea",
    "Salgados"
  ],
  "pedido_minimo": 0,
  "horarios": [
    {
      "dayOfWeek": "MONDAY",
      "start": "11:00:00",
      "duration": 240
    },
    {
      "dayOfWeek": "MONDAY",
      "start": "18:00:00",
      "duration": 270
    },
    "... demais dias"
  ],
  "cobrado": true,
  "cnpj_repetido_na_execucao": false,
  "busca_termo": null,
  "busca_local": "id direto",
  "url_ifood": null,
  "coletado_em": "2026-09-06T18:35:21.890Z"
}
```

### Visão geral: leads de restaurantes do iFood com CNPJ validado

Os scrapers de iFood que existem hoje entregam **cardápio, preço e avaliação** — dado de consumidor. Este entrega **dado de empresa**: CNPJ, razão de cadastro, endereço fiscal e MCC. Nenhum outro actor de iFood publica o CNPJ.

Você diz onde procurar (cidade ou coordenada) e o que procurar ("pizza", "japonesa", "padaria"), e recebe uma linha por estabelecimento, pronta para CRM, planilha de prospecção ou enriquecimento.

Na amostra de validação — 70 estabelecimentos em 4 cidades e 11 categorias, medida em 06/09/2026 — **70 tinham CNPJ na fonte (100%)**.

### Recursos: CNPJ validado, endereço com CEP, telefone e MCC

- **CNPJ com dígito verificador conferido.** Número que não fecha o DV sai como `null`, nunca como CNPJ. Nada de identificador inventado.
- **Endereço cadastral completo** — logradouro, número, bairro, cidade, UF, CEP e coordenadas.
- **Busca por cidade, sem procurar coordenada.** 32 capitais e grandes cidades já mapeadas; ou passe `"latitude,longitude"` para mirar um bairro.
- **Filtro de food-service, com o limite declarado.** A busca do iFood mistura drogaria e mercado nos resultados de comida; o actor descarta essas categorias. Veja abaixo o que o filtro **não** pega.
- **MCC** (Merchant Category Code) — segmenta restaurante, fast-food, conveniência, e casa com o vocabulário de quem vende maquininha ou crédito.
- **Você só paga o que foi entregue com CNPJ.** Linha sem CNPJ, não encontrada ou com erro **não é cobrada**.
- **Resultado vazio sempre vem explicado.** O relatório diz se a região não tem cobertura do iFood ou se a fonte falhou — nunca um "0" mudo.

### Exemplo de entrada: cidade ou coordenadas

```json
{
  "locais": ["Campinas-SP", "Recife-PE"],
  "termos": ["pizza", "hamburguer"],
  "max_restaurantes": 120,
  "apenas_restaurantes": true,
  "apenas_com_cnpj": true
}
```

Consulta direta, quando você já tem os IDs:

```json
{ "merchant_ids": ["3f2838d1-1234-4a86-a168-2f9c621d802d"] }
```

### O que o filtro não pega (medido, não estimado)

Quem classifica o estabelecimento é o iFood, no campo `tipo`. Em 1.048 linhas conferidas, essa classificação erra: **tabacaria, floricultura, loja de carregador de celular e adega aparecem como `RESTAURANT`**. O MCC não resolve — a mesma amostra tem headshop com MCC 5812 ("restaurantes") e sushi legítimo com MCC 7523 ("estacionamento").

Como não existe campo confiável para separar, o actor descarta pelo **nome**, com uma lista declarada que você pode ver e trocar (`excluir_termos_no_nome`). O que escapa disso vem entregue e cobrado, e sempre com `tipo`, `mcc`, `categoria_principal` e o nome do estabelecimento na linha, para você filtrar do seu lado.

**Não escondemos isso num classificador:** o resíduo medido foi de 1,5% a 5% das linhas cobradas, dependendo dos termos de busca. Termos de comida ("pizza", "japonesa") ficam na ponta baixa; termos genéricos puxam mais ruído.

### Parâmetros: cidade, coordenadas e teto de resultados

| Campo | Tipo | Padrão | Para que serve |
|---|---|---|---|
| `locais` | lista | `["Sao Paulo-SP"]` | Cidade (`"Recife-PE"`) ou coordenada (`"-8.05,-34.88"`) |
| `termos` | lista | `["restaurante"]` | Cada termo é uma varredura da cidade |
| `merchant_ids` | lista | `[]` | Modo consulta direta; ignora a busca |
| `max_restaurantes` | inteiro | `120` | Teto por execução |
| `apenas_restaurantes` | booleano | `true` | Exclui mercado e farmácia |
| `apenas_com_cnpj` | booleano | `true` | Entrega só quem tem CNPJ válido |
| `excluir_termos_no_nome` | lista | lista padrão | Palavras que descartam o estabelecimento pelo nome |
| `max_buscas` | inteiro | `40` | Teto de buscas, para a execução não gastar todo o tempo procurando |
| `timeoutMs` | inteiro | `30000` | Limite por requisição |

### Dicas para extrair mais restaurantes com CNPJ

- **Um termo cobre pouco.** Cada busca satura em ~200 itens. Para varrer uma cidade, use vários termos de cozinha (`pizza`, `japonesa`, `padaria`, `açaí`, `marmita`) em vez de aumentar só o teto.
- **Coordenada mira melhor que cidade.** O iFood ordena por distância; passar a coordenada do bairro traz a vizinhança dele, não o centro.
- **Quer auditar a cobertura?** Deixe `apenas_com_cnpj` desligado: as linhas sem CNPJ vêm marcadas `enriquecido: false` e saem de graça.

### Casos de uso: adquirência, prospecção B2B para food service e análise de crédito

- **Prospecção B2B de food-service** — distribuidor de bebidas, embalagens ou insumos monta a carteira por cidade e bairro, já com o CNPJ para abrir cadastro.
- **Adquirência e crédito** — quem vende maquininha ou antecipação segmenta por MCC e valida o CNPJ na Receita antes de abordar.
- **Enriquecimento de base** — cruze `cnpj_digitos` com dados públicos da Receita para obter porte, CNAE e sócios.
- **Estudo de praça** — densidade de bares e restaurantes por categoria e bairro antes de abrir uma operação.

O resultado sai como dataset da Apify e você exporta em JSON, CSV ou Excel, ou puxa direto pela API.

### Perguntas frequentes sobre leads de restaurantes do iFood

**De onde vem o CNPJ?** Do cadastro público do próprio estabelecimento no iFood, exibido na ficha da loja. O actor lê o campo estruturado e valida o dígito verificador antes de entregar.

**O dado é ao vivo?** A ficha do estabelecimento vem de um endpoint de catálogo, atualizado pela plataforma. CNPJ, endereço e telefone mudam raramente; trate como cadastro, não como preço em tempo real.

**Por que vieram menos restaurantes do que o teto?** Cada busca do iFood satura em torno de 200 itens por termo e coordenada. O relatório da execução mostra quantos foram descobertos, filtrados e entregues.

**Vocês cobram execução que não achou nada?** Não. A cobrança é por restaurante entregue com CNPJ válido. Região sem cobertura, restaurante sem CNPJ, ID inexistente e falha de rede não geram cobrança.

**Por que vieram três restaurantes com o mesmo CNPJ?** Porque são a mesma cozinha. O iFood lista marcas virtuais como lojas separadas: "Pizza Cesar", "Calzone do Cesar" e "Cesar's Pizza Gourmet" são três vitrines no mesmo endereço e no mesmo CNPJ. O actor entrega as três, porque cada uma é uma vitrine real, mas **cobra uma vez só por CNPJ** na execução. As irmãs vêm com `cobrado: false` e `cnpj_repetido_na_execucao: true`.

**Alguns campos vêm vazios.** `categorias` e `mcc` dependem de o estabelecimento ter preenchido o cadastro dele; quando não preencheu, o campo vem vazio ou nulo, e não inventamos valor. `cnpj`, `endereço` e `telefone` são os campos que sustentam a promessa do produto.

**Entrega cardápio e preço?** Não. Este actor é de **dado de empresa** (CNPJ, endereço, telefone, MCC). Para cardápio e preço há outros actors de iFood na Store.

### Preço: quanto custa extrair leads de restaurantes

**US$ 0,03 por restaurante entregue com CNPJ.** Evento único, sem taxa por execução e sem assinatura.

| Situação | Cobra? |
|---|---|
| Restaurante entregue com CNPJ validado | **Sim** — US$ 0,03 |
| **2ª marca virtual do mesmo CNPJ na mesma execução** | **Não** — entregue de graça |
| Estabelecimento fora da classificação de restaurante do iFood | Não — entregue de graça |
| Restaurante entregue sem CNPJ (`enriquecido: false`) | Não |
| Região sem cobertura do iFood | Não |
| ID inexistente ou fora do formato | Não |
| Erro de rede, bloqueio ou fonte fora do ar | Não |

Toda linha traz o campo `cobrado`, então a conta é auditável no próprio resultado.

Item no dataset é item cobrado — por isso linha não-entregável nem entra no dataset: ela vai para o relatório da execução.

**Exemplo:** varrer Campinas com quatro termos de cozinha e trazer 120 restaurantes com CNPJ custa **US$ 3,60**.

Os outros scrapers de iFood cobram por cardápio, preço e avaliação. Isso é dado de consumidor: serve para estudar o mercado, não para abrir um cadastro. Aqui você paga por uma linha que já é cadastro de empresa, com CNPJ conferido.

### MoreLock — a suíte de dados brasileiros

Este Actor faz parte da **MoreLock**, uma coleção de Actors de dados brasileiros feitos para se encaixarem pelo CNPJ. Quem usa este costuma combinar com:

| Actor | O que ele acrescenta ao seu fluxo |
|---|---|
| [Google Maps Brasil — Leads Locais com E-mail, Telefone e CNPJ](https://apify.com/paulovitor18/gmaps-brasil-leads) | Gera a lista de leads locais do Google Maps já com telefone, site e e-mail. |
| [Consulta CNPJ em Lote — Dados da Receita Federal](https://apify.com/paulovitor18/cnpj-bulk-lookup) | Fecha o cadastro: razão social, sócios (QSA), CNAE, situação e score de risco a partir do CNPJ. |
| [Google Maps Brasil — Monitor de Novos Negócios (+CNPJ)](https://apify.com/paulovitor18/gmaps-brasil-monitor) | Avisa quando abre um negócio novo no recorte que você vigia. |
| [Reclame Aqui Scraper — Reputação de Empresas BR](https://apify.com/paulovitor18/reclameaqui-scraper) | Acrescenta reputação pública: nota, volume de reclamações e taxa de resposta. |

**[Ver os 26 Actors da MoreLock →](https://apify.com/paulovitor18)**

### Histórico de versões

- **0.1.0** (06/09/2026) — primeira versão: busca por cidade/coordenada, consulta direta por ID, CNPJ validado por DV, filtro de food-service, relatório com prova de vazio.

### Contato e suporte

Problema, campo faltando ou cidade que você quer mapeada: abra uma issue na aba **Issues** do actor.

# Actor input Schema

## `locais` (type: `array`):

Onde procurar. Aceita o nome da cidade (ex.: "Campinas-SP", "Recife-PE") ou um par de coordenadas "latitude,longitude" (ex.: "-22.9099,-47.0626") para bairro ou raio específico. 32 capitais e grandes cidades já vêm mapeadas.

## `termos` (type: `array`):

O que buscar no catálogo do iFood em cada cidade. Use termos de cozinha ou tipo de negócio ("pizza", "hamburguer", "japonesa", "padaria"). Cada termo é uma varredura; mais termos = mais cobertura da cidade.

## `merchant_ids` (type: `array`):

Opcional. Se preenchido, o actor IGNORA a busca e consulta direto estes IDs do iFood (UUID). Serve para reprocessar uma lista que você já tem. ID fora do formato é descartado antes de qualquer requisição — não gasta e não cobra.

## `max_restaurantes` (type: `integer`):

Teto de estabelecimentos por execucao. Protege seu orcamento e o tempo da execucao. Varias marcas virtuais da mesma cozinha contam como estabelecimentos distintos, mas o CNPJ repetido e cobrado uma vez so.

## `apenas_restaurantes` (type: `boolean`):

A busca do iFood mistura mercado, farmacia e pet shop nos resultados de comida. Ligado, o actor descarta essas categorias e entrega so food-service. Desligado, os outros vem junto e sao entregues DE GRACA: a cobranca exige food-service, porque o evento cobrado promete restaurante.

## `apenas_com_cnpj` (type: `boolean`):

Ligado, restaurante sem CNPJ valido na fonte nao entra no resultado. Desligado, ele e entregue com "cnpj": null, marcado "enriquecido": false, e NAO e cobrado.

## `timeoutMs` (type: `integer`):

Limite por chamada à fonte. A requisição é limitada por AbortController cobrindo cabeçalho e corpo.

## `excluir_termos_no_nome` (type: `array`):

O iFood classifica como restaurante alguns comercios vizinhos (tabacaria, floricultura, loja de carregador). Como a classificacao e da plataforma e nao ha campo confiavel para separar, o actor descarta pelo NOME. Deixe vazio para usar a lista padrao, medida em 1.048 linhas reais; preencha para usar a SUA lista no lugar dela.

## `max_buscas` (type: `integer`):

Teto de requisicoes de busca. Protege contra um input com muitas cidades x muitos termos gastar a execucao inteira na descoberta e nao sobrar tempo para consultar ninguem.

## Actor input object example

```json
{
  "locais": [
    "Campinas-SP"
  ],
  "termos": [
    "restaurante"
  ],
  "merchant_ids": [],
  "max_restaurantes": 120,
  "apenas_restaurantes": true,
  "apenas_com_cnpj": true,
  "timeoutMs": 30000,
  "excluir_termos_no_nome": [],
  "max_buscas": 40
}
```

# Actor output Schema

## `restaurantes` (type: `string`):

Uma linha por estabelecimento entregue, com CNPJ, endereço e telefone.

## `resumo` (type: `string`):

Contadores: descobertos, entregues, cobrados, sem CNPJ, não encontrados e erros.

## `relatorio` (type: `string`):

Cada busca com seu desfecho (OK, SEM\_COBERTURA ou FALHOU), os erros por item e o status final da execução.

# 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 = {
    "locais": [
        "Campinas-SP"
    ],
    "termos": [
        "restaurante"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("paulovitor18/ifood-brasil-restaurantes-cnpj").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 = {
    "locais": ["Campinas-SP"],
    "termos": ["restaurante"],
}

# Run the Actor and wait for it to finish
run = client.actor("paulovitor18/ifood-brasil-restaurantes-cnpj").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 '{
  "locais": [
    "Campinas-SP"
  ],
  "termos": [
    "restaurante"
  ]
}' |
apify call paulovitor18/ifood-brasil-restaurantes-cnpj --silent --output-dataset

```

## MCP server setup

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

```

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/MmeRgXcArQWc4kMTF/builds/mFW6Pzvaccvg0Xx5w/openapi.json
