Referensi peristiwa
Seluruh 26 peristiwa webhook Listings API, dikelompokkan menurut sumber daya, beserta field yang tepat dan contoh payload untuk masing-masing.
26 event, dikelompokkan berdasarkan resource REST yang terkait. Setiap event di halaman ini dikirim ke satu URL webhook Anda. Tidak ada langganan per event, jadi buat percabangan berdasarkan event dan abaikan yang tidak Anda perlukan.
Semuanya menggunakan payload standar kecuali listing.submission, yang dijelaskan di bawah. Field opsional di dalam data dihilangkan saat kosong, bukan dikirim sebagai null.
Indeks
Profil bisnis
Digunakan bersama endpoint Profil bisnis, khususnya GET /locations/{locationId}/listings/premium, yang mengembalikan syncStatus dan listingUrl per sitasi yang diberitahukan oleh event ini.
listing.submission
Pemicu: pengiriman sitasi untuk satu lokasi di satu situs direktori mencapai status akhir.
Tingkat teratas:
Di dalam data:
{ "event": "listing.submission", "data": { "business_id": 279381, "v4_business_id": "TG9jYXRpb246Mjc5Mzgx", "location_id": "TG9jYXRpb246Mjc5Mzgx", "site": { "id": 42, "name": "Yelp", "url": "https://www.yelp.com" } }, "status": "success", "live_link": "https://www.yelp.com/biz/acme-dental-downtown"}Lokasi
Siklus hidup lokasi, berkorespondensi 1:1 dengan createLocation, updateLocation, dan archiveLocations. Berlaku per lokasi: location_id selalu berupa string numerik.
profile.created
Pemicu: lokasi baru dibuat.
{ "event": "profile.created", "timestamp": "2026-08-25T10:04:00Z", "account_id": 11073, "location_id": "901234", "data": { "source": "api" }}profile.updated
Pemicu: detail lokasi yang sudah ada diedit.
Dibatasi dengan debounce menjadi satu pengiriman per lokasi setiap 60 detik, dengan pengiriman pada awal interval. Pengeditan dalam interval tersebut digabungkan, bukan ditunda. Event untuk pengeditan tersebut tidak pernah dikirim. Perlakukan changed_fields sebagai petunjuk tentang pengeditan yang memulai interval, bukan sebagai daftar lengkap perubahan.
Event tiba pada awal interval, sehingga pembacaan ulang lokasi saat event tiba hanya menampilkan pengeditan pertama tersebut. Jadwalkan pembacaan ulang kedua setelah interval berakhir, setidaknya 60 detik kemudian, dan lakukan juga rekonsiliasi lokasi secara berkala, karena pengiriman event ini hanya dicoba satu kali tanpa percobaan ulang. Lihat pemulihan setelah event terlewat.
{ "event": "profile.updated", "timestamp": "2026-08-25T10:06:12Z", "account_id": 11073, "location_id": "901234", "data": { "source": "user", "changed_fields": ["name", "phone"] }}profile.deleted
Pemicu: lokasi diarsipkan. Ini merupakan penghapusan sementara. Tidak ada penghapusan permanen, dan pengarsipan dapat dibatalkan dengan cancelArchiveLocations, yang tidak memicu event.
{ "event": "profile.deleted", "timestamp": "2026-08-25T10:20:44Z", "account_id": 11073, "location_id": "901234", "data": { "source": "user" }}Akun terhubung
Siklus koneksi Google dan Facebook serta kondisinya, beserta endpoint Akun Terhubung. Cakupannya per lokasi. platform selalu bernilai google atau facebook; penyedia lain tidak menghasilkan peristiwa ini.
connected_account_id selalu ada sebagai kunci, tetapi bernilai null pada kedua peristiwa verifikasi Google.
connection.location_connected
Pemicu: profil bisnis Google atau Facebook ditautkan ke lokasi.
{ "event": "connection.location_connected", "timestamp": "2026-08-25T14:32:10Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "google", "connected_account_id": "ba03bc4b-9f8c-4d3b-8e93-9628034c63cc" }}connection.location_disconnected
Pemicu: tautan profil bisnis Google atau Facebook ke lokasi dilepas.
{ "event": "connection.location_disconnected", "timestamp": "2026-08-25T14:35:02Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "google", "connected_account_id": "ba03bc4b-9f8c-4d3b-8e93-9628034c63cc" }}connection.reauth_required
Pemicu: kredensial akun terhubung dinyatakan tidak valid. Tidak ada data yang akan disinkronkan melalui koneksi ini sampai seseorang memberikan otorisasi ulang.
{ "event": "connection.reauth_required", "timestamp": "2026-08-25T14:40:18Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "google", "connected_account_id": "ba03bc4b-9f8c-4d3b-8e93-9628034c63cc", "reason": "Google credentials are invalid. Please reconnect." }}connection.listing_inaccessible
Pemicu: akun terhubung tidak lagi dapat mengakses profil bisnis lokasi tersebut. Berbeda dengan reauth_required: kredensial mungkin masih sepenuhnya valid, tetapi akses ke profil bisnis tertentu itu telah dicabut.
{ "event": "connection.listing_inaccessible", "timestamp": "2026-08-25T14:42:55Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "facebook", "connected_account_id": "cf12de77-2211-4a09-b7c1-0a6f3b2e91aa", "reason": "No longer has access to this listing." }}connection.google_verification_verified
Pemicu: Google Business Profile suatu lokasi lolos verifikasi.
{ "event": "connection.google_verification_verified", "timestamp": "2026-08-25T14:50:00Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "google", "connected_account_id": null }}connection.google_verification_failed
Pemicu: verifikasi Google Business Profile berakhir dengan kegagalan. Tidak ada panggilan REST yang memulai verifikasi; statusnya sendiri dapat dibaca, seperti dijelaskan di atas.
Hanya status akhir yang menghasilkan peristiwa: VERIFIED memicu peristiwa _verified, sedangkan SUSPENDED atau DUPLICATE (failure_type rejected) dan ERROR_WHILE_FETCHING (transient) memicu peristiwa ini. Status yang menunjukkan proses masih berlangsung (PENDING_VERIFICATION, UNDER_REVIEW, NOT_VERIFIED, NOT_CONNECTED) sama sekali tidak menghasilkan peristiwa, sehingga tidak adanya peristiwa bukanlah suatu indikasi. Baca googleVerificationStatus secara berkala melalui pembacaan lokasi selama verifikasi berlangsung.
{ "event": "connection.google_verification_failed", "timestamp": "2026-08-25T14:52:31Z", "account_id": 11073, "location_id": "279381", "data": { "platform": "google", "connected_account_id": null, "failure_type": "rejected", "reason": "This profile is suspended." }}Ulasan
Ulasan dan tanggapan, beserta endpoint Ulasan termasuk beri tanggapan, edit tanggapan dan arsipkan tanggapan.
Ulasan dalam kategori Social disaring dan tidak pernah dikirimkan.
interaction.review
Pemicu: ulasan diterima ke dalam sistem atau berubah.
{ "event": "interaction.review", "timestamp": "2026-08-25T09:12:44Z", "account_id": 11073, "location_id": "279381", "data": { "interaction": { "id": "6f8a1d20-3e11-4a55-9f7d-2b0c9e5a4471", "type": "Review", "content": "Friendly staff and no waiting.", "rating": 5, "title": null, "author_name": "Dana R.", "author_avatar": "https://lh3.googleusercontent.com/a/example", "date": "2026-08-25T08:58:02Z", "source": "google.com", "permalink": "https://maps.google.com/example-review", "category": "Review", "interaction_status": "unread", "parent_id": null, "interaction_request_id": "3c1e9b74-88a2-4d0e-9c31-77a1f0be5d92" } }}interaction.response
Pemicu: tanggapan terhadap ulasan dipublikasikan, diedit, atau diarsipkan. Strukturnya sama dengan interaction.review, dengan dua perbedaan: type bernilai Response, dan parent_id merujuk pada ulasan yang ditanggapi.
Semua field lain yang tercantum di bawah interaction.review disertakan dengan makna yang sama.
{ "event": "interaction.response", "timestamp": "2026-08-25T09:30:07Z", "account_id": 11073, "location_id": "279381", "data": { "interaction": { "id": "b2d7c095-5f43-4e21-8a10-6d9c3f77e208", "type": "Response", "content": "Thanks Dana, see you next time!", "rating": null, "author_name": "Acme Dental Downtown", "date": "2026-08-25T09:29:55Z", "source": "google.com", "permalink": "https://maps.google.com/example-review", "category": "Review", "interaction_status": "responded", "parent_id": "6f8a1d20-3e11-4a55-9f7d-2b0c9e5a4471", "interaction_request_id": "3c1e9b74-88a2-4d0e-9c31-77a1f0be5d92" } }}Postingan
Postingan lokal Google Business Profile, bersama endpoint Postingan. Cakupannya per lokasi, dan location_id berupa string numerik.
Keempat peristiwa menggunakan struktur data yang sama; field opsionalnya berbeda. Semua field opsional dihilangkan jika kosong.
local_post.created
Pemicu: item postingan dibuat dan masuk antrean untuk dikirim ke Google. Postingan tersebut belum tayang.
{ "event": "local_post.created", "timestamp": "2026-08-25T11:02:00Z", "account_id": 11073, "location_id": "279381", "data": { "post_id": 88421, "post_item_id": 5512309, "post_type": "STANDARD" }}local_post.published
Pemicu: Google menerima postingan dan postingan tersebut sudah tayang.
{ "event": "local_post.published", "timestamp": "2026-08-25T11:06:41Z", "account_id": 11073, "location_id": "279381", "data": { "post_id": 88421, "post_item_id": 5512309, "post_type": "STANDARD", "post_external_id": "accounts/123/locations/456/localPosts/789" }}local_post.rejected
Pemicu: Google menolak postingan, atau pengirimannya gagal.
{ "event": "local_post.rejected", "timestamp": "2026-08-25T11:07:15Z", "account_id": 11073, "location_id": "279381", "data": { "post_id": 88421, "post_item_id": 5512310, "post_type": "OFFER", "rejection_reason": "Rejected" }}local_post.deleted
Pemicu: item postingan dihapus.
{ "event": "local_post.deleted", "timestamp": "2026-08-25T15:40:09Z", "account_id": 11073, "location_id": "279381", "data": { "post_id": 88421, "post_item_id": 5512309, "post_type": "STANDARD", "post_external_id": "accounts/123/locations/456/localPosts/789" }}Social
Publikasi media sosial dan siklus koneksi pada tingkat merek, bersama endpoint Social. Sembilan peristiwa: lima untuk postingan, empat untuk koneksi.
account_id dan timestamp disertakan seperti biasa. ID di dalam data berupa UUID biasa yang sama dengan yang digunakan REST API, dikirim sebagai string.
social_post.created
Pemicu: postingan sosial dibuat. Hanya saat pembuatan — pengeditan postingan yang sudah ada tidak menghasilkan peristiwa ini lagi.
{ "event": "social_post.created", "timestamp": "2026-09-28T14:02:11Z", "account_id": 62570, "location_id": null, "data": { "post_id": "c47a1e58-2b93-4f10-a6d7-58e0c9b12345", "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "status": "scheduled", "created_by": 40122, "platform_ids": [1, 2, 4] }}social_post.published
Pemicu: postingan berhasil tayang sepenuhnya. Peristiwa ini dihasilkan hanya jika publikasi berhasil sepenuhnya: setidaknya satu saluran berhasil memublikasikan dan tidak ada saluran yang mengalami error. Publikasi yang hanya berhasil sebagian tidak menghasilkan peristiwa ini — kondisi tersebut menghasilkan social_post.failed sebagai gantinya.
{ "event": "social_post.published", "timestamp": "2026-10-02T13:30:07Z", "account_id": 62570, "location_id": null, "data": { "post_id": "c47a1e58-2b93-4f10-a6d7-58e0c9b12345", "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "status": "published", "published_on": "2026-10-02T13:30:04", "items": [ { "platform": "instagram", "social_platform_id": 2, "connected_account_id": "b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7", "published_url": "https://www.instagram.com/p/CxYz1234abc/", "vendor_post_id": "18029384756012345", "status": "success" } ] }}social_post.failed
Pemicu: publikasi gagal. Ini adalah kegagalan pengiriman, berbeda dari penolakan editorial. Peristiwa ini dipicu pada percobaan ulang terakhir, sehingga tidak dihasilkan selama postingan masih memiliki sisa percobaan.
items memuat hanya saluran yang mengalami error, sehingga postingan yang berhasil dipublikasikan di dua platform dan gagal di platform ketiga akan diterima di sini dengan satu item.
{ "event": "social_post.failed", "timestamp": "2026-10-02T13:34:55Z", "account_id": 62570, "location_id": null, "data": { "post_id": "c47a1e58-2b93-4f10-a6d7-58e0c9b12345", "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "status": "failed", "items": [ { "platform": "linkedin", "social_platform_id": 4, "status": "error", "reason": "Authorization expired", "vendor_error": "The access token is no longer valid." } ] }}social_post.rejected
Pemicu: alur kerja persetujuan menolak postingan. Penolakan ini bersifat editorial, bukan kegagalan pengiriman: postingan tidak pernah sampai ke platform.
{ "event": "social_post.rejected", "timestamp": "2026-09-29T09:11:03Z", "account_id": 62570, "location_id": null, "data": { "post_id": "e08b2d97-6f14-4c22-b7a5-9d3e1f6c4a70", "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "status": "rejected", "rejection_reason": "Please use the updated product name." }}social_post.deleted
Pemicu: postingan diarsipkan, baik melalui POST /social/posts/cancel maupun oleh proses pengarsipan terjadwal. Peristiwa ini hanya dipicu ketika status benar-benar berubah, sehingga mengarsipkan kembali postingan yang sudah diarsipkan tidak menghasilkan peristiwa apa pun.
{ "event": "social_post.deleted", "timestamp": "2026-09-30T16:20:41Z", "account_id": 62570, "location_id": null, "data": { "post_id": "e08b2d97-6f14-4c22-b7a5-9d3e1f6c4a70", "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "status": "archived", "archived_at": "2026-09-30T16:20:39" }}social_connection.connected
Pemicu: saluran merek menjadi aktif, baik saat pertama kali terhubung maupun saat saluran yang sebelumnya diarsipkan dihubungkan kembali. is_reconnect membedakan keduanya.
{ "event": "social_connection.connected", "timestamp": "2026-09-27T11:05:22Z", "account_id": 62570, "location_id": null, "data": { "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "connected_account_id": "b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7", "platform": "instagram", "display_name": "Jenny Home", "is_reconnect": false }}social_connection.disconnected
Pemicu: saluran sengaja dihapus melalui pemanggilan pemutusan koneksi. Peristiwa ini hanya dihasilkan ketika saluran benar-benar diarsipkan, sehingga pemutusan koneksi yang gagal tidak menghasilkan peristiwa yang keliru.
{ "event": "social_connection.disconnected", "timestamp": "2026-10-04T08:47:10Z", "account_id": 62570, "location_id": null, "data": { "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "connected_account_id": "b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7", "platform": "instagram", "display_name": "Jenny Home" }}social_connection.archived
Pemicu: koneksi saluran terputus tanpa dikehendaki — platform membatalkan validitas token, atau proses rekonsiliasi mendapati bahwa saluran tidak lagi dapat dijangkau. Tidak ada yang meminta pemutusan ini, dan hal itulah yang membedakannya dari disconnected.
{ "event": "social_connection.archived", "timestamp": "2026-10-06T02:15:33Z", "account_id": 62570, "location_id": null, "data": { "social_profile_id": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902", "connected_account_id": "2d4e6f80-1c33-4b7a-8e05-9a1b2c3d4e5f", "platform": "facebook", "display_name": "Jenny Home & Co.", "reason": "Access token has been invalidated by the platform." }}Analitik ulasan
Rekap ulasan terjadwal, satu event per lokasi per periode.
Kedua event menggunakan struktur data yang sama:
Lokasi tanpa aktivitas dalam periode tersebut tidak menghasilkan event, tetapi Anda juga tidak menerima event dari lokasi yang snapshot-nya gagal sampai. Tidak diterimanya snapshot dapat memiliki beberapa arti, dan untuk kelompok event ini, kemungkinan bahwa hal itu tidak menandakan masalah justru paling kecil. Penyebabnya bisa berupa: tidak ada aktivitas; pengiriman gagal atau melewati batas waktu (hanya ada satu percobaan dan tidak ada percobaan ulang); pengiriman dinonaktifkan karena akun tidak memiliki hak akses webhook, tidak memiliki URL yang dikonfigurasi, belum diverifikasi, atau diblokir; atau, yang paling mungkin dalam kasus ini, batas per menit menyebabkan sebagian event dalam lonjakan dibuang sebagai rate_limited.
Jangan pernah mencatat nilai nol hanya karena snapshot tidak diterima. Cocokkan dengan GET /locations/{locationId}/review-analytics-overview untuk periode yang sama, dan jika pembacaan tersebut juga gagal, laporkan periode tersebut sebagai tidak tersedia, bukan sebagai nol.
review_analytics.daily_snapshot
Pemicu: proses rekap harian, sekali per lokasi per hari.
{ "event": "review_analytics.daily_snapshot", "timestamp": "2026-08-25T02:00:00Z", "account_id": 11073, "location_id": "279381", "data": { "period": "2026-08-24", "granularity": "daily", "total_reviews": 1240, "new_reviews_in_period": 3, "average_rating": 4.6667, "previous_average_rating": 5.0 }}review_analytics.weekly_snapshot
Pemicu: proses rekap mingguan, sekali per lokasi per minggu. period adalah hari pertama dalam minggu yang dirangkum.
{ "event": "review_analytics.weekly_snapshot", "timestamp": "2026-08-24T02:00:00Z", "account_id": 11073, "location_id": "279381", "data": { "period": "2026-08-17", "granularity": "weekly", "total_reviews": 1237, "new_reviews_in_period": 18, "average_rating": 4.6123, "previous_average_rating": 4.5901 }}Event yang mungkin Anda terima tetapi tidak boleh dijadikan dasar implementasi
Platform menghasilkan kelompok event lain: kampanye ulasan, peringkat, promosi berbayar postingan media sosial, perubahan status akun iklan media sosial, ide postingan AI, dan kepemilikan Google Business Profile. Kelompok event tersebut tidak memiliki endpoint REST yang dipublikasikan dalam Listings API, tidak didokumentasikan di sini, dan strukturnya tidak tercakup dalam jaminan kompatibilitas apa pun. Karena hanya ada satu URL dan tidak ada langganan per event, handler Anda harus mengabaikan setiap event yang tidak dikenalinya dan tetap mengembalikan 200.