# モニタリング (/ja/features/monitoring)

<!-- agent-signals: reading_time_min: 13 · est_tokens: 8916 · updated: 2026-07-30 -->
Related: [検索](/ja/features/search.md), [検索ハイライト](/ja/features/search-highlights.md), [Research Index](/ja/features/research.md), [スクレイピング](/ja/features/scrape.md), [スクレイピングを高速化](/ja/features/fast-scraping.md), [バッチスクレイピング](/ja/features/batch-scrape.md)

Firecrawl のモニタリングは定期的なチェックを実行し、何かが変化したり新たに現れたりしたときに、あなたまたは agent に通知します。`/monitor` を使うと、[既知のページを監視](/ja/features/monitoring-page)したり、[スケジュールに従って Web サイトをクロール](/ja/features/monitoring-website)したり、ゴールに一致する新しい結果を見つけるために[常時稼働の Web 検索を実行](/ja/features/monitoring-web-scale)したりできます。

すべてのモニタータイプは同じワークフローを共有しています。1 つ以上の ターゲット を選択し、スケジュールを設定し、任意の自然言語のゴールを追加して、重要な変化があったときに webhook、メール、または Slack 通知を受け取ります。このページでは共通の構成について説明します。ターゲット 固有の設定と例については、[Page](/ja/features/monitoring-page)、[Website](/ja/features/monitoring-website)、または [Web 全体規模の監視](/ja/features/monitoring-web-scale) のモニタリングページを参照してください。

<CardGroup cols="3">
  <Card title="ページ監視" icon="<svg xmlns=&#x22;http://www.w3.org/2000/svg&#x22; viewBox=&#x22;0 0 24 24&#x22; fill=&#x22;none&#x22;><path d=&#x22;M8 7L16 7&#x22; stroke=&#x22;currentColor&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/><path d=&#x22;M8 11L12 11&#x22; stroke=&#x22;currentColor&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/><path d=&#x22;M13 21.5V21C13 18.1716 13 16.7574 13.8787 15.8787C14.7574 15 16.1716 15 19 15H19.5M20 13.3431V10C20 6.22876 20 4.34315 18.8284 3.17157C17.6569 2 15.7712 2 12 2C8.22877 2 6.34315 2 5.17157 3.17157C4 4.34314 4 6.22876 4 10L4 14.5442C4 17.7892 4 19.4117 4.88607 20.5107C5.06508 20.7327 5.26731 20.9349 5.48933 21.1139C6.58831 22 8.21082 22 11.4558 22C12.1614 22 12.5141 22 12.8372 21.886C12.9044 21.8623 12.9702 21.835 13.0345 21.8043C13.3436 21.6564 13.593 21.407 14.0919 20.9081L18.8284 16.1716C19.4065 15.5935 19.6955 15.3045 19.8478 14.9369C20 14.5694 20 14.1606 20 13.3431Z&#x22; stroke=&#x22;currentColor&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/></svg>" href="/ja/features/monitoring-page">
    1 つ以上の既知の URL を監視し、各スクレイピング結果を前回のスナップショットと diff し、意味のあるページ変更があれば alert を送信します。
  </Card>

  <Card title="Web サイト監視" icon="<svg xmlns=&#x22;http://www.w3.org/2000/svg&#x22; viewBox=&#x22;0 0 24 24&#x22; fill=&#x22;none&#x22;><path d=&#x22;M8 7L16 7&#x22; stroke=&#x22;currentColor&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/><path d=&#x22;M8 11L12 11&#x22; stroke=&#x22;currentColor&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/><path d=&#x22;M13 21.5V21C13 18.1716 13 16.7574 13.8787 15.8787C14.7574 15 16.1716 15 19 15H19.5M20 13.3431V10C20 6.22876 20 4.34315 18.8284 3.17157C17.6569 2 15.7712 2 12 2C8.22877 2 6.34315 2 5.17157 3.17157C4 4.34314 4 6.22876 4 10L4 14.5442C4 17.7892 4 19.4117 4.88607 20.5107C5.06508 20.7327 5.26731 20.9349 5.48933 21.1139C6.58831 22 8.21082 22 11.4558 22C12.1614 22 12.5141 22 12.8372 21.886C12.9044 21.8623 12.9702 21.835 13.0345 21.8043C13.3436 21.6564 13.593 21.407 14.0919 20.9081L18.8284 16.1716C19.4065 15.5935 19.6955 15.3045 19.8478 14.9369C20 14.5694 20 14.1606 20 13.3431Z&#x22; stroke=&#x22;currentColor&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/></svg>" href="/ja/features/monitoring-website">
    スケジュールに従ってサイトをクロールし、追加、変更、削除されたページを検出して、webhook または受信トレイに通知します。
  </Card>

  <Card title="Web 全体規模の監視" icon="<svg xmlns=&#x22;http://www.w3.org/2000/svg&#x22; viewBox=&#x22;0 0 24 24&#x22; fill=&#x22;none&#x22;><path d=&#x22;M12.5 19L12.5 22&#x22; stroke=&#x22;currentColor&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/><path d=&#x22;M10.5 22H14.5&#x22; stroke=&#x22;currentColor&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/><circle cx=&#x22;7&#x22; cy=&#x22;7&#x22; r=&#x22;7&#x22; transform=&#x22;matrix(-1 0 0 1 20.5 2)&#x22; stroke=&#x22;currentColor&#x22; stroke-linecap=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/><path d=&#x22;M8.5 4C9.15431 4.0385 9.49236 4.35899 10.0735 4.97301C11.1231 6.08206 12.1727 6.1746 12.8724 5.80492C13.922 5.2504 13.04 4.35221 14.2719 3.86409C15.0748 3.54595 15.1868 2.68026 14.7399 2&#x22; stroke=&#x22;currentColor&#x22; stroke-linejoin=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/><path d=&#x22;M20 10C18.5 10 18.2338 11.2468 17 11C14.5 10.5 13.7916 11.0589 13.7916 12.2511C13.7916 13.4432 13.7916 13.4432 13.2717 14.3373C12.9335 14.9189 12.8153 15.5004 13.4894 16&#x22; stroke=&#x22;currentColor&#x22; stroke-linejoin=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/><path d=&#x22;M6.5 2C4.64864 3.79995 3.5 6.3082 3.5 9.08251C3.5 14.5598 7.97715 19 13.5 19C16.2255 19 18.6962 17.9187 20.5 16.165&#x22; stroke=&#x22;currentColor&#x22; stroke-linecap=&#x22;round&#x22; stroke-width=&#x22;1.5&#x22;/></svg>" href="/ja/features/monitoring-web-scale">
    定期的に Web 検索を実行し、ゴールに一致する新しい結果が現れたときに alert を送信します。
  </Card>
</CardGroup>

各チェックでは、ページ単位の結果が `same`、`new`、`changed`、`removed`、`error` として記録されます。監視対象の各ページの処理完了時に webhook を受け取ることも、チェックが完了するたびに webhook を受け取ることも、変更やエラーが発生した際にメールで要約を受け取ることも、チャンネルに Slack 通知を受け取ることもでき、これらを自由に組み合わせることもできます。

<div id="targets">
  ## ターゲット [#ターゲット]
</div>

すべてのモニターには 1 つ以上の **ターゲット** があります。ターゲットの種類によって、各チェックで実行される内容が決まります:

| ターゲット    | 監視対象                 | セットアップ                                           |
| -------- | -------------------- | ------------------------------------------------ |
| `scrape` | 指定した既知の URL          | [ページ監視](/ja/features/monitoring-page)            |
| `crawl`  | クロールによって検出されたすべてのページ | [Web サイト監視](/ja/features/monitoring-website)     |
| `search` | Web 全体の新しい検索結果       | [Web 全体規模の監視](/ja/features/monitoring-web-scale) |

各モニターは 1～50 個のターゲットを受け付け、1 つのモニター内で異なる種類のターゲットを組み合わせることもできます。`retentionDays` のデフォルトは `30` で、最大 `365` まで設定できます。

create の各呼び出しでは、正規化された cron、計算済みの `nextRunAt`、および `estimatedCreditsPerMonth` を含む新しいモニターが返されます。判定が有効な場合、`estimatedCreditsPerMonth` は上限見積もりになります。これは、判定クレジットが実際に判定された変更ページに対してのみ課金されるためです:

```json title="Response"
{
  "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">
  ## ゴールと判定 [#ゴールと判定]
</div>

意味のある変更があったときだけ通知を受けたい場合は、平易な表現で `goal` を追加します。`goal` が指定されていて `judgeEnabled` が省略されている場合、Firecrawl は自動的に判定を有効にします。判定は変更のあったページで実行され、`meaningful`、`confidence`、`reason`、`meaningfulChanges` を含む `judgment` を返します。

ゴールの適用方法は ターゲット によって異なります。[page](/ja/features/monitoring-page) と [website](/ja/features/monitoring-website) のモニターでは変更されたページを判定し、[entire web-scale monitors](/ja/features/monitoring-web-scale#judging) では新しい各 search result を判定します。

変更の判定はまだ行わず、ゴールだけを保存したい場合は、`judgeEnabled: false` を使用します。判定が実行されるのは、モニター に `judgeEnabled` と空でない `goal` の両方が設定されている場合だけです。

<Note>
  `search` ターゲット (entire web-scale monitoring) では、`judgeEnabled: false` を設定しない限り `goal` が必要です。`scrape` と `crawl` ターゲット では 任意 です。
</Note>

<Note>
  各 チェック では、常に元となるスクレイピングまたはクロールの料金が発生します。判定が有効な場合、judge は検証した変更済みページごとに 1 クレジット を追加で消費します。変更されたページがない チェック では、judge クレジット は消費されません。
</Note>

適切なゴールは、短く明確であることが重要です。何を alert のトリガーにするかを示し、top N、価格、役割の種類、会社、地域、トピック、status、またはエンティティなどの対象範囲も明記してください。除外条件は、意図に含まれる場合にのみ追加します。ゴールが広い場合は、その広さを保ってください。たとえば、"any change" の場合は、変更を見逃すようなノイズ除去の絞り込みを加えるべきではありません。

たとえば、次のような goal を持つ モニター では:

```text
AIに関連する新しいHacker Newsのストーリーがトップ10に入ったときに通知する。AIに関係のないストーリーの変更は無視する。トップ10外の変更には通知しない。
```

一致するストーリーが監視対象に入ると、このような `monitor.page` webhook が生成されることがあります:

```json title="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://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">
  ## スケジュール [#スケジュール]
</div>

スケジュールは、cron またはシンプルな自然言語テキストで指定できます。

<CodeGroup>
  <CodeBlockTabs defaultValue="Cron" groupId="cron+text">
    <CodeBlockTabsList>
      <CodeBlockTabsTrigger value="Cron">
        Cron
      </CodeBlockTabsTrigger>

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

    <CodeBlockTab value="Cron">
      ```json  
      {
        "schedule": {
          "cron": "*/30 * * * *",
          "timezone": "UTC"
        }
      }
      ```
    </CodeBlockTab>

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

サポートされている自然言語の例:

* `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`

最小間隔は 5 分です。API レスポンスでは常に正規化された cron 式が返されます。テキストによるスケジュールでは、`timezone` が `daily at 9am` のような表現の実行時刻を制御します。テキストによるスケジュールは、cron に変換される前にモニター ID ごとに分散されるため、多数のモニターがまったく同じタイミングで実行されることはありません。

<div id="change-tracking">
  ## 変更追跡 [#変更追跡]
</div>

[Page](/ja/features/monitoring-page) と [Web サイト](/ja/features/monitoring-website) のモニターでは、デフォルトで各ページの Markdown の差分を比較し、`same`、`changed`、`new`、`removed`、`error` のいずれかを返します。**特定の構造化フィールド** (価格、見出し、在庫フラグ、リスト内の項目など) の変更を検出したい場合は、対象の `scrapeOptions` に `modes: ["json"]` を指定した `changeTracking` フォーマットを追加して、JSONモードの変更追跡を有効にします。

<Note>
  変更追跡は `scrape` ターゲットと `crawl` ターゲットに適用されます。Web スケール全体の (`search`) モニターは、既知のページの差分を比較するのではなく、新しい結果が見つかったときにアラートを送信します。詳しくは [ステータスと重複排除](/ja/features/monitoring-web-scale#statuses-and-dedup) を参照してください。
</Note>

<div id="markdown-mode-default">
  ### Markdown モード (デフォルト) [#markdown-モード-デフォルト]
</div>

`scrapeOptions.formats` が `["markdown"]` のみの場合、チェック レスポンス内の変更された各ページには、unified 形式のテキスト差分と、[parseDiff](https://github.com/sergeyt/parse-diff) スタイルの AST が含まれます。

```json title="Markdown-mode diff"
{
  "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">
  ### JSONモード [#jsonモード]
</div>

`modes: ["json"]` を指定した `changeTracking` フォーマットを、注目するフィールドを定義した JSON schema (または `prompt`) とあわせて渡します。Firecrawl はチェックのたびにその JSON を抽出し、フィールドパスをキーとする**フィールド単位の差分**を出力します。さらに、利用側で元のスクレイピング結果を再取得しなくて済むよう、現在の抽出結果全体を含む `snapshot.json` も出力します。

<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
      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)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      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);
      ```
    </CodeBlockTab>

    <CodeBlockTab value="cURL">
      ```bash  
      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" }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                ]
              }
            }
          ]
        }'
      ```
    </CodeBlockTab>
  </CodeBlockTabs>
</CodeGroup>

差分の ペイロード では、抽出結果内の JSON パスがキーとして使われます。各値は `{previous, current}` のペアです。

```json title="JSON-mode diff"
{
  "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>
  追跡対象のフィールドに変更がなく、周囲の Markdown だけが変わった場合でも、git-diff も有効にしない限り (下記の mixed mode を参照) 、JSONモードのモニターは `same` を返します。この差分は、schema 内のフィールドだけに焦点を当てています。
</Note>

<div id="mixed-mode-json-git-diff">
  ### Mixedモード (JSON + git-diff) [#mixedモード-json--git-diff]
</div>

構造化されたフィールド単位の差分 **と** 生の markdown の unified diff の両方が必要な場合は、両方のモードを指定します。

```json title="Mixed target (JSON + git-diff)"
{
  "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" }
                }
              }
            }
          }
        }
      }
    ]
  }
}
```

すると、チェック レスポンスには `snapshot.json` の抽出結果に加えて、`diff.text` (markdown のサイドカー) と `diff.json` (フィールド単位の差分) の両方が含まれます。

```json title="Mixed-mode diff (JSON + git-diff)"
{
  "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" }
      ]
    }
  }
}
```

mixed-mode のページでは、**いずれか** 一方でも変更があれば `changed` が報告されます。

<div id="notifications">
  ## 通知 [#通知]
</div>

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

モニター に `webhook` が設定されている場合、Firecrawl は 2 つの モニター event を送信できます。

* `monitor.page`: 監視対象の各ページのスクレイピングが scrape worker で完了するたびに送信されます。
* `monitor.check.completed`: チェック全体の整合処理が完了した後に送信されます。チェック の status と集計数が含まれます。ページ単位の結果を確認するには、`monitor.page` event または モニター check API を使用してください。

`monitor.page` には、変更されたページに対して意味のある変更の判定が実行された場合、`isMeaningful` と `judgment` が含まれます。

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

`monitor.page` の ペイロード:

```json title="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"
  }
}
```

`monitor.check.completed` の ペイロード:

```json title="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` です。失敗した チェック または部分的な チェック の場合は `false` となり、利用可能であれば `error` に失敗理由が含まれます。

<div id="email">
  ### メール [#メール]
</div>

メールの要約は、チェックで変更・新規追加・削除・エラーのいずれかに該当するページがあった場合にのみ送信されます。

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

モニターでゴールが設定され、判定が有効になっている場合、メールの要約では重要な変更ページが優先されます。変更されたすべてのページがノイズと判定され、新規追加・削除・エラーに該当するページもない場合、メールは送信されません。

`recipients` を省略すると、Firecrawl はシステムアラートメールの受信対象となるチームメンバーに送信します。
明示的な受信者は最大 25 件まで設定できます。

<div id="recipient-confirmation-process">
  #### 受信者の確認手順 [#受信者の確認手順]
</div>

新しい受信者がモニターに追加されると、Firecrawl は確認リンクを含むメールを送信します。これにより、その受信者がそのモニターの通知を受け取ることに明確に同意したことを確認できます。受信者がすでにチームのメンバーである場合は、確認は不要です。

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

モニター通知をSlackチャンネルに送信することもできます。

<Note>
  Slack通知はダッシュボード専用の機能です。設定できるのは[monitoring dashboard](https://www.firecrawl.dev/app/monitoring)のみで、APIやSDKsからは設定できません。
</Note>

Slack通知を設定するには:

1. [monitoring dashboard](https://www.firecrawl.dev/app/monitoring)を開きます。新しいモニターの作成中にSlack通知を追加することも、すでに存在するモニターに追加することもできます。
2. モニターの作成中、または既存のモニターを選択した後、**Notifications**までスクロールして**Slack**を選択します。
3. OAuthによる認証に進みます。フローを完了し、通知を受け取りたいワークスペースとチャンネルを選択します。

<div id="check-results">
  ## チェック結果 [#チェック結果]
</div>

`GET /v2/monitor/{monitorId}/checks` でチェックの一覧を取得し、`GET /v2/monitor/{monitorId}/checks/{checkId}` で個別のチェック詳細を確認できます。SDKs はデフォルトで自動的にページネーションに対応しています。

<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")

      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)
      ```
    </CodeBlockTab>

    <CodeBlockTab value="Node">
      ```js  
      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);
        }
      }
      ```
    </CodeBlockTab>

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

チェック一覧は、チェックの `status` で絞り込めます: `queued`、`running`、`completed`、`failed`、`partial`、`skipped_overlap`。

チェック詳細のレスポンスには、`estimatedCredits`、`actualCredits`、集計件数、およびページネーションされた `pages` 配列が含まれます。`estimatedCredits` はそのチェックに対して上限として予約されるクレジット数で、`actualCredits` は Firecrawl が変更されたページ数と判定が必要なページ数を把握した後に確定する最終的な請求量です。結果の次のページを取得するには、トップレベルの `next` URL を使用します。これはクロールのページネーションと同じです。ページは `status` で絞り込めます: `same`、`new`、`changed`、`removed`、`error`。変更された各ページにはインラインの `diff` データが含まれます。JSONモードのモニターによるページには、現在の抽出結果を含む `snapshot` も含まれます。

<Tabs>
  <Tab title="Markdownモード">
    ```json title="Markdown-mode response"
    {
      "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="JSONモード">
    ```json title="JSON-mode response"
    {
      "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="Mixedモード">
    ```json title="Mixed-mode response (JSON + git-diff)"
    {
      "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">
  ## 料金 [#料金]
</div>

モニター にモニターごとの個別料金はありません。各チェックでは、実行されるスクレイピング、クロール、または検索の分のクレジットが消費され、さらに有意な変更の判定を有効にしている場合は、判定で有意な変更ありと認められたページごとに追加で 1 クレジットが消費されます。

| コンポーネント                                          | クレジット                                             |
| ------------------------------------------------ | ------------------------------------------------- |
| スクレイピングモニター                                      | URL ごとに、チェック 1 回あたり 1 クレジット                       |
| クロールモニター                                         | 検出されたページごとに、チェック 1 回あたり 1 クレジット                   |
| ウェブモニター                                          | 10 件の結果ごとに、チェック 1 回あたり 2 クレジット                    |
| ウェブモニターの判定                                       | AI 判定が有効な場合、判定された結果ごとに 1 クレジット (結果のスクレイピングと評価を含む) |
| 有意な変更の判定が有効                                      | 判定で変更ありと認められたページごとに追加で 1 クレジット                    |
| Format アドオン (JSON、PDF、question、enhanced mode など) | 単体の[scrape](/ja/features/scrape)と同じ               |

<div id="api-reference">
  ## API リファレンス [#api-リファレンス]
</div>

* [モニターを作成](/ja/api-reference/endpoint/monitor-create)
* [モニター一覧](/ja/api-reference/endpoint/monitor-list)
* [モニターを取得](/ja/api-reference/endpoint/monitor-get)
* [モニターを更新](/ja/api-reference/endpoint/monitor-update)
* [モニターを削除](/ja/api-reference/endpoint/monitor-delete)
* [モニターを実行](/ja/api-reference/endpoint/monitor-run)
* [モニターチェック一覧](/ja/api-reference/endpoint/monitor-checks-list)
* [モニターチェックを取得](/ja/api-reference/endpoint/monitor-check-get)
* [モニターページの webhookペイロード](/ja/api-reference/endpoint/webhook-monitor-page)
* [モニターチェック完了の webhookペイロード](/ja/api-reference/endpoint/webhook-monitor-check-completed)
