投稿
listingsapi-js SDKを使用して、お知らせ、イベント、特典をGoogleとFacebookに公開します。
投稿メソッドは、Google Business ProfileとFacebookにコンテンツを公開し、サイトごとの公開ステータスと分析データを確認できるようにします。すべての投稿メソッドは、ListingsAPIクライアントインスタンスで直接使用できます。
公開処理は非同期です。作成呼び出しはstatus: 'INPROGRESS'を返し、投稿はバックグラウンドで公開されます。ステータスがSUCCESSになるまでfetchPostをポーリングし、サイトごとの失敗をpublishDetails[].submissionErrorで確認してください。
bulkPublish
1回の呼び出しで、複数の拠点のGoogleとFacebookに1つの投稿を公開します。sitesのデフォルトは両方です。メッセージ(またはサイトごとのマップ)はサイトごとに1つのエントリに展開され、拠点IDは自動的にエンコードされます。また、ネットワーク呼び出しの前にクライアント側でペイロードが検証されます(無効なペイロードは即座にValidationErrorをスローします)。
const result = await client.bulkPublish({name: 'Holiday hours',locationIds: [16808, 16809, 16810],message: 'Open until 10pm through the holidays!',mediaUrl: 'https://cdn.example.com/holiday.jpg',ctaType: 'LEARN_MORE',ctaUrl: 'https://example.com/holiday-hours',});console.log(result.socialPost.id, result.socialPost.status); // INPROGRESS, publishes asyncサイトごとに本文を指定するには、messageにオブジェクトを渡します。
await client.bulkPublish({name: 'Holiday hours',locationIds: [16808, 16809],message: { GOOGLE: 'Open until 10pm through the holidays. Book online!', FACEBOOK: 'We are staying open late for the holidays. See you soon!',},});オプション
createAnnouncement
ANNOUNCEMENT投稿を作成します。これは、CTAとメディアを任意で追加できるシンプルなメッセージです。bulkPublishと同じオプションを受け取りますが、postTypeとcontextInfoは除きます。ここでは、sitesのデフォルトは['GOOGLE']です。
await client.createAnnouncement({name: 'Grand Opening',locationIds: [16808],message: 'Acme Dental is now open in the Mission!',sites: ['GOOGLE'],ctaType: 'LEARN_MORE',ctaUrl: 'https://example.com/opening',});createEvent
タイトルと開始・終了期間を指定して、EVENT投稿を作成します。titleは必須です(Googleで必須とされています)。startDayとendDayはYYYY-MM-DD形式の日付で、startTimeとendTimeは任意で指定できる表示用の時刻です。sitesのデフォルトは['GOOGLE']です。
await client.createEvent({name: 'Live music',locationIds: [16808],message: 'Join us Friday for live jazz!',title: 'Jazz Night',startDay: '2026-08-01',endDay: '2026-08-01',startTime: '7:00pm',endTime: '10:00pm',});createOffer
クーポン、割引、利用条件を指定して、OFFER投稿を作成します。titleは必須で、それ以外の特典フィールドはすべて任意です。sitesのデフォルトは['GOOGLE']です。
await client.createOffer({name: 'Summer sale',locationIds: [16808],message: '20% off whitening all week!',title: 'Summer Sale',couponCode: 'SUMMER20',discount: '20%',redeemUrl: 'https://example.com/sale',termsConditions: 'One per customer.',startDay: '2026-08-01',endDay: '2026-08-07',});特典のオプション
createPost
クライアント側で検証せずに、フラットなフィールドで構成された未加工のリクエストボディから投稿を作成します。このメソッドは、渡された内容をAPIが要求するinputオブジェクトでラップするため、実際に送信されるリクエストボディは{"input": {...}}になります。ラップされていないフラットなリクエストボディはHTTP 400で拒否されます。このリクエストボディの構築と検証を行うcreateAnnouncement、createEvent、またはcreateOfferの使用を推奨します。
await client.createPost({postName: 'Grand Opening',locationIds: ['TG9jYXRpb246MTY4MDg='],postType: 'ANNOUNCEMENT',postSites: ['GOOGLE'],postMessage: [{ site: 'GOOGLE', message: 'We are now open!' }],});fetchPost
投稿のコンテンツ、サイトごとの公開ステータス、分析データを取得します。INPROGRESS投稿が公開されるまでポーリングするために使用します。
let post = await client.fetchPost('U29jaWFsUG9zdDo0NDEyMg=='); while (post.status === 'INPROGRESS') {await new Promise((resolve) => setTimeout(resolve, 5000));post = await client.fetchPost('U29jaWFsUG9zdDo0NDEyMg==');} for (const detail of post.publishDetails ?? []) {if (detail.submissionError) { console.log('failed:', detail.submissionError);}}deletePost
投稿を削除し、公開先のすべてのサイトからも削除します。
await client.deletePost('U29jaWFsUG9zdDo0NDEyMg==');fetchLocationPosts
指定した拠点を対象とする投稿キャンペーンの一覧を取得します。オフセットによるページネーション(pageとperPage)を使用し、postsByLocationに解決されます。
このルートはtagを拒否するため、SDKは0.3.2以降、後方互換性のためにこのオプションを受け付けますが、リクエストには一切含めません。タグによる絞り込みが必要な場合は、fetchLocationBulkPostsを使用してください。
const posts = await client.fetchLocationPosts(16808, { page: 1, perPage: 10 });オプション
fetchBulkPost
一括キャンペーンを、拠点ごとの公開ステータスと分析データとともに取得します。
const bulk = await client.fetchBulkPost('QnVsa1Bvc3Q6OTk=');fetchLocationBulkPosts
指定した拠点を含む一括(複数拠点)キャンペーンの一覧を取得します。fetchLocationPostsと同じオプションを受け取ります。
const campaigns = await client.fetchLocationBulkPosts(16808, { page: 1, perPage: 10 });