Aller au contenu
prodid

Guide de l’éditeur

Publier vos produits

Publier sur prodid, c’est mettre deux fichiers sur le web et un enregistrement dans le DNS. Sur votre propre domaine, il n’y a ni inscription ni clé à garder : le domaine est l’identifiant, et vous modifiez ou retirez ce que vous publiez en modifiant les fichiers.

Comment allez-vous publier ?

Voie 1

Publier sur votre propre domaine

Deux fichiers et un enregistrement DNS. Une plateforme qui publie pour des marchands fait la même chose sur chaque domaine marchand, si bien que chacun garde sa propre identité et son propre niveau de confiance.

0 étapes sur 4 faites
x
  1. Servir le document de découverte

    Un fichier, à un chemin fixe, qui indique où sont vos flux produit : 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"]
    }
    L’exemple de spec/fixtures/v1/examples/prodid.json, rendu à partir du fichier lui-même.
  2. Servir le flux

    Un flux est du NDJSON : un objet JSON complet par ligne, UTF-8, séparé par des retours à la ligne. Pas de tableau autour, pas de virgules entre les lignes. Ainsi un flux de deux millions de produits se lit ligne à ligne, et une ligne défectueuse ne vous coûte que cette ligne, pas le reste.

    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"}]}
    Trois variantes d’un produit, tirées de spec/fixtures/v1/examples/items.ndjson. Elles partagent un group, donc l’index en construit une famille à trois variantes.
  3. Revendiquer l’identité dans le DNS

    Une fois les fichiers en ligne, publiez un enregistrement qui nomme votre propre domaine comme hôte.

    _prodid.acme.example TXT
    _prodid.acme.example. IN TXT "v=prodid0; host=acme.example"
  4. Signaler le changement à l’index

    Facultatif. Chaque domaine connu est réexploré selon un calendrier ; un ping ne fait qu’avancer la prochaine exploration.

    demander à l’index de lancer la découverte maintenant
    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"}

Voie 2

Déléguer l’hébergement, garder l’identité

Beaucoup de fabricants possèdent un domaine sans pouvoir y déposer de fichier. Le flux est hébergé ailleurs et le domaine prouvé par le DNS : l’identité de la source reste le domaine et le niveau de confiance reste verified. Créez un site sur publish.prodid.org, saisissez votre domaine ; il affiche l’enregistrement exact à ajouter et le vérifie pour vous.

À quoi cela ressemble

0 étapes sur 4 faites
x
  1. Un catalogue téléversé sur un slug hébergé

    , par exemple acme.prodid.org, qui sert à la fois le document de découverte et le flux.

  2. Un enregistrement TXT sur le domaine que vous possédez

    , qui nomme cet hôte. Un hôte, jamais une URL : un enregistrement ne peut donc jamais diriger le robot vers une adresse arbitraire.

    _prodid.acme.example TXT
    _prodid.acme.example. IN TXT "v=prodid0; host=acme.prodid.org"
  3. Un document qui nomme votre domaine en retour.

    Le DNS dit mon document est là-bas ; le document dit je parle pour ce domaine. Un document délégué sans domain est rejeté : l’absence ne vaut jamais consentement, et c’est ce qui empêche quiconque de pointer un enregistrement vers le flux de quelqu’un d’autre.

    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"]
    }
    Tiré de spec/fixtures/v1/examples/prodid.delegated.json. La seule différence avec la voie 1 est le champ domain, et ici il est obligatoire.
  4. Créez votre site

    L’éditeur hébergé n’écrit domain dans le document qu’après avoir vu lui-même votre enregistrement TXT : il n’y a donc aucun moment où un document revendique un domaine qui ne l’a pas demandé.

Voie 3

Publier sans domaine

0 étapes sur 1 faites
x
  1. Créez votre site

    Un producteur sans aucun domaine publie sur un slug hébergé, <slug>.prodid.org, sous son propre nom. Réservez-en un sur publish.prodid.org. L’identité de la source est l’hôte du slug et le niveau de confiance unverified, car rien n’a été prouvé sur un domaine. Les enregistrements sont de vrais enregistrements : identifiants, résolution, attribution.

Vérifiez votre domaine

Publication terminée ? Saisissez votre domaine. L’index est invité à l’examiner maintenant, et vous arrivez sur sa page d’état en direct.

Le prochain crawl met l’état à jour en quelques minutes.

Vérifier vos fichiers avant le ping

prodid-batch check valide votre document de découverte et chaque flux exactement comme l’index le ferait, sans jeton et sans rien demander à l’index. Il s’exécute depuis un clone du dépôt avec Bun 1.4.4. Donnez-lui les fichiers eux-mêmes : un chemin finissant par .json est lu comme un document, tout autre chemin comme un flux NDJSON.

valider ce que vous servez, comme le fera l’index
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 fichier sans problème affiche ok et le nombre d’enregistrements que l’index en tirerait. Sinon, il affiche une ligne par problème, sous la forme items.ndjson:12: message avec la ligne du flux concernée, et se termine avec un code non nul. Il lit les fichiers, pas votre DNS ni votre serveur : l’enregistrement TXT, le type de contenu et les en-têtes de cache de la liste ci-dessus restent à vérifier par vous.

Les règles de validation d’un enregistrement sont dans la spécification, les schémas sont servis sur /spec/schemas/v1, et /spec/fixtures/v1 contient des vecteurs lisibles par machine sur lesquels tester votre export avant que quiconque l’explore.

La spécification est publiée en anglais uniquement, et c’est le texte anglais qui fait foi.

État : Spec v1. L’index et l’éditeur hébergé tournent sur prodid.org. Tout le monde peut publier, sur son propre domaine ou en hébergé. Les formats de fichier de cette page sont ceux que lit l’index quand vous le pingez.

Référence

prodid est open source. Aidez-le à grandir.

Mettez une étoile au dépôt pour que d’autres le trouvent, signalez ce qui ne va pas, envoyez un correctif ou écrivez-nous ici, sans compte GitHub.