Yayıncı rehberi
Ürünlerini yayınla
prodid’e yayın yapmak, web’e iki dosya ve DNS’e bir kayıt koymak demek. Kendi alan adında kayıt olunacak bir yer ya da saklanacak bir anahtar yok: kimlik bilgisi alan adının kendisi; yayımladığını dosyaları değiştirerek değiştirir ya da geri çekersin.
Nasıl yayımlayacaksınız?
Kimlik ve barındırma ayrı şeyler. Kimliğin, kontrol ettiğin bir alan adıdır; belgelerin gerçekte nerede sunulduğu ise kimliğini ya da prodid’in ürünlerine atadığı hiçbir tanımlayıcıyı değiştirmeden sonra değiştirebileceğin bir ayrıntı. Üç yol var ve üçü de birebir aynı kayıtları üretir.
1. yol
Kendi alan adında dosya sunabiliyorsun.
Keşif belgesini alan adında sun ve alan adının kendisini gösteren bir TXT kaydı yayınla.
- Kimlik
- alan adı
- Güven
- verified
2. yol
Bir alan adın var ama oradan dosya sunamıyorsun.
Barındırılan bir slug’da yayınla ve alan adındaki tek bir TXT kaydını o host’a yönlendir.
- Kimlik
- DNS ile kanıtlanmış alan adı
- Güven
- verified
3. yol
Hiç alan adın yok.
Barındırılan bir slug’da yayınla. Sonra hiçbir şey kaybetmeden bir alan adı ekle.
- Kimlik
- slug host’u
- Güven
- unverified
2. ve 3. yol, <slug>.prodid.org adresindeki barındırılan yayın hizmetini kullanır. E-postana gelen bir bağlantıyla publish.prodid.org’a giriş yap, bir site oluştur, dosyanı yükle ve varsa alan adını bağla. Her şeyi dışa aktarabilir ya da siteyi istediğin an oradan silebilirsin.
1. yol
Kendi alan adında yayınla
İki dosya ve bir DNS kaydı. Mağazalar adına yayın yapan bir platform aynı şeyi her mağazanın alan adında yapar; böylece her mağaza kendi kimliğini ve kendi güven seviyesini korur.
Keşif belgesini sun
Sabit bir yolda, ürün akışlarının nerede olduğunu listeleyen tek bir dosya:
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 örneği, dosyanın kendisinden üretildi. $typeZorunlu: evet- Her zaman org.prodid.feed.
versionZorunlu: evet- 1. Değeri 0 olan bir belge, 2027-01-26 00:00 UTC’den önce başlayan taramalarda kabul edilir; sonrasında kesin olumsuz olarak reddedilir.
publisher.nameZorunlu: evet- İddialarının yanında bir insanın görmesi gereken ad.
publisher.contactZorunlu: hayır- Birinin gerçekten okuduğu bir e-posta adresi. Kaynağın lapse olduğunda dizin buraya yazar ve alacağın tek uyarı budur.
licenseZorunlu: evet- Akışlarındaki bilgileri kapsayan SPDX tanımlayıcısı, örneğin CC0-1.0.
feedsZorunlu: evet- En fazla 100 https URL’si, hepsi bu belgeyle aynı host’ta.
domainZorunlu: devrederken- Bu belgenin adına konuştuğu alan adı. Belgeye başka bir host’u gösteren bir TXT kaydıyla ulaşıldığında zorunludur ve o alan adına eşit olmalıdır. Belgeyi alan adı kendisi sunuyorsa isteğe bağlıdır; ama varsa yine eşleşmelidir.
Varsayılan portta, geçerli bir sertifikayla, HTTPS üzerinden
application/jsonolarak sun; ya da herhangi birapplication/…+jsonolarak. Başka bir host’a yönlendirme: tarayıcının izlediği tek yönlendirmeacme.example’danwww.acme.example’a olanıdır.Akışı sun
Akış NDJSON’dır: her satırda tam bir JSON nesnesi, UTF-8, satırlar yeni satırla ayrılır. Etrafında dizi yok, satırlar arasında virgül yok. Böylece iki milyon ürünlük bir akış satır satır akar ve bozuk bir satır sana geri kalanı değil yalnızca o satırı kaybettirir.
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 dosyasından tek bir ürünün üç varyantı. Aynı group’u paylaştıkları için dizin bunlardan üç varyantlı tek bir aile kurar. Akışlar, onları listeleyen belgeyle aynı host’ta durur. Başka bir host’taki akışı gösteren bir keşif belgesi kısmen değil bütünüyle reddedilir: tek bir akışı değil tüm kaynağı kaybedersin ve bu kesin olumsuz sayılır, yani aşağıdaki lapse saatini başlatır. JSON’u sitenden, NDJSON’u ayrı bir CDN host adından sunmak istemek normaldir; ama v1’de desteklenmez. İkisini de tek host’a koy.
Bu satırların ilki, okunacak şekilde açılmış haliyle:
tek bir org.prodid.item kaydı{ "$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" }] }$typeZorunlu: evet- Her zaman org.prodid.item.
keyZorunlu: evet- Bu kaydın akış içindeki kalıcı adı. Aynı key’i yeniden yayınlamak öncekinin yerine geçer.
brandZorunlu: evet- Markanın ürün üzerinde göründüğü hali. Bir mpn’i kapsamadan önce normalleştirilir; yani ARÇELİK ve Arçelik iki değil tek markadır.
nameZorunlu: evet- Varyant eksenleri olmadan ürün adı.
identifiersZorunlu: evet- En az bir { scheme, value } ve dizinin saklayabileceği en az bir tane. Değerlerin başında ya da sonunda boşluk olmaz ve boş olmazlar. Bir gtin, doğru kontrol hanesiyle 8, 12, 13 ya da 14 haneli olmalı ve tümü sıfır olmamalıdır; bir mpn, bir şeye normalleşen bir brand ister, çünkü benzersiz olduğu kapsam odur; kısıtlı dolaşım gtin’i saklanır ama yalnızca senin kendi rcn’in olarak. Saklanabilir hiçbir şeyi kalmayan kayıt hiçbir şeyi tanımlamaz ve atlanır.
langZorunlu: hayır- Bu kayıttaki insanların okuyacağı metin için BCP 47 etiketi.
groupZorunlu: hayır- Kendi gruplama anahtarın. Aynı değeri paylaşan ürün birimleri tek bir ailenin varyantlarıdır.
variantZorunlu: hayır- Bu ürün birimini grup içinde ayıran eksenler: renk, beden, kapasite.
categoryZorunlu: hayır- GS1 GPC brick kodu; gpc: ve ardından sekiz hane olarak yazılır.
marketsZorunlu: hayır- Bu ürün biriminin satıldığı pazarların ISO 3166-1 alpha-2 kodları.
propertiesZorunlu: hayır- Metinler, sayılar, mantıksal değerler, listeler ya da bir ölçü için { value, unit }.
mediaZorunlu: hayır- En fazla 20 https URL’si; her biri bir kind ve alınabilir listeden bir SPDX lisansıyla. Akışların aksine bunlar herhangi bir host’ta olabilir.
Düz ürün birimleri gönder. Aileleri ya da varyantları kendin kurmazsın ve asla
opidgöndermezsin: dizin ilkinigroup’tan türetir, ikincisini kendisi atar. Zaten bir Google Merchant akışı üretiyorsangroupseninitem_group_id’indir.Dışa aktarmadan önce barkodlarla ilgili bilmeye değer iki şey var. Tümü sıfır olan bir
gtinbarkod değil, bir katalog yer tutucusudur; onu taşıyan kayıt hatalı kontrol hanesi gibi reddedilir. Kısıtlı dolaşım numarası, yani mağaza içi aralıklar, saklanır ve sana atfedilir; ama küresel olarak hiçbir şeyi tanımlamaz, bu yüzden ürününü asla başkasınınkiyle birleştirmez ve/01/onu çözmez.Kimliği DNS’te sahiplen
Dosyalar yayına girdikten sonra host olarak kendi alan adını gösteren tek bir kayıt yayınla.
_prodid.acme.example TXT_prodid.acme.example. IN TXT "v=prodid0; host=acme.example"Kayıt, keşfin zaten bulacağı yeri gösterir; yani verinle ilgili hiçbir şey değişmez. Değişen şey, DNS’ine yalnızca ekleme yetkisi olan birinin yapabildikleridir. Kayıt yoksa, onların eklediği bir kayıt kimliğini sessizce ele geçirir, çünkü DNS dosyaya üstün gelir. Senin kaydın zaten oradaysa, ikinci bir kayıt keşfin birden fazla kayıt hatasıyla başarısız olmasına yol açar: görünür, bildirilen ve geri alınabilen bir lapse.
_prodid’i asla bir tedarikçiye devretme._prodid.<domain>üzerinde yazma yetkisi, tıpkı DKIM ya da ACME DNS-01 doğrulamasında olduğu gibi, kimliğinin kontrolü demektir. DNS’i paylaşılan bir alan adı, paylaşılan bir kimliktir. Ajansa akışı ver, kaydı değil.Dosyaları kayıttan önce yükle, sonra değil: henüz orada olmayan bir belgeyi gösteren kayıt başarısız bir keşiftir. Değerler büyük-küçük harf duyarsız okunur ve sondaki tek nokta sorun değildir; yani
ACME.Example.ileacme.exampleaynı host’tur.Dizine değiştiğini bildir
İsteğe bağlı. Bilinen her alan adı bir takvime göre yeniden taranır; ping yalnızca bir sonraki taramayı öne çeker.
dizinden keşfi şimdi çalıştırmasını istecurl -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": [...]}tek seferde en fazla 1000 tane alır; bir platform barındırdığı her mağazayı böyle tanıtır. Gönderilecek bir anahtar yok, çünkü ping çağırana içerik üzerinde hiçbir söz hakkı vermez; tek söylediği de202’dir. Alan adının bilinip bilinmediğini, bir şey bulunup bulunmadığını ya da bir dakika önce başka birinin ping atıp atmadığını söylemez.429yalnızca senin kendi istek bütçeni aştığın anlamına gelir; hatalarapplication/problem+jsonolarak döner. Alan adına ne olduğu ping’de değil, kaynak durumunda görünür.
2. yol
Barındırmayı devret, kimliği koru
Pek çok üreticinin bir alan adı vardır ama ona dosya koyamaz. Akış başka bir yerde barındırılır ve alan adı DNS ile kanıtlanır; böylece kaynak kimliği yine alan adıdır ve güven seviyesi yine verified olur. publish.prodid.org’da bir site oluştur, alan adını gir; eklemen gereken kaydı birebir gösterir ve senin için denetler.
Nasıl görünür
Barındırılan bir slug’a yüklenmiş bir katalog
, örneğin
acme.prodid.org; hem keşif belgesini hem akışı sunar.Sahip olduğun alan adında, o host’u gösteren tek bir TXT kaydı.
URL değil host; böylece bir kayıt tarayıcıyı asla rastgele bir adrese yönlendiremez.
_prodid.acme.example TXT_prodid.acme.example. IN TXT "v=prodid0; host=acme.prodid.org"Alan adını geri gösteren bir belge.
DNS belgem şurada der; belge o alan adı adına konuşuyorum der.
domainiçermeyen devredilmiş bir belge reddedilir: yokluk asla onay sayılmaz; kimsenin başkasının akışına kayıt yönlendirememesinin nedeni de budur.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 dosyasından. 1. yoldan tek farkı domain alanı ve burada zorunlu. Sitenizi oluşturun
Barındırılan yayıncı
domain’i belgeye ancak TXT kaydını kendisi gördükten sonra yazar; böylece bir belgenin, bunu istememiş bir alan adını sahiplendiği bir an olmaz.
3. yol
Alan adı olmadan yayınla
Sitenizi oluşturun
Hiç alan adı olmayan bir üretici, kendi adıyla, barındırılan bir slug’da yayın yapar:
<slug>.prodid.org. publish.prodid.org’dan bir tane al. Kaynak kimliği slug host’udur ve güven seviyesiunverified, çünkü bir alan adıyla ilgili hiçbir şey kanıtlanmamıştır. Kayıtlar gerçek kayıtlardır: tanımlayıcılar, çözümleme, kaynak gösterme.Bu durumdaki yayıncıların çoğunun zaten bir Google Merchant ürün dosyası vardır; bu yüzden böyle bir dosyadan
org.prodid.itemkayıtlarına eşleme şartnamede sütun sütun yazılıdır; bilerek bıraktıklarıyla birlikte: fiyat, stok, kargo ve durum, ürüne değil, belirli bir günde bir satıcıya aittir. Dışa aktarmadan önce Merchant akışını içe aktarma bölümünü okumaya değer: publish.prodid.org yüklediğin CSV ya da TSV’yi tam olarak bu eşlemeyle dönüştürür. İçindeki dört şey tablonun nasıl görünmesi gerektiğini belirler:- Dört sütun varyant ekseni olur:
color,size,materialvepattern; alıcının tek biritem_group_idiçinde aralarından seçtikleri.gender,age_group,size_typevesize_systemsıradan özellik olarak kalır: tüm grubu tanımlarlar ve eksen olsalar, biri onlardan birini iki farklı şekilde yazdığı anda tek ürünü birkaç ürüne bölerlerdi. - Tekrarlanan bir öznitelik hücre başına değil dosya başına ya virgülle ayrılır ya da başlık tekrarlanır. Bir hücre, başlığı tüm dosyada yalnızca bir kez geçiyorsa virgüllerden bölünür; başlığı tekrarlarsan altındaki her hücre bütün olarak alınır. İçinde virgül olan bir değeri taşımanın tek yolu budur ve dosya için bir kez verdiğin bir karardır.
additional_image_link,product_type,product_highlight,product_detailvecertificationiçin geçerlidir; virgülle dolu birdescriptiondahil geri kalan her şey her iki durumda da bütün olarak alınır. - Bir
product_detailhiçbir şeyin üzerine yazmaz. Ortadaki alt özniteliği özellik anahtarı olur, bölüm adı atılır ve bir anahtar için ilk değer kazanır. Aynı anahtarlı sonraki bir detail ya da eşlemenin zaten ürettiği bir anahtara denk gelen biri atılır ve satırıyla raporlanır; böylece bir detail sütunu satırın geri kalanının söylediğini asla sessizce yeniden tanımlayamaz. - Bir medya lisansı beyan edilmelidir. Merchant biçiminde bunun için bir sütun yok ve lisanssız hiçbir şey alınmaz; bu yüzden bir içe aktarma, dosyadaki her görseli ve belgeyi kapsayan tek bir alınabilir SPDX tanımlayıcısı beyan eder. Kendi
licensesütunun bunu satır satır geçersiz kılar; beyan edilen lisansı alınabilir olmayan bir dosya da başarısız kayıtlar değil, medyasız kayıtlar üretir.
Kayda dönüşemeyen bir satır (kullanılabilir tanımlayıcısı olmayan, kontrol hanesi tutmayan GTIN’li) atlanır ve tablo satır numarasıyla raporlanır; başlık 1. satır sayılır. Yani bozuk bir satır içe aktarmanın tamamına değil yalnızca kendisine mal olur. Kendini karşılaştırabileceğin hazır bir örnek /spec/fixtures/merchant altında: bir CSV, üretmesi gereken kayıtlar ve atlanması gereken satır.
Bugün verilen bir karar için önemli olan kısım, sonra ne olacağıdır. Edindiğin bir alan adına aynı host’u gösteren bir TXT kaydı eklemek, bir sonraki taramada slug’ı alan adına çevirir: aynı kaynak, aynı kayıtlar, her
opidkorunur; güven deunverified’danverified’a yükselir.skutanımlayıcıların kaynağın adına değil kaynağın kendisine bağlıdır; bu yüzden taşınmadan etkilenmez. publish.prodid.org’da bu, 2. yolun kullandığı aynı domain alanıdır.- Dört sütun varyant ekseni olur:
Alan adınızı kontrol edin
Yayınlamayı bitirdiniz mi? Alan adınızı girin. Dizinden şimdi bakması istenir ve canlı durum sayfasına gidersiniz.
Yayına girmeden önce
Ping atmadan önce dosyalarını denetle
prodid-batch check, keşif belgeni ve her akışı tam olarak dizinin yapacağı gibi doğrular; token olmadan ve dizine hiçbir şey sormadan. Bun 1.4.4 ile deponun bir kopyasından çalışır. Dosyaların kendisini ver: .json ile biten bir yol tek bir belge, diğer her yol bir NDJSON akışı olarak okunur.
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 recordsSorunsuz bir dosya ok ve dizinin ondan alacağı kayıt sayısını yazar. Aksi halde her sorun için, bulunduğu akış satırıyla birlikte items.ndjson:12: message biçiminde bir satır yazar ve sıfır olmayan bir kodla çıkar. DNS’ini ya da sunucunu değil dosyaları okur; yani yukarıdaki listedeki TXT kaydı, içerik türü ve önbellek başlıkları yine senin denetlemen gereken şeyler.
Bir kaydın doğrulandığı kurallar şartnamede, şemalar /spec/schemas/v1 adresinde; /spec/fixtures/v1 ise biri taramadan önce dışa aktarıcını karşısında çalıştırabileceğin, makinenin okuyabildiği vektörleri tutar.
Şartname yalnızca İngilizce yayımlanır ve bağlayıcı metin İngilizce olanıdır.
Durum: Şartname v1. Dizin ve barındırılan yayıncı prodid.org üzerinde çalışıyor. Herkes kendi alan adında ya da barındırılan olarak yayın yapabilir. Burada anlatılan dosya biçimleri, ping attığında dizinin okuduğu biçimlerdir.
Başvuru
Her şeyden önce bilmeye değer, çünkü aşağıdaki üç yoldan hangisinin senin olduğunu bu belirler. Keşif her taramada sıfırdan, önce DNS’le çalışır ve verine giden yol taramalar arasında hatırlanmaz.
Önce
_prodid.acme.exampleadresinde bir DNS TXT kaydıOrada bir
v=prodid0kaydı varsa, kendi alan adını gösterse bile yalnızca o izlenir. Kayıt bir host adlandırır; belge her zamanhttps://<host>/.well-known/prodid.jsonadresindedir.Yalnızca böyle bir kayıt yoksa
https://acme.example/.well-known/prodid.jsonAlan adının kendi üzerindeki belge. Alan adını HTTPS üzerinden kim sunuyorsa onun adına o konuşur.
DNS önce gelir çünkü daha güçlü bir kanıttır: bir host’a dosya koyabilen herkes alan adının sahibi değildir ve sahibin bunu geçersiz kılabilmesi gerekir. Dosyayı kendin sunsan bile kaydı yazman gerekmesinin nedeni de bu; ne kazandırdığını 1. yol, 3. adım anlatıyor.
Tam olarak bir kayıt, arkasında hiçbir şey yok. O adda birden fazla v=prodid0 kaydı bir hatadır, aralarında bir seçim değil; tek bir bozuk ya da fazla uzun kayıt da hatadır. Yedek yol yoktur: bir kayıt varsa ve çalışmıyorsa, keşif tarayıcıyı alan adına yönlendirmek yerine orada biter. Host değiştiriyorsan kaydı değiştir, asla ikinci bir kayıt ekleme. Test vektörleriyle birlikte dilbilgisi şartnamede.
Yanıt sayılan nedir. En fazla bir yönlendirmeden sonra HTTP 200, JSON içerik türü, akış şemasına göre doğrulanan bir gövde ve keşfedilen alan adını gösteren bir domain. Bilinmeyen yollara HTML ve 200 ile yanıt veren bir site yanıt vermiş sayılmaz; text/html olarak sunulan bir belge de öyle.
Güven bir iddianın değil kaynağın özelliğidir. Kimin konuştuğuna dair neyin kanıtlandığını söyler; belirli bir bilginin doğru olup olmadığı hakkında hiçbir şey söylemez. Bununla ne yapacağına veriyi kullanan karar verir.
| Seviye | Anlamı |
|---|---|
| authoritative | Alan adı kontrolü kanıtlanmış ve markanın sahipliği teyit edilmiş. |
| verified | Alan adı kontrolü TXT kaydıyla ya da belgeyi alan adının kendisi sunarak kanıtlanmış. |
| unverified | Alan adı olmayan barındırılan bir slug, bir veri seti aktarımı ya da bir topluluk katkısı. |
Yalnızca kimliği bir alan adı olan kaynak unverified’dan fazlası olabilir. verified taramadan gelir. authoritative gelmez, çünkü hiçbir tarama bir markanın sahibini kanıtlayamaz: onu dizinin işletmecisi verir ve yalnızca kanıta dayanarak.
Kanıt, GS1 firma önekindir.
Kaynağının marka altında yayımladığı GTIN’lerin GS1 firma öneki, GS1’in herkese açık “Verified by GS1” sorgusunun gösterdiği gibi, alan adını kontrol eden kuruluşa lisanslı olmalıdır. Bu sorgunun URL’si kanıt olarak yetkiyle birlikte saklanır.
Bir yetki tek bir markayı adlandırır ve her biri geri alınabilir.
Marka normalleştirilmiş haliyle kaydedilir. Bir kaynak birkaç marka için yetki taşıyabilir; işletmeci her birini ayrı ayrı geri alır.
Bir yetki, altındaki kanıttan uzun yaşamaz.
Kaynağın tam olarak şu üçü sağlandığı sürece
authoritative’dir: alan adının kontrolü kanıtlı, kaynak lapsed değil ve geri alınmamış en az bir yetkisi var. Alan adı kanıtını kaybedersen ya da lapse olursan, kimse bir şey yapmadan hemen kalan kanıtın desteklediği seviyeye düşer: lapsed ikenverified, alan adı kanıtı da gittiyse daha aşağı. Üçü yeniden sağlandığı anda tekrarauthoritativeolur.Markayı değil kaynağı kapsar.
Güven kaynağın özelliği olarak kalır: tek bir marka için verilen yetki, kaynağının yaptığı her iddiayı
authoritativeyapar; yetkisi olmayan markalarla ilgili iddialar dahil.
Bunu istemek için önce kendi alan adında yayın yap, sonra alan adını, markayı ve GTIN’lerinden biri için bir Verified by GS1 sorgusunu belirterek istek formuyla başvur. İşletmeci, kaynağının o marka altında yayımladığı GTIN’leri Verified by GS1’de denetler. Başvuru herkese açıktır.
Zaten var olan bir key ile kayıt yayınlamak öncekinin yerine geçer. Ayrı bir güncelleme uç noktası yok, çünkü durum akışın kendisidir.
Tarayıcının bütünüyle aldığı bir akıştan kaybolan key, onunla ilgili iddialarını geri çekilmiş olarak işaretler. Varlık ve tanımlayıcısı kalır: başkalarının ona verdiği bağlantılar çalışmaya devam eder, diğer kaynakların iddiaları da.
Bir tarama, akış URL’lerinden birini artık göstermeyen bir belge okuduğunda, o akışın taşıdığı her canlı kayıt, sanki tüm key’leri kaybolmuş gibi hemen geri çekilir ve URL bir daha alınmaz. Aşağıdaki yedi günlük tolerans burada geçerli değil: bir URL’yi çıkarmak dosyanın gittiğini söylemektir ve dizin sözüne güvenir. Sonra yeniden listelemek onu geri getirir, sıfırdan okunarak. Yapabiliyorsan belgeyi bir ETag ile sun: 304, listenin değişmediği anlamına gelir; dolayısıyla hiçbir şeyi emekliye ayırmaz.
64 KiB’tan büyük, ayrıştırılamayan ya da geçersiz bir satır atlanır ve sayılır. Atlanan satırın key’i bilinmediği için, atlanmış satırı olan bir akış yedi gün boyunca hiçbir şeyi geri çekmez. Sonrasında eksik key’ler her zamanki gibi geri çekilir. Sayı herkese açıktır; yani sessizce satır kaybeden bir akış sessiz kalmaz.
Bir tarama ancak belgenin listelediği her şey okunduğunda başarılı olur: kabul edilebilir bir belge ve içindeki her akışın 200 ya da 304 ile yanıt vermesi. Bir akışın zaman aşımına uğraması diğerlerini kaybettirmez (yanıt veren akışlar alınır ve başarısız taramada hiçbir şey geri çekilmez) ama tarama bir iletim hatası sayılır ve durumundaki feeds_failed bunu gösterir. Dolayısıyla tamamen sağlıklı bir belge, önünde kalıcı olarak ölü tek bir akış URL’si varken, yanıt vermeyi tamamen bırakmış bir alan adıyla aynı yedi günlük saatle lapse olur ve bundan otuz gün sonra kataloğu kaybeder. Artık sunmadığın bir akış URL’sini çürümeye bırakma, belgeden çıkar.
Kesin olumsuz, yani keşfin kabul edilebilir bir belge olmadan bitmesi (ne kayıt ne belge; bozuk, fazla uzun ya da tekrarlı bir kayıt; ya da 200 olmayan, JSON olmayan, geçersiz, domain konusunda artık uyuşmayan ya da host’u dışında bir akış listeleyen bir belge) kaynağı hemen lapse eder. İletim hatası (DNS zaman aşımı, 5xx, 429, aşılan bir sınır; belgede ya da herhangi bir akışta) tek başına hiçbir şeyi değiştirmez; ama her denemenin böyle bittiği art arda yedi gün seni de lapse eder. Yani sonsuza dek hata döndürmek, iddialarını oldukları yerde sabitlemenin bir yolu değildir.
Bu şüphe payı sana değil, bir host’a aittir. Yalnızca kaynağının daha önce doğrulandığı bir host’ta geçerlidir. Hiç doğrulanmadığı bir host’ta (yeni bir slug, _prodid’i az önce yönlendirdiğin bir host, 2. ve 3. yoldaki her şey) zaman aşımı ve 5xx dahil her hata kesin olumsuzdur ve seni hemen lapse eder. Bu bilinçli bir tercih: aksi halde doğrulanmış bir kaynak kaydını kontrol etmediği bir host’a yöneltip, lapse’in bugün mü yoksa bir hafta sonra mı başladığından o host’un ayakta olup olmadığını okuyabilirdi. Host değiştirmek bu yüzden sana hiçbir şeye mal olmaz. Yeni host’taki ilk başarılı tarama her şeyi temizler ve bir lapse, hiçbir şey geri çekilmeden önceki 30 gün boyunca geri alınabilir kalır.
Lapsed bir kaynak yeni iddia almaz, okuyuculara lapsed olarak gösterilir ve publisher.contact adresine bildirim gider. Lapsed bir kaynağın taraması, tamamen başarılı olana kadar hiçbir şey yazmaz; lapse ancak o zaman kalkar. Kesintisiz 30 günlük lapse’ten sonra kayıtların ve etkin iddiaları birlikte geri çekilir ve geçmiş olarak kalır. O 30 gün senin kurtarma pencerendir; iletişim adresinin birinin okuduğu bir adres olması gerekmesinin nedeni de bu.
Geri dönmek hiçbir şeyi değiştirmeyi gerektirmez. Her zamanki belgeyi ve akışı sun; keşif başarılı olduğu anda yayımladığın her şey, tek bir bayt değişmiş olsun ya da olmasın, yeniden ileri sürülür. Senden canlı hiçbir şey tutmadığı sürece dizin koşullu istekleri bırakır; yani değişmemiş bir dosya asla geri çekilmiş kalmak için bir neden olmaz.
Okuyucunun gördüğü her iddia seen_at taşır: bilginin herhangi bir yerde ilk yayımlandığı an değil, bu kaynağın bu değeri kesintisiz olarak ne zamandan beri ileri sürdüğü. Aynı değeri bulan her yeniden taramadan sağ çıkar; amacı da budur. Bir geri çekilmeden sağ çıkmaz. Kaynağın 30 günden uzun lapsed kalırsa, yayımladığın her bilginin tarihi geri döndüğün günden yeniden başlar; çünkü aradaki süre boyunca doğrulanabilir hiç kimse onları üstlenmedi. Geri çekilen satırlar kalır; böylece ?history=1 boşluğu gizlemek yerine gösterir. Okuyucunun ne gördüğü şartnamede.
/source/acme.example bir şeylerin yanlış gittiğini görmenin yoludur: son taramanın sonucu, keşfin hangi yolu izlediği, kaç kaydın değiştiği, kaç satırın atlandığı, kaç akışın okunamadığı ve lapsed olup olmadığın, olduysan ne zamandan beri. Yalnızca alan adının ne yayımladığını ve dizinin ne zaman baktığını bildirir; bir taramayı kimin istediğini asla.
{
"$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
}
}Tür baytlar okunarak belirlenir; Content-Type’ın yalnızca bir ipucu. Altı tür saklanır, başka hiçbir şey değil: image olarak JPEG, PNG, GIF, WebP ve AVIF; document olarak PDF. SVG yok, HTML yok, arşiv yok, Office dosyası yok; teknik föy PDF olarak gider. Algılanan tür ile girdinin kind’ı uyuşmalı, yoksa girdi atlanır.
| Ne | Sınır |
|---|---|
| Tek bir görsel | 20 MiB |
| Tek bir belge | 50 MiB |
| Tek bir medya indirmesi | 60 s |
| Bir kayıttaki medya girdileri | 20 |
Lisans, herhangi bir şey indirilmeden önce metin olarak denetlenir ve tam olarak yedi SPDX tanımlayıcısından biri olmalıdır; dosyayı herkesin olduğu gibi yeniden dağıtmasına izin verenler, ki dizin de onunla bunu yapar:
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.0Buradaki her şey girdi başınadır. Reddedilen, fazla büyük ya da erişilemeyen bir girdi yalnızca o girdiye mal olur: kaydın medyası yüzünden asla geçersiz olmaz, diğer iddiaları geçerli kalır ve hiçbir medya hatası seni lapse etmez. media_failed içinde sayılır ve o kaydın bir sonraki taramasında yeniden denenir. Bir şey akışların tersine işler: aynı host kuralı burada geçerli değildir; yani görsellerin bir CDN’de durabilir. Gerekçeler Neler alınır ve lisans listesi bölümlerinde.
Perakendeciler, sicil kurumları, açık veri setleri ve katkıda bulunanlar diğerleri gibi birer kaynaktır. İddiaları onlara atfedilir ve seninkilerin üzerine asla yazmaz; anlaşamadığınız yerde iki iddia da kaynaklarıyla yan yana görünür.