# Guia Avançado de Scraping (/pt-BR/advanced-scraping-guide)

<!-- agent-signals: reading_time_min: 19 · est_tokens: 9558 · updated: 2026-07-30 -->

Referência para todas as opções em todos os endpoints de scraping, rastreamento, mapeamento e agente do Firecrawl."

<div id="basic-scraping">
  ## scraping básica [#scraping-básica]
</div>

Para raspar uma única página e obter conteúdo em Markdown limpo, use o endpoint `/scrape`.

<CodeGroup>
  <CodeBlockTabs defaultValue="Python" groupId="curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="Python">
      ```python  
      # pip install firecrawl-py

      from firecrawl import Firecrawl

      firecrawl = Firecrawl(api_key="fc-YOUR-API-KEY")

      doc = firecrawl.scrape("https://firecrawl.dev")

      print(doc.markdown)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      // npm install firecrawl

      import { Firecrawl } from 'firecrawl-js';

      const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR-API-KEY' });

      const doc = await firecrawl.scrape('https://firecrawl.dev');

      console.log(doc.markdown);
      ```
    </CodeBlockTab>

    <CodeBlockTab value="cURL">
      ```bash  
      curl -X POST https://api.firecrawl.dev/v2/scrape \
          -H 'Content-Type: application/json' \
          -H 'Authorization: Bearer fc-YOUR-API-KEY' \
          -d '{
            "url": "https://docs.firecrawl.dev"
          }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

<div id="scraping-pdfs">
  ## Extração de PDFs [#extração-de-pdfs]
</div>

O Firecrawl oferece suporte a PDFs. Use a opção `parsers` (por exemplo, `parsers: ["pdf"]`) quando quiser garantir a extração de PDFs. Você pode controlar a estratégia de extração com a opção `mode`:

* **`auto`** (padrão) — tenta primeiro uma extração rápida baseada em texto e, se necessário, recorre a OCR.
* **`fast`** — apenas extração baseada em texto (texto embutido). Mais rápido, mas ignora páginas digitalizadas ou com muitas imagens.
* **`ocr`** — força a extração via OCR em todas as páginas. Use para documentos digitalizados ou quando `auto` classificar uma página incorretamente.

`{ type: "pdf" }` e `"pdf"` usam por padrão `mode: "auto"`.

```json
"parsers": [{ "type": "pdf", "mode": "fast", "maxPages": 50 }]
```

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

Ao usar o endpoint `/scrape`, você pode personalizar a requisição com as seguintes opções.

<div id="formats-formats">
  ### Formatos (`formats`) [#formatos-formats]
</div>

O array `formats` controla quais tipos de saída o scraper retorna. Padrão: `["markdown"]`.

**Formatos em string**: passe o nome diretamente (por exemplo, `"markdown"`).

| Formato    | Descrição                                                                                                                                                     |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `markdown` | Conteúdo da página convertido para Markdown limpo.                                                                                                            |
| `html`     | HTML processado com elementos desnecessários removidos.                                                                                                       |
| `rawHtml`  | HTML original exatamente como retornado pelo servidor.                                                                                                        |
| `links`    | Todos os links encontrados na página.                                                                                                                         |
| `images`   | Todas as imagens encontradas na página.                                                                                                                       |
| `summary`  | Um resumo gerado por um LLM do conteúdo da página.                                                                                                            |
| `branding` | Extrai a identidade de marca (cores, fontes, tipografia, espaçamento, componentes de UI).                                                                     |
| `product`  | Extrai um produto estruturado (título, preço, disponibilidade, imagens e variantes) de páginas de produto por meio de dados estruturados de múltiplas fontes. |

**Formatos em objeto**: passe um objeto com `type` e opções adicionais.

| Formato          | Opções                                                                                   | Descrição                                                                                                                                                  |
| ---------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `json`           | `prompt?: string`, `schema?: object`                                                     | Extrai dados estruturados usando um LLM. Forneça um schema JSON e/ou um prompt em linguagem natural (máx. 10.000 caracteres).                              |
| `screenshot`     | `fullPage?: boolean`, `quality?: number`, `viewport?: { width, height }`                 | Captura uma captura de tela. No máximo uma por requisição. A resolução máxima do viewport é 7680×4320. As URLs das capturas de tela expiram após 24 horas. |
| `changeTracking` | `modes?: ("json" \| "git-diff")[]`, `tag?: string`, `schema?: object`, `prompt?: string` | Rastreio de mudanças entre scrapes. Requer que `"markdown"` também esteja no array de formatos.                                                            |
| `attributes`     | `selectors: [{ selector: string, attribute: string }]`                                   | Extrai atributos HTML específicos de elementos que correspondem a seletores CSS.                                                                           |

<div id="mobile-scraping">
  ### Scraping móvel [#scraping-móvel]
</div>

Defina `mobile: true` para emular um dispositivo móvel. Isso é útil quando um site responsivo oculta conteúdo na versão desktop ou exibe um layout diferente em navegadores móveis.

Para sites específicos de uma região, combine com `location` e uma captura de tela em um dispositivo móvel para verificar o layout renderizado:

<CodeGroup>
  <CodeBlockTabs defaultValue="Python" groupId="curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="Python">
      ```python  
      from firecrawl import Firecrawl

      firecrawl = Firecrawl(api_key="fc-YOUR-API-KEY")

      doc = firecrawl.scrape(
          "https://example.com",
          mobile=True,
          location={"country": "GB", "languages": ["en-GB"]},
          formats=[
              "markdown",
              {"type": "screenshot", "fullPage": True, "viewport": {"width": 390, "height": 844}},
          ],
          only_main_content=False,
          wait_for=2000,
      )

      print(doc.markdown)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      import { Firecrawl } from 'firecrawl-js';

      const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR-API-KEY' });

      const doc = await firecrawl.scrape('https://example.com', {
        mobile: true,
        location: { country: 'GB', languages: ['en-GB'] },
        formats: [
          'markdown',
          { type: 'screenshot', fullPage: true, viewport: { width: 390, height: 844 } },
        ],
        onlyMainContent: false,
        waitFor: 2000,
      });

      console.log(doc.markdown);
      ```
    </CodeBlockTab>

    <CodeBlockTab value="cURL">
      ```bash  
      curl -X POST https://api.firecrawl.dev/v2/scrape \
        -H 'Content-Type: application/json' \
        -H 'Authorization: Bearer fc-YOUR-API-KEY' \
        -d '{
          "url": "https://example.com",
          "mobile": true,
          "location": {
            "country": "GB",
            "languages": ["en-GB"]
          },
          "formats": [
            "markdown",
            { "type": "screenshot", "fullPage": true, "viewport": { "width": 390, "height": 844 } }
          ],
          "onlyMainContent": false,
          "waitFor": 2000
        }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

Se o site ainda exibir um layout para desktop apesar de `mobile: true`, adicione um User-Agent mobile via `headers`:

```json
{
  "headers": {
    "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1"
  }
}
```

<div id="content-filtering">
  ### Filtragem de conteúdo [#filtragem-de-conteúdo]
</div>

Esses parâmetros controlam quais partes da página aparecem na saída. Quando `onlyMainContent` é `true` (o padrão), o boilerplate (nav, footer etc.) é removido. `includeTags` e `excludeTags` são aplicados ao DOM original da página, não ao resultado após a filtragem, portanto seus seletores devem segmentar os elementos conforme aparecem no HTML de origem. Defina `onlyMainContent: false` para usar a página completa como ponto de partida para a filtragem por tags.

| Parâmetro         | Tipo      | Padrão | Descrição                                                                                                                                              |
| ----------------- | --------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `onlyMainContent` | `boolean` | `true` | Retorna apenas o conteúdo principal. Defina como `false` para retornar a página completa.                                                              |
| `includeTags`     | `array`   | —      | Seletores CSS a serem incluídos — tags, classes, IDs ou seletores de atributo (por exemplo, `["h1", "p", ".main-content", "[data-testid=\"main\"]"]`). |
| `excludeTags`     | `array`   | —      | Seletores CSS a serem excluídos — tags, classes, IDs ou seletores de atributo (por exemplo, `["#ad", "#footer", "[role=\"banner\"]"]`).                |

<div id="timing-and-cache">
  ### Tempo e cache [#tempo-e-cache]
</div>

| Parâmetro | Tipo           | Padrão      | Descrição                                                                                                                                       |
| --------- | -------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `waitFor` | `integer` (ms) | `0`         | Tempo extra de espera antes do scraping, além do smart-wait. Use com moderação.                                                                 |
| `maxAge`  | `integer` (ms) | `172800000` | Retorne uma versão em cache se estiver mais recente do que esse valor (o padrão é 2 dias). Defina `0` para sempre buscar uma versão atualizada. |
| `timeout` | `integer` (ms) | `60000`     | Duração máxima da requisição antes de abortar (o padrão é 60 segundos). O mínimo é 1000 (1 segundo).                                            |

<div id="pdf-parsing">
  ### Análise de PDF [#análise-de-pdf]
</div>

| Parâmetro | Tipo    | Padrão    | Descrição                                                                                             |
| --------- | ------- | --------- | ----------------------------------------------------------------------------------------------------- |
| `parsers` | `array` | `["pdf"]` | Controla o processamento de PDFs. Use `[]` para ignorar a análise e retornar base64 (1 crédito fixo). |

```json
{ "type": "pdf", "mode": "fast" | "auto" | "ocr", "maxPages": 10 }
```

| Propriedade | Tipo                        | Padrão          | Descrição                                                                                |
| ----------- | --------------------------- | --------------- | ---------------------------------------------------------------------------------------- |
| `type`      | `"pdf"`                     | *(obrigatório)* | Tipo de parser.                                                                          |
| `mode`      | `"fast" \| "auto" \| "ocr"` | `"auto"`        | `fast`: extração somente de texto. `auto`: fast com OCR como fallback. `ocr`: força OCR. |
| `maxPages`  | `integer`                   | —               | Limita o número de páginas a serem analisadas.                                           |

<div id="actions">
  ### Ações [#ações]
</div>

Execute ações no navegador antes do scraping. Isso é útil para conteúdo dinâmico, navegação ou páginas com acesso restrito. Você pode incluir até 50 ações por requisição, e o tempo total de espera entre todas as ações `wait` e `waitFor` não pode exceder 60 segundos.

| Ação                | Parâmetros                                                               | Descrição                                                                                                                                                 |
| ------------------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `wait`              | `milliseconds?: number`, `selector?: string`                             | Aguarde por um tempo fixo **ou** até que um elemento fique visível (informe um ou outro, não ambos). Ao usar `selector`, o tempo limite é de 30 segundos. |
| `click`             | `selector: string`, `all?: boolean`                                      | Clique em um elemento que corresponda ao seletor CSS. Defina `all: true` para clicar em todas as correspondências.                                        |
| `write`             | `text: string`                                                           | Digite texto no campo atualmente em foco. Primeiro, você deve focar o elemento com uma ação `click`.                                                      |
| `press`             | `key: string`                                                            | Pressione uma tecla do teclado (por exemplo, `"Enter"`, `"Tab"`, `"Escape"`).                                                                             |
| `scroll`            | `direction?: "up" \| "down"`, `selector?: string`                        | Role a página ou um elemento específico. A direção padrão é `"down"`.                                                                                     |
| `screenshot`        | `fullPage?: boolean`, `quality?: number`, `viewport?: { width, height }` | Faça uma captura de tela. A resolução máxima da viewport é 7680×4320.                                                                                     |
| `scrape`            | *(nenhum)*                                                               | Capture o HTML atual da página neste ponto da sequência de ações.                                                                                         |
| `executeJavascript` | `script: string`                                                         | Execute código JavaScript na página. Os valores retornados ficam disponíveis no array `actions.javascriptReturns` da resposta.                            |
| `pdf`               | `format?: string`, `landscape?: boolean`, `scale?: number`               | Gere um PDF. Formatos compatíveis: `"A0"` a `"A6"`, `"Letter"`, `"Legal"`, `"Tabloid"`, `"Ledger"`. O padrão é `"Letter"`.                                |

<CodeGroup>
  <CodeBlockTabs defaultValue="Python" groupId="curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="Python">
      ```python  
      from firecrawl import Firecrawl

      firecrawl = Firecrawl(api_key='fc-YOUR-API-KEY')

      doc = firecrawl.scrape('https://example.com', {
        'actions': [
          { 'type': 'wait', 'milliseconds': 1000 },
          { 'type': 'click', 'selector': '#accept' },
          { 'type': 'scroll', 'direction': 'down' },
          { 'type': 'click', 'selector': '#q' },
          { 'type': 'write', 'text': 'firecrawl' },
          { 'type': 'press', 'key': 'Enter' },
          { 'type': 'wait', 'milliseconds': 2000 }
        ],
        'formats': ['markdown']
      })

      print(doc.markdown)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      import { Firecrawl } from 'firecrawl-js';

      const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR-API-KEY' });

      const doc = await firecrawl.scrape('https://example.com', {
        actions: [
          { type: 'wait', milliseconds: 1000 },
          { type: 'click', selector: '#accept' },
          { type: 'scroll', direction: 'down' },
          { type: 'click', selector: '#q' },
          { type: 'write', text: 'firecrawl' },
          { type: 'press', key: 'Enter' },
          { type: 'wait', milliseconds: 2000 }
        ],
        formats: ['markdown']
      });

      console.log(doc.markdown);
      ```
    </CodeBlockTab>

    <CodeBlockTab value="cURL">
      ```bash  
      curl -X POST https://api.firecrawl.dev/v2/scrape \
        -H 'Content-Type: application/json' \
        -H 'Authorization: Bearer fc-YOUR-API-KEY' \
        -d '{
          "url": "https://example.com",
          "actions": [
            { "type": "wait", "milliseconds": 1000 },
            { "type": "click", "selector": "#accept" },
            { "type": "scroll", "direction": "down" },
            { "type": "click", "selector": "#q" },
            { "type": "write", "text": "firecrawl" },
            { "type": "press", "key": "Enter" },
            { "type": "wait", "milliseconds": 2000 }
          ],
          "formats": ["markdown"]
        }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

<div id="action-execution-notes">
  #### Observações sobre a execução de ações [#observações-sobre-a-execução-de-ações]
</div>

* **Write** requer um `click` anterior para focar o elemento de destino.
* **Scroll** aceita um `selector` opcional para rolar um elemento específico em vez da página.
* **Wait** aceita `milliseconds` (atraso fixo) ou `selector` (esperar até que fique visível).
* As ações são executadas **sequencialmente**: cada etapa é concluída antes da próxima começar.
* Ações **não são compatíveis com PDFs**. Se a URL for resolvida para um PDF, a requisição falhará.

<div id="advanced-action-examples">
  #### Exemplos de Ações Avançadas [#exemplos-de-ações-avançadas]
</div>

**Fazendo uma captura de tela:**

```bash title="cURL"
curl -X POST https://api.firecrawl.dev/v2/scrape \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer fc-YOUR-API-KEY' \
  -d '{
    "url": "https://example.com",
    "actions": [
      { "type": "click", "selector": "#load-more" },
      { "type": "wait", "milliseconds": 1000 },
      { "type": "screenshot", "fullPage": true, "quality": 80 }
    ]
  }'
```

**Clicar em vários elementos:**

```bash title="cURL"
curl -X POST https://api.firecrawl.dev/v2/scrape \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer fc-YOUR-API-KEY' \
  -d '{
    "url": "https://example.com",
    "actions": [
      { "type": "click", "selector": ".expand-button", "all": true },
      { "type": "wait", "milliseconds": 500 }
    ],
    "formats": ["markdown"]
  }'
```

**Gerar um PDF:**

```bash title="cURL"
curl -X POST https://api.firecrawl.dev/v2/scrape \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer fc-YOUR-API-KEY' \
  -d '{
    "url": "https://example.com",
    "actions": [
      { "type": "pdf", "format": "A4", "landscape": false }
    ]
  }'
```

**Executar JavaScript (por exemplo, para extrair dados embutidos na página):**

```bash title="cURL"
curl -X POST https://api.firecrawl.dev/v2/scrape \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer fc-YOUR-API-KEY' \
  -d '{
    "url": "https://example.com",
    "actions": [
      { "type": "executeJavascript", "script": "document.querySelector(\"#__NEXT_DATA__\").textContent" }
    ],
    "formats": ["markdown"]
  }'
```

O valor de retorno de cada ação `executeJavascript` é armazenado no array `actions.javascriptReturns` da resposta.

<div id="full-scrape-example">
  ### Exemplo completo de scraping [#exemplo-completo-de-scraping]
</div>

A solicitação abaixo combina várias opções de scraping:

```bash title="cURL"
curl -X POST https://api.firecrawl.dev/v2/scrape \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer fc-YOUR-API-KEY' \
    -d '{
      "url": "https://docs.firecrawl.dev",
      "formats": [
        "markdown",
        "links",
        "html",
        "rawHtml",
        { "type": "screenshot", "fullPage": true, "quality": 80 }
      ],
      "includeTags": ["h1", "p", "a", ".main-content"],
      "excludeTags": ["#ad", "#footer"],
      "onlyMainContent": false,
      "waitFor": 1000,
      "timeout": 15000,
      "parsers": ["pdf"]
    }'
```

Essa requisição retorna markdown, HTML, HTML bruto, links e uma captura de tela da página inteira. Ela restringe o conteúdo a `<h1>`, `<p>`, `<a>` e `.main-content`, enquanto exclui `#ad` e `#footer`, aguarda 1 segundo antes de iniciar o scraping, define um tempo limite de 15 segundos e habilita a análise de PDFs.

Consulte a [referência completa da API de Scrape](https://docs.firecrawl.dev/api-reference/endpoint/scrape) para mais detalhes.

<div id="json-extraction-via-formats">
  ## Extração em JSON via formatos [#extração-em-json-via-formatos]
</div>

Use o objeto de formato JSON em `formats` para extrair dados estruturados de uma só vez:

<CodeGroup>
  <CodeBlockTabs defaultValue="Python" groupId="curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="Python">
      ```python  
      from firecrawl import Firecrawl

      firecrawl = Firecrawl(api_key='fc-YOUR-API-KEY')

      doc = firecrawl.scrape('https://firecrawl.dev', {
        'formats': [{
          'type': 'json',
          'prompt': 'Extract the features of the product',
          'schema': {
            'type': 'object',
            'properties': { 'features': { 'type': 'object' } },
            'required': ['features']
          }
        }]
      })

      print(doc.json)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      import { Firecrawl } from 'firecrawl-js';

      const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR-API-KEY' });

      const doc = await firecrawl.scrape('https://firecrawl.dev', {
        formats: [{
          type: 'json',
          prompt: 'Extract the features of the product',
          schema: {
            type: 'object',
            properties: { features: { type: 'object' } },
            required: ['features']
          }
        }]
      });

      console.log(doc.json);
      ```
    </CodeBlockTab>

    <CodeBlockTab value="cURL">
      ```bash  
      curl -X POST https://api.firecrawl.dev/v2/scrape \
        -H 'Content-Type: application/json' \
        -H 'Authorization: Bearer fc-YOUR-API-KEY' \
        -d '{
          "url": "https://firecrawl.dev",
          "formats": [{
            "type": "json",
            "prompt": "Extract the features of the product",
            "schema": {"type": "object", "properties": {"features": {"type": "object"}}, "required": ["features"]}
          }]
        }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

<div id="agent-endpoint">
  ## Endpoint do agente [#endpoint-do-agente]
</div>

Use o endpoint `/v2/agent` para extração autônoma de dados em várias páginas. O agente é executado de forma assíncrona: você inicia uma tarefa e depois faz polling dos resultados.

<div id="agent-options">
  ### Opções do agente [#opções-do-agente]
</div>

| Parâmetro               | Tipo      | Padrão           | Descrição                                                                                                                                                                                 |
| ----------------------- | --------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `prompt`                | `string`  | *(obrigatório)*  | Instruções em linguagem natural descrevendo quais dados extrair (máx. 10.000 caracteres).                                                                                                 |
| `urls`                  | `array`   | —                | URLs às quais o agente estará limitado.                                                                                                                                                   |
| `schema`                | `object`  | —                | Schema JSON para estruturar os dados extraídos.                                                                                                                                           |
| `maxCredits`            | `number`  | `2500`           | Créditos máximos que o agente pode gastar. O dashboard suporta até 2.500; para limites maiores, defina isso pela API (valores acima de 2.500 são sempre cobrados como requisições pagas). |
| `strictConstrainToURLs` | `boolean` | `false`          | Quando `true`, o agente visita apenas as URLs fornecidas.                                                                                                                                 |
| `model`                 | `string`  | `"spark-1-mini"` | Modelo de IA a ser usado: `"spark-1-mini"` (padrão, 60% mais barato) ou `"spark-1-pro"` (maior precisão).                                                                                 |

<CodeGroup>
  <CodeBlockTabs defaultValue="Python" groupId="curl+node+python">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="Python">
        Python
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="Node">
        Node
      </CodeBlockTabsTrigger>

      <CodeBlockTabsTrigger value="cURL">
        cURL
      </CodeBlockTabsTrigger>
    </CodeBlockTabsList>

    <CodeBlockTab value="Python">
      ```python  
      from firecrawl import Firecrawl

      firecrawl = Firecrawl(api_key='fc-YOUR-API-KEY')

      # Iniciar job do agente
      started = firecrawl.start_agent(
          prompt="Extraia o título e a descrição",
          urls=["https://docs.firecrawl.dev"],
          schema={"type": "object", "properties": {"title": {"type": "string"}, "description": {"type": "string"}}, "required": ["title"]}
      )

      # Consultar status
      status = firecrawl.get_agent_status(started["id"])
      print(status.get("status"), status.get("data"))
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      import { Firecrawl } from 'firecrawl';

      const firecrawl = new Firecrawl({ apiKey: 'fc-YOUR-API-KEY' });

      // Iniciar job do agente
      const started = await firecrawl.startAgent({
        prompt: 'Extraia o título e a descrição',
        urls: ['https://docs.firecrawl.dev'],
        schema: { type: 'object', properties: { title: { type: 'string' }, description: { type: 'string' } }, required: ['title'] }
      });

      // Consultar status
      const status = await firecrawl.getAgentStatus(started.id);
      console.log(status.status, status.data);
      ```
    </CodeBlockTab>

    <CodeBlockTab value="cURL">
      ```bash  
      curl -X POST https://api.firecrawl.dev/v2/agent \
        -H 'Content-Type: application/json' \
        -H 'Authorization: Bearer fc-YOUR-API-KEY' \
        -d '{
          "prompt": "Extraia o título e a descrição",
          "urls": ["https://docs.firecrawl.dev"],
          "schema": {"type": "object", "properties": {"title": {"type": "string"}, "description": {"type": "string"}}, "required": ["title"]}
        }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

<div id="check-agent-status">
  ### Verificar status do agente [#verificar-status-do-agente]
</div>

Faça requisições periódicas para `GET /v2/agent/{jobId}` para verificar o progresso. O campo `status` da resposta será `"processing"`, `"completed"` ou `"failed"`.

```bash title="cURL"
curl -X GET https://api.firecrawl.dev/v2/agent/YOUR-JOB-ID \
  -H 'Authorization: Bearer fc-YOUR-API-KEY'
```

Os SDKs de Python e Node também fornecem um método conveniente (`firecrawl.agent()`) que inicia o job e consulta o status automaticamente até a conclusão.

<div id="crawling-multiple-pages">
  ## Rastreamento de várias páginas [#rastreamento-de-várias-páginas]
</div>

Para rastrear várias páginas, use o endpoint `/v2/crawl`. O rastreamento é executado de forma assíncrona e retorna um ID do job. Use o parâmetro `limit` para controlar quantas páginas serão rastreadas. Se omitido, o rastreamento processará até 10.000 páginas.

```bash title="cURL"
curl -X POST https://api.firecrawl.dev/v2/crawl \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer fc-YOUR-API-KEY' \
    -d '{
      "url": "https://docs.firecrawl.dev",
      "limit": 10
    }'
```

<div id="response">
  ### Resposta [#resposta]
</div>

```json
{ "id": "1234-5678-9101" }
```

<div id="check-crawl-job">
  ### Verificar o job de rastreamento [#verificar-o-job-de-rastreamento]
</div>

Use o ID do job para verificar o status do rastreamento e recuperar os resultados.

```bash title="cURL"
curl -X GET https://api.firecrawl.dev/v2/crawl/1234-5678-9101 \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer fc-YOUR-API-KEY'
```

Se o conteúdo tiver mais de 10MB ou se o job de rastreamento ainda estiver em execução, a resposta pode incluir o parâmetro `next`, uma URL para a próxima página de resultados.

<div id="crawl-prompt-and-params-preview">
  ### Prévia do prompt e dos parâmetros de rastreamento [#prévia-do-prompt-e-dos-parâmetros-de-rastreamento]
</div>

Você pode fornecer um `prompt` em linguagem natural para que o Firecrawl defina as configurações de rastreamento. Visualize-as primeiro:

```bash title="cURL"
curl -X POST https://api.firecrawl.dev/v2/crawl/params-preview \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer fc-YOUR-API-KEY' \
  -d '{
    "url": "https://docs.firecrawl.dev",
    "prompt": "Extract docs and blog"
  }'
```

<div id="crawler-options">
  ### Opções do crawler [#opções-do-crawler]
</div>

Ao usar o endpoint `/v2/crawl`, você pode configurar o comportamento do crawler com as seguintes opções.

<div id="path-filtering">
  #### Filtragem de caminhos [#filtragem-de-caminhos]
</div>

| Parâmetro        | Tipo      | Padrão  | Descrição                                                                 |
| ---------------- | --------- | ------- | ------------------------------------------------------------------------- |
| `includePaths`   | `array`   | —       | Padrões regex para URLs a serem incluídas (apenas o pathname por padrão). |
| `excludePaths`   | `array`   | —       | Padrões regex para URLs a serem excluídas (apenas o pathname por padrão). |
| `regexOnFullURL` | `boolean` | `false` | Aplica os padrões à URL completa em vez de apenas ao pathname.            |

<Warning>
  A URL inicial também é verificada em relação a `includePaths`. Se ela não corresponder a nenhum dos padrões, o rastreamento poderá retornar 0 páginas.
</Warning>

<div id="crawl-scope">
  #### Escopo do rastreamento [#escopo-do-rastreamento]
</div>

| Parâmetro            | Tipo         | Padrão  | Descrição                                                                      |
| -------------------- | ------------ | ------- | ------------------------------------------------------------------------------ |
| `maxDiscoveryDepth`  | `integer`    | —       | Profundidade máxima de links para descoberta de novas URLs.                    |
| `limit`              | `integer`    | `10000` | Máximo de páginas a serem rastreadas.                                          |
| `crawlEntireDomain`  | `boolean`    | `false` | Explorar páginas irmãs (siblings) e pais (parents) para cobrir todo o domínio. |
| `allowExternalLinks` | `boolean`    | `false` | Seguir links para domínios externos.                                           |
| `allowSubdomains`    | `boolean`    | `false` | Seguir subdomínios do domínio principal.                                       |
| `delay`              | `number` (s) | —       | Atraso entre coletas. Definir isso força a concorrência para 1.                |

<div id="sitemap-and-deduplication">
  #### Sitemap e deduplicação [#sitemap-e-deduplicação]
</div>

| Parâmetro                | Tipo      | Padrão      | Descrição                                                                                                              |
| ------------------------ | --------- | ----------- | ---------------------------------------------------------------------------------------------------------------------- |
| `sitemap`                | `string`  | `"include"` | `"include"`: usar sitemap + descoberta de links. `"skip"`: ignorar sitemap. `"only"`: rastrear apenas URLs do sitemap. |
| `deduplicateSimilarURLs` | `boolean` | `true`      | Normaliza variantes de URL (`www.`, `https`, barras finais, `index.html`) tratando-as como duplicadas.                 |
| `ignoreQueryParameters`  | `boolean` | `false`     | Remove query strings antes da deduplicação (por exemplo, `/page?a=1` e `/page?a=2` se tornam uma única URL).           |

<div id="scrape-options-for-crawl">
  #### Opções de scrape para crawl [#opções-de-scrape-para-crawl]
</div>

| Parâmetro       | Tipo     | Padrão                      | Descrição                                                                                              |
| --------------- | -------- | --------------------------- | ------------------------------------------------------------------------------------------------------ |
| `scrapeOptions` | `object` | `{ formats: ["markdown"] }` | Configuração de scrape por página. Aceita todas as [opções de scrape](#scrape-options) listadas acima. |

<div id="crawl-example">
  ### Exemplo de rastreamento [#exemplo-de-rastreamento]
</div>

```bash title="cURL"
curl -X POST https://api.firecrawl.dev/v2/crawl \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer fc-SUA-API-KEY' \
    -d '{
      "url": "https://docs.firecrawl.dev",
      "includePaths": ["^/blog/.*$", "^/docs/.*$"],
      "excludePaths": ["^/admin/.*$", "^/private/.*$"],
      "maxDiscoveryDepth": 2,
      "limit": 1000
    }'
```

<div id="mapping-website-links">
  ## Mapeamento de links de websites [#mapeamento-de-links-de-websites]
</div>

O endpoint `/v2/map` identifica URLs relacionadas a um determinado website.

```bash title="cURL"
curl -X POST https://api.firecrawl.dev/v2/map \
    -H 'Content-Type: application/json' \
    -H 'Authorization: Bearer fc-YOUR-API-KEY' \
    -d '{
      "url": "https://docs.firecrawl.dev"
    }'
```

<div id="map-options">
  ### Opções do Map [#opções-do-map]
</div>

| Parâmetro           | Tipo      | Padrão      | Descrição                                  |
| ------------------- | --------- | ----------- | ------------------------------------------ |
| `search`            | `string`  | —           | Filtra links por correspondência de texto. |
| `limit`             | `integer` | `100`       | Número máximo de links retornados.         |
| `sitemap`           | `string`  | `"include"` | `"include"`, `"skip"` ou `"only"`.         |
| `includeSubdomains` | `boolean` | `true`      | Inclui subdomínios.                        |

Aqui está a referência da API: [Documentação do endpoint Map](https://docs.firecrawl.dev/api-reference/endpoint/map)

<div id="whitelisting-firecrawl">
  ## Adicionando o Firecrawl à lista de permissões [#adicionando-o-firecrawl-à-lista-de-permissões]
</div>

<div id="allowing-firecrawl-to-scrape-your-website">
  ### Como permitir que o Firecrawl faça scraping do seu site [#como-permitir-que-o-firecrawl-faça-scraping-do-seu-site]
</div>

* **User Agent**: permita `FirecrawlAgent` no seu firewall ou nas suas regras de segurança.
* **Endereços IP**: o Firecrawl não usa um conjunto fixo de IPs de saída.

<div id="allowing-your-application-to-call-the-firecrawl-api">
  ### Permitindo que sua aplicação faça chamadas à API do Firecrawl [#permitindo-que-sua-aplicação-faça-chamadas-à-api-do-firecrawl]
</div>

Se o seu firewall bloquear requisições de saída da sua aplicação para serviços externos, você precisa adicionar o endereço IP do servidor da API do Firecrawl à lista de permissões para que sua aplicação possa acessar a API do Firecrawl (`api.firecrawl.dev`):

* **Endereço IP**: `35.245.250.27`

Adicione esse IP à lista de permissões de saída do seu firewall para que seu backend possa enviar requisições de scrape, crawl, map e agent para o Firecrawl.
