Проверка товарных связок через ruBERT

Адрес сервиса — https://rubert.platfomni.com. Метод POST /v1/compare сравнивает конкретный эталонный SKU с названием товара у партнёра. Без авторизации доступны проверка готовности, формат запросов и ответов OpenAPI и эта инструкция в Markdown.

Первый запрос

Поместите свой персональный ключ в переменную окружения RUBERT_API_TOKEN или секрет приложения. Передавайте его в заголовке Authorization: Bearer … по HTTPS. Отдельно указывать имя пользователя не нужно. В запросе ниже один эталон и одно партнёрское название.

curl --fail-with-body --silent --show-error \
  https://rubert.platfomni.com/v1/compare \
  -H "Authorization: Bearer ${RUBERT_API_TOKEN:?задайте RUBERT_API_TOKEN}" \
  -H 'Content-Type: application/json' \
  --data-binary '{"pairs":[{"etalon_name":"Нурофен таблетки 200 мг №20","partner_name":"Нурофен таб. 200мг №20"}]}'

etalon_name и partner_name — обязательные исходные названия. В etalon_brand и partner_brand передайте фактические поля бренда или производителя каждой стороны, если они есть. При отсутствии значения поле можно опустить или передать null. Метод принимает 1–16 пар. Ответы идут в том же порядке. Для сопоставления с внутренними ID сохраните позиции массива у себя.

Как использовать ответ

Для примера с Нурофеном выше сервис вернул следующие поля. Здесь показана только часть ответа, а балл округлён.

{
  "model_version": "61031-5500-policy-b",
  "results": [{
    "input_status": "eligible",
    "decision": "review",
    "proposed_decision": "same_sku",
    "scores": {"overall": 0.96409},
    "predicted_reasons": []
  }]
}

Читайте results[i].proposed_decision. Значение same_sku означает, что модель предлагает совпадение. Значение review означает, что соответствие требует проверки. Сервис запущен в оценочном режиме. Поле decision всегда равно review. Запрос не меняет связку в каталоге.

scores.overall — балл совпадения от 0 до 1. Порог версии 61031-5500-policy-b равен 0,9575216 (округлённо). Одного общего балла для решения недостаточно. Если хотя бы одна применимая проверка обнаружила конфликт, модель также предлагает review. predicted_reasons содержит сработавшие проверки дозировки (dosage), фасовки (pack_size), формы (release_form) или объёма (volume). Пустой список возможен при низком общем балле. Учитывайте отдельную оценку только при axes.<поле>.applicable=true. Баллы не интерпретируются как вероятность ошибки в рабочем потоке.

Для каждого результата сначала проверьте input_status. Если он равен ineligible, оценка равна null, а причина находится в input_reason. Так обрабатываются, в частности, пустые после нормализации названия и пары длиннее 512 токенов. Названия не обрезаются.

Пример на Python

import os
import requests

with requests.Session() as client:
    client.headers["Authorization"] = "Bearer " + os.environ["RUBERT_API_TOKEN"]
    pairs = [{"etalon_name": "Нурофен таблетки 200 мг №20",
              "partner_name": "Нурофен таб. 200мг №20"}]
    response = client.post("https://rubert.platfomni.com/v1/compare",
                           json={"pairs": pairs}, timeout=(3, 10))
    response.raise_for_status()
    for row in response.json()["results"]:
        print(row["proposed_decision"], row["scores"]["overall"], row["predicted_reasons"])

Ошибки и повторные запросы

HTTP Что делать
200 Проверьте каждый элемент results, включая input_status.
401 Проверьте ключ и заголовок авторизации.
413 Уменьшите тело запроса. Предел — 128 КБ.
422 Исправьте структуру JSON, поля или число пар (1–16).
502 / 503 / 504 Сервис запускается или занят. Повторите с небольшой задержкой, учитывая Retry-After, если он есть.

При массовой проверке отправляйте пачки до 16 пар и переиспользуйте HTTPS-соединение. Результат запроса не имеет побочных эффектов. Заголовок Server-Timing показывает время вычисления на сервере в миллисекундах, без ожидания очереди и сетевого обмена.

В замере 2 ноября 2026 года на 256 реальных связках медиана одиночного HTTPS-запроса составила 199 мс, 95-й перцентиль — 257 мс. Для пачки из 16 пар это 2,06 и 2,92 с за всю пачку, около 7,3 пары/с. Замер выполнен с одним клиентом и прогретым соединением. При одновременных запросах время ожидания может вырасти.