本文へ移動
prodid

パブリッシャーガイド

製品を公開する

prodid への公開は、Web に 2 つのファイルを置き、DNS に 1 つのレコードを追加することです。自分のドメインなら、登録も保管すべき鍵もありません。ドメインそのものが資格情報であり、ファイルを変えれば公開した内容を変更・撤回できます。

どの方法で公開しますか?

方法 1

自分のドメインで公開する

2 つのファイルと 1 つの DNS レコード。加盟店に代わって公開するプラットフォームは、加盟店ドメインごとに同じことを行うので、各加盟店が自分の ID と信頼レベルを保ちます。

4 ステップ中 0 完了
x
  1. ディスカバリー文書を配信する

    製品フィードの場所を列挙する、固定パスの 1 つのファイル: 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 の例。そのファイルからそのまま描画しています。
  2. フィードを配信する

    フィードは NDJSON です。1 行に 1 つの完全な JSON オブジェクト、UTF-8、改行区切り。外側に配列はなく、行の間にカンマもありません。こうすることで 200 万製品のフィードも 1 行ずつストリーム処理でき、壊れた行は残りではなくその行だけを失います。

    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 にある同じ製品の 3 つのバリアント。group を共有しているので、インデックスはそれをもとに 3 つのバリアントを持つ 1 つのファミリーを作ります。
  3. DNS で ID を確保する

    ファイルが公開されたら、自分のドメインをホストとするレコードを公開します。

    _prodid.acme.example TXT
    _prodid.acme.example. IN TXT "v=prodid0; host=acme.example"
  4. 変更をインデックスに知らせる

    任意です。既知のドメインはすべて定期的に再取得され、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"}

方法 2

ホスティングを委任し、ID は保つ

ドメインは持っていても、そこにファイルを置けないメーカーは多くあります。フィードは別の場所にホストされ、ドメインは DNS で証明されるので、ソースの ID はドメインのまま、信頼は verified のままです。publish.prodid.org でサイトを作ってドメインを入力すると、追加すべき正確なレコードが表示され、確認もしてくれます。

実際の形

4 ステップ中 0 完了
x
  1. ホスト型 slug のディレクトリにアップロード

    します。例えば acme.prodid.org で、ディスカバリー文書とフィードの両方を配信します。

  2. 自分が所有するドメインの TXT レコード

    で、そのホストを指します。URL ではなくホストなので、レコードがクローラーを任意のアドレスに向けることはできません。

    _prodid.acme.example TXT
    _prodid.acme.example. IN TXT "v=prodid0; host=acme.prodid.org"
  3. あなたのドメインを指し返す文書。

    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 フィールドだけで、ここでは必須です。
  4. サイトを作成する

    ホスト型パブリッシャーは、あなたの TXT レコードを自分で確認してから初めて domain を文書に書き込むので、求めていないドメインを文書が主張する時間帯は存在しません。

方法 3

ドメインなしで公開する

1 ステップ中 0 完了
x
  1. サイトを作成する

    ドメインをまったく持たない生産者は、ホスト型 slug <slug>.prodid.org で自分の名前で公開します。publish.prodid.org で申し込んでください。ソースの ID は slug ホストで、ドメインについて何も証明されていないため信頼は unverified です。レコードは本物のレコードで、識別子も解決も出典の帰属もすべてそろっています。

ドメインを確認する

公開は終わりましたか。ドメインを入力してください。インデックスにいま確認を依頼し、そのライブのステータスページへ移動します。

次のクロールで、数分以内にステータスが更新されます。

ping の前にファイルを確認する

prodid-batch check は、ディスカバリー文書とすべてのフィードをインデックスとまったく同じ方法で検証します。トークンは不要で、インデックスには何も問い合わせません。リポジトリのクローンで Bun 1.4.4 を使って実行します。ファイルそのものを渡してください。.json で終わるパスは 1 つの文書として、それ以外は 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 の形でフィードの行番号付きの 1 行が表示され、0 以外の終了コードで終わります。読むのはファイルであり、DNS やサーバーではないので、上のチェックリストの TXT レコード、コンテンツタイプ、キャッシュヘッダーは自分で確認してください。

レコードを検証する規則は仕様にあり、スキーマは /spec/schemas/v1 に、誰かが取得する前にエクスポーターを試せる機械可読なテストベクトルは /spec/fixtures/v1 にあります。

仕様は英語でのみ公開されており、英語の本文が規範となります。

現状: Spec v1。インデックスとホスト型パブリッシャーは prodid.org で稼働しています。誰でも、自分のドメインからでもホスト型でも公開できます。 ここで説明しているファイル形式は、ping したときにインデックスが読む形式です。

リファレンス

prodid はオープンソースです。成長を手伝ってください。

リポジトリにスターを付けて見つけてもらいやすくしたり、問題を知らせたり、修正を送ったり、GitHub アカウントなしでここからメッセージを送ったりしてください。