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

# ウェブフックの設定

> ウェブフック配信先の設定、エンドポイントの検証、シグネチャの確認、ペイロードの処理方法。

ウェブフックはモニター結果を受信する推奨方法です。モニターがトリガーすると、Pubrioは設定されたURLにJSONペイロードを含むPOSTリクエストをリアルタイムで送信します。

## 前提条件

* モニターアクセス権のあるPubrio APIキー
* パブリックにアクセス可能なHTTPSエンドポイント（または[usewebhook.com](https://usewebhook.com)のテストURL）

<Tip>
  **クイックテスト：** [usewebhook.com](https://usewebhook.com)を使用して無料の一時的なウェブフックURLを生成できます。デプロイなしですべての受信ペイロードを確認できます。
</Tip>

***

## ステップ1：ウェブフック配信先でモニターを作成

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.pubrio.com/monitors/create \
    -H "Content-Type: application/json" \
    -H "pubrio-api-key: YOUR_API_KEY" \
    -d '{
      "name": "My First Monitor",
      "detection_mode": "signal_first",
      "signal_types": ["jobs"],
      "signal_filters": [
        {
          "signal_type": "jobs",
          "filters": {
            "locations": ["US"]
          }
        }
      ],
      "destination_type": "webhook",
      "destination_config": {
        "webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID",
        "headers": {
          "X-Custom-Auth": "your-secret-token"
        },
        "body": {
          "pipeline": "my-webhook"
        }
      },
      "max_records_per_trigger": 5,
      "profile_id": 1
    }'
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://api.pubrio.com/monitors/create",
      headers={
          "Content-Type": "application/json",
          "pubrio-api-key": "YOUR_API_KEY"
      },
      json={
          "name": "My First Monitor",
          "detection_mode": "signal_first",
          "signal_types": ["jobs"],
          "signal_filters": [
              {
                  "signal_type": "jobs",
                  "filters": {
                      "locations": ["US"]
                  }
              }
          ],
          "destination_type": "webhook",
          "destination_config": {
              "webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID",
              "headers": {
                  "X-Custom-Auth": "your-secret-token"
              },
              "body": {
                  "pipeline": "my-webhook"
              }
          },
          "max_records_per_trigger": 5,
          "profile_id": 1
      }
  )

  print(response.json())
  ```

  ```javascript Node.js theme={null}
  const response = await fetch("https://api.pubrio.com/monitors/create", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "pubrio-api-key": "YOUR_API_KEY"
    },
    body: JSON.stringify({
      name: "My First Monitor",
      detection_mode: "signal_first",
      signal_types: ["jobs"],
      signal_filters: [
        {
          signal_type: "jobs",
          filters: {
            locations: ["US"]
          }
        }
      ],
      destination_type: "webhook",
      destination_config: {
        webhook_url: "https://usewebhook.com/YOUR_WEBHOOK_ID",
        headers: {
          "X-Custom-Auth": "your-secret-token"
        },
        body: {
          pipeline: "my-webhook"
        }
      },
      max_records_per_trigger: 5,
      profile_id: 1
    })
  });

  console.log(await response.json());
  ```
</CodeGroup>

**レスポンス：**

```json theme={null}
{
  "data": {
    "monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "name": "My First Monitor",
    "detection_mode": "signal_first",
    "destination_type": "webhook",
    "is_active": true,
    "is_paused": false,
    "masked_signature": "7••••••••••••••••8df",
    "created_at": "2026-04-06T10:00:00.000Z",
    "signature": "71a2b3c4-d5e6-f789-0abc-def123456789"
  }
}
```

`headers` オブジェクトは毎回の配信にカスタムHTTPヘッダーを追加します（認証に便利）。`body` オブジェクトはウェブフックペイロードのルートレベルにカスタムフィールドを追加します。

<Tip>
  レスポンスの `signature` を保存してください — 受信ペイロードの検証に必要です。これは作成時と[シグネチャ公開](/jp/api-reference/endpoint/monitors/signature_reveal)エンドポイントでのみ返されます。
</Tip>

***

## ステップ2：ウェブフック接続を検証

[ウェブフック検証](/jp/api-reference/endpoint/monitors/webhook_validate)エンドポイントを使用してエンドポイントが到達可能かテストします。これはプレースホルダーデータを含む**サンプルペイロード**を送信します — クレジットは消費されず、実際のシグナルは取得されません。

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.pubrio.com/monitors/webhook/validate \
    -H "Content-Type: application/json" \
    -H "pubrio-api-key: YOUR_API_KEY" \
    -d '{
      "monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "detection_mode": "signal_first",
      "signal_types": ["jobs"],
      "signal_filters": [
        {
          "signal_type": "jobs",
          "filters": { "locations": ["US"] }
        }
      ],
      "destination_type": "webhook",
      "destination_config": {
        "webhook_url": "https://usewebhook.com/YOUR_WEBHOOK_ID",
        "headers": { "X-Custom-Auth": "your-secret-token" },
        "body": { "pipeline": "my-webhook" }
      },
      "profile_id": 1
    }'
  ```
</CodeGroup>

成功したレスポンスには、送信されたサンプルリクエストペイロードとエンドポイントが返したレスポンスが含まれます — 本番稼働前に接続が正常であることを確認できます。

***

## ステップ3：実データでテスト

接続が検証されたら、[プロセストライ](/jp/api-reference/endpoint/monitors/process_try)エンドポイントを使用して実際の実行をトリガーします。これは実際のシグナルを取得しウェブフックに配信します — `tried_at` に最近の過去の日付を使用してデータが利用可能であることを確認してください：

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.pubrio.com/monitors/process/try \
    -H "Content-Type: application/json" \
    -H "pubrio-api-key: YOUR_API_KEY" \
    -d '{
      "monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "tried_at": "2026-01-01T00:00:00.000Z",
      "profile_id": 1
    }'
  ```
</CodeGroup>

<Info>
  validateと異なり、tryエンドポイントは実際のスキャンを実行し**クレジットを消費します**。実際のペイロードが正しく届くことを確認し、スケジュールされたスキャンが開始される前に結果をすばやく推定するために使用してください。
</Info>

***

## ステップ4：シグネチャの検証

各モニターには、受信ペイロードがPubrioからのものであることを確認するための一意のシグネチャがあります。

<CodeGroup>
  ```bash cURL — シグネチャの公開 theme={null}
  curl -X POST https://api.pubrio.com/monitors/signature/reveal \
    -H "Content-Type: application/json" \
    -H "pubrio-api-key: YOUR_API_KEY" \
    -d '{
      "monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "profile_id": 1
    }'
  ```
</CodeGroup>

```json theme={null}
{
  "data": {
    "monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "signature": "71a2b3c4-d5e6-f789-0abc-def123456789"
  }
}
```

このシグネチャを受信ペイロードの `monitor.monitor_id` と比較して真正性を検証します。

***

## ウェブフックペイロード構造

ペイロードはモニターの `detection_mode` に応じて異なります：

<Tabs>
  <Tab title="シグナルファースト">
    `signal_first` モードでは、ペイロードにトップレベルの `signals` 配列が含まれます：

    ```json theme={null}
    {
      "monitor": {
        "monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "name": "My Signal Monitor",
        "detection_mode": "signal_first",
        "signal_types": ["jobs", "news"],
        "signal_filters": [...],
        "company_filters": {...},
        "is_company_enrichment": true,
        "is_people_enrichment": true,
        "people_enrichment_configs": [...]
      },
      "metadata": {
        "total_signals": 3,
        "total_companies": 2,
        "total_people": 5
      },
      "triggered_at": "2026-04-05T20:29:43.832Z",
      "signals": [
        {
          "signal_type": "jobs",
          "signal": {
            "signal_type": "jobs",
            "job_search_id": "...",
            "companies": [
              {
                "domain_search_id": "...",
                "company_name": "...",
                "domain": "...",
                ...
              }
            ],
            ...
          },
          "companies": [
            {
              "domain_search_id": "...",
              "company_name": "...",
              "domain": "...",
              "logo_url": "...",
              "country_code": "...",
              "company_size": 5000,
              "industry": "...",
              "people": [...],
              "emails": [...],
              "phones": [...],
              ...
            }
          ]
        },
        {
          "signal_type": "news",
          "signal": {
            "signal_type": "news",
            "news_search_id": "...",
            "news_id": "...",
            "title": "...",
            "summary": "...",
            "published_at": "...",
            "source": "...",
            "category": "...",
            "companies": [...],
            ...
          },
          "companies": [...],
          ...
        },
        ...
      ],
      "pipeline": "my-webhook"
    }
    ```

    各シグナルエントリにはシグナルの詳細と、関連するエンリッチメント済み企業と人物が含まれます。
  </Tab>

  <Tab title="カンパニーファースト">
    `company_first` モードでは、ペイロードにエンリッチメント済み企業データとネストされたシグナルを含むトップレベルの `companies` 配列が含まれます：

    ```json theme={null}
    {
      "monitor": {
        "monitor_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "name": "My Company Monitor",
        "detection_mode": "company_first",
        "signal_types": ["jobs", "news", "advertisements"],
        "signal_filters": [...],
        "company_filters": {...},
        "is_company_enrichment": true,
        "is_people_enrichment": true,
        "people_enrichment_configs": [...]
      },
      "metadata": {
        "total_signals": 4,
        "total_companies": 2,
        "total_people": 8
      },
      "triggered_at": "2026-04-03T17:45:27.228Z",
      "companies": [
        {
          "company_name": "Acme Corp",
          "domain": "acmecorp.com",
          "domain_search_id": "...",
          "country_code": "US",
          "logo_url": "...",
          "linkedin_name": "acmecorp",
          "company_size": 5200,
          "industry": "Enterprise Software",
          "estimated_revenue": 50000000,
          "founded_year": 2010,
          "company_address": "San Francisco, CA",
          "specialties": ["SaaS", "Cloud Computing", ...],
          "linkedin_url": "https://linkedin.com/company/...",
          "locations": ["US"],
          "signals": [
            {
              "signal_type": "news",
              "signal": {
                "news_id": "...",
                "title": "Acme Corp Launches New AI Product",
                "summary": "...",
                "published_at": "2026-04-03T16:35:00.000Z",
                "source": "techcrunch.com",
                "category": "launches",
                "news_category_name": "Product Launch",
                ...
              }
            },
            {
              "signal_type": "jobs",
              "signal": {
                "job_search_id": "...",
                ...
              }
            },
            ...
          ],
          "people": [
            {
              "name": "Jane Smith",
              "title": "VP of Engineering",
              "email": "j.smith@acmecorp.com",
              ...
            },
            ...
          ],
          "emails": ["info@acmecorp.com", ...],
          "phones": ["+14155551234", ...],
          "contacts": [...],
          ...
        },
        ...
      ],
      "pipeline": "my-webhook"
    }
    ```

    配列内の各企業には、完全なエンリッチメント済みプロファイル、すべてのマッチしたシグナル、エンリッチメント済みの人物連絡先が含まれます。
  </Tab>
</Tabs>

<Note>
  `destination_config` のカスタム `body` フィールドはルートレベルに表示されます（例：上記の例の `"pipeline": "my-webhook"`）。
</Note>

***

## メール配信先

メール配信を希望するチームは、`destination_type` を `"email"` に設定してください：

```json theme={null}
{
  "destination_type": "email",
  "destination_config": {
    "email": "alerts@your-company.com"
  }
}
```

<Info>
  Pubrioはエージェンシーやチーム向けのホワイトラベルメール配信をサポートしています。送信者ドメインとブランディングのカスタマイズについては[お問い合わせ](https://pubrio.com/en/get-in-touch)ください。
</Info>

***

## トラブルシューティング

<AccordionGroup>
  <Accordion title="ウェブフックがペイロードを受信しない">
    * エンドポイントがパブリックにアクセス可能であることを確認してください（ファイアウォールやVPNの背後にないこと）
    * `200` ステータスコードを返すことを確認してください — 他のコードは失敗として扱われます
    * [ウェブフック検証](/jp/api-reference/endpoint/monitors/webhook_validate)エンドポイントを使用して接続をテストしてください
    * [統計ログ](/jp/api-reference/endpoint/monitors/statistics_logs)でエラーメッセージとレスポンスコードを確認してください
  </Accordion>

  <Accordion title="障害後にモニターが一時停止">
    ウェブフックが一貫して非200コードを返す場合、`max_failure_trigger` の連続失敗回数に達するとモニターが一時停止します。問題を修正し、[モニター更新](/jp/api-reference/endpoint/monitors/update)で再アクティベートしてください。
  </Accordion>

  <Accordion title="重複ペイロード">
    配信に失敗しリトライが設定されている場合、同じペイロードを複数回受信する可能性があります。`triggered_at` またはログIDを使用して重複排除してください。
  </Accordion>

  <Accordion title="ペイロードが大きすぎる">
    `max_records_per_trigger` を減らして配信ごとのレコード数を制限してください。フィルターを絞り込んでマッチするシグナル量を減らすこともできます。
  </Accordion>
</AccordionGroup>
