Перейти к содержимому
prodid

Открытые данные

Скачать индекс

Индекс заменим. Всё, что он знает и что может знать читатель, публикуется как полная выгрузка — дамп, который любой может скачать и загрузить в собственный индекс.

Последний дамп

На момент сборки этой страницы самым свежим был снимок, сделанный . Новый пишется каждую ночь в 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. В нём пять файлов данных и манифест.

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 пишется последним. Это копия 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Имя источника.
keyKey записи в этом источнике.
feedURL фида, из которого она прочитана. Отсутствует у записи, созданной импортом набора данных.
opidItem, в который она разрешилась.
bodyorg.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 записывается как принявший решение о загруженных слияниях.

Чтобы прочитать файл без загрузки, сверьте его с хешем и распакуйте. Хеш ниже взят из последнего манифеста на момент сборки этой страницы.

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

Полные правила — в спецификации, в разделе Dumps.

Спецификация публикуется только на английском, и нормативным считается английский текст.

prodid — открытый проект. Помогите ему расти.

Поставьте звезду репозиторию, чтобы его нашли другие, сообщите, что не так, пришлите исправление или напишите нам здесь без аккаунта GitHub.