Dados abertos
Baixe o índice
O índice é substituível. Tudo o que ele sabe e que um leitor pode saber é publicado como uma exportação completa, um dump, que qualquer pessoa pode baixar e carregar num índice próprio.
O dump mais recente
Quando esta página foi gerada, o dump mais recente era o snapshot tirado em . Um novo é gravado toda noite às 04:30 UTC, e latest.jsonsempre nomeia o mais recente.
- sources.ndjson.gz
2 linhas · 446 B
Uma linha por fonte.
sha256 0bb6045c5ba3c73d6756f3b5ec2e8910b28f147fd80f6403d542554f8879ba8c
- entities.ndjson.gz
24 linhas · 1.9 KiB
Uma linha por entidade, incluindo as fundidas.
sha256 1333fd9c883d4c4679a2288d874586caae364238233b04163aae8479bf72915c
- records.ndjson.gz
9 linhas · 1.2 KiB
Uma linha por registro, incluindo os retirados.
sha256 cfdfb40fd5cdd941d65adbe559ca491261971ca328316741630d155e179a4600
- groupings.ndjson.gz
15 linhas · 501 B
Uma linha por agrupamento.
sha256 5c562f31473d5f2b8f8551caca0f1cbb2d2f3e35f542af1e2ee6e5f35f3f261e
- merges.ndjson.gz
0 linhas · 20 B
Uma linha por fusão, incluindo as revertidas.
sha256 59869db34853933b239f1e2219cf7d431da006aa919635478511fabbfc8849d2
O diretório deste dump é https://dumps.prodid.org/v1/2026-10-29/, e o manifesto é manifest.json, gravado em 2026-10-29 04:30 UTC. As licenças dele dizem index: CC0-1.0 e claims: source.
Onde os dumps ficam
Um dump é um diretório com o nome da data UTC do seu snapshot, dentro da versão em que foi gravado. v1/ guarda dumps v1, cujo manifesto e cujas linhas de fonte e entidade são documentos v1. Ele contém cinco arquivos de dados e um manifesto.
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 é gravado por último. É uma cópia do manifest.json do dump mais recente, gravada depois que todos os arquivos desse dump e o manifesto estão no lugar. Quem começa por ele nunca encontra um manifesto nomeando um arquivo que ainda não existe, e acha o diretório pelo próprio snapshot_at do manifesto.
Retenção. Um dump diário é mantido por 7 dias. O primeiro dump de cada mês UTC é mantido para sempre. Um dump mantido nunca é regravado: diretório, arquivos e manifesto ficam byte a byte como estavam.
Dumps v0. Os dumps v0 gravados antes da v1 continuam em https://dumps.prodid.org/v0/, com a mesma retenção, e v0/latest.json continua nomeando o último deles. Eles validam contra os schemas v0 para sempre.
O manifesto. Nomeia cada um dos cinco arquivos exatamente uma vez, com o SHA-256 e o tamanho do arquivo como servido, compactado, e o número de linhas depois de descompactado. Confira cada arquivo contra o seu digest antes de carregar. O schema é https://prodid.org/schemas/v1/org.prodid.dump.json, com vetores em /spec/fixtures/v1/dump.
O que cada arquivo contém
Todo arquivo é NDJSON compactado com gzip, um objeto JSON por linha. Os cinco são lidos de um mesmo snapshot consistente, então batem entre si: toda fonte que uma linha nomeia tem sua linha em sources.ndjson.gz, e todo opid que uma linha nomeia tem sua linha em entities.ndjson.gz.
| Arquivo | Uma linha por | A linha |
|---|---|---|
| sources.ndjson.gz | fonte | O status da fonte, exatamente como /source/{name} responde. |
| entities.ndjson.gz | entidade, incluindo as fundidas | O documento da entidade exatamente como /id/{opid}?history=1 responde, incluindo afirmações retiradas. |
| records.ndjson.gz | registro, incluindo os retirados | source, key, feed, opid, body, first_seen, last_seen, withdrawn_at. |
| groupings.ndjson.gz | agrupamento | source, kind, key, opid. |
| merges.ndjson.gz | fusão, incluindo as revertidas | from, into, decided_at, reverted_at. |
Entidades fundidas
Um opid fundido responde 308 no resolvedor, então não tem documento próprio para copiar. A linha dele é o documento que ele responderia se não estivesse fundido (os próprios identificadores e afirmações continuam nele, e é isso que torna uma fusão reversível) com um membro a mais, merged_into, o opid da entidade que permanece. Fusões não se encadeiam: a entidade que permanece nunca está fundida também.
Uma linha de registro
Um registro como o índice o guarda. Todo horário é UTC, ISO 8601.
| Campo | O que é |
|---|---|
| source | O nome da fonte. |
| key | A key do registro nessa fonte. |
| feed | A URL do feed de onde foi lido. Ausente num registro gravado por uma importação de conjunto de dados. |
| opid | O item para o qual ele resolveu. |
| body | O org.prodid.item que o publicador enviou, sem mudanças. |
| first_seen | Quando o índice o leu pela primeira vez. |
| last_seen | Quando o índice o leu pela última vez. |
| withdrawn_at | Presente exatamente quando o registro está retirado. |
Uma linha de agrupamento
Para qual entidade um agrupamento de uma fonte resolveu. kind é family ou variant, e key é aquilo pelo que os registros da fonte são agrupados, escrito por extenso em vez de resumido, para que outra implementação consiga casar o próprio agrupamento com ele.
family
{ "group": "<group>" }
para um grupo do publicador; { "key": "<key>" } para um registro sem grupo, que é uma família sozinho.
variant
{ "family": <a key da família>, "variant": { <eixo>: <valor>, … } }
a variante do registro, {} quando não tem.
Uma linha de fusão
Uma decisão de fusão: from o opid fundido, into a entidade que permanece, decided_at quando foi tomada e reverted_at, presente exatamente quando foi revertida.
O que um dump nunca contém
Um dump não diz mais do que o resolvedor já diz, mais os registros, agrupamentos e fusões a partir dos quais as respostas dele são montadas.
- O endereço de contato de um publicador, que o índice guarda só para mandar o aviso de lapse.
- O log de rastreamento, o texto de erro do rastreador ou qualquer outra coisa sobre um rastreamento que o status da fonte não mostre.
- Por que uma fusão foi feita ou quem a decidiu.
- Por que um hash de mídia foi bloqueado.
- Os bytes da mídia. O media_url de uma afirmação de mídia aponta para o arquivo, e um hash bloqueado não é servido.
- Os identificadores internos de linha do índice. Toda linha nomeia uma fonte pelo nome e uma entidade pelo opid.
- As concessões de autoridade e as evidências delas. A linha de uma fonte diz authoritative se ela era em snapshot_at, mas um índice carregado do dump não tem nenhuma concessão até o próprio operador conceder uma.
Licenças
Duas regras, e o licenses do manifesto declara as duas.
index: CC0-1.0
Tudo o que o índice cria
Os
opid, os mapeamentos de identificadores, a hierarquia de família e variante, agrupamentos e fusões.claims: source
Toda afirmação e todo registro
Sob a licença que a própria fonte declara: a
licenseda linha dessa fonte emsources.ndjson.gz. Uma fonte que não declara nenhuma não concedeu nada, e o prodid não concede nada em nome dela.
Um conjunto de dados aberto que não publica documento de descoberta próprio entra no índice como uma fonte chamada dataset:<slug>, importada pelo operador do índice a partir da exportação pública do conjunto. Essa fonte é sempre unverified, e a license dela é a do próprio conjunto. As regras estão na especificação.
Carregue no seu próprio índice
prodid-batch load-dump carrega um dump v0 ou v1 num banco PostgreSQL 18 vazio migrado para a mesma versão, numa única transação. Ele aceita o diretório datado de um dump, o manifest.json dele ou um latest.json, local ou por 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.jsonCada arquivo é conferido contra os sha256, bytes e lines do manifesto antes de qualquer gravação, e um dump remoto é baixado antes para um diretório temporário. Um banco que não está vazio é recusado. PRODID_OPERATOR é registrado como quem decidiu as fusões carregadas.
Para ler um arquivo sem carregá-lo, confira contra o digest e descompacte. O digest abaixo é o do manifesto mais recente quando esta página foi gerada.
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 1As regras completas estão na especificação, em Dumps.
A especificação é publicada apenas em inglês, e o texto em inglês é o normativo.