دليل الناشر
انشر منتجاتك
النشر إلى prodid يعني وضع ملفين على الويب وسجل واحد في DNS. على نطاقك الخاص لا تسجيل ولا مفتاح تحفظه: النطاق نفسه هو بيانات الاعتماد، وتغيير الملفات يغيّر ما نشرته أو يسحبه.
كيف ستنشر؟
الهوية منفصلة عن الاستضافة. هويتك نطاق تتحكم فيه؛ ومكان وجود المستندات فعلًا تفصيلٌ يمكنك تغييره لاحقًا دون أن تتغير هويتك أو أي معرّف منحه prodid لمنتجاتك. ثلاث طرق، والسجلات متطابقة.
الطريقة 1
تستطيع تقديم الملفات على نطاقك.
قدّم مستند الاكتشاف على النطاق، وانشر سجل TXT يسمّي النطاق نفسه.
- الهوية
- النطاق
- الثقة
- verified
الطريقة 2
لديك نطاق لكن لا تستطيع تقديم الملفات عليه.
انشر على slug مستضاف، ووجّه سجل TXT على نطاقك إلى ذلك المضيف.
- الهوية
- النطاق، مُثبتًا عبر DNS
- الثقة
- verified
الطريقة 3
ليس لديك نطاق على الإطلاق.
انشر على slug مستضاف. إضافة نطاق لاحقًا لا تُفقدك شيئًا.
- الهوية
- مضيف الـ slug
- الثقة
- unverified
الطريقتان 2 و3 تستخدمان الناشر المستضاف على <slug>.prodid.org. سجّل الدخول إلى publish.prodid.org برابط يصل إلى بريدك، وأنشئ موقعك، وارفع ملفك، واربط نطاقك إن كان لديك نطاق. يمكنك من هناك تصدير كل شيء أو حذف الموقع في أي وقت.
الطريقة 1
النشر على نطاقك الخاص
ملفان وسجل DNS واحد. المنصة التي تنشر نيابة عن التجار تفعل الشيء نفسه على نطاق كل تاجر، فيحتفظ كل تاجر بهويته ومستوى ثقته.
قدّم مستند الاكتشاف
ملف واحد في مسار ثابت يسرد أماكن موجزات منتجاتك:
https://acme.example/.well-known/prodid.json.well-known/prodid.jsonapplication/json{ "$type": "org.prodid.feed", "version": 1, "publisher": { "name": "Acme Tekstil", "contact": "data@acme.example" }, "license": "CC0-1.0", "feeds": ["https://acme.example/prodid/items.ndjson"] }المثال الموجود في spec/fixtures/v1/examples/prodid.json، معروضًا من ذلك الملف مباشرة. $typeمطلوب: نعم- دائمًا org.prodid.feed.
versionمطلوب: نعم- 1. المستند بالقيمة 0 يُقبل في عمليات الجلب التي تبدأ قبل 2027-01-26 00:00 UTC، ويُرفض بعدها رفضًا صريحًا.
publisher.nameمطلوب: نعم- الاسم الذي ينبغي أن يراه الناس بجانب ادعاءاتك.
publisher.contactمطلوب: لا- بريد يقرؤه أحد فعلًا. يكتب الفهرس إليه حين يدخل مصدرك في lapse؛ وهو التنبيه الوحيد الذي تتلقاه.
licenseمطلوب: نعم- معرّف SPDX يغطي المعلومات في موجزاتك، مثل CC0-1.0.
feedsمطلوب: نعم- حتى 100 عنوان https، كلها على مضيف هذا المستند نفسه.
domainمطلوب: عند التفويض- النطاق الذي يمثله هذا المستند. مطلوب، ويجب أن يساويه، كلما وُجد المستند عبر سجل TXT يسمّي مضيفًا آخر. اختياري حين يقدّمه النطاق نفسه، لكن يجب أن يتطابق إن وُجد.
قدّمه عبر HTTPS على المنفذ الافتراضي بشهادة صالحة، بنوع
application/jsonأو أيapplication/…+json. لا تعِد التوجيه إلى مضيف آخر: الزاحف يتبع إعادة توجيه من نوع واحد فقط، منacme.exampleإلىwww.acme.example.قدّم موجزك
الموجز بصيغة NDJSON: كائن JSON كامل في كل سطر، بترميز UTF-8، مفصولًا بأسطر جديدة. لا مصفوفة حوله ولا فواصل بين الأسطر. بهذا يمكن قراءة موجز فيه مليونا منتج سطرًا سطرًا، والسطر المعطوب يُفقد ذلك السطر فقط لا ما بعده.
prodid/items.ndjsonapplication/x-ndjson{"$type":"org.prodid.item","key":"TJ-2041-NVY-M","brand":"Acme","name":"Trail Jacket","lang":"en","group":"TJ-2041","variant":{"color":"navy","size":"M"},"identifiers":[{"scheme":"gtin","value":"09506000134352"},{"scheme":"mpn","value":"TJ-2041-NVY-M"}],"markets":["TR","DE"],"properties":{"material":"100% recycled polyester","madeIn":"TR","weight":{"value":480,"unit":"g"}},"media":[{"url":"https://acme.example/img/tj2041-navy.webp","license":"CC-BY-4.0","kind":"image"}]} {"$type":"org.prodid.item","key":"TJ-2041-NVY-L","brand":"Acme","name":"Trail Jacket","lang":"en","group":"TJ-2041","variant":{"color":"navy","size":"L"},"identifiers":[{"scheme":"gtin","value":"09506000134406"},{"scheme":"mpn","value":"TJ-2041-NVY-L"}],"markets":["TR","DE"],"properties":{"material":"100% recycled polyester","madeIn":"TR","weight":{"value":505,"unit":"g"}},"media":[{"url":"https://acme.example/img/tj2041-navy.webp","license":"CC-BY-4.0","kind":"image"}]} {"$type":"org.prodid.item","key":"TJ-2041-OLV-M","brand":"Acme","name":"Trail Jacket","lang":"en","group":"TJ-2041","variant":{"color":"olive","size":"M"},"identifiers":[{"scheme":"gtin","value":"09506000134413"},{"scheme":"mpn","value":"TJ-2041-OLV-M"}],"markets":["TR"],"properties":{"material":"100% recycled polyester","madeIn":"TR","weight":{"value":480,"unit":"g"}},"media":[{"url":"https://acme.example/img/tj2041-olive.webp","license":"CC-BY-4.0","kind":"image"}]}ثلاثة متغيّرات لمنتج واحد من spec/fixtures/v1/examples/items.ndjson. تشترك في group واحد، فيبني الفهرس منه عائلة واحدة بثلاثة متغيّرات. يجب أن تكون الموجزات على مضيف المستند الذي يسردها نفسه. مستند الاكتشاف الذي يسرد موجزًا على مضيف آخر يُرفض كله لا جزئيًا: تخسر المصدر كله لا موجزًا واحدًا، ويُعدّ ذلك رفضًا صريحًا يبدأ عدّاد الـ lapse الموصوف أدناه. تقديم JSON من موقعك وNDJSON من اسم مضيف منفصل لشبكة CDN طلب شائع، لكن v1 لا يدعمه. ضع الاثنين على المضيف نفسه.
السطر الأول منها، منسّقًا ليسهل قراؤه:
سجل org.prodid.item واحد{ "$type": "org.prodid.item", "key": "TJ-2041-NVY-M", "brand": "Acme", "name": "Trail Jacket", "lang": "en", "group": "TJ-2041", "variant": { "color": "navy", "size": "M" }, "identifiers": [ { "scheme": "gtin", "value": "09506000134352" }, { "scheme": "mpn", "value": "TJ-2041-NVY-M" } ], "markets": ["TR", "DE"], "properties": { "material": "100% recycled polyester", "madeIn": "TR", "weight": { "value": 480, "unit": "g" } }, "media": [{ "url": "https://acme.example/img/tj2041-navy.webp", "license": "CC-BY-4.0", "kind": "image" }] }$typeمطلوب: نعم- دائمًا org.prodid.item.
keyمطلوب: نعم- اسم ثابت لهذا السجل داخل موجزك. نشر key نفسه مرة أخرى يستبدله.
brandمطلوب: نعم- العلامة التجارية كما تظهر على المنتج. تُطبَّع قبل أن تحدد نطاق mpn، فـ ARÇELİK وArçelik علامة واحدة لا اثنتان.
nameمطلوب: نعم- اسم المنتج، دون أبعاد المتغيّر.
identifiersمطلوب: نعم- { scheme, value } واحد على الأقل، وواحد على الأقل منها يستطيع الفهرس حفظه. القيم بلا مسافات في طرفيها وغير فارغة. يجب أن يكون gtin من 8 أو 12 أو 13 أو 14 رقمًا برقم تحقق صحيح وليس كله أصفارًا؛ ويحتاج mpn إلى brand يبقى منه شيء بعد التطبيع، لأنه فريد ضمن نطاقها فقط؛ وgtin مقيّد التداول يُحفظ، لكن بوصفه rcn خاصًا بك فقط. السجل الذي لا يبقى فيه شيء قابل للحفظ لا يعرّف شيئًا ويُتخطّى.
langمطلوب: لا- وسم BCP 47 للنص المقروء في هذا السجل.
groupمطلوب: لا- مفتاح التجميع الخاص بك. العناصر التي تشترك في القيمة نفسها متغيّرات لعائلة واحدة.
variantمطلوب: لا- الأبعاد التي تميّز هذا العنصر داخل مجموعته: اللون والمقاس والسعة.
categoryمطلوب: لا- رمز GS1 GPC brick، بصيغة gpc: يليها ثمانية أرقام.
marketsمطلوب: لا- رموز ISO 3166-1 alpha-2 للأسواق التي يُباع فيها العنصر.
propertiesمطلوب: لا- نص أو رقم أو قيمة منطقية أو قائمة، أو { value, unit } للقياس.
mediaمطلوب: لا- حتى 20 عنوان https، لكل منها kind وترخيص SPDX من القائمة المقبولة. على خلاف الموجزات، يمكن أن تكون على أي مضيف.
أرسل عناصر مسطّحة. لا تبني العائلات أو المتغيّرات بنفسك أبدًا، ولا ترسل
opidأبدًا: الأولى يستنتجها الفهرس منgroup، والثاني يمنحه الفهرس. إن كنت تولّد موجز Google Merchant أصلًا، فـgroupهوitem_group_idلديك.أمران عن الباركود يستحقان المعرفة قبل التصدير. الـ
gtinالمكوَّن كله من أصفار ليس باركودًا بل عنصرًا نائبًا في كتالوج، والسجل الذي يحمله يُرفض كما يُرفض رقم تحقق خاطئ. أما رمز التداول المقيّد، أي النطاقات المخصصة للاستخدام داخل المتجر، فيُحفظ ويُنسب إليك، لكنه لا يعرّف شيئًا عالميًا، فلا يدمج منتجك أبدًا مع منتج غيرك، ولا يحلّه/01/.اطالب بهويتك في DNS
بعد أن تصبح الملفات متاحة، انشر سجلًا يسمّي نطاقك نفسه مضيفًا.
_prodid.acme.example TXT_prodid.acme.example. IN TXT "v=prodid0; host=acme.example"يشير إلى المكان الذي كان الاكتشاف سيجده على أي حال، فلا يتغير شيء في بياناتك. ما يتغير هو ما يستطيع فعله شخص لا يملك سوى صلاحية إضافة سجل DNS. دون سجلك، يستولي سجلٌ يضيفه على هويتك بصمت، لأن DNS يتقدم على الملف. ومع وجود سجلك، يجعل السجل الثاني الاكتشاف يفشل بخطأ أكثر من سجل: وهذا lapse، ظاهر ومُبلَّغ عنه وقابل للاسترداد.
لا تفوّض
_prodidإلى مزوّد أبدًا. صلاحية الكتابة على_prodid.<domain>هي التحكم في هويتك، تمامًا كما في التحقق عبر DKIM أو ACME DNS-01. النطاق الذي يُشارَك DNS الخاص به تُشارَك هويته. أعطِ وكالتك الموجز، لا السجل.انشر الملفات أولًا ثم أضف السجل، لا العكس: السجل الذي يشير إلى مستند غير موجود بعد هو اكتشاف فاشل. القيمة تُقرأ دون تمييز بين الأحرف الكبيرة والصغيرة، ولا بأس بنقطة في آخرها، فـ
ACME.Example.وacme.exampleمضيف واحد.أخبر الفهرس بأن شيئًا تغيّر
اختياري. كل نطاق معروف يُعاد جلبه وفق جدول؛ والـ ping لا يفعل سوى تقديم الجلب التالي.
اطلب من الفهرس تشغيل الاكتشاف الآنcurl -X POST https://prodid.org/ping \ -H 'content-type: application/json' \ -d '{"domain": "acme.example"}' HTTP/1.1 202 Accepted Content-Type: application/json {"status":"accepted"}يقبل
{"domains": [...]}حتى 1000 نطاق دفعة واحدة، وبه تعرّف المنصة بكل تاجر تستضيفه. لا سرّ ترسله، لأن الـ ping لا يمنح المتصل أي تأثير في المحتوى، ولا يجيب إلا بـ202. لا يخبرك هل النطاق معروف، ولا هل وُجد شيء، ولا هل أرسل أحد غيرك ping له قبل دقيقة. الرمز429يعني فقط أنك تجاوزت حصتك من الطلبات، والأخطاء تأتي بصيغةapplication/problem+json. ما حدث لنطاقك يظهر في حالة مصدرك، لا في استجابة الـ ping.
الطريقة 2
فوّض الاستضافة واحتفظ بهويتك
كثير من الشركات المصنّعة تملك نطاقًا لكنها لا تستطيع وضع ملفات عليه. الموجز مستضاف في مكان آخر والنطاق مُثبت عبر DNS، فتبقى هوية المصدر هي النطاق وتبقى الثقة verified. أنشئ الموقع على publish.prodid.org وأدخل نطاقك، فيعرض لك السجل الدقيق الذي تضيفه ويتحقق منه نيابة عنك.
كيف يبدو ذلك
ارفع ملفاتك إلى دليل slug مستضاف
، مثل
acme.prodid.org، الذي يقدّم مستند الاكتشاف والموجز معًا.سجل TXT على النطاق الذي تملكه
يسمّي ذلك المضيف. مضيف لا عنوان URL، فلا يستطيع السجل أبدًا توجيه الزاحف إلى عنوان اعتباطي.
_prodid.acme.example TXT_prodid.acme.example. IN TXT "v=prodid0; host=acme.prodid.org"مستند يشير إلى نطاقك.
يقول DNS: «مستندي هناك»؛ ويقول المستند: «أنا أمثّل ذلك النطاق». المستند المفوَّض بلا
domainيُرفض: الغياب لا يُعدّ موافقة أبدًا، وهذا ما يمنع أي أحد من توجيه سجل إلى موجز غيره.acme.prodid.org/.well-known/prodid.jsonapplication/json{ "$type": "org.prodid.feed", "version": 1, "domain": "acme.example", "publisher": { "name": "Acme Tekstil", "contact": "data@acme.example" }, "license": "CC0-1.0", "feeds": ["https://acme.prodid.org/feeds/items.ndjson"] }من spec/fixtures/v1/examples/prodid.delegated.json. الفرق الوحيد عن الطريقة 1 هو حقل domain، وهو هنا مطلوب. أنشئ موقعك
لا يكتب الناشر المستضاف
domainفي المستند إلا بعد أن يرى سجل TXT الخاص بك بنفسه، فلا توجد فترة يدّعي فيها مستند نطاقًا لم يطلب ذلك.
الطريقة 3
النشر دون نطاق
أنشئ موقعك
المنتج الذي لا يملك نطاقًا على الإطلاق ينشر باسمه على slug مستضاف
<slug>.prodid.org. اطلبه على publish.prodid.org. هوية المصدر هي مضيف الـ slug، والثقةunverifiedلأنه لم يُثبت شيء عن أي نطاق. السجلات سجلات حقيقية: معرّفات وحلّ ونسبة إلى المصدر، كاملة.معظم الناشرين في هذا الوضع لديهم أصلًا ملف منتجات Google Merchant، لذلك تحدد المواصفة الربط من ذلك الملف إلى سجلات
org.prodid.itemعمودًا عمودًا، ومعه ما تتركه عمدًا: السعر والتوفر والشحن والحالة تخص بائعًا في يوم ما، لا المنتج. يستحق استيراد موجز Merchant القراءة قبل التصدير: يحوّل publish.prodid.org ملف CSV أو TSV الذي ترفعه وفق هذا الربط تحديدًا. وأربع نقاط فيه تحدد شكل جدولك:- أربعة أعمدة تصبح أبعاد المتغيّر:
colorوsizeوmaterialوpattern، أي ما يختار بينه المشتري داخلitem_group_idواحد. أماgenderوage_groupوsize_typeوsize_systemفتبقى سمات عادية: إنها تصف المجموعة كلها، ولو كانت أبعادًا لانقسم المنتج الواحد إلى عدة منتجات كلما كتب أحد واحدةً منها بطريقتين. - الفواصل أم الترويسات المكررة للسمات المتكررة يُحسم لكل ملف، لا لكل خلية. لا تُقسَّم الخلية عند الفواصل إلا إذا ظهرت ترويسة عمودها مرة واحدة في الملف؛ وإذا كررت الترويسة، تُقرأ كل خلية تحتها كاملة. هذه هي الطريقة الوحيدة لنقل قيمة فيها فاصلة، والقرار يُتخذ مرة واحدة للملف كله. ينطبق ذلك على
additional_image_linkوproduct_typeوproduct_highlightوproduct_detailوcertification؛ وكل ما عداها، ومنهdescriptionالمليء بالفواصل، يُقرأ كاملًا في الحالتين. product_detailلا يستبدل شيئًا أبدًا. تصبح السمة الفرعية في وسطه مفتاح السمة، ويُتخلى عن اسم القسم، وأول قيمة لكل مفتاح هي التي تُعتمد. التفصيل اللاحق بالمفتاح نفسه، أو الذي يقع على مفتاح أنتجه الربط مسبقًا، يُسقط ويُبلَّغ عنه مع سطره، فلا يستطيع عمود التفاصيل أبدًا أن يغيّر بصمت ما قاله باقي السطر.- يجب التصريح بترخيص الوسائط. لا عمود له في صيغة Merchant، ولا يُستوعب شيء دون ترخيص، لذا يصرّح الاستيراد بمعرّف SPDX واحد مقبول يغطي كل الصور والمستندات في الملف. عمود
licenseالخاص بك يتجاوزه سطرًا سطرًا؛ والملف الذي يكون ترخيصه المصرّح به غير مقبول ينتج سجلات بلا وسائط، لا سجلات فاشلة.
الأسطر التي لا يمكن أن تصبح سجلات (لا معرّف صالح، أو رقم تحقق GTIN خاطئ) تُتخطّى ويُبلَّغ عنها برقم سطرها في الجدول، والترويسة هي السطر 1، فالسطر المعطوب يُفقد ذلك السطر فقط لا الاستيراد كله. في /spec/fixtures/merchant مثال كامل للمقارنة: ملف CSV، والسجلات التي يجب أن ينتجها، والسطر الذي يجب أن يُتخطّى.
المهم لقرار اليوم هو ما يحدث لاحقًا. أضف سجل TXT يسمّي المضيف نفسه على نطاق تحصل عليه لاحقًا، فيصبح الـ slug ذلك النطاق في الجلب التالي: المصدر نفسه، والسجلات نفسها، وكل
opidمحفوظ، وترتفع الثقة منunverifiedإلىverified. معرّفاتskuالخاصة بك مرتبطة بالمصدر نفسه لا باسمه، فتبقى صالحة بعد الانتقال. على publish.prodid.org، هو حقل النطاق نفسه الذي في الطريقة 2.- أربعة أعمدة تصبح أبعاد المتغيّر:
تحقّق من نطاقك
انتهيت من النشر؟ أدخل نطاقك. يُطلب من الفهرس أن يفحصه الآن، وتنتقل إلى صفحة حالته الحيّة.
قبل الإطلاق
افحص ملفاتك قبل الـ ping
يتحقق prodid-batch check من مستند الاكتشاف وكل موجز تمامًا كما يفعل الفهرس، دون رمز وصول ودون أن يسأل الفهرس عن شيء. يعمل من نسخة من المستودع باستخدام Bun 1.4.4. أعطه الملفات نفسها: المسار المنتهي بـ .json يُقرأ مستندًا واحدًا، وأي مسار آخر يُقرأ موجز NDJSON.
git clone https://github.com/productdevbook/prodid
cd prodid
bun install --frozen-lockfile
curl -fsSo prodid.json https://acme.example/.well-known/prodid.json
curl -fsSo items.ndjson https://acme.example/prodid/items.ndjson
bun apps/batch/src/cli.ts check prodid.json items.ndjson
prodid.json: ok, 1 record
items.ndjson: ok, 3 recordsالملف السليم يطبع ok وعدد السجلات التي سيأخذها الفهرس منه. وإلا فيطبع سطرًا لكل مشكلة، بصيغة items.ndjson:12: message مع رقم سطر الموجز، وينتهي بحالة خروج غير صفرية. يقرأ الملفات، لا DNS ولا خادمك، فسجل TXT ونوع المحتوى وترويسات التخزين المؤقت في القائمة أعلاه تبقى عليك.
القواعد التي تُتحقق بها السجلات موجودة في المواصفة، والمخططات في /spec/schemas/v1، ومتجهات اختبار يقرؤها الحاسوب في /spec/fixtures/v1 لاختبار أداة التصدير لديك قبل أن يجلب أي أحد.
تُنشر المواصفة بالإنجليزية فقط، والنص الإنجليزي هو المرجع المُلزم.
الوضع الحالي: Spec v1. يعمل الفهرس والناشر المستضاف على prodid.org. يمكن لأي أحد أن ينشر، من نطاقه الخاص أو عبر الاستضافة. صيغ الملفات الموصوفة هنا هي ما يقرؤه الفهرس حين ترسل له ping.
مرجع
من المفيد أن تعرف هذا أولًا، لأنه يحدد أي الطرق الثلاث أدناه تناسبك. يبدأ الاكتشاف من DNS في كل جلب، ولا يتذكر أي مسار إلى بياناتك بين جلب وآخر.
أولًا
سجل DNS TXT على
_prodid.acme.exampleإن وُجد هناك سجل
v=prodid0فهو وحده المتّبع، حتى لو أشار إلى نطاقك نفسه. يحدد السجل host؛ والمستند دائمًا فيhttps://<host>/.well-known/prodid.json.فقط إن لم يوجد مثل هذا السجل
https://acme.example/.well-known/prodid.jsonالمستند على النطاق نفسه. من يقدّم النطاق عبر HTTPS يتحدث باسمه.
يأتي DNS أولًا لأنه الإثبات الأقوى: القدرة على وضع ملف على مضيف لا تعني ملكية النطاق، ويجب أن يستطيع المالك نقض ذلك. لهذا ينبغي أن تكتب السجل حتى لو قدّمت الملفات بنفسك؛ الخطوة 3 من الطريقة 1 تشرح ما يمنحك إياه.
سجل واحد، ولا شيء خلفه. وجود أكثر من سجل v=prodid0 على الاسم نفسه خطأ، لا خيارٌ بينها؛ وكذلك سجل واحد مشوّه أو طويل جدًا. لا بديل احتياطي: ما دام هناك سجل، فالسجل المعطوب ينهي الاكتشاف بدل أن يجعل الزاحف ينظر في نطاقك. لتغيير المضيف استبدل السجل، ولا تضف سجلًا ثانيًا أبدًا. الصيغة ومتجهات الاختبار في المواصفة.
ما الذي يُعدّ استجابة. HTTP 200 بعد إعادة توجيه واحدة على الأكثر، ونوع محتوى JSON، وجسم يتحقق وفق مخطط الموجز، وdomain يسمّي النطاق المكتشف. الموقع الذي يعيد HTML بالرمز 200 لمسار مجهول ليس استجابة، ولا المستند المقدَّم بـ text/html.
الثقة صفة للمصدر، لا للادعاء. تقول ما الذي ثبت عمّن يتكلم، لا هل معلومة ما صحيحة. ومستخدمو البيانات هم من يقررون كيف يتعاملون معها.
| المستوى | المعنى |
|---|---|
| authoritative | أثبت التحكم في النطاق، ومؤكَّد مالكًا للعلامة التجارية. |
| verified | أثبت التحكم في النطاق عبر سجل TXT أو بتقديم النطاق للمستند. |
| unverified | slug مستضاف بلا نطاق، أو استيراد مجموعة بيانات، أو مساهمة مجتمعية. |
لا يمكن أن يرتفع فوق unverified إلا مصدر هويته نطاق. يأتي verified من الجلب. أما authoritative فلا، لأن أي جلب لا يستطيع إثبات من يملك علامة تجارية: يمنحه مشغّل الفهرس، وبناءً على دليل فقط.
الدليل هو بادئة شركتك في GS1.
يجب أن تحمل أرقام GTIN التي ينشرها مصدرك بتلك العلامة بادئة شركة GS1 مرخّصة للمؤسسة التي تتحكم في نطاقك، كما يبيّنها البحث العام لدى GS1، Verified by GS1. يُحفظ عنوان ذلك البحث دليلًا مع المنح.
منح واحد لكل علامة تجارية، وكل منح قابل للإلغاء.
تُسجَّل العلامة بصيغتها المطبَّعة. يمكن أن يحمل المصدر منحًا لعدة علامات، ويلغي المشغّل كلًا منها على حدة.
لا يبقى المنح أطول من الإثبات الذي يقوم عليه.
يكون مصدرك
authoritativeما دام تحكمه في النطاق مُثبتًا، وليس في حالة lapsed، ويحمل منحًا واحدًا على الأقل غير ملغى. إن فقد إثبات النطاق أو دخل في lapse، ينزل فورًا إلى ما يدعمه الإثبات المتبقي:verifiedأثناء الـ lapse، وأدنى إن ذهب إثبات النطاق أيضًا، دون أن يفعل أحد شيئًا. ويعودauthoritativeفور تحقق الشروط الثلاثة من جديد.يغطي المصدر، لا العلامة التجارية.
الثقة دائمًا صفة للمصدر: منحٌ لعلامة واحدة يجعل كل ادعاء من مصدرك
authoritative، بما في ذلك ادعاءاته عن علامات لم يُمنح لها.
لتطلبه، انشر أولًا على نطاقك، ثم اطلبه عبر نموذج الطلب مع نطاقك وعلامتك التجارية ونتيجة Verified by GS1 لأحد أرقام GTIN لتلك العلامة. يتحقق المشغّل من أرقام GTIN التي ينشرها مصدرك بتلك العلامة في Verified by GS1. الطلبات علنية.
نشر سجل بـ key موجود يستبدل السجل السابق. لا واجهة تحديث؛ فالموجز نفسه هو الحالة.
إذا اختفى key من موجز جلبه الزاحف كاملًا، توسم ادعاءاتك عنه بأنها مسحوبة. يبقى الكيان ومعرّفاته: روابط الآخرين إليه تبقى صالحة، وكذلك ادعاءات المصادر الأخرى.
حين لا يعود المستند الذي قرأه الجلب يسرد أحد عناوين موجزاتك، يُسحب فورًا كل سجل فعّال حمله ذلك الموجز، كأن كل مفاتيحه اختفت، ولا يُجلب ذلك العنوان مرة أخرى. مهلة الأيام السبعة أدناه لا تنطبق هنا: إزالة العنوان تعني أنك تقول إن الملف انتهى، والفهرس يأخذ بكلامك. أدرجه مرة أخرى لاحقًا فيعود ويُقرأ من البداية. قدّم ETag لمستندك إن استطعت: الرمز 304 يعني أن القائمة لم تتغير، فلا يُقاعَد شيء.
الأسطر التي تتجاوز 64 KiB أو لا يمكن تحليلها أو غير الصالحة تُتخطّى وتُعدّ. ولأن key السطر المتخطّى مجهول، لا يسحب الموجز الذي فيه أسطر متخطّاة شيئًا لمدة سبعة أيام. بعدها تُسحب المفاتيح الغائبة كالمعتاد. الأعداد علنية، فالموجز الذي يُسقط أسطرًا بصمت لا يبقى صامتًا.
لا ينجح الجلب إلا إذا قُرئ كل ما يسرده المستند: مستند مقبول، وكل موجز فيه أعاد 200 أو 304. انتهاء مهلة موجز واحد لا يُفقدك الموجزات الأخرى (الموجزات التي استجابت تُستوعب، والجلب الفاشل لا يسحب شيئًا)، لكن الجلب يُحسب فشلًا في النقل، ويقول feeds_failed في حالتك ذلك. لذا فالمستند السليم تمامًا الذي يحمل عنوان موجز واحدًا معطوبًا دائمًا يدخل في lapse بعدّاد الأيام السبعة نفسه الذي يدخل به نطاق توقف عن الاستجابة كليًا، ويفقد كتالوجه كله بعد ثلاثين يومًا من ذلك. احذف من المستند عنوان الموجز الذي لم تعد تقدّمه بدل أن تتركه يتعفّن.
الرفض الصريح، أي انتهاء الاكتشاف دون مستند مقبول (لا سجل ولا مستند؛ سجل مشوّه أو طويل جدًا أو مكرر؛ أو مستند ليس 200، أو ليس JSON، أو غير صالح، أو لم يعد متطابقًا في domain، أو يسرد موجزات خارج مضيفه)، يُدخل المصدر في lapse فورًا. فشل النقل (انتهاء مهلة DNS، أو 5xx، أو 429، أو بلوغ حد، على المستند أو أي موجز) لا يغيّر شيئًا وحده، لكنك تدخل في lapse أيضًا إذا انتهت كل محاولة لسبعة أيام به، فإعادة الأخطاء باستمرار لا تجمّد ادعاءاتك في مكانها.
هذا الافتراض لحسن النية يخص المضيف، لا أنت. ينطبق فقط على مضيف سبق أن تحقق مصدرك عليه. على مضيف لم يُتحقق عليه قط (slug جديد، أو مضيف وجّهت إليه _prodid للتو، وكل ما في الطريقتين 2 و3)، كل فشل، بما فيه انتهاء المهلة و5xx، رفض صريح يُدخلك في lapse فورًا. هذا مقصود: لولاه لاستطاع مصدر متحقَّق منه أن يوجّه سجله إلى مضيف لا يتحكم فيه، ويعرف هل ذلك المضيف يعمل من بدء الـ lapse اليوم أو بعد أسبوع. تغيير المضيف لا يكلّفك شيئًا بسبب ذلك. أول جلب ناجح على المضيف الجديد يمحو كل شيء، والـ lapse قابل للاسترداد دائمًا خلال الثلاثين يومًا التي تسبق سحب أي شيء.
المصدر الذي في lapse لا يقبل ادعاءات جديدة، ويظهر للقراء بأنه lapsed، ويتلقى publisher.contact الخاص به إشعارًا. الجلب لمصدر في lapse لا يكتب شيئًا حتى ينجح كاملًا؛ عندها فقط يُرفع الـ lapse. بعد 30 يومًا متواصلة من الـ lapse، تُسحب سجلاتك وادعاءاتها الفعّالة معها، وتُحفظ تاريخًا. هذه الأيام الثلاثون هي نافذة الاسترداد، ولهذا يجب أن يكون عنوان التواصل عنوانًا يقرؤه أحد.
العودة لا تحتاج إلى أي تغيير. قدّم المستند نفسه والموجزات نفسها كالمعتاد، فيُعاد تأكيد كل ما نشرته لحظة نجاح الاكتشاف، سواء غيّرت بايتًا أم لا: يتخلى الفهرس عن الطلبات الشرطية ما دام لا يحتفظ بشيء فعّال لك، فلا يصبح الملف غير المتغير سببًا لبقائك مسحوبًا أبدًا.
كل ادعاء يراه القارئ يحمل seen_at: ليس أين نُشرت المعلومة أول مرة، بل منذ متى يؤكد هذا المصدر هذه القيمة دون انقطاع. يبقى عبر كل إعادة جلب تجد القيمة نفسها، وهذا هو المقصود منه. لا يبقى بعد السحب. إذا دخل مصدرك في lapse أكثر من 30 يومًا، يبدأ تاريخ كل معلومة نشرتها من يوم عودتك، لأنه لم يكن في الفجوة أحد يمكن التحقق منه يقف وراءها. الصفوف المسحوبة تبقى، فيعرض ?history=1 الفجوة بدل أن يخفيها؛ وما يراه القراء موجود في المواصفة.
/source/acme.example هو المكان الذي تكتشف فيه المشكلات: نتيجة آخر جلب، وأي مسار سلكه الاكتشاف، وكم سجلًا تغيّر، وكم سطرًا تُخطّي، وكم موجزًا تعذّرت قراءته، وهل أنت في lapse ومنذ متى. يبلّغ فقط عمّا نشره نطاقك ومتى نظر الفهرس، ولا يبلّغ أبدًا عمّن طلب الجلب.
{
"$type": "org.prodid.source",
"version": 1,
"name": "acme.example",
"kind": "domain",
"trust": "verified",
"verified_by": "dns-txt",
"verified_at": "2026-09-14T09:12:03Z",
"lapsed": false,
"license": "CC0-1.0",
"last_crawl": {
"at": "2026-09-19T06:00:11Z",
"via": "dns-txt",
"document_url": "https://acme.prodid.org/.well-known/prodid.json",
"outcome": "success",
"http_status": 200,
"records_seen": 3,
"records_changed": 1,
"lines_skipped": 0,
"feeds_failed": 0,
"media_failed": 0
}
}يُحدَّد النوع بقراءة البايتات؛ وContent-Type الذي ترسله مجرد تلميح. تُحفظ ستة أنواع فقط ولا شيء غيرها: JPEG وPNG وGIF وWebP وAVIF بوصفها image، وPDF بوصفه document. لا تُقبل SVG ولا HTML ولا الأرشيفات ولا ملفات Office: انشر صحائف المواصفات بصيغة PDF. يجب أن يطابق النوع المكتشف kind الخاص بالإدخال، وإلا يُتخطّى الإدخال.
| البند | الحد |
|---|---|
| صورة واحدة | 20 MiB |
| مستند واحد | 50 MiB |
| جلب وسائط واحد | 60 s |
| إدخالات الوسائط في سجل واحد | 20 |
قبل جلب أي شيء، يُفحص الترخيص نصًّا ويجب أن يكون أحد سبعة معرّفات SPDX بالضبط: تلك التي تسمح لأي أحد بإعادة توزيع الملف كما هو، وهذا بالضبط ما يفعله الفهرس به:
CC0-1.0 CC-BY-4.0 CC-BY-SA-4.0 CC-BY-ND-4.0
CC-BY-3.0 CC-BY-SA-3.0 CC-BY-ND-3.0كل شيء هنا لكل إدخال على حدة. الإدخال المرفوض أو الكبير جدًا أو غير القابل للوصول لا يُفقد إلا نفسه: لا يبطل سجلك أبدًا بسبب الوسائط، وتبقى ادعاءاته الأخرى قائمة، ولا يُدخلك أي فشل في الوسائط في lapse. يُحسب في media_failed ويُعاد المحاولة في المرة التالية التي يُجلب فيها السجل. أمر واحد معاكس تمامًا للموجزات: قاعدة المضيف نفسه لا تنطبق هنا، فيمكن أن تكون صورك على شبكة CDN. ما الذي يُستوعب وقائمة التراخيص تذكران السبب.
تجار التجزئة والسجلات ومجموعات البيانات المفتوحة والمساهمون مصادر مثل غيرهم. ادعاءاتهم تُنسب إليهم ولا تستبدل ادعاءاتك أبدًا؛ وحين تختلفون، يظهر الادعاءان جنبًا إلى جنب، كلٌّ مع مصدره.