アプリで電話拡張SDK (英語)を使用すると、 HubSpotが提供する通話ツール と同様に、CRM内のレコードから直接、HubSpotユーザーに対してカスタムの通話オプションを提供できます。ユーザーがアプリを使用して電話をかけると、HubSpotはCRMレコードのアクティビティータイムライン上にエンゲージメントを作成し、アプリとデータをやり取りして詳細を入力します。
電話拡張は、次の3つのコンポーネントで構成されています。
電話拡張SDK 。貴社のアプリとHubSpot間の通信を可能にするJavaScript SDK。
コール設定エンドポイント 。貴社のアプリのコール設定のために使用するAPIエンドポイント。この設定は、アプリに接続する各HubSpotアカウントで使用されます。
コールiframe 。貴社のアプリをHubSpotユーザーに対して表示する場所。コール設定APIエンドポイントを使用して設定されます。
アプリをまだ用意していない場合は、HubSpot開発者アカウントを使用してアプリを作成 できます。HubSpot開発者アカウントをまだお持ちでない場合は、こちら から登録してください。
以下のドキュメントでは、SDKを使用したアウトバウンドコールについて説明します。SDKを使用した着信通話の受信(ベータ版) の詳細をご確認ください。
デモ用コールアプリを実行する
2つの異なるデモ用アプリで電話拡張SDKをテストするオプションがあります。
これらのデモ用アプリは完全に機能するコールアプリではありませんが、モックデータを使用してより現実に近いエクスペリエンスを実現します。
デモ用コールアプリをインストールする
インストールの有無にかかわらず、デモ用アプリを実行できます。ローカル環境にデモをインストールするには:
お使いの環境にNode.js をインストールします。
このリポジトリーのZIPをダウンロード 、複製、またはフォークします。
ターミナルを開き、プロジェクトのルートディレクトリーに移動します。
次のコマンドのいずれかを実行します。
cd demos/demo-minimal-js && npm i && npm start
cd demos/demo-react-ts && npm i && npm start
これによって、目的のデモディレクトリーに切り替わり、npm CLI を使用してプロジェクトに必要なNode.js (英語)の依存関係がインストールされ、アプリが起動します。
npm startコマンドを実行すると、https://localhost:9025/ に接続された新しいブラウザータブが自動的に開きます。アプリケーションにアクセスするには、「接続がセキュリティーで保護されていない」ことを通知するメッセージをバイパスする必要があります。
HubSpotからデモ用コールアプリを起動する
次のようにしてレコードに移動します。
コンタクト : HubSpotアカウントで、[コンタクト]>[コンタクト]に移動します。
会社 : HubSpotアカウントで、[コンタクト]>[会社]に移動します。
ブラウザーの開発者コンソールを開き、次のコマンドを実行します。
demo-minimal-jsまたはdemo-react-tsのインストール手順が完了している場合:
localStorage . setItem ( "LocalSettings:Calling:installDemoWidget" , "local" );
インストール手順をスキップした場合:
localStorage . setItem ( "LocalSettings:Calling:installDemoWidget" , "app:js" );
localStorage . setItem ( "LocalSettings:Calling:installDemoWidget" , "app" );
ページの表示を更新し、左のサイドバーでコール アイコンをクリックします**。[発信元]ドロップダウンメニューをクリックして、その中からデモ用アプリの 名前**を選択します(例:Demo App Local、Demo App JS、Demo App React)。
[コール]をクリックして、デモ用アプリが電話拡張SDKを介してHubSpotとどのように連携しているかを確認します。また、ブラウザーの開発者コンソールに記録されたイベントも表示できます。
電話拡張SDKをコールアプリにインストールする
電話拡張SDKをNode.js の依存関係としてコールアプリに追加するには:
npm i --save @hubspot/calling-extensions-sdk
yarn add @hubspot/calling-extensions-sdk
電話拡張SDKを使用する
電話拡張SDKは、メッセージを交換するために、HubSpot対応のシンプルなAPIとコールアプリを公開します。メッセージは、SDKで公開されるメソッドを介して送信され、eventHandlersを介して受信されます。利用可能なイベントを網羅したリストが、「イベント」セクション に記載されています。
イベントの説明は次のとおりです。
番号をダイヤルする : HubSpotが番号のダイヤルイベントを送信します。
発信通話が開始された : 通話が開始されると、アプリがHubSpotに通知します。
エンゲージメントを作成する : HubSpotは、アプリから要求された場合、最小限の情報でコールエンゲージメント を作成します。
エンゲージメントが作成された : HubSpotがエンゲージメントを作成しました。
EngagementIdがアプリに送信された : HubSpotがengagementIdをアプリに送信します。
通話が終了した : 通話が終了するとアプリが通知します。
通話が完了した : ユーザーがアプリの利用を完了するとアプリが通知します。
エンゲージメントを更新する : アプリはengagementIdによってエンゲージメントをフェッチ(取得)し、その他の通話の詳細とエンゲージメントをマージして更新します。APIを介したコールエンゲージメントの更新 、またはSDKを介したコールエンゲージメントの更新 について詳細をご確認ください。
まず、CallingExtensionsオブジェクトのインスタンスを作成します。拡張機能インスタンスを作成するときにオプションのオブジェクトを指定することで、拡張機能の動作を定義できます。このオプションのオブジェクトは、拡張機能の動作を指定できるeventHandlersフィールドを提供します。次のコードブロックは、使用可能なオプションと定義可能なイベントハンドラーを示しています。
import CallingExtensions from "@hubspot/calling-extensions-sdk" ;
const options = {
/** @property {boolean} debugMode - Whether to log various inbound/outbound debug messages to the console. If false, console.debug will be used instead of console.log */
debugMode: boolean ,
// eventHandlers handle inbound messages
eventHandlers: {
onReady : () => {
/* HubSpot is ready to receive messages. */
},
onDialNumber : event => {
/* HubSpot sends a dial number from the contact */
},
onCreateEngagementSucceeded : event => {
/* HubSpot has created an engagement for this call. */
}
onEngagementCreatedFailed : event => {
/* HubSpot has failed to create an engagement for this call. */
}
onUpdateEngagementSucceeded : event => {
/* HubSpot has updated an engagement for this call. */
},
onUpdateEngagementFailed : event => {
/* HubSpot has failed to update an engagement for this call. */
}
onVisibilityChanged : event => {
/* Call widget's visibility is changed. */
}
}
};
const extensions = new CallingExtensions ( options );
アプリをテストする
エンドユーザー向けの電話拡張iFrameを起動するには、HubSpotに次のiFrameパラメーターが必要です。
{
name : string /* The name of your calling app to display to users. */ ,
url : string /* The URL of your calling app, built with the Calling Extensions SDK */ ,
width : number /* The iFrame's width */ ,
height : number /* The iFrame's height */ ,
isReady : boolean /* Whether the widget is ready for production (defaults to true) */ ,
supportsCustomObjects : true /* Whether calls can be placed from a custom object */
}
コール設定APIエンドポイントを使用する
APIツール(Postmanなど)を使用して、次のペイロードをHubSpotの設定APIに送信します。必ずコールアプリのAPP_IDとアプリのDEVELOPER_ACCOUNT_API_KEY を取得してください。
isReadyフラグは、アプリが本番環境用に準備できているかどうかを示します。テスト中は、このフラグをfalseに設定する必要があります。
# Example payload to add the call widget app settings
curl --request POST \
--url 'https://api.hubapi.com/crm/v3/extensions/calling/APP_ID/settings?hapikey=DEVELOPER_ACCOUNT_API_KEY' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '{"name":"demo widget","url":"https://mywidget.com/widget","height":600,"width":400,"isReady":false}'
# Note that this endpoint also supports PATCH, GET and DELETE
localStorageを使用して拡張機能の設定を上書きする
テスト目的で、拡張機能の設定を上書きできます。HubSpotタブからブラウザーの開発者コンソールを開き、以下の設定を編集して、コマンドを実行します。
const myExtensionSettings = {
isReady: true ,
name: "My app name" ,
url: "My local/qa/prod URL" ,
};
localStorage . setItem ( "LocalSettings:Calling:CallingExtensions" , JSON . stringify ( myExtensionSettings ));
アプリを本番環境に向けて準備する
コール設定エンドポイント を使用してアプリを設定したら、PATCHエンドポイントを使用してisReadyをtrueに変更します。
# Example payload to add the call widget app settings
curl --request PATCH \
--url 'https://api.hubapi.com/crm/v3/extensions/calling/APP_ID/settings?hapikey=DEVELOPER_ACCOUNT_API_KEY' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '{"isReady":true}'
コールアプリをHubSpotマーケットプレイスに公開する
アプリをセットアップしたら、ユーザーはアプリのインストールURLを使用してアカウントにアプリをインストールできます。他のHubSpotユーザーが見つけられるように公開する場合は、 HubSpotアプリマーケットプレイス に掲載 することもできます。アプリが内部使用のみを目的としている場合は、これは必要ありません。
イベント
使用可能な通話イベント:
HubSpotへメッセージを送信する
HubSpotからメッセージを受信する
HubSpotにメッセージを送信する
extensionsオブジェクトは、HubSpotにメッセージを送信したり、他の動作を指定して関連付けたりするために呼び出すことができる、次のイベントハンドラーを提供します。以下の例を参照してください。
initialized:必須
ソフトフォンがインタラクションに対応できる状態であることを通知するメッセージを送信します。
const payload = {
isLoggedIn: boolean ,
engagementId: number ,
isAvailable: boolean ,
};
extensions . initialized ( payload );
プロパティー 型 説明 isLoggedInブール値 ユーザーがログインしているかどうかをチェックします。 engagementId数値 HubSpotによって作成されるエンゲージメントID。 isAvailable数値 ユーザーが対応可能かどうかをチェックします。
userAvailable
ユーザーが対応可能であることを通知するメッセージを送信します。
extensions . userAvailable ();
userUnavailable
ユーザーが対応不可であることを通知するメッセージを送信します。
extensions . userUnavailable ();
userLoggedIn
ユーザーがログインしたことを通知するメッセージを送信します。
// This message is only needed when user isn't logged in when initialized
extensions . userLoggedIn ();
userLoggedOut
ユーザーがログアウトしたことを通知するメッセージを送信します。
extensions . userLoggedOut ();
incomingCall
着信通話が開始されたことをHubSpotに通知するメッセージを送信します。
const callInfo = {
externalCallId: string ,
callStartTime: number ,
createEngagement: boolean ,
fromNumber: string ,
tonumber: string ,
};
extensions . incomingCall ( callInfo );
プロパティー 型 説明 externalCallId文字列 コールアプリによって作成されるコールID。ヘルプデスクでの通話 を有効にするために使用されます。 callStartTime数値 コールの開始時刻(ミリ秒単位)。 createEngagementブール値 HubSpotにコールのエンゲージメントを作成させるかどうかを指定します。Trueの場合、HubSpotはonCreateEngagementSucceeded またはonCreateEngagementFailed を返します。 fromNumber文字列 発信者の電話番号。必須パラメーター toNumber文字列 受信者の電話番号。
outgoingCall
発信通話が開始されたことをHubSpotに通知するメッセージを送信します。
const callInfo = {
phoneNumber: string /** @deprecated Use toNumber instead **/ ,
callStartTime: number ,
createEngagement: true ,
toNumber: string ,
fromNumber: string ,
dialingContext: onDialEventPayload ,
};
extensions . outgoingCall ( callInfo );
プロパティー 型 説明 callStartTime数値 コールの開始時刻(ミリ秒単位)。 createEngagementブール値 HubSpotにコールのエンゲージメントを作成させるかどうかを指定します。Trueの場合、HubSpotはonCreateEngagementSucceeded またはonCreateEngagementFailed を返します。 toNumber文字列 受信者の電話番号。 fromNumber文字列 発信者の電話番号。必須パラメーター dialingContextオブジェクト 該当する場合、チケットやエンゲージメントの作成にダイヤルコンテキストが使用されます。このオブジェクトには、onDialNumber ペイロードのすべてのプロパティーが含まれます。このプロパティーにより、HubSpotとサード パーティー アプリの間で完全なダイヤルコンテキストが戻され、データの一貫性が確保されます。
callAnswered
発信通話に応答中であることをHubSpotに通知するメッセージを送信します。
const payload = {
externalCallId: string ,
};
extensions . callAnswered ();
プロパティー 型 説明 externalCallId文字列 コールアプリによって作成されるコールID。ヘルプデスクでの通話 を有効にするために使用されます。
callEnded
通話が終了したことをHubSpotに通知するメッセージを送信します。
// After receiving the call ended event, the user can navigate away, can close the call widget.
extensions . callEnded ({
externalCallId: string ,
engagementId: number ,
callEndStatus: EndStatus ,
});
プロパティー 型 説明 externalCallId文字列 コールアプリによって作成されるコールID。ヘルプデスクでの通話 を有効にするために使用されます。 engagementId数値 HubSpotによって作成されるエンゲージメントID。 callEndStatus列挙 終了時のコールのステータス。有効なステータス:COMPLETEDFAILEDCANCELEDBUSYNO_ANSWERREJECTEDMISSED
callCompleted
コールが完了したことをHubSpotに通知するメッセージを送信します。エンゲージメントのプロパティーはHubSpotが所有 するため、手動で作成または更新する必要がなくなりました(強調表示されている箇所を参照)。
ユーザーがCallタスクタイプのタスクキューに入っている場合、hideWidgetプロパティーは無視されます。
// After receiving the call completed event, HubSpot will
// 1) insert the engagement into the timeline
// 2) set the default associations on the engagement
// 3) closes the widget unless `hideWidget` is set to false.
// 4) update the engagement with any engagement properties
const data = {
engagementId: number ,
hideWidget: boolean ,
engagementProperties: { [key: string]: string },
externalCallId: string ,
}
extensions . callCompleted ( data );
プロパティー 型 説明 engagementId数値 HubSpotによって作成されるエンゲージメントID。 hideWidgetブール値 通話の終了時にウィジェットを非表示にするかどうかを指定します。任意指定のパラメーターです。デフォルトではtrueに設定されます。 engagementProperties文字列 プロパティーを追加 して、HubSpot所有のエンゲージメントにオプトインします。これにより、HubSpotはonUpdateEngagementSucceeded またはonUpdateEngagementFailed を返するようになります。externalCallId文字列 コールアプリによって作成されるコールID。ヘルプデスクでの通話 を有効にするために使用されます。
publishToChannel
接続されたチャネルにコールを公開します。これはHubSpotが所有するエンゲージメントには必要ありません。
const payload = {
externalCallId ,
engagementId ,
};
extensions . publishToChannel ( payload );
プロパティー 型 説明 externalCallId文字列 コールアプリによって作成されるコールID。ヘルプデスクでの通話 を有効にするために使用されます。 engagementId数値 HubSpotによって作成されるエンゲージメントID。
navigateToRecord
このイベントは、レコードに移動するときに呼び出されます。
onNavigateToRecord {
const {
engagementId : number ,
objectCoordinates : object coordinates
} = data ;
...
}
プロパティー 型 説明 engagementId数値 HubSpotによって作成されるエンゲージメントID。 objectCoordinatesオブジェクト座標 portalId、objectId、objectTypeIDを参照します。
sendError
コールアプリでエラーが発生したことをHubSpotに通知するメッセージを送信します。
// After receiving the sendError event, HubSpot will display an alert popup to the user with the error message provided.
const data = {
message: string ,
};
extensions . sendError ( data );
プロパティー 型 説明 message文字列 アラートポップアップに表示されるエラーメッセージ。
コールアプリのサイズを変更する必要があることをHubSpotに通知するメッセージを送信します。
// After receiving the resizeWidget event, HubSpot will use the provided height and width to resize the call widget.
const data = {
height: number ,
width: number ,
};
extensions . resizeWidget ( data );
プロパティー 型 説明 height数値 望ましいコールウィジェットの高さ。 width数値 望ましいコールウィジェットの幅。
HubSpotからメッセージを受信する
extensionsオブジェクトは、HubSpotでメッセージを受信した際や、または他の関連する動作を指定するために呼び出すことができる、次のイベントハンドラーを提供します。以下の例を参照してください。
onReady
HubSpotがメッセージを受信できる状態であることを通知するメッセージ。
// Example snippet for handling onReady event
onReady () {
extensions . initialized ( payload );
}
プロパティー 型 説明 engagementId数値 HubSpotによって作成されるエンゲージメントID。 iframeLocation列挙 widget:コールアプリが インバウンドコール をサポートしていない場合コールレコードページに表示されるドラッグ&ドロップウィジット。remote:コールアプリがインバウンドコールをサポートしている場合にナビゲーション バーの枠に表示されるフレーム。window:コールアプリがインバウンドをサポートしている場合にコールウィンドウに表示されるフレーム。ownerId文字列または数値 HubSpotにログインしているユーザーのID。 PortalId数値 HubSpotアカウントのID。 userId数値 HubSpotユーザーのID。
onDialNumber
このイベントは、HubSpotでユーザーが発信通話を開始するとトリガーされます。onDialNumberイベントのペイロードには、コールに関連付けられている全てのフィールドが含まれます。これらのフィールドについて、以下の表で詳しく説明します。
onDialNumber ( data ) {
const {
phoneNumber : string ,
ownerId : number ,
subjectId : number ,
objectId : number ,
objectType : CONTACT | COMPANY ,
portalId : number ,
countryCode : string ,
calleeInfo {
calleeId : number ,
calleeObjectTypeId : string ,
},
startTimestamp : number ,
toPhoneNumberSrc : string ,
} = data ;
...
}
プロパティー 型 説明 phoneNumber文字列 HubSpotユーザーが電話をかけた相手の電話番号。 ownerId文字列または数値 (HubSpotに)ログインしているユーザーのID。 subjectId数値 件名のID。 objectId数値 電話番号のオブジェクトタイプ。 objectType文字列 ダイヤルされた電話番号(コンタクトまたは会社の電話番号など)に関連付けられているオブジェクトタイプ。ここで考えられる値は、"CONTACT"または"COMPANY"です。 portalId数値 HubSpotポータルのID。 countryCode文字列 電話番号の国コード。 calleeInfo配列 着信者に関する情報。以下を含める必要があります。calleeID: numbercalleeObjectTypeId: string startTimestamp数値 通話開始時のタイムスタンプ。 toPhoneNumberSrc文字列 ’ HubSpotでの電話番号のプロパティー名 。プロパティーには、標準のプロパティー値またはカスタムプロパティーを指定できます。例えば、コンタクトに3つの連絡先電話番号がある場合、それぞれ「Office」、「Personal」、「Mobile」という関連付けラベルを設定できます。
onEngagementCreated
非推奨。代わりにonCreateEngagementSucceeded を使用してください。
/** @deprecated Use onCreateEngagementSucceeded instead **/
onEngagementCreated ( data ) {
const {
engagementId : number ,
} = data ;
...
}
プロパティー 型 説明 engagementId数値 HubSpotによって作成されるエンゲージメントID。
onCreateEngagementSucceeded
HubSpotにより、エンゲージメントが正常に更新されたことを通知するメッセージがコール アプリ パートナーに送信されます。
onCreateEngagementSucceeded : event => {};
onCreateEngagementFailed
HubSpotにより、エンゲージメントを作成できなかったことを通知するメッセージがコール アプリ パートナーに送信されます。
onCreateEngagementFailed : event => {};
onNavigateToRecordFailed
このイベントは、レコードへの移動が失敗したときに呼び出されます。
onNavigateToRecordFailed {
const {
engagementId : number ,
objectCoordinates : object coordinates
} = data ;
...
}
プロパティー 型 説明 engagementId数値 HubSpotによって作成されるエンゲージメントID。 objectCoordinatesオブジェクト座標 portalId、objectId、objectTypeIDを参照します。
onPublishToChannelSucceeded
このイベントは、チャネルへの公開が成功すると呼び出されます。
onPublishToChannelSucceeded {
const {
engagementId : number ,
externalCallId : string
} = data ;
...
}
プロパティー 型 説明 engagementId数値 HubSpotによって作成されるエンゲージメントID。 externalCallId文字列 コールアプリによって作成されるコールID。ヘルプデスクでの通話 を有効にするために使用されます。
onPublishToChannelFailed
このイベントは、チャネルへの公開に失敗したときに呼び出されます。
onPublishToChannelFailed {
const {
engagementId : number ,
externalCallId : string
} = data ;
...
}
プロパティー 型 説明 engagementId数値 HubSpotによって作成されるエンゲージメントID。 externalCallId文字列 コールアプリによって作成されるコールID。ヘルプデスクでの通話 を有効にするために使用されます。
onCallerIdMatchSucceeded
このイベントは、発信者IDの照合が成功すると呼び出されます。
onCallerIdMatchSucceeded : event => {};
onCallerIdMatchFailed
このイベントは、発信者IDの照合に失敗したときに呼び出されます。
onCallerIDMatchFailed : event => {};
onVisibilityChanged
ユーザーがコールアプリを最小化または非表示にしたかどうかを通知するメッセージ。
onVisibilityChanged ( data ) {
const { isMinimized , isHidden } = data ;
...
}
defaultEventHandler
イベントのデフォルトのハンドラー。
defaultEventHandler ( event ) {
console . info ( "Event received. Do you need to handle it?" , event );
}
電話拡張SDK | よくある質問
ユーザー認証はどのように処理されますか?
コールアプリが認証を処理します。
電話拡張はCDNでホスティングされるのですか?
はい。電話拡張SDKはjsDeliver 経由でインストールできます。例えば、[email protected] をインストールするには、https://cdn.jsdelivr.net/npm/@hubspot/[email protected] /dist/main.js を使用できます。
エンゲージメントはどのタイミングで作成または更新されるのですか?
ユーザーは、HubSpot UI内からもHubSpot UI外(モバイルアプリ、リダイレクトされた番号など)からも通話を開始できます。コールがHubSpot UI内から開始された場合、HubSpotはコールエンゲージメントを作成し、コールアプリにエンゲージメントを送信します。通話が終了すると、コールアプリはコールのその他の詳細を追加し、このエンゲージメントを更新できます。通話がHubSpot UIの外部で開始された場合、アプリは通話エンゲージメントを作成します。
連携の一部として必要なスコープは何ですか?
連絡先とタイムラインのスコープを追加する必要があります。これらのスコープにより、アプリケーションは連絡先にアクセスでき、CRMでコールエンゲージメントを作成および更新することができます。
この機能をマーケットプレイスの既存のアプリケーションに追加することはできますか?それとも新しいアプリを作成して追加するのですか?
コール ユース ケースに対応する既存のアプリを既に持っている場合は、この機能を既存のアプリに直接追加できます。既にアプリをインストールしている全てのお客さまは、アプリを再度インストールしなくても、この新しい機能を利用できます。
既存のソフト フォン アプリケーションをSDKで連携させることはできますか?
はい。既存のソフト フォン アプリケーションとの連携は非常に簡単です。上記のドキュメントの手順に従って、アプリケーションを起動して利用を開始してください。
ユーザーは複数の連携を同時に使用できますか?
はい。ユーザーは複数のサードパーティーのコール連携を同時に使用できます。コールボタンをクリックした後に表示されるサービスプロバイダーを切り替える機能を使用して、サービスプロバイダーをシームレスに切り替えることができます。
無料ユーザーはアプリ連携をインストールできますか?
はい。全てのユーザーがアプリをインストールできます。
ユーザーが既にアプリをインストールしている場合、連携は自動的に表示されますか?
はい。ユーザーが既にアプリをインストールしており、電話拡張機能で同じアプリを更新している場合、連携が自動的に表示されます。現在、開発者がコールアプリを一部の顧客のみに有効にする方法はありません。
どのユーザーでもアプリをインストールまたはアンインストールできますか?
いいえ。必要な権限を持つユーザーのみ、アプリをインストールおよびアンインストールできます。ユーザーの権限を確認する 方法について詳細をご確認ください。
カスタムのコールプロパティーを作成することはできますか?
はい。プロパティーAPI を使用してカスタムのコールプロパティーを作成できます。
カスタムオブジェクトから電話をかけることはできますか?
はい。コール連携がSDKのみを使用してコールを行っている限り、カスタムオブジェクトから電話を発信できます。各連携では、通話拡張SDKのみを使用してコールが行われていること、outgoingCallイベントでHubSpotに通知されることを確認する必要があります。
まず、outgoingCallイベントでエンゲージメントを作成するのに、連携で電話拡張SDKが使用されていることを確認します。
outgoingCall ({ createEngagement: true });
createEngagementがtrueの場合、こちら からアプリ情報を更新する方法をご覧ください。
outgoingCallイベント全体の例を以下に示します。
const callInfo = {
phoneNumber: string , // optional unless call is initiated by the widget
createEngagement: true // whether HubSpot should create an engagement for this call
callStartTime : number // optional unless call is initiated by the widget
};
extensions . outgoingCall ( callInfo );
Last modified on December 10, 2025