接続済みアカウント

listingsapi-js SDKを使用して、Google、Facebook、Apple Business Connectのアカウントを接続し、それらの掲載情報を拠点に対応付け、アカウントの接続を解除します。

接続済みアカウントは、Google Business Profile、Facebook Pages、または Apple Business Connect の所有者による OAuth の認可です。認可が得られると、プラットフォームはそのアカウントが所有する掲載情報を読み取り、それぞれを拠点に紐付けることができます。接続済みアカウントのすべてのメソッドは、ListingsAPI クライアントインスタンスにあります。

通常は、接続リンクを作成し、所有者が認可するのを待ち、アカウントの一覧を取得して connectedAccountId を入手し、マッチングを開始し、候補を確認してから、その候補を確定するか、掲載情報を手動で紐付けます。各メソッドの解決値は、それぞれ固有のレスポンスキー配下にあるペイロードであり、そのキーは以下の各セクションに記載しています。

connectGoogleAccount

Google Business Profile 用に、1 つのアカウント全体を対象とする OAuth リンクを作成します。返された url に所有者を誘導してください。同意画面が閉じると、所有者は指定した successUrl または errorUrl に戻ります。

TypeScript
const link = await client.connectGoogleAccount('https://app.example.com/onboarding/google/done','https://app.example.com/onboarding/google/failed',); console.log(link.url);

パラメータ

パラメータ型説明
successUrlstring認可後に所有者が戻る先の絶対 URL です。
errorUrlstring所有者がキャンセルした場合、または認可に失敗した場合に戻る先の絶対 URL です。

解決値は、url、success、errors を含む bulkConnectLinkForGoogle ペイロードです。使用できないリダイレクトでも、url が null の成功レスポンスが返される場合があるため、success だけでなく url も確認してください。リンクの有効期間は短いため、試行のたびに新しいリンクを作成してください。

connectFacebookAccount

connectGoogleAccount に対応する Facebook Pages 用のメソッドで、同じ 2 つのリダイレクト引数を受け取ります。

TypeScript
const link = await client.connectFacebookAccount('https://app.example.com/onboarding/facebook/done','https://app.example.com/onboarding/facebook/failed',); console.log(link.url);

パラメータ

パラメータ型説明
successUrlstring認可後に所有者が戻る先の絶対 URL です。
errorUrlstring所有者がキャンセルした場合、または認可に失敗した場合に戻る先の絶対 URL です。

解決値は、url、success、errors を含む bulkConnectLinkForFacebook ペイロードです。

getOauthConnectUrl

アカウント全体ではなく、1 つの拠点を対象とする OAuth リンクを作成します。所有者が接続する拠点がすでにわかっていて、自社の製品内にあるその拠点の画面に所有者を戻したい場合に使用します。

TypeScript
const link = await client.getOauthConnectUrl(1800289,'GOOGLE','https://app.example.com/locations/1800289/connected','https://app.example.com/locations/1800289/connect-failed',); console.log(link.url);

パラメータ

パラメータ型説明
locationIdstring | number接続を紐付ける拠点です。数値の ID は自動的にエンコードされます。
sitestring接続する掲載先で、'GOOGLE'、'FACEBOOK'、'APPLE' のいずれかです。
successUrlstring認可後に所有者が戻る先の絶対 URL です。
errorUrlstring認可に失敗した場合に所有者が戻る先の絶対 URL です。

解決値は、url、success、errors を含む createConnectUrl ペイロードです。両方のリダイレクト先が必須で、いずれも絶対 URL である必要があります。リンクは 1 回限り使用でき、指定した拠点に紐付いています。

fetchConnectedAccounts

利用中のアカウントで認可された Google および Facebook のアカウントを、接続の健全性と紐付け済み拠点数とともに一覧で取得します。以降のすべてのメソッドで必要となる connectedAccountId は、ここで取得します。

TypeScript
const page1 = await client.fetchConnectedAccounts({publisher: 'GoogleAccount',status: 'Connected',page: 1,perPage: 20,}); for (const record of page1.records ?? []) {console.log(record.email, record.connectedAccountId, record.status);}

オプション

パラメータ型説明
publisherstringアカウントの種類です。たとえば、'GoogleAccount' または 'FacebookAccount' を指定します。
statusstring接続状態のフィルターで、'Connected'、'NotConnected'、'ConnectionIssue' のいずれかです。
pagenumberページ番号です(1 から始まります)。
perPagenumber1 ページあたりのレコード数です。

解決値は connectedAccountsInfo ペイロードで、records 配列と、hasNextPage、hasPreviousPage、totalPages、totalRecords を含む pageInfo で構成されます。各レコードには、connectedAccountId、email、connectedAccountType、connectedLocationsCount、connectivityIssue、status、requestMatchesStatus が含まれます。

フィルターとフィールドでは、使用する値が異なります。status オプションは 'Connected'、'NotConnected'、'ConnectionIssue' のいずれかを受け取りますが、レコード自体の status は CONNECTED、MATCH_IN_PROGRESS、CONNECTIVITY_ISSUE のいずれかです。レコードの値をそのままフィルターに渡すと拒否されます。

fetchConnectedAccountDetails

ID を指定して 1 つのアカウントを読み取ります。ID がすでにわかっている場合は一覧全体をページごとに取得するよりも負荷が低く、マッチングの実行中にポーリングする際にもこのメソッドを使用します。

TypeScript
const details = await client.fetchConnectedAccountDetails('4f712c17-4f95-42dd-90f4-97171a2e67b5',); console.log(details.details.requestMatchesStatus); // MATCH_IN_PROGRESS, then MATCH_COMPLETED

パラメータ

パラメータ型説明
connectedAccountIdstringfetchConnectedAccounts から取得した接続済みアカウントの ID です。

解決値は connectedAccountDetails ペイロードで、details の配下に、一覧で返されるものと同じフィールドを持つレコードが格納されます。候補の準備ができたかどうかは requestMatchesStatus を監視して確認し、再認可を求めるかどうかは status と connectivityIssue を読み取って判断してください。

fetchConnectedAccountFolders

接続済みアカウントがアクセスできる Google アカウントグループ(フォルダー)を一覧で取得します。所有者が特定のグループに新しい掲載情報を作成したい場合は、createGmbListing の前にこのメソッドを呼び出してください。

TypeScript
const folders = await client.fetchConnectedAccountFolders('4f712c17-4f95-42dd-90f4-97171a2e67b5',); for (const folder of folders) {console.log(folder.folderId, folder.folderName, folder.locationCount);} // Narrow by nameconst matching = await client.fetchConnectedAccountFolders('4f712c17-4f95-42dd-90f4-97171a2e67b5',{ folderName: 'West Region' },);

オプション

パラメータ型説明
folderNamestringこの名前に一致するフォルダーに結果を絞り込みます。

解決値は getFoldersUnderGoogleAccount 配列で、デフォルトは空の配列です。各フォルダーには、folderId(変更せずにそのまま渡す accounts/<id> 文字列)、folderName、locationCount が含まれ、Google が件数を返さない場合、最後のフィールドは null になることがあります。このパスは、種類が Google のアカウントでのみ有効です。

fetchConnectedAccountListings

接続済みアカウントがアクセスできる掲載先の掲載情報を一覧で取得します。各レコードの id は、connectListing が受け取る connectedAccountListingId そのものなので、このメソッドを使って掲載情報の選択機能を実装できます。

TypeScript
const listings = await client.fetchConnectedAccountListings('4f712c17-4f95-42dd-90f4-97171a2e67b5',{ locationInfo: 'William St', page: 1, perPage: 50 },); for (const record of listings.records ?? []) {console.log(record.id, record.locationName, record.address);}

オプション

パラメータ型説明
locationInfostringビジネス名、住所、市区町村、郵便番号、店舗コード、電話番号を対象とする自由入力のテキスト検索です。
pagenumberページ番号です(1 から始まります)。
perPagenumber1 ページあたりのレコード数です。デフォルトは 500 で、これが最大値でもあります。

解決値は、records と pageInfo を含む connectedAccountListings ペイロードです。各レコードには、id、locationName、address、phone、liveLink、accountTypeName が含まれます。内部では書き込みのような形式のリクエストを使いますが、この操作は読み取りであり、SDK はエンドポイントの要件に従って、アカウント ID とページング情報をリクエストボディに格納します。

triggerConnectedAccountMatches

指定されたアカウントがアクセスできるすべてのプロフィールを取得し、利用中のアカウントの拠点と照合するジョブをキューに追加します。所有者が同意画面での操作を終えた直後と、拠点を一括作成した後に呼び出してください。

TypeScript
const result = await client.triggerConnectedAccountMatches(['4f712c17-4f95-42dd-90f4-97171a2e67b5',]); console.log(result.success, result.failedIds);

パラメータ

パラメータ型説明
connectedAccountIdsstring[]マッチングを実行する対象のアカウントです。

解決値は、success と failedIds を含む connectedAccountsTriggerMatches ペイロードです。success が true であることは、ジョブがキューに追加されたことを示し、マッチングの完了を意味するものではありません。requestMatchesStatus が MATCH_COMPLETED になるまで fetchConnectedAccountDetails をポーリングし、その後で候補を読み取ってください。

fetchConnectionSuggestions

マッチングによって生成された組み合わせを読み取り、紐付けを行う前に、担当者が各拠点と掲載先の掲載情報を比較できるようにします。

TypeScript
const suggestions = await client.fetchConnectionSuggestions('4f712c17-4f95-42dd-90f4-97171a2e67b5',{ page: 1, perPage: 50 },); for (const record of suggestions.records ?? []) {console.log(record.accountType, record.matchedDataDatabaseId, record.locationInfo.name);}

オプション

パラメータ型説明
pagenumberページ番号です(1 から始まります)。
perPagenumber1 ページあたりのレコード数です。

解決値は、records と pageInfo を含む connectionSuggestionsForAccount ペイロードです。候補レコードには id フィールドがありません。識別子は matchedDataDatabaseId で、accountType(GMB、FB、APPLE のいずれか)がマッチングレコードの種類を示します。confirmConnectedAccountMatches が受け取る ID の生成には両方が必要なため、この 2 つを一緒に保持してください。まだ一致するものがないアカウントでは、空の records 配列が返されます。

confirmConnectedAccountMatches

確認済みの組み合わせを承認します。確定すると、各拠点が掲載先の掲載情報に紐付けられ、以降の拠点の更新が反映されるようになります。

各 ID は候補レコードから生成します。マッチングレコードの型名とレコードの matchedDataDatabaseId をコロンで連結し、それを base64 エンコードしてください。GMB は GmbLocationMatchedData に、FB は FbLocationMatchedData に、APPLE は AppleLocationMatchedData に対応します。

TypeScript
const TYPES: Record<string, string> = {GMB: 'GmbLocationMatchedData',FB: 'FbLocationMatchedData',APPLE: 'AppleLocationMatchedData',}; const matchRecordId = (record: any) =>Buffer.from(TYPES[record.accountType] + ':' + record.matchedDataDatabaseId).toString('base64'); const approved = (suggestions.records ?? []).map(matchRecordId);const result = await client.confirmConnectedAccountMatches(approved); console.log(result.success, result.failedIds);

パラメータ

パラメータ型説明
matchRecordIdsstring[]確定するマッチングレコードのエンコード済み ID です。少なくとも 1 つが必要です。

解決値は、success と failedIds を含む confirmConnectMatches ペイロードです。呼び出すたびに success を確認してください。ID をデコードした結果が 3 種類のいずれにも該当しない場合、成功時と同じ形式のレスポンスが返されますが、success は false で、failedIds は含まれません。一部の ID で失敗した場合、failedIds に格納されるのは送信したエンコード済みの値ではなく、デコードされたデータベース ID なので、matchedDataDatabaseId と照合してください。

1件の掲載情報と1つの拠点の関連付け

照合済みの掲載情報1件と拠点1つの関連付けを完了するためのメソッドは3つあります。重複して説明せず、他の掲載情報エンドポイントとともに説明しています。

confirmConnectedAccountMatchesでアカウント内の大部分を処理した後、まだ手動で関連付ける必要がある店舗が1つ残っている場合に、これらを使用します。


oauthDisconnect

拠点ごとのOAuth経由で、同じ単一拠点の接続解除を実行します。同じ引数を受け取り、同じペイロードで解決されるため、コード内で読みやすい方の名前を選んでください。

TypeScript
await client.oauthDisconnect(1800289, 'GOOGLE');

パラメータ

パラメータ型説明
locationIdstring | number接続を解除する拠点です。
sitestring接続を解除する掲載先です。'GOOGLE'、'FACEBOOK'、'APPLE'のいずれかを指定します。

disconnectConnectedAccountsLocationsペイロードで解決され、キーはdisconnectListingが返すものと同じです。

disconnectGoogleAccount

Googleアカウント全体の接続を解除すると、そのアカウント経由で関連付けられたすべての拠点が更新を受信しなくなります。顧客が解約する場合や所有権を譲渡する場合に使用します。

TypeScript
await client.disconnectGoogleAccount('4f712c17-4f95-42dd-90f4-97171a2e67b5');

パラメータ

パラメータ型説明
connectedAccountIdstring接続を解除するGoogleアカウントです。

successを含むgmbBulkDisconnectペイロードで解決されます。この操作では一部だけを解除できないため、アカウントを維持したまま1つの拠点の関連付けを解除するには、disconnectListingを使用してください。不明なIDであってもsuccessがtrueで返されるため、確実に確認する必要がある場合は、後でfetchConnectedAccountsを読み取ってください。

disconnectFacebookAccount

Facebook用の対応するメソッドで、引数は同じであり、一部だけを解除できない点も同じです。

TypeScript
await client.disconnectFacebookAccount('9d2b5a41-0c7e-4f83-bb16-2ac43e70d915');

パラメータ

パラメータ型説明
connectedAccountIdstring接続を解除するFacebookアカウントです。

successを含むfbBulkDisconnectペイロードで解決されます。同じ注意点が当てはまり、不明なIDでも成功が報告されるため、fetchConnectedAccountsで確認してください。

一般的な初期設定の流れ

connect_google.ts
import { ListingsAPI } from 'listingsapi-js'; const client = new ListingsAPI(); // reads LISTINGSAPI_KEY from env // 1. Send the owner through the consent screenconst link = await client.connectGoogleAccount('https://app.example.com/onboarding/google/done','https://app.example.com/onboarding/google/failed',);console.log('open:', link.url); // 2. After they return, pick up the account IDconst accounts = await client.fetchConnectedAccounts({ publisher: 'GoogleAccount' });const accountId = accounts.records[0].connectedAccountId; // 3. Match its listings against your locationsawait client.triggerConnectedAccountMatches([accountId]); // 4. Poll until matching finisheslet details = await client.fetchConnectedAccountDetails(accountId);while (details.details.requestMatchesStatus !== 'MATCH_COMPLETED') {await new Promise((resolve) => setTimeout(resolve, 5000));details = await client.fetchConnectedAccountDetails(accountId);} // 5. Read the suggestions and confirm the approved onesconst suggestions = await client.fetchConnectionSuggestions(accountId, { perPage: 100 });console.log('found ' + (suggestions.records ?? []).length + ' suggested matches');