Открытые данные
Скачать индекс
Индекс заменим. Всё, что он знает и что может знать читатель, публикуется как полная выгрузка — дамп, который любой может скачать и загрузить в собственный индекс.
Последний дамп
На момент сборки этой страницы самым свежим был снимок, сделанный . Новый пишется каждую ночь в 04:30 UTC, а latest.jsonвсегда указывает на самый свежий.
- sources.ndjson.gz
строк: 2 · 446 B
Одна строка на источник.
sha256 0bb6045c5ba3c73d6756f3b5ec2e8910b28f147fd80f6403d542554f8879ba8c
- entities.ndjson.gz
строк: 24 · 1.9 KiB
Одна строка на сущность, включая слитые.
sha256 1333fd9c883d4c4679a2288d874586caae364238233b04163aae8479bf72915c
- records.ndjson.gz
строк: 9 · 1.2 KiB
Одна строка на запись, включая отозванные.
sha256 cfdfb40fd5cdd941d65adbe559ca491261971ca328316741630d155e179a4600
- groupings.ndjson.gz
строк: 15 · 501 B
Одна строка на группировку.
sha256 5c562f31473d5f2b8f8551caca0f1cbb2d2f3e35f542af1e2ee6e5f35f3f261e
- merges.ndjson.gz
строк: 0 · 20 B
Одна строка на слияние, включая отменённые.
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. В нём пять файлов данных и манифест.
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. Дампы v0, записанные до v1, остаются в https://dumps.prodid.org/v0/ с тем же сроком хранения, а v0/latest.json по-прежнему указывает на последний из них. Они навсегда проходят проверку по схемам v0.
Манифест. Называет каждый из пяти файлов ровно один раз, с SHA-256 и размером файла в отдаваемом сжатом виде и числом строк после распаковки. Перед загрузкой сверяйте каждый файл с его хешем. Схема — https://prodid.org/schemas/v1/org.prodid.dump.json, векторы — в /spec/fixtures/v1/dump.
Что содержит каждый файл
Каждый файл — NDJSON, сжатый gzip, по одному JSON-объекту на строку. Все пять читаются из одного согласованного снимка, поэтому согласуются друг с другом: у каждого источника, названного в строке, есть своя строка в sources.ndjson.gz, а у каждого opid, названного в строке, — своя строка в entities.ndjson.gz.
| Файл | Одна строка на | Строка |
|---|---|---|
| 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, поэтому у него нет собственного документа для копирования. Его строка — документ, который он отдавал бы, не будь он слит (его собственные идентификаторы и утверждения остаются на нём, и это делает слияние обратимым), плюс ещё один элемент, merged_into — opid оставшейся сущности. Слияния не образуют цепочек: оставшаяся сущность сама никогда не слита.
Строка записи
Одна запись в том виде, в каком её хранит индекс. Всё время — в UTC, ISO 8601.
| Поле | Что это |
|---|---|
| source | Имя источника. |
| key | Key записи в этом источнике. |
| feed | URL фида, из которого она прочитана. Отсутствует у записи, созданной импортом набора данных. |
| opid | Item, в который она разрешилась. |
| body | org.prodid.item, отправленный издателем, без изменений. |
| first_seen | Когда индекс впервые её прочитал. |
| last_seen | Когда индекс прочитал её в последний раз. |
| withdrawn_at | Присутствует ровно тогда, когда запись отозвана. |
Строка группировки
В какую сущность разрешилась группировка источника. kind — family или variant, а key — то, по чему сгруппированы записи источника, записанное явно, а не хешем, чтобы другая реализация могла сопоставить с ним свою группировку.
family
{ "group": "<group>" }
для группы издателя; { "key": "<key>" } для записи без группы, которая сама по себе семейство.
variant
{ "family": <key семейства>, "variant": { <ось>: <значение>, … } }
вариант записи, {} если его нет.
Строка слияния
Одно решение о слиянии: from — слитый opid, into — оставшаяся сущность, decided_at — когда оно принято, и reverted_at, присутствующий ровно тогда, когда слияние отменено.
Чего в дампе никогда нет
Дамп говорит не больше, чем уже говорит резолвер, плюс записи, группировки и слияния, из которых построены его ответы.
- Контактный адрес издателя, который индекс хранит только для уведомления о lapse.
- Журнал обхода, тексты ошибок обходчика и всё прочее об обходе, чего не показывает статус источника.
- Почему было сделано слияние и кто его решил.
- Почему был заблокирован хеш медиа.
- Байты медиа. media_url медиа-утверждения указывает на файл, а заблокированный хеш не отдаётся.
- Внутренние идентификаторы строк индекса. Каждая строка называет источник по имени, а сущность по opid.
- Выдачи полномочий и их доказательства. Строка источника говорит authoritative, если он был таким на snapshot_at, но индекс, загруженный из дампа, не имеет выдач, пока его собственный оператор не сделает их.
Лицензии
Два правила, и licenses в манифесте указывает оба.
index: CC0-1.0
Всё, что создаёт индекс
opid, сопоставления идентификаторов, иерархия семейств и вариантов, группировки и слияния.claims: source
Каждое утверждение и каждая запись
Под лицензией, которую объявляет их источник:
licenseстроки этого источника вsources.ndjson.gz. Источник, не объявивший лицензию, ничего не предоставил, и prodid ничего не предоставляет от его имени.
Открытый набор данных, не публикующий собственного документа обнаружения, попадает в индекс как источник с именем dataset:<slug>, импортированный оператором индекса из публичной выгрузки набора. Такой источник всегда unverified, а его license — лицензия самого набора. Правила — в спецификации.
Загрузить в собственный индекс
prodid-batch load-dump загружает дамп v0 или v1 в пустую базу PostgreSQL 18, мигрированную до той же версии, одной транзакцией. Принимает датированный каталог дампа, его 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.
Спецификация публикуется только на английском, и нормативным считается английский текст.