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, rastrear um site em um agendamento ou executar uma busca contínua na web 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, Site ou Toda a web em escala.
Monitoramento de páginas
Acompanhe uma ou mais URLs conhecidas, compare cada scraping com o último snapshot e gere alertas para mudanças significativas na página.
Monitoramento de sites
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.
Monitoramento de toda a web em escala
Execute buscas na web recorrentes e gere alertas quando um novo resultado aparecer e corresponder à sua meta.
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.
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 |
crawl | Cada página descoberta por um rastreamento | Monitoramento de sites |
search | Novos resultados em toda a web | Monitoramento de toda a web em escala |
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:
{
"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": ["[email protected]"],
"includeDiffs": true
}
},
"retentionDays": 30,
"estimatedCreditsPerMonth": 2880,
"lastCheckSummary": null,
"createdAt": "2026-05-17T15:30:00.000Z",
"updatedAt": "2026-05-17T15:30:00.000Z"
}
}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 e site avaliam páginas alteradas, enquanto monitores de toda a web em escala 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.
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.
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.
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:
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:
{
"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"
}
}Os agendamentos podem ser fornecidos como expressão cron ou como texto simples em linguagem natural.
{
"schedule": {
"cron": "*/30 * * * *",
"timezone": "UTC"
}
}Exemplos aceitos em linguagem natural:
every 30 minutesevery 15 minutes starting at :07hourlyevery 2 hoursdailydaily at 9:00daily at 9amdaily at 5:30 PMweekly
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.
Os monitores de Página e site 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.
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.
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:
{
"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": []
}
]
}
]
}
}
}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.
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": ["[email protected]"],
"includeDiffs": True,
}
},
)
print(monitor.id)O payload do diff usa caminhos JSON na extração como chaves. Cada valor é um par {previous, current}:
{
"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"]
}
]
}
}
}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.
Se você quiser tanto o diff estruturado por campo quanto o diff unificado bruto em markdown, passe ambos os modos:
{
"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:
{
"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.
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 eventosmonitor.pageou 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.
{
"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:
{
"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:
{
"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.
Os resumos por email são enviados somente quando uma verificação detecta páginas alteradas, novas, removidas ou com erro.
{
"notification": {
"email": {
"enabled": true,
"recipients": ["[email protected]"],
"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.
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.
Você também pode enviar notificações do monitor para um canal do Slack.
As notificações do Slack são um recurso disponível apenas no painel. Elas só podem ser configuradas pelo painel de monitoramento, não pela API nem pelos SDKs.
Para configurar notificações do Slack:
- Abra o painel de monitoramento. Você pode adicionar notificações do Slack ao criar um novo monitor ou adicioná-las a um monitor que já existe.
- Durante a criação do monitor ou após selecionar um monitor existente, role até Notificações e selecione Slack.
- Você precisará passar pelo fluxo de OAuth. Conclua o processo e selecione o workspace e o canal em que deseja receber as notificações.
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.
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)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.
{
"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"
}
}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 avulso |