Pular para o conteúdo
prodid

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.

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

ArquivoUma linha porA linha
sources.ndjson.gzfonteO status da fonte, exatamente como /source/{name} responde.
entities.ndjson.gzentidade, incluindo as fundidasO documento da entidade exatamente como /id/{opid}?history=1 responde, incluindo afirmações retiradas.
records.ndjson.gzregistro, incluindo os retiradossource, key, feed, opid, body, first_seen, last_seen, withdrawn_at.
groupings.ndjson.gzagrupamentosource, kind, key, opid.
merges.ndjson.gzfusão, incluindo as revertidasfrom, 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.

CampoO que é
sourceO nome da fonte.
keyA key do registro nessa fonte.
feedA URL do feed de onde foi lido. Ausente num registro gravado por uma importação de conjunto de dados.
opidO item para o qual ele resolveu.
bodyO org.prodid.item que o publicador enviou, sem mudanças.
first_seenQuando o índice o leu pela primeira vez.
last_seenQuando o índice o leu pela última vez.
withdrawn_atPresente 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 license da linha dessa fonte em sources.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.

a partir de um clone do repositório
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

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

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

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

O prodid é código aberto. Ajude-o a crescer.

Dê uma estrela ao repositório para que outros o encontrem, conte o que está errado, envie uma correção ou escreva para nós aqui, sem conta no GitHub.