Zum Inhalt springen
prodid

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.

dumps.prodid.org
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.json

latest.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.

DateiEine Zeile proDie Zeile
sources.ndjson.gzQuelleDer Status der Quelle, genau wie /source/{name} ihn liefert.
entities.ndjson.gzEntität, zusammengeführte eingeschlossenDas Entitätsdokument genau wie /id/{opid}?history=1 es liefert, zurückgezogene Claims eingeschlossen.
records.ndjson.gzDatensatz, zurückgezogene eingeschlossensource, key, feed, opid, body, first_seen, last_seen, withdrawn_at.
groupings.ndjson.gzGruppierungsource, kind, key, opid.
merges.ndjson.gzZusammenführung, rückgängig gemachte eingeschlossenfrom, 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.

FeldBedeutung
sourceDer Name der Quelle.
keyDer key des Datensatzes in dieser Quelle.
feedDie URL des Feeds, aus dem er gelesen wurde. Fehlt bei einem Datensatz aus einem Datensatzimport.
opidDas Item, auf das er aufgelöst wurde.
bodyDas org.prodid.item, das der Publisher gesendet hat, unverändert.
first_seenWann der Index ihn zuerst gelesen hat.
last_seenWann der Index ihn zuletzt gelesen hat.
withdrawn_atGenau 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 license der Zeile dieser Quelle in sources.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.

aus einem Klon des Repositorys
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

Jede 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.

sources.ndjson.gz
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

Die vollständigen Regeln stehen in der Spezifikation unter Dumps.

Die Spezifikation erscheint nur auf Englisch, und der englische Text ist der maßgebliche.

prodid ist Open Source. Hilf mit, dass es wächst.

Gib dem Repository einen Stern, damit andere es finden, sag uns, was falsch ist, schick eine Korrektur oder schreib uns hier, ganz ohne GitHub-Konto.