> ## Documentation Index
> Fetch the complete documentation index at: https://docs.firecrawl.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Monitoramento

> Agende verificações recorrentes, detecte mudanças e receba notificações por webhook ou e-mail

O monitoramento do Firecrawl executa verificações recorrentes e notifica você ou seu agente quando algo muda ou aparece. Use `/monitor` para [acompanhar páginas conhecidas](/pt-BR/features/monitoring-page), [rastrear um site em um agendamento](/pt-BR/features/monitoring-website) ou [executar uma busca contínua na web](/pt-BR/features/monitoring-web-scale) por novos resultados que correspondam a uma meta.

Todos os tipos de monitor compartilham o mesmo fluxo de trabalho: escolha um ou mais alvos, defina um agendamento, adicione uma meta opcional em linguagem simples e receba notificações por webhook, email ou Slack quando algo importante acontecer. Esta página aborda a configuração compartilhada. Para configurações e exemplos específicos de alvo, acesse a página de monitoramento de [Página](/pt-BR/features/monitoring-page), [Site](/pt-BR/features/monitoring-website) ou [Toda a web em escala](/pt-BR/features/monitoring-web-scale).

<CardGroup cols={3}>
  <Card title="Monitoramento de páginas" icon="file-lines" href="/pt-BR/features/monitoring-page">
    Acompanhe uma ou mais URLs conhecidas, compare cada scraping com o último snapshot e gere alertas para mudanças significativas na página.
  </Card>

  <Card title="Monitoramento de sites" icon="spider" href="/pt-BR/features/monitoring-website">
    Faça o rastreamento de um site em um agendamento, detecte páginas adicionadas, alteradas ou removidas e notifique seu webhook ou caixa de entrada.
  </Card>

  <Card title="Monitoramento de toda a web em escala" icon="globe" href="/pt-BR/features/monitoring-web-scale">
    Execute buscas na web recorrentes e gere alertas quando um novo resultado aparecer e corresponder à sua meta.
  </Card>
</CardGroup>

Cada verificação registra resultados por página como `same`, `new`, `changed`, `removed` ou `error`. Você pode receber um webhook quando cada página monitorada for concluída, um webhook para cada verificação concluída, resumos por email quando houver mudanças ou erros, notificações do Slack em um canal, ou qualquer combinação dessas notificações.

<div className="firecrawl-cta-box" style={{ opacity: 0.6 }}>
  <div style={{ display: "flex", alignItems: "flex-start", gap: "8px", marginBottom: "8px" }}>
    <Icon icon="sack-dollar" color="#9ca3af" size={22} />

    <div className="firecrawl-cta-title" style={{ margin: 0, color: "#9ca3af" }}>
      <span>Encerrado: recompensa por feedback sobre /monitor</span>
    </div>
  </div>

  <p className="firecrawl-cta-description">
    Todos os participantes elegíveis à recompensa já foram contatados. Fique de olho nas próximas recompensas em nossa documentação!
  </p>
</div>

<div id="targets">
  ## Alvos
</div>

Todo monitor tem um ou mais **alvos**. O tipo de alvo determina o que cada verificação faz:

| Alvo     | O que monitora                             | Configuração                                                                  |
| -------- | ------------------------------------------ | ----------------------------------------------------------------------------- |
| `scrape` | URLs conhecidas que você informa           | [Monitoramento de páginas](/pt-BR/features/monitoring-page)                   |
| `crawl`  | Cada página descoberta por um rastreamento | [Monitoramento de sites](/pt-BR/features/monitoring-website)                  |
| `search` | Novos resultados em toda a web             | [Monitoramento de toda a web em escala](/pt-BR/features/monitoring-web-scale) |

Cada monitor aceita de 1 a 50 alvos, e você pode misturar tipos de alvo em um único monitor. `retentionDays` tem valor padrão de `30` e pode ser definido em até `365`.

Cada chamada de criação retorna o novo monitor com o cron normalizado, `nextRunAt` calculado e `estimatedCreditsPerMonth`. Quando a avaliação está habilitada, `estimatedCreditsPerMonth` é uma estimativa de limite superior, porque os créditos de avaliação só são cobrados para páginas alteradas que de fato são avaliadas:

```json Response theme={null}
{
  "success": true,
  "data": {
    "id": "019df960-06e7-7383-9d89-82c0113dc31a",
    "name": "Hacker News AI monitor",
    "status": "active",
    "schedule": {
      "cron": "*/30 * * * *",
      "timezone": "UTC"
    },
    "nextRunAt": "2026-05-17T16:00:00.000Z",
    "lastRunAt": null,
    "currentCheckId": null,
    "goal": "Alert when a new Hacker News story related to AI enters the top 10. Ignore changes to stories that are not about AI. Do not alert on changes outside the top 10.",
    "judgeEnabled": true,
    "targets": [
      {
        "id": "019df960-09bb-7c11-8001-1f12f50ab1c2",
        "type": "scrape",
        "urls": ["https://news.ycombinator.com"]
      }
    ],
    "webhook": null,
    "notification": {
      "email": {
        "enabled": true,
        "recipients": ["alerts@example.com"],
        "includeDiffs": true
      }
    },
    "retentionDays": 30,
    "estimatedCreditsPerMonth": 2880,
    "lastCheckSummary": null,
    "createdAt": "2026-05-17T15:30:00.000Z",
    "updatedAt": "2026-05-17T15:30:00.000Z"
  }
}
```

<div id="goals-and-judging">
  ## Objetivos e avaliação
</div>

Adicione um `goal` em linguagem simples quando quiser receber alertas apenas sobre mudanças significativas. Se `goal` estiver presente e `judgeEnabled` for omitido, o Firecrawl ativa a avaliação automaticamente. A avaliação é executada nas páginas alteradas e retorna um `judgment` com `meaningful`, `confidence`, `reason` e `meaningfulChanges`.

Como a meta é aplicada depende do alvo: monitores de [página](/pt-BR/features/monitoring-page) e [site](/pt-BR/features/monitoring-website) avaliam páginas alteradas, enquanto [monitores de toda a web em escala](/pt-BR/features/monitoring-web-scale#judging) avaliam cada novo resultado de busca.

Use `judgeEnabled: false` se quiser armazenar uma meta sem avaliar as mudanças ainda. O avaliador só é executado quando o monitor tem `judgeEnabled` e um `goal` não vazio.

<Note>
  Um `goal` é obrigatório para alvos `search` (monitoramento de toda a web em escala), a menos que você defina `judgeEnabled: false`. Ele é opcional para alvos `scrape` e `crawl`.
</Note>

<Note>
  Cada verificação sempre cobra pelos scrapings ou rastreamentos subjacentes. Se a avaliação estiver habilitada, o avaliador adiciona 1 crédito para cada página alterada que ele valida. Verificações sem páginas alteradas não usam créditos do avaliador.
</Note>

Boas metas são curtas e explícitas: diga o que deve acionar um alerta, reforce qualquer escopo, como top N, preço, tipo de cargo, empresa, região, tópico, status ou entidade, e inclua exclusões apenas quando fizerem parte da intenção. Se a meta for ampla, mantenha-a ampla; por exemplo, "qualquer mudança" não deve adicionar filtros de ruído que ocultem mudanças.

Por exemplo, um monitor com esta meta:

```text theme={null}
Alerte quando uma nova história do Hacker News relacionada a IA entrar no top 10. Ignore mudanças em histórias que não sejam sobre IA. Não alerte sobre mudanças fora do top 10.
```

poderia gerar um webhook `monitor.page` como este quando uma história correspondente entrar no escopo:

```json monitor.page theme={null}
{
  "success": true,
  "type": "monitor.page",
  "id": "019df960-5f2a-75fb-a98b-bd2d32ca67d4",
  "webhookId": "f1e2d3c4-0000-0000-0000-000000000000",
  "data": [
    {
      "monitorId": "019df960-06e7-7383-9d89-82c0113dc31a",
      "checkId": "019df960-5f2a-75fb-a98b-bd2d32ca67d4",
      "url": "https://news.ycombinator.com",
      "status": "changed",
      "previousScrapeId": "019df94f-82c3-7e41-81f0-00c72b2d9c52",
      "currentScrapeId": "019df960-73ee-7ac2-97a9-fb0e442c21f1",
      "error": null,
      "isMeaningful": true,
      "judgment": {
        "meaningful": true,
        "confidence": "high",
        "reason": "A new AI-related story entered the Hacker News top 10.",
        "meaningfulChanges": [
          {
            "type": "added",
            "after": "4. Show HN: Open-source AI coding assistant",
            "reason": "This is a new AI-related story inside the top 10."
          }
        ]
      },
      "diff": {
        "text": "--- previous\n+++ current\n@@ -1,5 +1,6 @@\n # Hacker News\n 1. Database internals for beginners\n 2. A new approach to CSS\n 3. Building reliable queues\n+4. Show HN: Open-source AI coding assistant\n"
      }
    }
  ],
  "metadata": {
    "environment": "production"
  }
}
```

<div id="schedules">
  ## Agendamentos
</div>

Os agendamentos podem ser fornecidos como expressão cron ou como texto simples em linguagem natural.

<CodeGroup>
  ```json Cron theme={null}
  {
    "schedule": {
      "cron": "*/30 * * * *",
      "timezone": "UTC"
    }
  }
  ```

  ```json Text theme={null}
  {
    "schedule": {
      "text": "every 30 minutes",
      "timezone": "UTC"
    }
  }
  ```
</CodeGroup>

Exemplos aceitos em linguagem natural:

* `every 30 minutes`
* `every 15 minutes starting at :07`
* `hourly`
* `every 2 hours`
* `daily`
* `daily at 9:00`
* `daily at 9am`
* `daily at 5:30 PM`
* `weekly`

O intervalo mínimo é de 5 minutos. As respostas da API sempre retornam a expressão cron normalizada. Para agendamentos em texto, `timezone` determina quando expressões como `daily at 9am` são executadas. Os agendamentos em texto são distribuídos com base no ID do monitor antes de serem convertidos para cron, para que vários monitores não sejam executados todos no mesmo instante.

<div id="change-tracking">
  ## Rastreamento de mudanças
</div>

Os monitores de [Página](/pt-BR/features/monitoring-page) e [site](/pt-BR/features/monitoring-website) comparam o markdown de cada página por padrão e informam `same`, `changed`, `new`, `removed` ou `error`. Quando quiser detectar mudanças em **campos estruturados específicos** (preço, manchete, indicador de disponibilidade em estoque, itens de uma lista etc.), habilite o rastreamento de mudanças no modo JSON adicionando um formato `changeTracking` com `modes: ["json"]` às `scrapeOptions` do alvo.

<Note>
  O rastreamento de mudanças se aplica a alvos `scrape` e `crawl`. Monitores de toda a web em escala completos (`search`) emitem alertas sobre novos resultados em vez de comparar páginas conhecidas. Veja [Statuses and dedup](/pt-BR/features/monitoring-web-scale#statuses-and-dedup).
</Note>

<div id="markdown-mode-default">
  ### Modo Markdown (padrão)
</div>

Quando `scrapeOptions.formats` é apenas `["markdown"]`, cada página alterada na resposta da verificação inclui um diff de texto unificado e uma AST no estilo [parseDiff](https://github.com/sergeyt/parse-diff):

```json Markdown-mode diff theme={null}
{
  "diff": {
    "text": "--- previous\n+++ current\n@@ -1,3 +1,3 @@\n # Pricing\n-Starter — $19/mo\n+Starter — $24/mo\n",
    "json": {
      "files": [
        {
          "from": "previous",
          "to": "current",
          "chunks": [
            {
              "content": "@@ -1,3 +1,3 @@",
              "changes": []
            }
          ]
        }
      ]
    }
  }
}
```

<div id="json-mode">
  ### Modo JSON
</div>

Passe um formato `changeTracking` com `modes: ["json"]` junto com um schema JSON (ou um `prompt`) que descreva os campos que importam para você. O Firecrawl extrai esse JSON em cada verificação e gera um **diff por campo** identificado pelo caminho do campo, além de um `snapshot.json` com a extração atual completa, para que os consumidores não precisem buscar novamente o scraping subjacente.

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl
  from pydantic import BaseModel
  from typing import List

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


  class Plan(BaseModel):
      name: str
      price: str
      features: List[str]


  class Pricing(BaseModel):
      plans: List[Plan]


  monitor = firecrawl.create_monitor(
      name="Pricing monitor",
      schedule={"text": "hourly", "timezone": "UTC"},
      goal="Notify me when a pricing tier, price, or headline feature changes",
      targets=[
          {
              "type": "scrape",
              "urls": ["https://example.com/pricing"],
              "scrapeOptions": {
                  "formats": [
                      {
                          "type": "changeTracking",
                          "modes": ["json"],
                          "prompt": "Extract pricing tiers and headline features for each plan.",
                          "schema": Pricing.model_json_schema(),
                      }
                  ]
              },
          }
      ],
      notification={
          "email": {
              "enabled": True,
              "recipients": ["alerts@example.com"],
              "includeDiffs": True,
          }
      },
  )

  print(monitor.id)
  ```

  ```js Node theme={null}
  import Firecrawl from "@mendable/firecrawl-js";
  import { z } from "zod";

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

  const pricingSchema = z.object({
    plans: z.array(
      z.object({
        name: z.string(),
        price: z.string(),
        features: z.array(z.string()),
      }),
    ),
  });

  const monitor = await firecrawl.createMonitor({
    name: "Pricing monitor",
    schedule: { text: "hourly", timezone: "UTC" },
    goal: "Notify me when a pricing tier, price, or headline feature changes",
    notification: {
      email: {
        enabled: true,
        recipients: ["alerts@example.com"],
        includeDiffs: true,
      },
    },
    targets: [
      {
        type: "scrape",
        urls: ["https://example.com/pricing"],
        scrapeOptions: {
          formats: [
            {
              type: "changeTracking",
              modes: ["json"],
              prompt: "Extract pricing tiers and headline features for each plan.",
              schema: pricingSchema,
            },
          ],
        },
      },
    ],
  });

  console.log(monitor.id);
  ```

  ```bash cURL theme={null}
  curl -s -X POST "https://api.firecrawl.dev/v2/monitor" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Pricing monitor",
      "schedule": {
        "text": "hourly",
        "timezone": "UTC"
      },
      "goal": "Notify me when a pricing tier, price, or headline feature changes",
      "notification": {
        "email": {
          "enabled": true,
          "recipients": ["alerts@example.com"],
          "includeDiffs": true
        }
      },
      "targets": [
        {
          "type": "scrape",
          "urls": ["https://example.com/pricing"],
          "scrapeOptions": {
            "formats": [
              {
                "type": "changeTracking",
                "modes": ["json"],
                "prompt": "Extract pricing tiers and headline features for each plan.",
                "schema": {
                  "type": "object",
                  "properties": {
                    "plans": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "name": { "type": "string" },
                          "price": { "type": "string" },
                          "features": {
                            "type": "array",
                            "items": { "type": "string" }
                          }
                        }
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }'
  ```
</CodeGroup>

O payload do diff usa caminhos JSON na extração como chaves. Cada valor é um par `{previous, current}`:

```json JSON-mode diff theme={null}
{
  "diff": {
    "json": {
      "plans[0].price": {
        "previous": "$19/mo",
        "current": "$24/mo"
      },
      "plans[1].features[2]": {
        "previous": "10 GB storage",
        "current": "25 GB storage"
      }
    }
  },
  "snapshot": {
    "json": {
      "plans": [
        {
          "name": "Starter",
          "price": "$24/mo",
          "features": ["Up to 3 users", "Basic analytics", "Email support"]
        },
        {
          "name": "Pro",
          "price": "$49/mo",
          "features": ["Unlimited users", "Advanced analytics", "25 GB storage"]
        }
      ]
    }
  }
}
```

<Note>
  Mesmo que nenhum campo rastreado tenha mudado, mas o markdown ao redor tenha sido alterado, os monitores no modo JSON ainda reportam `same`, a menos que você também habilite o git-diff (veja o modo misto abaixo). O diff se concentra exclusivamente nos campos do seu schema.
</Note>

<div id="mixed-mode-json-git-diff">
  ### Modo misto (JSON + git-diff)
</div>

Se você quiser tanto o diff estruturado por campo **quanto** o diff unificado bruto em markdown, passe ambos os modos:

```json Mixed target (JSON + git-diff) theme={null}
{
  "type": "scrape",
  "urls": ["https://example.com/pricing"],
  "scrapeOptions": {
    "formats": [
      {
        "type": "changeTracking",
        "modes": ["json", "git-diff"],
        "prompt": "Extract pricing tiers and headline features for each plan.",
        "schema": {
          "type": "object",
          "properties": {
            "plans": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "name": { "type": "string" },
                  "price": { "type": "string" }
                }
              }
            }
          }
        }
      }
    ]
  }
}
```

A resposta da verificação passa então a conter tanto `diff.text` (sidecar em markdown) quanto `diff.json` (diff por campo), junto com a extração `snapshot.json`:

```json Mixed-mode diff (JSON + git-diff) theme={null}
{
  "diff": {
    "text": "--- previous\n+++ current\n@@ -1,3 +1,3 @@\n # Pricing\n-Starter — $19/mo\n+Starter — $24/mo\n",
    "json": {
      "plans[0].price": {
        "previous": "$19/mo",
        "current": "$24/mo"
      }
    }
  },
  "snapshot": {
    "json": {
      "plans": [
        { "name": "Starter", "price": "$24/mo" },
        { "name": "Pro", "price": "$49/mo" }
      ]
    }
  }
}
```

Uma página em modo misto indica `changed` sempre que **qualquer uma** das saídas mudar.

<div id="notifications">
  ## Notificações
</div>

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

Quando um monitor tem um `webhook`, o Firecrawl pode enviar dois eventos do monitor:

* `monitor.page`: Enviado conforme cada scraping monitorado é concluído no worker de scraping.
* `monitor.check.completed`: Enviado após a consolidação da verificação completa. Inclui o status da verificação e contagens de resumo. Use os eventos `monitor.page` ou a API de verificação do monitor para obter resultados por página.

`monitor.page` inclui `isMeaningful` e `judgment` quando a avaliação de alteração significativa é executada para uma página alterada.

```json Webhook config theme={null}
{
  "webhook": {
    "url": "https://example.com/webhooks/firecrawl",
    "headers": {
      "Authorization": "Bearer your-secret"
    },
    "metadata": {
      "environment": "production"
    },
    "events": ["monitor.page", "monitor.check.completed"]
  }
}
```

Payload de `monitor.page`:

```json monitor.page theme={null}
{
  "success": true,
  "type": "monitor.page",
  "id": "019df960-5f2a-75fb-a98b-bd2d32ca67d4",
  "webhookId": "f1e2d3c4-0000-0000-0000-000000000000",
  "data": [
    {
      "monitorId": "019df960-06e7-7383-9d89-82c0113dc31a",
      "checkId": "019df960-5f2a-75fb-a98b-bd2d32ca67d4",
      "url": "https://example.com/blog",
      "status": "changed",
      "previousScrapeId": "019df94f-82c3-7e41-81f0-00c72b2d9c52",
      "currentScrapeId": "019df960-73ee-7ac2-97a9-fb0e442c21f1",
      "error": null,
      "isMeaningful": true,
      "judgment": {
        "meaningful": true,
        "confidence": "high",
        "reason": "The page headline changed to announce a new release cadence.",
        "meaningfulChanges": [
          {
            "type": "changed",
            "before": "Welcome to our weekly update.",
            "after": "Welcome to our weekly update — now with daily releases!",
            "reason": "The headline changed in a way that matches the monitor goal."
          }
        ]
      },
      "diff": {
        "text": "--- previous\n+++ current\n@@ -1,3 +1,3 @@\n # Latest posts\n-Welcome to our weekly update.\n+Welcome to our weekly update — now with daily releases!\n"
      }
    }
  ],
  "metadata": {
    "environment": "production"
  }
}
```

Payload de `monitor.check.completed`:

```json monitor.check.completed theme={null}
{
  "success": true,
  "type": "monitor.check.completed",
  "id": "019df960-5f2a-75fb-a98b-bd2d32ca67d4",
  "webhookId": "f1e2d3c4-0001-0000-0000-000000000000",
  "data": [
    {
      "monitorId": "019df960-06e7-7383-9d89-82c0113dc31a",
      "checkId": "019df960-5f2a-75fb-a98b-bd2d32ca67d4",
      "status": "completed",
      "summary": {
        "totalPages": 2,
        "same": 1,
        "changed": 1,
        "new": 0,
        "removed": 0,
        "error": 0
      }
    }
  ],
  "metadata": {
    "environment": "production"
  }
}
```

`success` é `true` quando a verificação é concluída sem erros de página. É `false` em verificações com falha ou parciais, e `error` contém o motivo da falha quando disponível.

<div id="email">
  ### Email
</div>

Os resumos por email são enviados somente quando uma verificação detecta páginas alteradas, novas, removidas ou com erro.

```json Email config theme={null}
{
  "notification": {
    "email": {
      "enabled": true,
      "recipients": ["alerts@example.com"],
      "includeDiffs": true
    }
  }
}
```

Quando um monitor tem uma meta e a avaliação está habilitada, os resumos por email priorizam páginas alteradas significativas. Se todas as páginas alteradas forem classificadas como ruído e não houver páginas novas, removidas ou com erro, o email não será enviado.

Se `recipients` for omitido, o Firecrawl enviará para os membros da equipe aptos a receber emails de alerta do sistema.
Você pode configurar até 25 destinatários especificados.

<div id="recipient-confirmation-process">
  #### Processo de confirmação do destinatário
</div>

Quando um novo destinatário é adicionado a um monitor, o Firecrawl envia um email com um link de confirmação. Isso garante que ele concorde explicitamente em receber notificações desse monitor. Se o destinatário já for membro da equipe, não será necessário confirmar.

<div id="slack">
  ### Slack
</div>

Você também pode enviar notificações do monitor para um canal do Slack.

<Note>
  As notificações do Slack são um recurso disponível apenas no painel. Elas só podem ser configuradas pelo [painel de monitoramento](https://www.firecrawl.dev/app/monitoring), não pela API nem pelos SDKs.
</Note>

Para configurar notificações do Slack:

1. Abra o [painel de monitoramento](https://www.firecrawl.dev/app/monitoring). Você pode adicionar notificações do Slack ao criar um novo monitor ou adicioná-las a um monitor que já existe.
2. Durante a criação do monitor ou após selecionar um monitor existente, role até **Notificações** e selecione **Slack**.
3. Você precisará passar pelo fluxo de OAuth. Conclua o processo e selecione o workspace e o canal em que deseja receber as notificações.

<div id="check-results">
  ## Consultar resultados
</div>

Use `GET /v2/monitor/{monitorId}/checks` para listar verificações e `GET /v2/monitor/{monitorId}/checks/{checkId}` para inspecionar uma verificação. Os SDKs fazem paginação automática por padrão.

<CodeGroup>
  ```python Python theme={null}
  from firecrawl import Firecrawl

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

  check = firecrawl.get_monitor_check(monitor_id, check_id, limit=25, status="changed")

  for page in check.pages:
      print(page.url, page.status)

      if page.judgment:
          print(page.judgment.meaningful, page.judgment.reason)

      if page.diff and page.diff.text:
          print(page.diff.text)

      if page.snapshot and page.snapshot.json:
          print(page.snapshot.json)
  ```

  ```js Node theme={null}
  import Firecrawl from "@mendable/firecrawl-js";

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

  const check = await firecrawl.getMonitorCheck(monitorId, checkId, {
    limit: 25,
    status: "changed",
  });

  for (const page of check.pages) {
    console.log(page.url, page.status);

    if (page.judgment) {
      console.log(page.judgment.meaningful, page.judgment.reason);
    }

    if (page.diff?.text) {
      console.log(page.diff.text);
    }

    if (page.snapshot?.json) {
      console.log(page.snapshot.json);
    }
  }
  ```

  ```bash cURL theme={null}
  curl "https://api.firecrawl.dev/v2/monitor/$MONITOR_ID/checks/$CHECK_ID?limit=25&status=changed" \
    -H "Authorization: Bearer $FIRECRAWL_API_KEY"
  ```
</CodeGroup>

A lista de verificações pode ser filtrada pelo `status` da verificação: `queued`, `running`, `completed`, `failed`, `partial` ou `skipped_overlap`.

A resposta de detalhes da verificação inclui `estimatedCredits`, `actualCredits`, contagens resumidas e um array `pages` paginado. `estimatedCredits` é a reserva no limite máximo para a verificação; `actualCredits` é o valor final cobrado depois que o Firecrawl determina quantas páginas mudaram e precisaram de avaliação. Use a URL `next` de nível superior para buscar a próxima página de resultados, seguindo a paginação do rastreamento. Você pode filtrar páginas por `status`: `same`, `new`, `changed`, `removed` ou `error`. Cada página alterada inclui dados de `diff` inline; páginas de monitores em modo JSON também incluem um `snapshot` com a extração atual.

<Tabs>
  <Tab title="Modo Markdown">
    ```json Markdown-mode response theme={null}
    {
      "success": true,
      "next": "https://api.firecrawl.dev/v2/monitor/019df960-06e7-7383-9d89-82c0113dc31a/checks/019df960-5f2a-75fb-a98b-bd2d32ca67d4?skip=25&limit=25",
      "data": {
        "id": "019df960-5f2a-75fb-a98b-bd2d32ca67d4",
        "monitorId": "019df960-06e7-7383-9d89-82c0113dc31a",
        "status": "completed",
        "estimatedCredits": 2,
        "actualCredits": 2,
        "summary": {
          "totalPages": 1,
          "same": 0,
          "changed": 1,
          "new": 0,
          "removed": 0,
          "error": 0
        },
        "pages": [
          {
            "id": "019df960-7708-7c62-a5dc-6206f16ac122",
            "targetId": "019df960-09bb-7c11-8001-1f12f50ab1c2",
            "url": "https://example.com/blog",
            "status": "changed",
            "previousScrapeId": "019df94f-82c3-7e41-81f0-00c72b2d9c52",
            "currentScrapeId": "019df960-73ee-7ac2-97a9-fb0e442c21f1",
            "statusCode": 200,
            "error": null,
            "metadata": {
              "title": "Example Blog",
              "creditsUsed": 1
            },
            "judgment": {
              "meaningful": true,
              "confidence": "high",
              "reason": "The page headline changed to announce a new release cadence.",
              "meaningfulChanges": [
                {
                  "type": "changed",
                  "before": "Welcome to our weekly update.",
                  "after": "Welcome to our weekly update — now with daily releases!",
                  "reason": "The headline changed in a way that matches the monitor goal."
                }
              ]
            },
            "createdAt": "2026-05-17T15:35:00.000Z",
            "diff": {
              "text": "--- previous\n+++ current\n@@ -1,3 +1,3 @@\n # Latest posts\n-Welcome to our weekly update.\n+Welcome to our weekly update — now with daily releases!\n",
              "json": {
                "files": [
                  {
                    "from": "previous",
                    "to": "current",
                    "chunks": []
                  }
                ]
              }
            }
          }
        ],
        "next": "https://api.firecrawl.dev/v2/monitor/019df960-06e7-7383-9d89-82c0113dc31a/checks/019df960-5f2a-75fb-a98b-bd2d32ca67d4?skip=25&limit=25"
      }
    }
    ```
  </Tab>

  <Tab title="Modo JSON">
    ```json JSON-mode response theme={null}
    {
      "success": true,
      "data": {
        "id": "019df960-5f2a-75fb-a98b-bd2d32ca67d4",
        "monitorId": "019df960-06e7-7383-9d89-82c0113dc31a",
        "status": "completed",
        "estimatedCredits": 2,
        "actualCredits": 2,
        "summary": {
          "totalPages": 1,
          "same": 0,
          "changed": 1,
          "new": 0,
          "removed": 0,
          "error": 0
        },
        "pages": [
          {
            "id": "019df960-7708-7c62-a5dc-6206f16ac122",
            "targetId": "019df960-09bb-7c11-8001-1f12f50ab1c2",
            "url": "https://example.com/pricing",
            "status": "changed",
            "previousScrapeId": "019df94f-82c3-7e41-81f0-00c72b2d9c52",
            "currentScrapeId": "019df960-73ee-7ac2-97a9-fb0e442c21f1",
            "statusCode": 200,
            "error": null,
            "metadata": {
              "title": "Pricing",
              "creditsUsed": 1
            },
            "judgment": {
              "meaningful": true,
              "confidence": "high",
              "reason": "The Starter plan price and Pro storage limit changed.",
              "meaningfulChanges": [
                {
                  "type": "changed",
                  "before": "$19/mo",
                  "after": "$24/mo",
                  "reason": "The Starter plan price changed."
                },
                {
                  "type": "changed",
                  "before": "10 GB storage",
                  "after": "25 GB storage",
                  "reason": "The Pro storage limit changed."
                }
              ]
            },
            "createdAt": "2026-05-17T15:35:00.000Z",
            "diff": {
              "json": {
                "plans[0].price": {
                  "previous": "$19/mo",
                  "current": "$24/mo"
                },
                "plans[1].features[2]": {
                  "previous": "10 GB storage",
                  "current": "25 GB storage"
                }
              }
            },
            "snapshot": {
              "json": {
                "plans": [
                  {
                    "name": "Starter",
                    "price": "$24/mo",
                    "features": ["Up to 3 users", "Basic analytics", "Email support"]
                  },
                  {
                    "name": "Pro",
                    "price": "$49/mo",
                    "features": ["Unlimited users", "Advanced analytics", "25 GB storage"]
                  }
                ]
              }
            }
          }
        ]
      }
    }
    ```
  </Tab>

  <Tab title="Modo misto">
    ```json Mixed-mode response (JSON + git-diff) theme={null}
    {
      "success": true,
      "data": {
        "id": "019df960-5f2a-75fb-a98b-bd2d32ca67d4",
        "monitorId": "019df960-06e7-7383-9d89-82c0113dc31a",
        "status": "completed",
        "estimatedCredits": 2,
        "actualCredits": 2,
        "summary": {
          "totalPages": 1,
          "same": 0,
          "changed": 1,
          "new": 0,
          "removed": 0,
          "error": 0
        },
        "pages": [
          {
            "id": "019df960-7708-7c62-a5dc-6206f16ac122",
            "targetId": "019df960-09bb-7c11-8001-1f12f50ab1c2",
            "url": "https://example.com/pricing",
            "status": "changed",
            "previousScrapeId": "019df94f-82c3-7e41-81f0-00c72b2d9c52",
            "currentScrapeId": "019df960-73ee-7ac2-97a9-fb0e442c21f1",
            "statusCode": 200,
            "error": null,
            "metadata": {
              "title": "Pricing",
              "creditsUsed": 1
            },
            "judgment": {
              "meaningful": true,
              "confidence": "high",
              "reason": "The Starter plan price changed.",
              "meaningfulChanges": [
                {
                  "type": "changed",
                  "before": "Starter — $19/mo",
                  "after": "Starter — $24/mo",
                  "reason": "The Starter plan price changed."
                }
              ]
            },
            "createdAt": "2026-05-17T15:35:00.000Z",
            "diff": {
              "text": "--- previous\n+++ current\n@@ -1,3 +1,3 @@\n # Pricing\n-Starter — $19/mo\n+Starter — $24/mo\n",
              "json": {
                "plans[0].price": {
                  "previous": "$19/mo",
                  "current": "$24/mo"
                }
              }
            },
            "snapshot": {
              "json": {
                "plans": [
                  { "name": "Starter", "price": "$24/mo" },
                  { "name": "Pro", "price": "$49/mo" }
                ]
              }
            }
          }
        ]
      }
    }
    ```
  </Tab>
</Tabs>

<div id="pricing">
  ## Preços
</div>

Os monitores não têm uma cobrança separada por monitor. Cada verificação consome os créditos do scraping, do rastreamento ou da busca subjacente que ela executa, além de um crédito opcional por página alterada quando a avaliação de mudança significativa está ativada.

| Componente                                                          | Créditos                                                                                                               |
| ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| Monitor de scraping                                                 | 1 crédito por URL por verificação                                                                                      |
| Monitor de rastreamento                                             | 1 crédito por página descoberta por verificação                                                                        |
| Monitor web                                                         | 2 créditos por 10 resultados por verificação                                                                           |
| Avaliação do monitor web                                            | 1 crédito por resultado avaliado, quando a avaliação por IA está ativada (cobre o scraping e a avaliação do resultado) |
| Mudança significativa ativada                                       | 1 crédito adicional por página alterada validada pelo avaliador                                                        |
| Complementos de formato (JSON, PDF, question, modo aprimorado etc.) | O mesmo que um [scrape](/pt-BR/features/scrape) avulso                                                                 |

<div id="api-reference">
  ## Referência da API
</div>

* [Criar monitor](/pt-BR/api-reference/endpoint/monitor-create)
* [Listar monitores](/pt-BR/api-reference/endpoint/monitor-list)
* [Obter monitor](/pt-BR/api-reference/endpoint/monitor-get)
* [Atualizar monitor](/pt-BR/api-reference/endpoint/monitor-update)
* [Excluir monitor](/pt-BR/api-reference/endpoint/monitor-delete)
* [Executar monitor](/pt-BR/api-reference/endpoint/monitor-run)
* [Listar verificações do monitor](/pt-BR/api-reference/endpoint/monitor-checks-list)
* [Obter verificação do monitor](/pt-BR/api-reference/endpoint/monitor-check-get)
* [Payload do webhook de página do monitor](/pt-BR/api-reference/endpoint/webhook-monitor-page)
* [Payload do webhook de verificação concluída do monitor](/pt-BR/api-reference/endpoint/webhook-monitor-check-completed)
