مرجع الأحداث
جميع أحداث webhook في Listings API البالغ عددها 26، مجمّعة حسب المورد، مع الحقول الدقيقة ومثال على حمولة كل حدث.
26 حدثًا، مجمّعة حسب مورد REST الذي ترتبط به. يُرسَل كل حدث في هذه الصفحة إلى عنوان URL الوحيد المخصص لخطافات الويب لديك. لا يوجد اشتراك منفصل لكل حدث، لذا وجّه المعالجة حسب event وتجاهل ما لا تحتاج إليه.
تستخدم جميعها بنية البيانات القياسية باستثناء listing.submission، الموضّح أدناه. تُحذَف الحقول الاختيارية داخل data عندما تكون فارغة، بدلًا من إرسالها بقيمة null.
الفهرس
إدراجات الأنشطة التجارية
يرتبط بنقاط نهاية إدراجات الأنشطة التجارية، وخصوصًا GET /locations/{locationId}/listings/premium، التي تُرجع syncStatus وlistingUrl لكل استشهاد، وهما القيمتان اللتان يُعلن عنهما هذا الحدث.
listing.submission
شرط الإطلاق: وصول إرسال بيانات استشهاد بنشاط تجاري لموقع واحد على موقع دليل واحد إلى حالة نهائية.
المستوى الأعلى:
داخل 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"}المواقع
دورة حياة الموقع، مع تطابق بنسبة 1:1 مع createLocation وupdateLocation وarchiveLocations. النطاق خاص بالموقع: تكون location_id دائمًا سلسلة نصية رقمية.
profile.created
شرط الإطلاق: إنشاء موقع جديد.
{ "event": "profile.created", "timestamp": "2026-08-25T10:04:00Z", "account_id": 11073, "location_id": "901234", "data": { "source": "api" }}profile.updated
شرط الإطلاق: تعديل تفاصيل موقع موجود.
يُحدّ التسليم إلى مرة واحدة لكل موقع كل 60 ثانية، عند بداية الفترة. تُدمَج التعديلات الواقعة خلال هذه الفترة، ولا يُؤجَّل تسليمها. ولا تُسلَّم مطلقًا. اعتبر changed_fields مؤشرًا إلى التعديل الذي بدأت به الفترة، وليس بيانًا كاملًا بالفروق.
يصل الحدث في بداية الفترة، لذا فإن إعادة قراءة الموقع عند وصوله لا تُظهر إلا ذلك التعديل الأول. جدوِل قراءة ثانية بعد انتهاء الفترة، أي بعد 60 ثانية على الأقل، وطابق بيانات المواقع دوريًا أيضًا، لأن لهذا الحدث محاولة تسليم واحدة دون إعادة محاولة. انظر تدارك حدث فائت.
{ "event": "profile.updated", "timestamp": "2026-08-25T10:06:12Z", "account_id": 11073, "location_id": "901234", "data": { "source": "user", "changed_fields": ["name", "phone"] }}profile.deleted
شرط الإطلاق: أرشفة موقع. هذا حذف منطقي. لا يوجد حذف نهائي، ويمكن إلغاء الأرشفة باستخدام cancelArchiveLocations، الذي لا يُطلِق حدثًا.
{ "event": "profile.deleted", "timestamp": "2026-08-25T10:20:44Z", "account_id": 11073, "location_id": "901234", "data": { "source": "user" }}الحسابات المتصلة
دورة حياة اتصالات Google وFacebook وحالتها، إلى جانب نقاط نهاية الحسابات المتصلة. يقتصر نطاقها على الموقع. تكون قيمة platform دائمًا google أو facebook؛ ولا يصدر مقدمو الخدمات الآخرون هذه الأحداث.
يوجد connected_account_id دائمًا كمفتاح، لكن قيمته تكون null في حدثَي التحقق الخاصين بـ Google.
connection.location_connected
المُشغِّل: ربط إدراج نشاط تجاري على Google أو Facebook بموقع.
{ "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
المُشغِّل: إلغاء ربط إدراج نشاط تجاري على Google أو Facebook بموقع.
{ "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
المُشغِّل: إبطال بيانات الاعتماد للحساب المتصل. لن تجري مزامنة أي شيء عبر هذا الاتصال حتى يعيد أحدهم تفويضه.
{ "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
المُشغِّل: لم يعد الحساب المتصل قادرًا على الوصول إلى إدراج النشاط التجاري الخاص بالموقع. يختلف هذا عن reauth_required: فقد تظل بيانات الاعتماد صالحة تمامًا، لكن صلاحية الوصول إلى إدراج النشاط التجاري المحدد قد أُزيلت.
{ "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
المُشغِّل: اجتياز ملف Google Business Profile الخاص بموقع عملية التحقق.
{ "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
المُشغِّل: وصول عملية تحقق من ملف Google Business Profile إلى فشل نهائي. لا يبدأ أي استدعاء REST عملية تحقق؛ ويمكن قراءة الحالة نفسها كما هو موضح أعلاه.
لا تُصدر حدثًا إلا الحالات النهائية: تُطلِق VERIFIED الحدث _verified، وتُطلِق SUSPENDED أو DUPLICATE (failure_type rejected) وERROR_WHILE_FETCHING (transient) هذا الحدث. لا تُنتج الحالات التي تشير إلى أن العملية قيد التنفيذ (PENDING_VERIFICATION، UNDER_REVIEW، NOT_VERIFIED، NOT_CONNECTED) أي حدث على الإطلاق، لذا فإن غياب الحدث لا يدل على شيء. استعلم دوريًا عن googleVerificationStatus عند قراءة بيانات موقع ما دامت عملية التحقق قيد التنفيذ.
{ "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." }}التقييمات
التقييمات والردود، إلى جانب نقاط نهاية التقييمات، بما فيها الرد وتعديل الرد وأرشفة الرد.
تُستبعد التقييمات ضمن الفئة Social ولا تُسلَّم أبدًا.
interaction.review
المُشغِّل: استيعاب تقييم أو تغييره.
{ "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
المُشغِّل: نشر رد على تقييم أو تعديله أو أرشفته. له البنية نفسها التي لـ interaction.review، مع اختلافين: تكون قيمة type هي Response، ويشير parent_id إلى التقييم الذي يُرد عليه.
توجد جميع الحقول الأخرى المدرجة تحت interaction.review بالمعنى نفسه.
{ "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" } }}المنشورات
المنشورات المحلية على Google Business Profile، إلى جانب نقاط نهاية المنشورات. نطاقها محدد بموقع، وlocation_id سلسلة نصية رقمية.
تشترك الأحداث الأربعة في بنية واحدة لـ data؛ وتختلف الحقول الاختيارية. تُحذف جميع الحقول الاختيارية عندما تكون فارغة.
local_post.created
سبب الإطلاق: إنشاء عنصر منشور وإضافته إلى قائمة الانتظار لإرساله إلى Google. لم يُنشر بعد.
{ "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
سبب الإطلاق: قبول Google للمنشور وإتاحته للجمهور.
{ "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
سبب الإطلاق: رفض Google للمنشور، أو فشل إرساله.
{ "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
سبب الإطلاق: حذف عنصر المنشور.
{ "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
النشر على وسائل التواصل الاجتماعي على مستوى العلامة التجارية ودورة حياة الاتصالات، إلى جانب نقاط نهاية Social. تسعة أحداث: خمسة للمنشورات وأربعة للاتصالات.
يوجد account_id وtimestamp كالمعتاد. المعرّفات داخل data هي معرّفات UUID البسيطة نفسها التي تستخدمها واجهة REST API، وتُرسل كسلاسل نصية.
social_post.created
سبب الإطلاق: إنشاء منشور على وسائل التواصل الاجتماعي. عند الإنشاء فقط — لا يؤدي تعديل منشور موجود إلى إصدار الحدث مجددًا.
{ "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
سبب الإطلاق: نشر المنشور بالكامل. يُصدر هذا الحدث فقط عند النجاح الكامل: نُشر المنشور على قناة واحدة على الأقل، ولم يحدث أي خطأ في أي قناة. لا يؤدي النشر الجزئي إلى إصداره — بل يُصدر في هذه الحالة social_post.failed.
{ "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
سبب الإطلاق: فشل النشر. هذا فشل في التسليم، وهو مختلف عن الرفض التحريري. يُطلق عند آخر محاولة لإعادة المحاولة، لذا لا يُصدر ما دامت هناك محاولات متبقية للمنشور.
يحتوي items على القنوات التي حدثت فيها أخطاء فقط، لذا يصل هنا المنشور الذي نُشر على منصتين وفشل على ثالثة بعنصر واحد.
{ "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
سبب الإطلاق: رفض المنشور ضمن سير عمل للموافقة. هذا رفض تحريري، وليس فشلًا في التسليم: لم يصل المنشور إلى أي منصة.
{ "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
سبب الإطلاق: أرشفة المنشور، سواء عبر POST /social/posts/cancel أو من خلال عملية الأرشفة الدورية المجدولة. لا يُطلق إلا عند حدوث انتقال فعلي في الحالة، لذا لا تؤدي إعادة أرشفة منشور مؤرشف بالفعل إلى إصدار أي حدث.
{ "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
سبب الإطلاق: تنشيط قناة للعلامة التجارية، سواء عند اتصالها لأول مرة أو عند إعادة اتصال قناة كانت مؤرشفة. يميّز is_reconnect بين الحالتين.
{ "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
سبب الإطلاق: إزالة القناة عمدًا باستخدام استدعاء قطع الاتصال. لا يُصدر إلا عندما تُؤرشف القناة بالفعل، لذا لا تؤدي محاولة قطع اتصال فاشلة إلى إصدار حدث غير صحيح.
{ "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
سبب الإطلاق: فقدان الاتصال بالقناة دون قصد — أبطلت المنصة رمز الوصول، أو اكتشفت عملية مطابقة الحالة أنه لم يعد من الممكن الوصول إلى القناة. لم يطلب أحد ذلك، وهذا ما يميّزه عن 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." }}تحليلات التقييمات
ملخصات مجدولة للتقييمات، بواقع حدث واحد لكل موقع في كل فترة.
يشترك الحدثان في بنية data واحدة:
لا يصدر الموقع الذي لم يشهد نشاطًا خلال الفترة أي حدث، لكن النتيجة نفسها تحدث عندما لا تصل لقطة الموقع. غياب اللقطة لا يحدد السبب، وفي هذه الفئة يكون التفسير الذي لا يشير إلى مشكلة هو الأقل احتمالًا. فقد يعني ذلك: عدم وجود نشاط؛ أو فشل التسليم أو انتهاء مهلته (توجد محاولة واحدة دون إعادة محاولة)؛ أو منع التسليم لأن الحساب لا يملك صلاحية استخدام webhooks، أو لم يُضبط له عنوان URL، أو لم يتم التحقق منه أو كان محظورًا؛ أو، وهو الأرجح هنا، إسقاط الحد الأقصى لكل دقيقة جزءًا من الدفعة بوصفه rate_limited.
لا تسجّل قيمة صفر مطلقًا استنادًا إلى غياب اللقطة. طابق البيانات مع GET /locations/{locationId}/review-analytics-overview للفترة نفسها، وإذا فشلت عملية القراءة هذه أيضًا، فأبلغ بأن بيانات الفترة غير متاحة بدلًا من تسجيلها بقيمة صفر.
review_analytics.daily_snapshot
المُشغِّل: مهمة إعداد الملخص اليومي، مرة واحدة لكل موقع في اليوم.
{ "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
المُشغِّل: مهمة إعداد الملخص الأسبوعي، مرة واحدة لكل موقع في الأسبوع. يشير period إلى اليوم الأول من الأسبوع الذي يجري تلخيصه.
{ "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 }}أحداث قد تتلقاها ولكن ينبغي ألا تعتمد عليها في التطوير
تُصدر المنصة فئات أخرى من الأحداث: حملات التقييمات، والترتيب، وترويج منشورات التواصل الاجتماعي، وتغييرات حالة حسابات الإعلانات على منصات التواصل الاجتماعي، وأفكار المنشورات بالذكاء الاصطناعي، وملكية Google Business Profile. لا توجد لها نقطة نهاية REST منشورة في Listings API، وهي غير موثّقة هنا، ولا تشمل بُناها أي ضمانات للتوافق. نظرًا إلى وجود عنوان URL واحد وعدم وجود اشتراك منفصل لكل حدث، ينبغي أن يتجاهل المعالج لديك أي event لا يتعرف عليه، وأن يعيد 200 رغم ذلك.