Offene Daten
Den Index herunterladen
Der Index ist ersetzbar. Alles, was er weiß und ein Leser wissen darf, wird als vollständiger Export veröffentlicht, als Dump, den jeder herunterladen und in einen eigenen Index laden kann.
Der neueste Dump
Als diese Seite gebaut wurde, war der neueste Dump der Snapshot vom . Jede Nacht um 04:30 UTC wird ein neuer geschrieben, und latest.jsonnennt immer den neuesten.
- sources.ndjson.gz
2 Zeilen · 446 B
Eine Zeile pro Quelle.
sha256 0bb6045c5ba3c73d6756f3b5ec2e8910b28f147fd80f6403d542554f8879ba8c
- entities.ndjson.gz
24 Zeilen · 1.9 KiB
Eine Zeile pro Entität, zusammengeführte eingeschlossen.
sha256 1333fd9c883d4c4679a2288d874586caae364238233b04163aae8479bf72915c
- records.ndjson.gz
9 Zeilen · 1.2 KiB
Eine Zeile pro Datensatz, zurückgezogene eingeschlossen.
sha256 cfdfb40fd5cdd941d65adbe559ca491261971ca328316741630d155e179a4600
- groupings.ndjson.gz
15 Zeilen · 501 B
Eine Zeile pro Gruppierung.
sha256 5c562f31473d5f2b8f8551caca0f1cbb2d2f3e35f542af1e2ee6e5f35f3f261e
- merges.ndjson.gz
0 Zeilen · 20 B
Eine Zeile pro Zusammenführung, rückgängig gemachte eingeschlossen.
sha256 59869db34853933b239f1e2219cf7d431da006aa919635478511fabbfc8849d2
Das Verzeichnis dieses Dumps ist https://dumps.prodid.org/v1/2026-10-29/, sein Manifest ist manifest.json, geschrieben am 2026-10-29 04:30 UTC. Seine Lizenzen lauten index: CC0-1.0 und claims: source.
Wo Dumps liegen
Ein Dump ist ein Verzeichnis, benannt nach dem UTC-Datum seines Snapshots, unter der Version, in der er geschrieben ist. v1/ enthält v1-Dumps, deren Manifest und deren Quell- und Entitätszeilen v1-Dokumente sind. Es enthält fünf Datendateien und ein Manifest.
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 wird zuletzt geschrieben. Es ist eine Kopie der manifest.json des neuesten Dumps und wird geschrieben, nachdem jede Datei dieses Dumps und sein Manifest bereitliegen. Wer davon ausgeht, findet nie ein Manifest, das eine noch fehlende Datei nennt, und findet das Verzeichnis über das manifesteigene snapshot_at.
Aufbewahrung. Ein täglicher Dump wird 7 Tage aufbewahrt. Der erste Dump jedes UTC-Monats bleibt dauerhaft. Ein aufbewahrter Dump wird nie neu geschrieben: Verzeichnis, Dateien und Manifest bleiben Byte für Byte, wie sie waren.
v0-Dumps. Die vor v1 geschriebenen v0-Dumps bleiben unter https://dumps.prodid.org/v0/, mit derselben Aufbewahrung, und v0/latest.json nennt weiterhin den letzten davon. Sie validieren dauerhaft gegen die v0-Schemas.
Das Manifest. Es nennt jede der fünf Dateien genau einmal, mit SHA-256 und Größe der Datei, wie sie ausgeliefert wird, komprimiert, und ihrer Zeilenzahl nach dem Entpacken. Prüfen Sie jede Datei vor dem Laden gegen ihren Digest. Das Schema ist https://prodid.org/schemas/v1/org.prodid.dump.json, mit Vektoren in /spec/fixtures/v1/dump.
Was jede Datei enthält
Jede Datei ist gzip-komprimiertes NDJSON, ein JSON-Objekt pro Zeile. Alle fünf werden aus einem konsistenten Snapshot gelesen und stimmen deshalb überein: Jede Quelle, die eine Zeile nennt, hat ihre Zeile in sources.ndjson.gz, und jede opid, die eine Zeile nennt, hat ihre Zeile in entities.ndjson.gz.
| Datei | Eine Zeile pro | Die Zeile |
|---|---|---|
| sources.ndjson.gz | Quelle | Der Status der Quelle, genau wie /source/{name} ihn liefert. |
| entities.ndjson.gz | Entität, zusammengeführte eingeschlossen | Das Entitätsdokument genau wie /id/{opid}?history=1 es liefert, zurückgezogene Claims eingeschlossen. |
| records.ndjson.gz | Datensatz, zurückgezogene eingeschlossen | source, key, feed, opid, body, first_seen, last_seen, withdrawn_at. |
| groupings.ndjson.gz | Gruppierung | source, kind, key, opid. |
| merges.ndjson.gz | Zusammenführung, rückgängig gemachte eingeschlossen | from, into, decided_at, reverted_at. |
Zusammengeführte Entitäten
Eine zusammengeführte opid antwortet am Resolver mit 308 und hat deshalb kein eigenes Dokument zum Kopieren. Ihre Zeile ist das Dokument, das sie liefern würde, wäre sie nicht zusammengeführt (ihre eigenen Kennungen und Claims bleiben an ihr, das macht eine Zusammenführung umkehrbar), mit einem zusätzlichen Element, merged_into, der opid der verbleibenden Entität. Zusammenführungen verketten sich nicht: Die verbleibende Entität ist nie selbst zusammengeführt.
Eine Datensatzzeile
Ein Datensatz, wie der Index ihn hält. Jede Zeitangabe ist UTC, ISO 8601.
| Feld | Bedeutung |
|---|---|
| source | Der Name der Quelle. |
| key | Der key des Datensatzes in dieser Quelle. |
| feed | Die URL des Feeds, aus dem er gelesen wurde. Fehlt bei einem Datensatz aus einem Datensatzimport. |
| opid | Das Item, auf das er aufgelöst wurde. |
| body | Das org.prodid.item, das der Publisher gesendet hat, unverändert. |
| first_seen | Wann der Index ihn zuerst gelesen hat. |
| last_seen | Wann der Index ihn zuletzt gelesen hat. |
| withdrawn_at | Genau dann vorhanden, wenn der Datensatz zurückgezogen ist. |
Eine Gruppierungszeile
Auf welche Entität eine Gruppierung einer Quelle aufgelöst wurde. kind ist family oder variant, und key ist das, wonach die Datensätze der Quelle gruppiert sind, ausgeschrieben statt gehasht, damit eine andere Implementierung ihre eigene Gruppierung zuordnen kann.
family
{ "group": "<group>" }
für eine Publisher-Gruppe; { "key": "<key>" } für einen Datensatz ohne Gruppe, der eine eigene Familie ist.
variant
{ "family": <key der Familie>, "variant": { <Achse>: <Wert>, … } }
die Variante des Datensatzes, {} wenn er keine hat.
Eine Zusammenführungszeile
Eine Entscheidung zur Zusammenführung: from die zusammengeführte opid, into die verbleibende, decided_at wann sie getroffen wurde, und reverted_at, genau dann vorhanden, wenn sie rückgängig gemacht wurde.
Was ein Dump nie enthält
Ein Dump sagt nicht mehr als der Resolver ohnehin, plus die Datensätze, Gruppierungen und Zusammenführungen, aus denen seine Antworten gebaut sind.
- Die Kontaktadresse eines Publishers, die der Index nur hält, um die Lapse-Benachrichtigung zu senden.
- Das Crawl-Protokoll, die Fehlertexte des Crawlers oder sonst etwas über einen Crawl, das der Status der Quelle nicht zeigt.
- Warum eine Zusammenführung erfolgte oder wer sie entschieden hat.
- Warum ein Medien-Hash gesperrt wurde.
- Medien-Bytes. Die media_url eines Medien-Claims adressiert die Datei, und ein gesperrter Hash wird nicht ausgeliefert.
- Die internen Zeilenkennungen des Index. Jede Zeile nennt eine Quelle beim Namen und eine Entität bei ihrer opid.
- Die Freigaben und ihre Nachweise. Die Zeile einer Quelle sagt authoritative, wenn sie es zu snapshot_at war, aber ein aus dem Dump geladener Index hält keine Freigabe, bis sein eigener Betreiber eine erteilt.
Lizenzen
Zwei Regeln, und licenses im Manifest nennt beide.
index: CC0-1.0
Alles, was der Index erzeugt
opids, die Kennungszuordnungen, die Hierarchie aus Familie und Variante, Gruppierungen und Zusammenführungen.claims: source
Jeder Claim und jeder Datensatz
Unter der Lizenz, die seine eigene Quelle angibt: die
licenseder Zeile dieser Quelle insources.ndjson.gz. Eine Quelle ohne Angabe hat nichts eingeräumt, und prodid räumt in ihrem Namen nichts ein.
Ein offener Datensatz ohne eigenes Discovery-Dokument kommt als Quelle namens dataset:<slug> in den Index, importiert vom Betreiber des Index aus dem öffentlichen Export des Datensatzes. Eine solche Quelle ist immer unverified, und ihre license ist die des Datensatzes. Die Regeln stehen in der Spezifikation.
In einen eigenen Index laden
prodid-batch load-dump lädt einen v0- oder v1-Dump in eine leere PostgreSQL-18-Datenbank, die auf dieselbe Version migriert ist, in einer Transaktion. Es nimmt das datierte Verzeichnis eines Dumps, seine manifest.json oder eine latest.json, lokal oder über 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.jsonJede Datei wird gegen sha256, bytes und lines des Manifests geprüft, bevor etwas geschrieben wird, und ein entfernter Dump wird zuerst in ein temporäres Verzeichnis geladen. Eine nicht leere Datenbank wird abgelehnt. PRODID_OPERATOR wird als Entscheider der geladenen Zusammenführungen gespeichert.
Um eine Datei ohne Laden zu lesen, prüfen Sie sie gegen ihren Digest und entpacken Sie sie. Der Digest unten ist der aus dem neuesten Manifest zum Zeitpunkt, als diese Seite gebaut wurde.
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 1Die vollständigen Regeln stehen in der Spezifikation unter Dumps.
Die Spezifikation erscheint nur auf Englisch, und der englische Text ist der maßgebliche.