オープンデータ
インデックスをダウンロードする
インデックスは置き換え可能です。インデックスが知っていて読者が知りうるすべてのことは、完全なエクスポートであるダンプとして公開され、誰でもダウンロードして自分のインデックスに読み込めます。
最新のダンプ
このサイトのビルド時点で、最新のダンプは のスナップショットでした。毎晩 04:30 UTC に新しいダンプが書き込まれ、 latest.jsonは常に最新のものを指します。
- sources.ndjson.gz
2 行 · 446 B
ソースごとに 1 行。
sha256 0bb6045c5ba3c73d6756f3b5ec2e8910b28f147fd80f6403d542554f8879ba8c
- entities.ndjson.gz
24 行 · 1.9 KiB
エンティティ(統合済みを含む)ごとに 1 行。
sha256 1333fd9c883d4c4679a2288d874586caae364238233b04163aae8479bf72915c
- records.ndjson.gz
9 行 · 1.2 KiB
レコード(撤回済みを含む)ごとに 1 行。
sha256 cfdfb40fd5cdd941d65adbe559ca491261971ca328316741630d155e179a4600
- groupings.ndjson.gz
15 行 · 501 B
グループごとに 1 行。
sha256 5c562f31473d5f2b8f8551caca0f1cbb2d2f3e35f542af1e2ee6e5f35f3f261e
- merges.ndjson.gz
0 行 · 20 B
統合(取り消し済みを含む)ごとに 1 行。
sha256 59869db34853933b239f1e2219cf7d431da006aa919635478511fabbfc8849d2
このダンプのディレクトリは https://dumps.prodid.org/v1/2026-10-29/、マニフェストは manifest.json で、2026-10-29 04:30 UTC に書き込まれました。ライセンスは index: CC0-1.0 と claims: source です。
ダンプの置き場所
ダンプはスナップショットの UTC 日付を名前とするディレクトリで、そのバージョンのディレクトリの下にあります。v1/ には v1 のダンプが入り、そのマニフェスト、ソースとエンティティの行は v1 の文書です。中には 5 つのデータファイルとマニフェストがあります。
https://dumps.prodid.org/v1/<YYYY-MM-DD>/manifest.json
https://dumps.prodid.org/v1/<YYYY-MM-DD>/sources.ndjson.gz
https://dumps.prodid.org/v1/<YYYY-MM-DD>/entities.ndjson.gz
https://dumps.prodid.org/v1/<YYYY-MM-DD>/records.ndjson.gz
https://dumps.prodid.org/v1/<YYYY-MM-DD>/groupings.ndjson.gz
https://dumps.prodid.org/v1/<YYYY-MM-DD>/merges.ndjson.gz
https://dumps.prodid.org/v1/latest.jsonlatest.json は最後に書き込まれます。 これは最新ダンプの manifest.json のコピーで、そのダンプのすべてのファイルとマニフェストがそろった後に書き込まれます。そこから読み始める人が、まだ存在しないファイルを列挙するマニフェストに出会うことはなく、マニフェスト自身の snapshot_at からディレクトリを見つけられます。
保持。 日次のダンプは 7 日間保持されます。各 UTC 月の最初のダンプは無期限に保持されます。保持されたダンプは書き換えられず、ディレクトリ、ファイル、マニフェストはバイト単位で同じままです。
v0 のダンプ。 v1 より前に書き込まれた v0 のダンプは、同じ保持規則で https://dumps.prodid.org/v0/ の下に残り、v0/latest.json はその最後のものを指し続けます。それらは今後も v0 のスキーマに従います。
マニフェスト。 5 つのファイルをそれぞれ 1 回ずつ列挙し、圧縮された配信時の SHA-256 とサイズ、展開後の行数を示します。読み込む前に各ファイルをダイジェストで検証してください。スキーマは https://prodid.org/schemas/v1/org.prodid.dump.json、テストベクトルは /spec/fixtures/v1/dump にあります。
各ファイルの中身
すべてのファイルは gzip 圧縮された NDJSON で、1 行に 1 つの JSON オブジェクトです。5 つのファイルは同じ一貫したスナップショットから読まれるので、互いに整合します。どの行が挙げるソースも sources.ndjson.gz に自分の行を持ち、どの行が挙げる opid も entities.ndjson.gz に自分の行を持ちます。
| ファイル | 1 行あたり | 行の内容 |
|---|---|---|
| sources.ndjson.gz | ソース | ソースのステータス。/source/{name} が返すものとまったく同じ。 |
| entities.ndjson.gz | エンティティ(統合済みを含む) | エンティティ文書。/id/{opid}?history=1 が返すものとまったく同じで、撤回されたクレームを含む。 |
| records.ndjson.gz | レコード(撤回済みを含む) | source, key, feed, opid, body, first_seen, last_seen, withdrawn_at. |
| groupings.ndjson.gz | グループ | source, kind, key, opid. |
| merges.ndjson.gz | 統合(取り消し済みを含む) | from, into, decided_at, reverted_at. |
統合されたエンティティ
統合された opid はリゾルバーで 308 を返すので、コピーできる自分の文書がありません。その行は、統合されていなければ返したはずの文書(自分の識別子とクレームはそのまま残っており、だからこそ統合は取り消せます)に、存続するエンティティの opid を示すメンバー merged_into を加えたものです。統合は連鎖しません。存続するエンティティ自身が統合されることはありません。
レコードの行
インデックスが保持する 1 つのレコード。時刻はすべて UTC、ISO 8601。
| フィールド | 内容 |
|---|---|
| source | ソースの名前。 |
| key | そのソース内でのレコードの key。 |
| feed | それを読んだフィードの URL。データセットの取り込みで書かれたレコードにはありません。 |
| opid | それが解決されたアイテム。 |
| body | パブリッシャーが送った org.prodid.item。そのまま保存。 |
| first_seen | インデックスが最初に読んだ時刻。 |
| last_seen | インデックスが最後に読んだ時刻。 |
| withdrawn_at | レコードが撤回された場合のみ。 |
グループの行
あるソースのグループがどのエンティティに解決されたか。kind は family か variant で、key はそのソースのレコードがグループ化された内容です。ダイジェストではなく平文で書かれているので、他の実装が自分のグループと突き合わせられます。
family
{ "group": "<group>" }
パブリッシャーのグループ用。グループのないレコードはそれ自体で 1 つのファミリーとなり、{ "key": "<key>" } と書かれます。
variant
{ "family": <ファミリーの key>, "variant": { <次元>: <値>, … } }
レコードのバリアント。なければ {}。
統合の行
1 つの統合の決定。from は統合された opid、into は存続するエンティティ、decided_at は決定の時刻、reverted_at は統合が取り消された場合のみ。
ダンプに決して含まれないもの
ダンプが述べるのは、リゾルバーがすでに述べていることと、その回答を作るレコード、グループ、統合だけです。
- パブリッシャーの連絡先。インデックスは lapse の通知を送るためだけに保存しています。
- 取得のログ、クローラーのエラー文、その他ソースのステータスに表示されない取得の情報。
- 統合がなぜ行われたか、誰が決めたか。
- メディアのハッシュがなぜブロックされているか。
- メディアのバイト。メディアのクレームの media_url がファイルを指し、ブロックされたハッシュは配信されません。
- インデックス内部の行識別子。どの行もソースは名前で、エンティティは opid で参照します。
- authoritative の付与とその証拠。snapshot_at の時点でソースが authoritative なら、その行にそう書かれますが、ダンプから読み込んだインデックスは、その運営者が付与するまで何の付与も持ちません。
ライセンス
2 つの規則があり、マニフェストの licenses が両方を述べています。
index: CC0-1.0
インデックスが生成するすべて
opid、識別子の対応付け、ファミリーとバリアントの階層、グループと統合。claims: source
すべてのクレームとすべてのレコード
そのソース自身が宣言したライセンスに従います。つまり
sources.ndjson.gzにあるそのソースの行のlicenseです。ライセンスを宣言していないソースは何も許諾しておらず、prodid がそのソースに代わって何かを許諾することもありません。
自分のディスカバリー文書を公開しないオープンデータセットは、dataset:<slug> という名前のソースとしてインデックスに入り、インデックスの運営者がそのデータセットの公開エクスポートから取り込みます。そのようなソースは常に unverified で、その license はデータセット自身のライセンスです。規則は仕様にあります。
自分のインデックスに読み込む
prodid-batch load-dump は、v0 または v1 のダンプを、同じバージョンにマイグレーション済みの空の PostgreSQL 18 データベースに、1 つのトランザクションで読み込みます。ダンプの日付ディレクトリ、manifest.json、latest.json のいずれかを、ローカルでも HTTPS でも受け付けます。
git clone https://github.com/productdevbook/prodid.git && cd prodid
bun install --frozen-lockfile
export DATABASE_URL=postgres://<user>:<password>@<host>:<port>/<database>
bun run --filter '@prodid/db' migrate
PRODID_OPERATOR=<your name> bun apps/batch/src/cli.ts load-dump https://dumps.prodid.org/v1/latest.json何かを書き込む前に、すべてのファイルがマニフェストの sha256、bytes、lines で検証され、リモートのダンプはまず一時ディレクトリにダウンロードされます。空でないデータベースは拒否されます。PRODID_OPERATOR は読み込んだ統合の決定者として記録されます。
読み込まずにファイルを読むだけなら、ダイジェストで検証してから展開します。下のダイジェストは、このサイトのビルド時点の最新マニフェストのものです。
curl -sO https://dumps.prodid.org/v1/2026-10-29/sources.ndjson.gz
sha256sum sources.ndjson.gz
0bb6045c5ba3c73d6756f3b5ec2e8910b28f147fd80f6403d542554f8879ba8c sources.ndjson.gz
gunzip -c sources.ndjson.gz | head -n 1完全な規則は仕様の Dumps の節にあります。
仕様は英語でのみ公開されており、英語の本文が規範となります。