# Crawlear

> Rastreie recursivamente um site e obtenha conteúdo de cada página

import InstallationPython from '/snippets/pt-BR/v2/installation/python.mdx';
import InstallationNode from '/snippets/pt-BR/v2/installation/js.mdx';
import InstallationCLI from '/snippets/pt-BR/v2/installation/cli.mdx';
import CrawlPython from '/snippets/pt-BR/v2/crawl/base/python.mdx';
import CrawlNode from '/snippets/pt-BR/v2/crawl/base/js.mdx';
import CrawlCURL from '/snippets/pt-BR/v2/crawl/base/curl.mdx';
import CrawlCLI from '/snippets/pt-BR/v2/crawl/base/cli.mdx';
import CheckCrawlJobPython from '/snippets/pt-BR/v2/crawl-status/short/python.mdx';
import CheckCrawlJobNode from '/snippets/pt-BR/v2/crawl-status/short/js.mdx';
import CheckCrawlJobCURL from '/snippets/pt-BR/v2/crawl-status/short/curl.mdx';
import CheckCrawlJobCLI from '/snippets/pt-BR/v2/crawl-status/short/cli.mdx';
import CheckCrawlJobOutputScraping from '/snippets/pt-BR/v2/crawl-status/base/output-scraping.mdx';
import CheckCrawlJobOutputCompleted from '/snippets/pt-BR/v2/crawl-status/base/output-completed.mdx';
import CrawlWebSocketPython from '/snippets/pt-BR/v2/crawl-websocket/base/python.mdx';
import CrawlWebSocketNode from '/snippets/pt-BR/v2/crawl-websocket/base/js.mdx';
import CrawlWebhookCURL from '/snippets/pt-BR/v2/crawl-webhook/base/curl.mdx';
import PythonCrawlExample from '/snippets/pt-BR/v2/crawl/sdk-example/python.mdx';
import NodeCrawlExample from '/snippets/pt-BR/v2/crawl/sdk-example/js.mdx';
import PythonCrawlExampleResponse from '/snippets/pt-BR/v2/crawl/sdk-example/python-response.mdx';
import NodeCrawlExampleResponse from '/snippets/pt-BR/v2/crawl/sdk-example/js-response.mdx';
import StartCrawlPython from '/snippets/pt-BR/v2/start-crawl/base/python.mdx';
import StartCrawlNode from '/snippets/pt-BR/v2/start-crawl/base/js.mdx';
import StartCrawlCURL from '/snippets/pt-BR/v2/start-crawl/base/curl.mdx';
import StartCrawlCLI from '/snippets/pt-BR/v2/start-crawl/base/cli.mdx';
import StartCrawlOutput from '/snippets/pt-BR/v2/start-crawl/base/output.mdx';
import PlaygroundCTA from "/snippets/pt-BR/shared/playground-cta-crawl.mdx";

O Crawlear envia uma URL ao Firecrawl e descobre e extrai, de forma recursiva, todas as subpáginas acessíveis. Ele lida automaticamente com sitemaps, renderização de JavaScript e limites de taxa, retornando markdown limpo ou dados estruturados para cada página.

* Descobre páginas por meio do sitemap e da navegação recursiva por links
* Suporta filtragem de caminho, limites de profundidade e controle de subdomínios/links externos
* Retorna resultados via polling, WebSocket ou webhook

<PlaygroundCTA />

<div id="installation">
  ## Instalação
</div>

<CodeGroup>
  <InstallationPython />

  <InstallationNode />

  <InstallationCLI />
</CodeGroup>

<div id="basic-usage">
  ## Uso básico
</div>

Envie um job de rastreamento chamando `POST /v2/crawl` com uma URL inicial. O endpoint retorna um ID do job que você usa para consultar os resultados.

<CodeGroup>
  <CrawlPython />

  <CrawlNode />

  <CrawlCURL />

  <CrawlCLI />
</CodeGroup>

<Info>
  Cada página rastreada consome 1 crédito. O `limit` padrão de rastreamento é 10.000 páginas. Antes de iniciar, o endpoint de rastreamento verifica se os créditos restantes podem cobrir o `limit` — caso contrário, ele retorna um erro **402 (Pagamento Obrigatório)**. Defina um `limit` menor para corresponder ao tamanho de rastreamento pretendido (por exemplo, `limit: 100`) para evitar isso. São cobrados créditos adicionais para certas opções: modo JSON custa 4 créditos adicionais por página, e análise de PDF custa 1 crédito por página de PDF.
</Info>

<div id="scrape-options">
  ### Opções de scrape
</div>

Todas as opções do [endpoint Scrape](/pt-BR/api-reference/endpoint/scrape) estão disponíveis no rastreamento via `scrapeOptions` (JS) / `scrape_options` (Python). Elas se aplicam a cada página que o crawler coleta, incluindo formatos, proxy, cache, ações, localização e tags.

<CodeGroup>
  ```python Python
  from firecrawl import Firecrawl

  firecrawl = Firecrawl(api_key='fc-YOUR_API_KEY')

  # Crawl com opções de scrape
  response = firecrawl.crawl('https://example.com',
      limit=100,
      scrape_options={
          'formats': [
              'markdown',
              { 'type': 'json', 'schema': { 'type': 'object', 'properties': { 'title': { 'type': 'string' } } } }
          ],
          'proxy': 'auto',
          'max_age': 600000,
          'only_main_content': True
      }
  )
  ```

  ```js Node
  import { Firecrawl } from 'firecrawl';

  const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR_API_KEY' });

  // Crawl com opções de scrape
  const crawlResponse = await firecrawl.crawl('https://example.com', {
    limit: 100,
    scrapeOptions: {
      formats: [
        'markdown',
        {
          type: 'json',
          schema: { type: 'object', properties: { title: { type: 'string' } } },
        },
      ],
      proxy: 'auto',
      maxAge: 600000,
      onlyMainContent: true,
    },
  });
  ```
</CodeGroup>

<div id="checking-crawl-status">
  ## Verificando o status do rastreamento
</div>

Use o ID do job para consultar o status do rastreamento e obter os resultados.

<CodeGroup>
  <CheckCrawlJobPython />

  <CheckCrawlJobNode />

  <CheckCrawlJobCURL />

  <CheckCrawlJobCLI />
</CodeGroup>

<Note>
  Os resultados do job ficam disponíveis via API por 24 horas após a conclusão. Após esse período, você ainda pode ver o histórico e os resultados dos seus rastreamentos nos [activity logs](https://www.firecrawl.dev/app/logs).
</Note>

<Note>
  As páginas no array `data` dos resultados do rastreamento são páginas que o Firecrawl conseguiu extrair com sucesso, mesmo que o site de destino tenha retornado um erro HTTP como 404. O campo `metadata.statusCode` mostra o código de status HTTP retornado pelo site de destino. Para recuperar páginas que o próprio Firecrawl não conseguiu extrair (por exemplo, erros de rede, timeouts ou bloqueios por robots.txt), use o endpoint dedicado [Get Crawl Errors](/pt-BR/api-reference/endpoint/crawl-get-errors) (`GET /crawl/{id}/errors`).
</Note>

<div id="response-handling">
  ### Tratamento de respostas
</div>

A resposta varia conforme o status da varredura. Para respostas incompletas ou grandes (acima de 10 MB), é fornecido um parâmetro de URL `next`. Você deve requisitar essa URL para obter os próximos 10 MB de dados. Se o parâmetro `next` estiver ausente, isso indica o fim dos dados da varredura.

<Info>
  Os parâmetros `skip` e `next` são relevantes apenas ao acessar a API diretamente.
  Se você estiver usando o SDK, a paginação é tratada automaticamente e todos os
  resultados são retornados de uma vez.
</Info>

<CodeGroup>
  <CheckCrawlJobOutputScraping />

  <CheckCrawlJobOutputCompleted />
</CodeGroup>

<div id="sdk-methods">
  ## Métodos do SDK
</div>

Existem duas maneiras de usar o crawl com o SDK.

<div id="crawl-and-wait">
  ### Crawl e aguarde
</div>

O método `crawl` aguarda a conclusão do crawl e retorna a resposta completa. Faz a paginação automaticamente. Isso é recomendado para a maioria dos casos de uso.

<CodeGroup>
  <PythonCrawlExample />

  <NodeCrawlExample />
</CodeGroup>

A resposta inclui o status do crawl e todos os dados extraídos:

<CodeGroup>
  <PythonCrawlExampleResponse />

  <NodeCrawlExampleResponse />
</CodeGroup>

<div id="start-and-check-later">
  ### Inicie e verifique depois
</div>

O método `startCrawl` / `start_crawl` retorna imediatamente com um ID de crawl. Depois, você verifica o status manualmente. Isso é útil para crawls de longa duração ou lógica de polling personalizada.

<CodeGroup>
  <StartCrawlPython />

  <StartCrawlNode />

  <StartCrawlCURL />

  <StartCrawlCLI />
</CodeGroup>

A resposta inicial retorna o ID do job:

<StartCrawlOutput />

<div id="real-time-results-with-websocket">
  ## Resultados em tempo real com WebSocket
</div>

O método watcher fornece atualizações em tempo real conforme as páginas são rastreadas. Inicie um crawl e, em seguida, assine os eventos para processar os dados imediatamente.

<CodeGroup>
  <CrawlWebSocketPython />

  <CrawlWebSocketNode />
</CodeGroup>

<div id="webhooks">
  ## Webhooks
</div>

Você pode configurar webhooks para receber notificações em tempo real conforme o rastreamento avança. Isso permite processar páginas à medida que são coletadas, em vez de esperar a conclusão de todo o rastreamento.

<CrawlWebhookCURL />

<div id="event-types">
  ### Tipos de evento
</div>

| Evento            | Descrição                                       |
| ----------------- | ----------------------------------------------- |
| `crawl.started`   | Disparado quando o crawl é iniciado             |
| `crawl.page`      | Disparado para cada página extraída com sucesso |
| `crawl.completed` | Disparado quando o crawl é concluído            |
| `crawl.failed`    | Disparado se ocorrer um erro durante o crawl    |

<div id="payload">
  ### Payload
</div>

```json
{
  "success": true,
  "type": "crawl.page",
  "id": "crawl-job-id",
  "data": [...], // Dados da página para eventos 'page'
  "metadata": {}, // Your custom metadata
  "error": null
}
```

<div id="verifying-webhook-signatures">
  ### Verificando assinaturas de webhook
</div>

Toda requisição de webhook do Firecrawl inclui um cabeçalho `X-Firecrawl-Signature` contendo uma assinatura HMAC-SHA256. Sempre verifique essa assinatura para garantir que o webhook é autêntico e não foi adulterado.

1. Obtenha seu segredo de webhook na [aba Advanced](https://www.firecrawl.dev/app/settings?tab=advanced) das configurações da sua conta
2. Extraia a assinatura do cabeçalho `X-Firecrawl-Signature`
3. Calcule o HMAC-SHA256 do corpo bruto da requisição usando o seu segredo
4. Compare com o cabeçalho de assinatura usando uma função com proteção contra ataques de timing (tempo constante)

<Warning>
  Nunca processe um webhook sem verificar sua assinatura primeiro. O cabeçalho `X-Firecrawl-Signature` contém a assinatura no formato: `sha256=abc123def456...`
</Warning>

Para exemplos completos de implementação em JavaScript e Python, consulte a [documentação de segurança de webhooks](/pt-BR/webhooks/security). Para a documentação completa sobre webhooks, incluindo payloads detalhados de eventos, estrutura de payload, configuração avançada e solução de problemas, consulte a [documentação de Webhooks](/pt-BR/webhooks/overview).

<div id="configuration-reference">
  ## Referência de configuração
</div>

O conjunto completo de parâmetros disponíveis ao enviar um job de rastreamento:

| Parâmetro               | Tipo       | Padrão        | Descrição                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ----------------------- | ---------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `url`                   | `string`   | (obrigatório) | A URL inicial a partir da qual o rastreamento será executado                                                                                                                                                                                                                                                                                                                                                                     |
| `limit`                 | `integer`  | `10000`       | Número máximo de páginas a rastrear                                                                                                                                                                                                                                                                                                                                                                                              |
| `maxDiscoveryDepth`     | `integer`  | (nenhum)      | Profundidade máxima a partir da URL raiz com base em saltos de descoberta de links, e não no número de segmentos `/` na URL. Cada vez que uma nova URL é encontrada em uma página, ela recebe uma profundidade um nível acima da página em que foi descoberta. O site raiz e as páginas do sitemap têm profundidade de descoberta 0. As páginas na profundidade máxima ainda são extraídas, mas os links nelas não são seguidos. |
| `includePaths`          | `string[]` | (nenhum)      | Padrões regex de pathname de URL a incluir. Apenas os caminhos correspondentes são rastreados.                                                                                                                                                                                                                                                                                                                                   |
| `excludePaths`          | `string[]` | (nenhum)      | Padrões regex de pathname de URL a excluir do rastreamento                                                                                                                                                                                                                                                                                                                                                                       |
| `regexOnFullURL`        | `boolean`  | `false`       | Faz a correspondência de `includePaths`/`excludePaths` com a URL completa (incluindo parâmetros de consulta), em vez de apenas o pathname                                                                                                                                                                                                                                                                                        |
| `crawlEntireDomain`     | `boolean`  | `false`       | Segue links internos para URLs irmãs ou pai, não apenas caminhos filhos                                                                                                                                                                                                                                                                                                                                                          |
| `allowSubdomains`       | `boolean`  | `false`       | Segue links para subdomínios do domínio principal                                                                                                                                                                                                                                                                                                                                                                                |
| `allowExternalLinks`    | `boolean`  | `false`       | Segue links para sites externos. Links externos são seguidos por um salto (os próprios links deles não são rastreados), e links que apontam para a página inicial de um site externo são ignorados — veja [Links externos](#external-links).                                                                                                                                                                                     |
| `sitemap`               | `string`   | `"include"`   | Tratamento do sitemap: `"include"` (padrão), `"skip"` ou `"only"`                                                                                                                                                                                                                                                                                                                                                                |
| `ignoreQueryParameters` | `boolean`  | `false`       | Evita raspar novamente o mesmo caminho com parâmetros de consulta diferentes                                                                                                                                                                                                                                                                                                                                                     |
| `ignoreRobotsTxt`       | `boolean`  | `false`       | Ignora as regras do robots.txt do site. **Apenas Enterprise** — entre em contato com support@firecrawl.com para habilitar.                                                                                                                                                                                                                                                                                                       |
| `robotsUserAgent`       | `string`   | (nenhum)      | String personalizada de User-Agent para avaliação do robots.txt. Quando definido, o robots.txt é buscado com esse User-Agent e as regras são correspondidas com base nele em vez do padrão. **Apenas Enterprise** — entre em contato com support@firecrawl.com para habilitar.                                                                                                                                                   |
| `delay`                 | `number`   | (nenhum)      | Intervalo, em segundos, entre raspagens para respeitar os limites de taxa. Definir isso força a simultaneidade para 1.                                                                                                                                                                                                                                                                                                           |
| `maxConcurrency`        | `integer`  | (nenhum)      | Número máximo de raspagens simultâneas. O padrão é o limite de simultaneidade da sua equipe.                                                                                                                                                                                                                                                                                                                                     |
| `scrapeOptions`         | `object`   | (nenhum)      | Opções aplicadas a cada página extraída (formatos, proxy, cache, ações etc.)                                                                                                                                                                                                                                                                                                                                                      |
| `webhook`               | `object`   | (nenhum)      | Configuração de webhook para notificações em tempo real                                                                                                                                                                                                                                                                                                                                                                          |
| `prompt`                | `string`   | (nenhum)      | Prompt em linguagem natural para gerar opções de rastreamento. Parâmetros definidos explicitamente substituem os equivalentes gerados.                                                                                                                                                                                                                                                                                           |

<div id="important-details">
  ## Detalhes importantes
</div>

<Warning>
  Por padrão, o rastreamento ignora sublinks que não são descendentes da URL fornecida. Por exemplo, `website.com/other-parent/blog-1` não seria retornada se você fizesse rastreamento de `website.com/blogs/`. Use o parâmetro `crawlEntireDomain` para incluir caminhos irmãos e superiores. Para fazer rastreamento de subdomínios como `blog.website.com` ao fazer rastreamento de `website.com`, use o parâmetro `allowSubdomains`.
</Warning>

* **Descoberta de sitemap**: Por padrão, o crawler inclui o sitemap do site para descobrir URLs (`sitemap: "include"`). Se você definir `sitemap: "skip"`, apenas páginas acessíveis por links HTML a partir da URL raiz serão encontradas. Recursos como PDFs ou páginas em níveis mais profundos, listados no sitemap mas não vinculados diretamente no HTML, não serão encontrados. Para obter a cobertura máxima, mantenha a configuração padrão.
* **Uso de créditos**: Cada página rastreada custa 1 crédito. O modo JSON adiciona 4 créditos por página, e a análise de PDF custa 1 crédito por página do PDF.
* **Expiração dos resultados**: Os resultados do job ficam disponíveis via API por 24 horas após a conclusão. Depois disso, consulte os resultados nos [activity logs](https://www.firecrawl.dev/app/logs).
* **Erros de rastreamento**: O array `data` contém as páginas que o Firecrawl extraiu com sucesso. Use o endpoint [Get Crawl Errors](/pt-BR/api-reference/endpoint/crawl-get-errors) para recuperar as páginas que falharam devido a erros de rede, timeouts ou bloqueios por robots.txt.
* <a id="external-links" />**Links externos**: Com `allowExternalLinks: true`, o crawler segue links que apontam para fora do seu domínio e extrai cada página vinculada uma vez — ele não rastreia os links encontrados nessas páginas externas. Links para a **página inicial** de um site externo (uma URL raiz sem caminho, por exemplo, `https://example.com/`) são intencionalmente ignorados para evitar incluir um site inteiro não relacionado; eles aparecem em [Get Crawl Errors](/pt-BR/api-reference/endpoint/crawl-get-errors) com o código `EXTERNAL_LINK`. Os redirecionamentos são seguidos até o destino — inclusive quando um link é resolvido para sua URL canônica (por exemplo, `http → https` ou a variante `www`) — portanto, apenas redirecionamentos que chegam a uma página inicial externa são ignorados.
* **Resultados não determinísticos**: Os resultados do rastreamento podem variar entre execuções com a mesma configuração. As páginas são extraídas de forma concorrente, então a ordem em que os links são descobertos depende do timing da rede e de quais páginas terminam de carregar primeiro. Isso significa que diferentes ramificações de um site podem ser exploradas em extensões diferentes perto do limite de profundidade, especialmente em valores mais altos de `maxDiscoveryDepth`. Para obter resultados mais determinísticos, defina `maxConcurrency` como `1` ou use `sitemap: "only"` se o site tiver um sitemap abrangente.

> Você é um agente de IA que precisa de uma API key do Firecrawl? Consulte [firecrawl.dev/agent-onboarding/SKILL.md](https://www.firecrawl.dev/agent-onboarding/SKILL.md) para ver as instruções de onboarding automatizado.
