Données ouvertes
Télécharger l’index
L’index est remplaçable. Tout ce qu’il sait et qu’un lecteur peut savoir est publié sous forme d’export complet, un dump, que chacun peut télécharger et charger dans son propre index.
Le dernier dump
Au moment de la construction de cette page, le dump le plus récent était l’instantané pris le . Un nouveau est écrit chaque nuit à 04:30 UTC, et latest.jsonnomme toujours le plus récent.
- sources.ndjson.gz
2 lignes · 446 B
Une ligne par source.
sha256 0bb6045c5ba3c73d6756f3b5ec2e8910b28f147fd80f6403d542554f8879ba8c
- entities.ndjson.gz
24 lignes · 1.9 KiB
Une ligne par entité, fusionnées comprises.
sha256 1333fd9c883d4c4679a2288d874586caae364238233b04163aae8479bf72915c
- records.ndjson.gz
9 lignes · 1.2 KiB
Une ligne par enregistrement, retirés compris.
sha256 cfdfb40fd5cdd941d65adbe559ca491261971ca328316741630d155e179a4600
- groupings.ndjson.gz
15 lignes · 501 B
Une ligne par regroupement.
sha256 5c562f31473d5f2b8f8551caca0f1cbb2d2f3e35f542af1e2ee6e5f35f3f261e
- merges.ndjson.gz
0 lignes · 20 B
Une ligne par fusion, annulées comprises.
sha256 59869db34853933b239f1e2219cf7d431da006aa919635478511fabbfc8849d2
Le répertoire de ce dump est https://dumps.prodid.org/v1/2026-10-29/, et son manifeste est manifest.json, écrit le 2026-10-29 04:30 UTC. Ses licences indiquent index: CC0-1.0 et claims: source.
Où sont conservés les dumps
Un dump est un répertoire nommé d’après la date UTC de son instantané, sous la version dans laquelle il est écrit. v1/ contient les dumps v1, dont le manifeste et les lignes de source et d’entité sont des documents v1. Il contient cinq fichiers de données et un manifeste.
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 est écrit en dernier. C’est une copie du manifest.json du dump le plus récent, écrite après que chaque fichier de ce dump et son manifeste sont en place. Un lecteur qui part de lui ne trouve jamais un manifeste nommant un fichier encore absent, et trouve le répertoire grâce au snapshot_at du manifeste.
Conservation. Un dump quotidien est conservé 7 jours. Le premier dump de chaque mois UTC est conservé définitivement. Un dump conservé n’est jamais réécrit : son répertoire, ses fichiers et son manifeste restent identiques à l’octet près.
Dumps v0. Les dumps v0 écrits avant la v1 restent sous https://dumps.prodid.org/v0/, avec la même conservation, et v0/latest.json continue de nommer le dernier d’entre eux. Ils restent valides selon les schémas v0.
Le manifeste. Il nomme chacun des cinq fichiers exactement une fois, avec le SHA-256 et la taille du fichier tel qu’il est servi, compressé, et son nombre de lignes une fois décompressé. Vérifiez chaque fichier par rapport à son empreinte avant de le charger. Le schéma est https://prodid.org/schemas/v1/org.prodid.dump.json, avec des vecteurs dans /spec/fixtures/v1/dump.
Ce que contient chaque fichier
Chaque fichier est du NDJSON compressé en gzip, un objet JSON par ligne. Les cinq sont lus dans un même instantané cohérent, donc ils concordent : chaque source nommée par une ligne a sa ligne dans sources.ndjson.gz, et chaque opid nommé par une ligne a sa ligne dans entities.ndjson.gz.
| Fichier | Une ligne par | La ligne |
|---|---|---|
| sources.ndjson.gz | source | L’état de la source, exactement comme /source/{name} le renvoie. |
| entities.ndjson.gz | entité, fusionnées comprises | Le document d’entité exactement comme /id/{opid}?history=1 le renvoie, assertions retirées comprises. |
| records.ndjson.gz | enregistrement, retirés compris | source, key, feed, opid, body, first_seen, last_seen, withdrawn_at. |
| groupings.ndjson.gz | regroupement | source, kind, key, opid. |
| merges.ndjson.gz | fusion, annulées comprises | from, into, decided_at, reverted_at. |
Entités fusionnées
Un opid fusionné répond 308 au résolveur, il n’a donc pas de document propre à copier. Sa ligne est le document qu’il renverrait s’il n’était pas fusionné (ses propres identifiants et assertions y restent, ce qui rend une fusion réversible) avec un membre de plus, merged_into, l’opid de l’entité conservée. Les fusions ne s’enchaînent pas : l’entité conservée n’est jamais elle-même fusionnée.
Une ligne d’enregistrement
Un enregistrement tel que l’index le conserve. Toutes les dates sont en UTC, ISO 8601.
| Champ | Ce que c’est |
|---|---|
| source | Le nom de la source. |
| key | La key de l’enregistrement dans cette source. |
| feed | L’URL du flux d’où il a été lu. Absente pour un enregistrement écrit par un import de jeu de données. |
| opid | L’item auquel il s’est résolu. |
| body | L’org.prodid.item envoyé par l’éditeur, inchangé. |
| first_seen | Quand l’index l’a lu pour la première fois. |
| last_seen | Quand l’index l’a lu pour la dernière fois. |
| withdrawn_at | Présent exactement quand l’enregistrement est retiré. |
Une ligne de regroupement
L’entité à laquelle un regroupement d’une source s’est résolu. kind vaut family ou variant, et key est ce sur quoi les enregistrements de la source sont regroupés, écrit en clair plutôt que haché, pour qu’une autre implémentation puisse y faire correspondre son propre regroupement.
family
{ "group": "<group>" }
pour un groupe de l’éditeur ; { "key": "<key>" } pour un enregistrement sans groupe, qui forme une famille à lui seul.
variant
{ "family": <la key de la famille>, "variant": { <axe>: <valeur>, … } }
la variante de l’enregistrement, {} s’il n’en a pas.
Une ligne de fusion
Une décision de fusion : from l’opid fusionné, into l’entité conservée, decided_at le moment de la décision, et reverted_at, présent exactement quand elle a été annulée.
Ce qu’un dump ne contient jamais
Un dump n’en dit pas plus que le résolveur, plus les enregistrements, regroupements et fusions à partir desquels ses réponses sont construites.
- L’adresse de contact d’un éditeur, que l’index ne garde que pour envoyer l’avis de lapse.
- Le journal d’exploration, les messages d’erreur du robot, ou tout autre élément d’une exploration que l’état de la source ne montre pas.
- Pourquoi une fusion a été faite ou qui l’a décidée.
- Pourquoi une empreinte de média a été bloquée.
- Les octets des médias. Le media_url d’une assertion média désigne le fichier, et une empreinte bloquée n’est pas servie.
- Les identifiants de ligne internes de l’index. Chaque ligne désigne une source par son nom et une entité par son opid.
- Les attributions d’autorité et leurs preuves. La ligne d’une source indique authoritative si elle l’était à snapshot_at, mais un index chargé depuis le dump ne détient aucune attribution tant que son propre opérateur n’en a pas accordé.
Licences
Deux règles, et le champ licenses du manifeste énonce les deux.
index: CC0-1.0
Tout ce que produit l’index
Les
opid, les correspondances d’identifiants, la hiérarchie famille et variante, les regroupements et les fusions.claims: source
Chaque assertion et chaque enregistrement
Sous la licence que déclare sa propre source : la
licensede la ligne de cette source danssources.ndjson.gz. Une source qui n’en déclare aucune n’a rien accordé, et prodid n’accorde rien en son nom.
Un jeu de données ouvert qui ne publie pas de document de découverte entre dans l’index comme une source nommée dataset:<slug>, importée par l’opérateur de l’index depuis l’export public du jeu de données. Une telle source est toujours unverified, et sa license est celle du jeu de données. Les règles sont dans la spécification.
Le charger dans votre propre index
prodid-batch load-dump charge un dump v0 ou v1 dans une base PostgreSQL 18 vide migrée à la même version, en une seule transaction. Il prend le répertoire daté d’un dump, son manifest.json ou un latest.json, en local ou en 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.jsonChaque fichier est vérifié par rapport aux sha256, bytes et lines du manifeste avant toute écriture, et un dump distant est d’abord téléchargé dans un répertoire temporaire. Une base non vide est refusée. PRODID_OPERATOR est enregistré comme décideur des fusions chargées.
Pour lire un fichier sans le charger, vérifiez-le par rapport à son empreinte et décompressez-le. L’empreinte ci-dessous est celle du dernier manifeste au moment de la construction de cette page.
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 1Les règles complètes sont dans la spécification, sous Dumps.
La spécification est publiée en anglais uniquement, et c’est le texte anglais qui fait foi.