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

Руководство издателя

Опубликовать товары

Публикация в prodid — это два файла в вебе и одна запись в DNS. На своём домене не нужно ни регистрироваться, ни хранить ключи: домен и есть удостоверение, а изменить или отозвать опубликованное можно, изменив файлы.

Как вы будете публиковать?

Путь 1

Публикация на своём домене

Два файла и одна DNS-запись. Платформа, публикующая от имени магазинов, делает то же самое на домене каждого магазина, поэтому каждый сохраняет свою идентичность и свой уровень доверия.

Выполнено шагов: 0 из 4
x
  1. Отдайте документ обнаружения

    Один файл по фиксированному пути, где перечислено, где лежат ваши фиды: 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"]
    }
    Пример из spec/fixtures/v1/examples/prodid.json, собранный из самого файла.
  2. Отдайте фид

    Фид — это NDJSON: один полный JSON-объект на строку, UTF-8, строки разделены переводом строки. Без массива вокруг и без запятых между строками. Так фид на два миллиона товаров читается построчно, а одна плохая строка стоит вам только этой строки, а не остальных.

    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"}]}
    Три варианта одного товара из spec/fixtures/v1/examples/items.ndjson. У них общий group, поэтому индекс строит из них одно семейство с тремя вариантами.
  3. Закрепите идентичность в DNS

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

    _prodid.acme.example TXT
    _prodid.acme.example. IN TXT "v=prodid0; host=acme.example"
  4. Сообщите индексу об изменении

    Необязательно. Каждый известный домен обходится заново по расписанию, а пинг лишь приближает следующий обход.

    попросить индекс запустить обнаружение сейчас
    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"}

Путь 2

Делегируйте хостинг, сохраните идентичность

Многие производители владеют доменом, но не могут положить на него файл. Фид размещается в другом месте, а домен подтверждается через DNS, поэтому идентичность источника по-прежнему домен, а уровень доверия по-прежнему verified. Создайте сайт на publish.prodid.org, введите домен — сервис покажет точную запись для добавления и проверит её за вас.

Как это выглядит

Выполнено шагов: 0 из 4
x
  1. Каталог, загруженный на slug на хостинге

    , например acme.prodid.org, который отдаёт и документ обнаружения, и фид.

  2. Одна запись TXT на вашем домене

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

    _prodid.acme.example TXT
    _prodid.acme.example. IN TXT "v=prodid0; host=acme.prodid.org"
  3. Документ, который называет ваш домен в ответ.

    DNS говорит мой документ вон там; документ говорит я говорю от имени этого домена. Делегированный документ без domain отклоняется: отсутствие никогда не считается согласием, и именно это не даёт никому направить запись на чужой фид.

    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"]
    }
    Из spec/fixtures/v1/examples/prodid.delegated.json. Единственное отличие от пути 1 — поле domain, и здесь оно обязательно.
  4. Создайте свой сайт

    Хостинг-публикатор записывает domain в документ только после того, как сам увидит вашу запись TXT, поэтому нет момента, когда документ претендует на домен, который об этом не просил.

Путь 3

Публикация без домена

Выполнено шагов: 0 из 1
x
  1. Создайте свой сайт

    Производитель без домена публикует на slug на хостинге, <slug>.prodid.org, под своим именем. Зарезервируйте его на publish.prodid.org. Идентичность источника — хост slug, уровень доверия — unverified, потому что про домен ничего не доказано. Записи — настоящие записи: идентификаторы, разрешение, атрибуция.

Проверьте свой домен

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

Следующий обход обновит состояние через несколько минут.

Проверьте файлы перед пингом

prodid-batch check проверяет документ обнаружения и каждый фид ровно так же, как это сделал бы индекс, без токена и не обращаясь к индексу. Он запускается из клона репозитория с Bun 1.4.4. Передайте ему сами файлы: путь, оканчивающийся на .json, читается как один документ, любой другой — как NDJSON-фид.

проверьте то, что отдаёте, как это сделает индекс
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

Файл без проблем выводит ok и число записей, которые индекс из него возьмёт. Иначе выводится по строке на каждую проблему в виде items.ndjson:12: message с номером строки фида, и программа завершается с ненулевым кодом. Он читает файлы, а не ваш DNS или сервер, так что запись TXT, тип содержимого и заголовки кэширования из списка выше проверять по-прежнему вам.

Правила проверки записи — в спецификации, схемы лежат по адресу /spec/schemas/v1, а /spec/fixtures/v1 содержит машиночитаемые векторы, на которых можно прогнать ваш экспорт до того, как его кто-то обойдёт.

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

Статус: Spec v1. Индекс и хостинг-публикатор работают на prodid.org. Публиковать может любой: на своём домене или на хостинге. Форматы файлов на этой странице — те, что индекс читает, когда вы его пингуете.

Справочник

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

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