Saltar al contenido
prodid

Guía para publicadores

Publica tus productos

Publicar en prodid significa poner dos archivos en la web y un registro en el DNS. En tu propio dominio no hay que registrarse ni guardar ninguna clave: el dominio es la credencial, y cambias o retiras lo que publicas cambiando los archivos.

¿Cómo vas a publicar?

Vía 1

Publica en tu propio dominio

Dos archivos y un registro DNS. Una plataforma que publica en nombre de comercios hace lo mismo en el dominio de cada uno, así que cada comercio conserva su identidad y su nivel de confianza.

0 de 4 pasos hechos
x
  1. Sirve el documento de descubrimiento

    Un archivo, en una ruta fija, que indica dónde están tus feeds de producto: https://acme.example/.well-known/prodid.json

    .well-known/prodid.jsonapplication/json
    {
    	"$type": "org.prodid.feed",
    	"version": 1,
    	"publisher": { "name": "Acme Tekstil", "contact": "data@acme.example" },
    	"license": "CC0-1.0",
    	"feeds": ["https://acme.example/prodid/items.ndjson"]
    }
    El ejemplo de spec/fixtures/v1/examples/prodid.json, generado a partir del propio archivo.
  2. Sirve el feed

    Un feed es NDJSON: un objeto JSON completo por línea, UTF-8, separado por saltos de línea. Sin un array alrededor ni comas entre líneas. Así un feed de dos millones de productos se lee línea a línea, y una línea mala te cuesta esa línea y no el resto.

    prodid/items.ndjsonapplication/x-ndjson
    {"$type":"org.prodid.item","key":"TJ-2041-NVY-M","brand":"Acme","name":"Trail Jacket","lang":"en","group":"TJ-2041","variant":{"color":"navy","size":"M"},"identifiers":[{"scheme":"gtin","value":"09506000134352"},{"scheme":"mpn","value":"TJ-2041-NVY-M"}],"markets":["TR","DE"],"properties":{"material":"100% recycled polyester","madeIn":"TR","weight":{"value":480,"unit":"g"}},"media":[{"url":"https://acme.example/img/tj2041-navy.webp","license":"CC-BY-4.0","kind":"image"}]}
    {"$type":"org.prodid.item","key":"TJ-2041-NVY-L","brand":"Acme","name":"Trail Jacket","lang":"en","group":"TJ-2041","variant":{"color":"navy","size":"L"},"identifiers":[{"scheme":"gtin","value":"09506000134406"},{"scheme":"mpn","value":"TJ-2041-NVY-L"}],"markets":["TR","DE"],"properties":{"material":"100% recycled polyester","madeIn":"TR","weight":{"value":505,"unit":"g"}},"media":[{"url":"https://acme.example/img/tj2041-navy.webp","license":"CC-BY-4.0","kind":"image"}]}
    {"$type":"org.prodid.item","key":"TJ-2041-OLV-M","brand":"Acme","name":"Trail Jacket","lang":"en","group":"TJ-2041","variant":{"color":"olive","size":"M"},"identifiers":[{"scheme":"gtin","value":"09506000134413"},{"scheme":"mpn","value":"TJ-2041-OLV-M"}],"markets":["TR"],"properties":{"material":"100% recycled polyester","madeIn":"TR","weight":{"value":480,"unit":"g"}},"media":[{"url":"https://acme.example/img/tj2041-olive.webp","license":"CC-BY-4.0","kind":"image"}]}
    Tres variantes de un producto, de spec/fixtures/v1/examples/items.ndjson. Comparten un group, así que el índice construye con ellas una familia de tres variantes.
  3. Reclama la identidad en el DNS

    Con los archivos ya publicados, publica un registro que nombre tu propio dominio como host.

    _prodid.acme.example TXT
    _prodid.acme.example. IN TXT "v=prodid0; host=acme.example"
  4. Avisa al índice del cambio

    Opcional. Cada dominio conocido se vuelve a rastrear según un calendario; un ping solo adelanta el siguiente rastreo.

    pedir al índice que ejecute el descubrimiento ahora
    curl -X POST https://prodid.org/ping \
      -H 'content-type: application/json' \
      -d '{"domain": "acme.example"}'
    
    HTTP/1.1 202 Accepted
    Content-Type: application/json
    
    {"status":"accepted"}

Vía 2

Delega el alojamiento, conserva la identidad

Muchos fabricantes tienen un dominio y no pueden poner un archivo en él. El feed se aloja en otro sitio y el dominio se prueba con DNS, así que la identidad de la fuente sigue siendo el dominio y el nivel de confianza sigue siendo verified. Crea un sitio en publish.prodid.org, escribe tu dominio y te muestra el registro exacto que debes añadir y lo comprueba por ti.

Cómo queda

0 de 4 pasos hechos
x
  1. Un catálogo subido a un slug alojado

    , por ejemplo acme.prodid.org, que sirve tanto el documento de descubrimiento como el feed.

  2. Un registro TXT en el dominio que tienes

    , que nombra ese host. Un host, nunca una URL, así que un registro nunca puede dirigir al rastreador a una dirección cualquiera.

    _prodid.acme.example TXT
    _prodid.acme.example. IN TXT "v=prodid0; host=acme.prodid.org"
  3. Un documento que nombra tu dominio de vuelta.

    El DNS dice mi documento está allí; el documento dice hablo por ese dominio. Un documento delegado sin domain se rechaza: la ausencia nunca se toma como consentimiento, y eso impide que alguien apunte un registro al feed de otro.

    acme.prodid.org/.well-known/prodid.jsonapplication/json
    {
    	"$type": "org.prodid.feed",
    	"version": 1,
    	"domain": "acme.example",
    	"publisher": { "name": "Acme Tekstil", "contact": "data@acme.example" },
    	"license": "CC0-1.0",
    	"feeds": ["https://acme.prodid.org/feeds/items.ndjson"]
    }
    De spec/fixtures/v1/examples/prodid.delegated.json. La única diferencia con la vía 1 es el campo domain, y aquí es obligatorio.
  4. Crea tu sitio

    El publicador alojado escribe domain en el documento solo después de ver tu registro TXT él mismo, así que no hay ningún momento en que un documento reclame un dominio que no lo ha pedido.

Vía 3

Publica sin dominio

0 de 1 pasos hechos
x
  1. Crea tu sitio

    Un productor sin ningún dominio publica en un slug alojado, <slug>.prodid.org, con su propio nombre. Reserva uno en publish.prodid.org. La identidad de la fuente es el host del slug y el nivel de confianza unverified, porque no se ha probado nada sobre un dominio. Los registros son registros de verdad: identificadores, resolución, atribución.

Comprueba tu dominio

¿Has terminado de publicar? Introduce tu dominio. Se le pide al índice que lo revise ahora y llegas a su página de estado en vivo.

El próximo rastreo actualiza el estado en unos minutos.

Comprueba tus archivos antes del ping

prodid-batch check valida tu documento de descubrimiento y cada feed exactamente como lo haría el índice, sin token y sin preguntarle nada al índice. Se ejecuta desde un clon del repositorio con Bun 1.4.4. Dale los archivos en sí: una ruta que termina en .json se lee como un documento, cualquier otra como un feed NDJSON.

valida lo que sirves, como lo hará el índice
git clone https://github.com/productdevbook/prodid
cd prodid
bun install --frozen-lockfile
curl -fsSo prodid.json https://acme.example/.well-known/prodid.json
curl -fsSo items.ndjson https://acme.example/prodid/items.ndjson
bun apps/batch/src/cli.ts check prodid.json items.ndjson

prodid.json: ok, 1 record
items.ndjson: ok, 3 records

Un archivo sin problemas imprime ok y el número de registros que el índice tomaría de él. Si no, imprime una línea por problema, como items.ndjson:12: message con la línea del feed en la que está, y sale con un código distinto de cero. Lee los archivos, no tu DNS ni tu servidor, así que el registro TXT, el tipo de contenido y las cabeceras de caché de la lista de arriba siguen siendo cosa tuya.

Las reglas con las que se valida un registro están en la especificación, los esquemas se sirven en /spec/schemas/v1, y /spec/fixtures/v1 tiene vectores legibles por máquina con los que probar tu exportador antes de que nadie lo rastree.

La especificación se publica solo en inglés, y el texto en inglés es el normativo.

Estado: Spec v1. El índice y el publicador alojado funcionan en prodid.org. Cualquiera puede publicar, en su propio dominio o alojado. Los formatos de archivo de esta página son los que lee el índice cuando le haces ping.

Referencia

prodid es de código abierto. Ayúdalo a crecer.

Dale una estrella al repositorio para que otros lo encuentren, cuéntanos qué está mal, envía una corrección o escríbenos aquí sin cuenta de GitHub.