ウェブフック統合

自動化におけるWebhook統合を使用すると、会議後に会議メモ、アクションアイテム、トランスクリプト、インサイト、録音、およびその他のメタデータを受け取ることができます。自動化は共有することもでき、チーム全体でWebhook統合を統一します。

開始するには

CirclebackからWebhookイベントを受け取るには、次の手順に従ってください:

  1. 自動化を開き、既存または新しい自動化にWebhookステップを追加します。

  2. WebhookエンドポイントURLを入力し、Webhookリクエストに含めたくないものをトグルでオフにします。

  3. 完了を選択し、保存して自動化を完了します。

リクエスト

設定後、提供されたエンドポイントURLで次のフィールドを含むJSONボディと共にPOSTリクエストが届き始めます:

  • id (number): Circleback会議ID、Circlebackの会議へのリンクを生成するのに使用可能 (https://app.circleback.ai/meetings/${id})

  • name (string): 会議名

  • createdAt (string): 会議作成日をISO形式の文字列で

  • duration (number): 会議の秒単位の期間

  • url (string or null): バーチャル会議のURL (例: Zoom、Google Meet、Microsoft Teams)

  • recordingUrl (string or null): 会議の録音ファイルのURLで、24時間のみ有効 (会議の録音を設定で保存するように設定されている場合のみ利用可能)

  • tags (array of strings): 会議に追加されたタグの名前

  • icalUid (string or null): 会議に関連するカレンダーイベントのユニーク識別子

  • attendees (array of objects): 会議の出席者

    • name (string or null): カレンダーイベントに関連付けられている場合の招待者名または会議参加者の名前

    • email (string or null): カレンダーイベントに関連付けられている場合の招待者メール

  • notes (string): Markdown形式のCircleback会議メモ

  • actionItems (array of objects): 会議のために作成されたアクションアイテムの配列

    • id (number): CirclebackアクションアイテムID

    • title (string): アクションアイテムのタイトル

    • description (string): アクションアイテムの説明

    • assignee (object or null): アクションアイテムの担当者オブジェクトまたは未割当の場合はnull

      • name (string or null): 担当者の名前

      • email (string or null): 担当者のメール

    • status (string): アクションアイテムのステータス、『PENDING』または『DONE』のいずれか

  • transcript (array of objects): 会議のトランスクリプトセグメント

    • speaker (string): スピーカーの名前

    • text (string): 発言内容

    • timestamp (number): セグメントの開始時点を秒で示すタイムスタンプ

  • insights (object):

    • [insightName] (string object key): ユーザーが作成したインサイトの名前

      • オブジェクトの配列

        • insight (string or object if insight has custom fields): インサイトの結果

        • speaker (string or null): インサイトが関連付けられているスピーカー(もしあれば)

        • timestamp (number or null): インサイトが関連付けられているタイムスタンプ(もしあれば)

自動化におけるWebhook統合を使用すると、会議後に会議メモ、アクションアイテム、トランスクリプト、インサイト、録音、およびその他のメタデータを受け取ることができます。自動化は共有することもでき、チーム全体でWebhook統合を統一します。

開始するには

CirclebackからWebhookイベントを受け取るには、次の手順に従ってください:

  1. 自動化を開き、既存または新しい自動化にWebhookステップを追加します。

  2. WebhookエンドポイントURLを入力し、Webhookリクエストに含めたくないものをトグルでオフにします。

  3. 完了を選択し、保存して自動化を完了します。

リクエスト

設定後、提供されたエンドポイントURLで次のフィールドを含むJSONボディと共にPOSTリクエストが届き始めます:

  • id (number): Circleback会議ID、Circlebackの会議へのリンクを生成するのに使用可能 (https://app.circleback.ai/meetings/${id})

  • name (string): 会議名

  • createdAt (string): 会議作成日をISO形式の文字列で

  • duration (number): 会議の秒単位の期間

  • url (string or null): バーチャル会議のURL (例: Zoom、Google Meet、Microsoft Teams)

  • recordingUrl (string or null): 会議の録音ファイルのURLで、24時間のみ有効 (会議の録音を設定で保存するように設定されている場合のみ利用可能)

  • tags (array of strings): 会議に追加されたタグの名前

  • icalUid (string or null): 会議に関連するカレンダーイベントのユニーク識別子

  • attendees (array of objects): 会議の出席者

    • name (string or null): カレンダーイベントに関連付けられている場合の招待者名または会議参加者の名前

    • email (string or null): カレンダーイベントに関連付けられている場合の招待者メール

  • notes (string): Markdown形式のCircleback会議メモ

  • actionItems (array of objects): 会議のために作成されたアクションアイテムの配列

    • id (number): CirclebackアクションアイテムID

    • title (string): アクションアイテムのタイトル

    • description (string): アクションアイテムの説明

    • assignee (object or null): アクションアイテムの担当者オブジェクトまたは未割当の場合はnull

      • name (string or null): 担当者の名前

      • email (string or null): 担当者のメール

    • status (string): アクションアイテムのステータス、『PENDING』または『DONE』のいずれか

  • transcript (array of objects): 会議のトランスクリプトセグメント

    • speaker (string): スピーカーの名前

    • text (string): 発言内容

    • timestamp (number): セグメントの開始時点を秒で示すタイムスタンプ

  • insights (object):

    • [insightName] (string object key): ユーザーが作成したインサイトの名前

      • オブジェクトの配列

        • insight (string or object if insight has custom fields): インサイトの結果

        • speaker (string or null): インサイトが関連付けられているスピーカー(もしあれば)

        • timestamp (number or null): インサイトが関連付けられているタイムスタンプ(もしあれば)

自動化におけるWebhook統合を使用すると、会議後に会議メモ、アクションアイテム、トランスクリプト、インサイト、録音、およびその他のメタデータを受け取ることができます。自動化は共有することもでき、チーム全体でWebhook統合を統一します。

開始するには

CirclebackからWebhookイベントを受け取るには、次の手順に従ってください:

  1. 自動化を開き、既存または新しい自動化にWebhookステップを追加します。

  2. WebhookエンドポイントURLを入力し、Webhookリクエストに含めたくないものをトグルでオフにします。

  3. 完了を選択し、保存して自動化を完了します。

リクエスト

設定後、提供されたエンドポイントURLで次のフィールドを含むJSONボディと共にPOSTリクエストが届き始めます:

  • id (number): Circleback会議ID、Circlebackの会議へのリンクを生成するのに使用可能 (https://app.circleback.ai/meetings/${id})

  • name (string): 会議名

  • createdAt (string): 会議作成日をISO形式の文字列で

  • duration (number): 会議の秒単位の期間

  • url (string or null): バーチャル会議のURL (例: Zoom、Google Meet、Microsoft Teams)

  • recordingUrl (string or null): 会議の録音ファイルのURLで、24時間のみ有効 (会議の録音を設定で保存するように設定されている場合のみ利用可能)

  • tags (array of strings): 会議に追加されたタグの名前

  • icalUid (string or null): 会議に関連するカレンダーイベントのユニーク識別子

  • attendees (array of objects): 会議の出席者

    • name (string or null): カレンダーイベントに関連付けられている場合の招待者名または会議参加者の名前

    • email (string or null): カレンダーイベントに関連付けられている場合の招待者メール

  • notes (string): Markdown形式のCircleback会議メモ

  • actionItems (array of objects): 会議のために作成されたアクションアイテムの配列

    • id (number): CirclebackアクションアイテムID

    • title (string): アクションアイテムのタイトル

    • description (string): アクションアイテムの説明

    • assignee (object or null): アクションアイテムの担当者オブジェクトまたは未割当の場合はnull

      • name (string or null): 担当者の名前

      • email (string or null): 担当者のメール

    • status (string): アクションアイテムのステータス、『PENDING』または『DONE』のいずれか

  • transcript (array of objects): 会議のトランスクリプトセグメント

    • speaker (string): スピーカーの名前

    • text (string): 発言内容

    • timestamp (number): セグメントの開始時点を秒で示すタイムスタンプ

  • insights (object):

    • [insightName] (string object key): ユーザーが作成したインサイトの名前

      • オブジェクトの配列

        • insight (string or object if insight has custom fields): インサイトの結果

        • speaker (string or null): インサイトが関連付けられているスピーカー(もしあれば)

        • timestamp (number or null): インサイトが関連付けられているタイムスタンプ(もしあれば)

{
  "id": 1234,
  "name": "Event Venue Review",
  "createdAt": "2023-07-25T20:30:57.926Z",
  "duration": 1306.09,
  "url": "https://meet.google.com/abc-defgh-xyz",
  "recordingUrl": null,
  "tags": ["Events"],
  "icalUid": "1a2b3c@google.com",
  "attendees": [
    { "name": "John Appleseed", "email": "john@example.com" },
    { "name": "Samantha Grey", "email": "sam@example.com" }
  ],
  "notes": "#### Overview\n*   Several options for event venues were reviewed...",
  "actionItems": [
    {
      "id": 252,
      "title": "Contact event venues",
      "description": "Reach out to Sunriver Events and other potential event venues to see if they would be open to hosting the event this summer.",
      "assignee": {
      	"name": "John Appleseed",
      	"email": "john@example.com"
      },
      "status": "PENDING"
    },
    {
      "id": 253,
      "title": "Review and finalize venue options",
      "description": "Review pricing and availability of venues and pick a venue for the event.",
      "assignee": null,
      "status": "PENDING"
    }
  ],
  "transcript": [
    {
	    "speaker": "John Appleseed",
	    "text": "Hey, how's it going?",
	    "timestamp": 4.56
    },
    {
	    "speaker": "Samantha Grey",
	    "text": "Going well, just testing webhooks in Circleback.",
	    "timestamp": 18.32
    }
  ],
  "insights": {
    "Customer details": [
	    {
		    "insight": {
			    "Company name": "Initech",
			    "Number of employees": 120
		    },
		    "speaker": "John Appleseed",
		    "timestamp": 800.00
	    }
    ],
    "Questions": [
			{
				"insight": "Is this thing on?",
				"speaker": "Samantha Grey",
				"timestamp": 49.15
			},
			{
				"insight": "When will the webhook integration be ready?",
				"speaker": "John Appleseed",
				"timestmap": 120.12
			}
    ]
  }
}
{
  "id": 1234,
  "name": "Event Venue Review",
  "createdAt": "2023-07-25T20:30:57.926Z",
  "duration": 1306.09,
  "url": "https://meet.google.com/abc-defgh-xyz",
  "recordingUrl": null,
  "tags": ["Events"],
  "icalUid": "1a2b3c@google.com",
  "attendees": [
    { "name": "John Appleseed", "email": "john@example.com" },
    { "name": "Samantha Grey", "email": "sam@example.com" }
  ],
  "notes": "#### Overview\n*   Several options for event venues were reviewed...",
  "actionItems": [
    {
      "id": 252,
      "title": "Contact event venues",
      "description": "Reach out to Sunriver Events and other potential event venues to see if they would be open to hosting the event this summer.",
      "assignee": {
      	"name": "John Appleseed",
      	"email": "john@example.com"
      },
      "status": "PENDING"
    },
    {
      "id": 253,
      "title": "Review and finalize venue options",
      "description": "Review pricing and availability of venues and pick a venue for the event.",
      "assignee": null,
      "status": "PENDING"
    }
  ],
  "transcript": [
    {
	    "speaker": "John Appleseed",
	    "text": "Hey, how's it going?",
	    "timestamp": 4.56
    },
    {
	    "speaker": "Samantha Grey",
	    "text": "Going well, just testing webhooks in Circleback.",
	    "timestamp": 18.32
    }
  ],
  "insights": {
    "Customer details": [
	    {
		    "insight": {
			    "Company name": "Initech",
			    "Number of employees": 120
		    },
		    "speaker": "John Appleseed",
		    "timestamp": 800.00
	    }
    ],
    "Questions": [
			{
				"insight": "Is this thing on?",
				"speaker": "Samantha Grey",
				"timestamp": 49.15
			},
			{
				"insight": "When will the webhook integration be ready?",
				"speaker": "John Appleseed",
				"timestmap": 120.12
			}
    ]
  }
}

受信リクエストの検証(オプション)

受信したWebhookイベントがCirclebackからのものであることを確認するために、署名秘密を使用して受信リクエストを検証することができます。これはオプションのステップですが、セキュリティを強化するために推奨されます。

自動化でWebhookを設定するときに、署名秘密が提供されます。これは、各Webhookイベントのための暗号署名を生成するために使用されるユニークで安全な文字列です。

署名を検証するには、次の手順に従います:

  1. 受信リクエストヘッダーから署名を抽出します。署名は x-signatureという名前のヘッダーにあります。

  2. 署名秘密とリクエストボディを使用して、期待される署名を生成します。

  3. 期待される署名と提供された署名を比較します。一致すれば、そのリクエストは有効とされ、Webhookイベントの処理を続行できます。

以下はTypeScriptでの実装例です:

import crypto from 'crypto';

export const verifyWebhookSignature = (
  requestBody: string,
  signature: string, // 'X-Signature' header in the incoming request
  signingSecret: string  // Signing secret from Settings → Webhook (whsec_...)
): boolean => {
// Generate the expected signature
  const expectedSignature = crypto.createHmac('sha256', signingSecret)
    .update(requestBody)
    .digest('hex');

// Compare the expected signature with the provided signature
  return expectedSignature === signature;
};

// Example usage in a webhook endpoint handler
export const webhookEndpointHandler = async (req: express.Request, res: express.Response) => {
  try {
// Extract the necessary data from the request
    const { body: requestBody } = req;
    const signature = req.headers['x-signature'] as string;
    const signingSecret = 'your-signing-secret';

// Verify the signature
    if (!verifyWebhookSignature(JSON.stringify(requestBody), signature, signingSecret)) {
      return res.status(401).json({ error: 'Invalid signature.' });
    }

// Process the webhook event
    await processWebhookEvent(requestBody);

// Return a success response
    return res.status(200).json({ message: 'Webhook event processed successfully.' });
  } catch (error) {
    console.error('Error processing webhook event.', error);
    return res.status(500).json({ error: 'Error processing webhook event.' });
  }
};

'your-signing-secret'を実際のサイニングシークレットに置き換えることを忘れないでください。

署名を検証することで、受け取るWebhookイベントがCirclebackからのものであり、改ざんされていないことを確認できます。これにより、アプリケーションを不正アクセスや潜在的な攻撃から保護するのに役立ちます。