貼文
使用 listingsapi-js SDK,將公告、活動和優惠發布至 Google 和 Facebook。
貼文方法會將內容發布至 Google Business Profile 和 Facebook,並讓您監控各網站的發布狀態與分析資料。所有貼文方法都直接位於 ListingsAPI 用戶端實例上。
發布作業以非同步方式進行:建立呼叫會傳回 status: 'INPROGRESS',貼文則在背景發布。請輪詢 fetchPost,直到狀態為 SUCCESS,並查看 publishDetails[].submissionError,確認各網站的發布失敗情況。
bulkPublish
只需呼叫一次,即可將同一篇貼文發布至多個地點的 Google 和 Facebook。sites 預設包含這兩個網站。訊息(或各網站的對應表)會展開為每個網站各一筆項目,地點 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,因此自 0.3.2 起,SDK 為了向下相容而接受此選項,但絕不會將其傳送出去。需要依標籤篩選時,請使用 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 });