/api/v4/listings/scansإنشاء listings scan
يبدأ تدقيقًا في كيفية إدراج أي نشاط تجاري عبر شبكة الأدلة، ويعيد الفحص فورًا لتتمكن من انتظار webhook اكتماله.
المعلمات
النص الأساسي
| الاسم | النوع | مطلوب | الوصف |
|---|---|---|---|
| input | object | مطلوب | Wrapper object. The entire request body must be nested under `input`. |
| input.name | string | مطلوب | Business name, up to 150 characters. |
| input.street | string | مطلوب | Street address, up to 200 characters. |
| input.city | string | مطلوب | City, up to 100 characters. |
| input.stateIso | string | اختياري | State or province code, up to 50 characters. Required for every country except `GB`. |
| input.postalCode | string | اختياري | Postal code, up to 20 characters. Required for every country except `NG` and `AE`. |
| input.countryIso | string | مطلوب | Two-letter ISO 3166-1 country code, for example `US`. |
| input.phone | string | مطلوب | Business phone number with 6 to 15 digits. Local formats are read in the context of `countryIso`, and an international format with a leading `+` works too. |
مثال على الطلب
نص جاهز للصق. استبدل المعرّفات والقيم النموذجية بقيمك.
{ "input": { "name": "Franklin Barbecue", "street": "900 E 11th St", "city": "Austin", "stateIso": "TX", "postalCode": "78702", "countryIso": "US", "phone": "+15126531187" }}الاستجابات
200The scan was accepted and is `QUEUED`. `reused` is `false` and `results` is empty until directories are checked. Wait for the `listing_scan.completed` webhook, or poll the scan.
{ "data": { "createListingScan": { "reused": false, "scan": { "id": "TGlzdGluZ1NjYW46N2MxZTRmNTItOWEzYi00ZDY4LWIwZTEtNWYyYThjOWQzZTQ3", "status": "QUEUED", "source": "DIRECTORY_SEARCH", "locationId": null, "resultsAsOf": null, "createdAt": "2026-11-05T07:00:41Z", "startedAt": null, "completedAt": null, "business": { "name": "Franklin Barbecue", "street": "900 E 11th St", "city": "Austin", "stateIso": "TX", "postalCode": "78702", "countryIso": "US", "phone": "+15126531187" }, "summary": { "total": 0, "found": 0, "accurate": 0, "inaccurate": 0, "notFound": 0, "pending": 0, "unavailable": 0 }, "failure": null, "results": [] }, "quota": { "limit": 50, "used": 6, "remaining": 44, "resetsAt": "2026-11-23T12:38:03Z" }, "errors": [] } }}200The request was rejected, so **no scan was created**. The error is reported in `errors[]` on an `HTTP 200`, `scan` is `null`, and `quota` still returns the current allowance. This example is a phone number with too few digits.
{ "data": { "createListingScan": { "reused": false, "scan": null, "quota": { "limit": 50, "used": 5, "remaining": 45, "resetsAt": "2026-11-23T12:38:03Z" }, "errors": [ { "code": "SY83003", "message": "SY83003: Invalid value for phone", "contextInfo": [ { "key": "field", "value": "phone" } ] } ] } }}400A read-only key was used on this write (`SY90016`). Use a Write key.
401Unauthenticated, missing or invalid API key.
429Rate limit exceeded. Retry after the `Retry-After` header value.
يبدأ فحصًا لنشاط تجاري واحد. يتحقق الفحص من وجود إدراج النشاط التجاري ومدى دقته عبر شبكة الأدلة: الخرائط ومحركات البحث مثل Google وBing وApple Maps وYelp وFacebook وMapQuest، ومجمّعات البيانات والأدلة المحلية، ومساعدي الذكاء الاصطناعي مثل ChatGPT وGemini. بحسب البلد، يتحقق الفحص من نحو 60 دليلًا كحد أقصى. لا يلزم أن يكون النشاط التجاري موقعًا في حسابك، لذا يمكنك تدقيق بيانات نشاط تجاري لعميل محتمل أو لعميل قبل إعداده للاستخدام.
يعيد الاستدعاء النتيجة فورًا ويكون الفحص في حالة QUEUED. تُجرى عمليات التحقق من الأدلة في الخلفية، وتُقرأ النتيجة باستخدام GET /listings/scans/{scanId}.
حالة استخدام: تدقيق إدراجات نشاط تجاري لعميل محتمل. تجمع أداة المبيعات لديك اسم النشاط التجاري وعنوانه ورقم هاتفه. أنشئ فحصًا، واحفظ scan.id المُعاد، واقرأ الفحص المكتمل من data.scan عند وصول الحدث listing_scan.completed. يوفر summary الملخص (عدد الأدلة التي عثرت على النشاط التجاري، وعدد الأدلة التي كانت بياناته فيها دقيقة)، ويوفر results[] التفاصيل الخاصة بكل دليل لعرضها في التقرير.
حالة استخدام: التحقق من حالة نشاط تجاري تديره بالفعل. افحص بيانات النشاط التجاري لأحد مواقعك. يتعرف الفحص عليه ويُنشئ نتائجه من إدراجات النشاط التجاري الفعلية لذلك الموقع بدلًا من البحث مجددًا (انظر إعادة الاستخدام والفحوص المجانية).
كيف ينتهي الفحص
يمر الفحص بالحالتين QUEUED وIN_PROGRESS، ثم ينتهي بالحالة COMPLETED أو FAILED. تكتمل معظم الفحوص خلال 1 إلى 7 دقائق. إذا لم يستجب أحد الأدلة بعد نحو 15 دقيقة، تُضبط نتيجته على UNAVAILABLE ويكتمل الفحص بالنتائج الأخرى.
- يُفضّل استخدام webhook. يُرسل كل من الحدثين
listing_scan.completedوlisting_scan.failedمرة واحدة لكل فحص، مع كائن الفحص نفسه الذي يعيدهGET /listings/scans/{scanId}، بما في ذلك النتائج. تُرسل هذه الأحداث إلى الحسابات التي فعّلت webhooks ولديها عنوان URL لـ webhook تم التحقق منه، وتُوقّع مثل سائر الأحداث. انظرlisting_scan.completed. - استخدم الاستعلام الدوري كخيار بديل. إذا لم تتمكن من استقبال webhooks، فاقرأ الفحص كل 15 ثانية حتى تصبح قيمة
statusهيCOMPLETEDأوFAILED. لا يحقق الاستعلام بمعدل أسرع أي فائدة، ويستهلك حصتك من الطلبات.
الحقول المطلوبة
الحقول name وstreet وcity وcountryIso وphone مطلوبة دائمًا. يعتمد اشتراط حقلين على البلد:
إذا كانت القيمة مفقودة أو بتنسيق غير صحيح، يُرفض الطلب مع SY83003، ويذكر الخطأ اسم الحقل. يجب أن يتكون phone من 6 إلى 15 رقمًا، وأن يتكون countryIso من حرفين.
إعادة الاستخدام والفحوص المجانية
لا يُجري الفحص بحثًا جديدًا دائمًا. يوضح الحقل source في الفحص المُعاد مصدر نتائجه:
إذا فحصت النشاط التجاري نفسه مجددًا خلال 7 أيام، يُعاد الفحص الموجود في حسابك بدلًا من إنشاء فحص جديد، مع reused: true في الاستجابة. لا يبدأ فحص جديد ولا يُرسل webhook جديد، لذا اقرأ الفحص المُعاد (فقد يكون قيد التنفيذ) بدلًا من انتظار حدث آخر. وينطبق السلوك نفسه عند فحص أحد مواقعك مجددًا خلال فترة إعادة الاستخدام.
الحصة الشهرية
تشمل الخطط المدفوعة Listings scans ضمن حصة شهرية تعتمد على خطتك. وهي غير متاحة مع تصريح ليوم واحد مجاني للبيئة التجريبية. لا يُحتسب ضمن الحصة إلا فحص DIRECTORY_SEARCH جديد. الحالات التالية مجانية:
- تكرار الفحص للنشاط التجاري نفسه خلال 7 أيام (
reused: true)، - نسخة
RECENT_SCAN، - فحص
LOCATION_LISTINGS، - فحص يفشل، إذ لا يُحتسب.
تُجدَّد الحصة مع بداية فترة الفوترة لحسابك. تتضمن كل استجابة لطلب إنشاء quota مع limit وused وremaining وresetsAt، حتى عند رفض الطلب. راجع الخطط والإضافات.
الأخطاء
عند رفض طلب إنشاء، تُعاد استجابة HTTP 200 تتضمن scan: null وسبب الرفض في errors[]، لذا تحقّق من errors ولا تكتفِ برمز الحالة. لا يمكن للمفاتيح المخصصة للقراءة فقط إنشاء فحوص: وهذه هي حالة الفشل الوحيدة على مستوى الطلب، وتُعاد فيها استجابة HTTP 400 مع SY90016.
تتوفر القائمة الكاملة للرموز في رموز الأخطاء.
ملاحظات.
- يجب تغليف جسم الطلب داخل كائن
input. - تحقّق من
errors، وليس من حالة HTTP. يُعاد طلب الإنشاء المرفوض باستجابةHTTP 200. - تُوحَّد صيغة أرقام الهواتف قبل تشغيل الفحص، ويُعدّ الطلبان اللذان يختلفان فقط في التنسيق أو حالة الأحرف أو المسافات متعلقين بالنشاط التجاري نفسه.
- يُحتسب كل طلب إنشاء طلبًا واحدًا ضمن حد معدل الطلبات، مهما كان عدد الأدلة التي يتحقق منها الفحص.
- يُحتفظ بالفحص لمدة 90 يومًا. بعد ذلك، تُعيد قراءته استجابة
404معSY83005. - يتطلب هذا الاستدعاء مفتاحًا بصلاحية Write (الكتابة).
curl -X POST 'https://listingsapi.com/api/v4/listings/scans' \ -H "Authorization: API $LISTINGSAPI_KEY" \ -H 'Content-Type: application/json' \ -d '{ "input": { "name": "Franklin Barbecue", "street": "900 E 11th St", "city": "Austin", "stateIso": "TX", "postalCode": "78702", "countryIso": "US", "phone": "+15126531187" } }'