← На главную

AnyImages — серверная интеграция

Поиск товаров по изображениям · Руководство по интеграции через API

Обзор

AnyImages — сервис поиска товаров по изображениям. Интеграция выполняется на серверной стороне в реальном времени. Браузер пользователя никогда не обращается к API напрямую.

Массовые офлайн-запросы (bulk) для кэширования данных не поддерживаются и могут привести к блокировке доступа. API предназначен исключительно для онлайн-вызовов в реальном времени.

Сценарии использования

Поиск по фото в строке поиска

Пользователь загружает фото с устройства или делает снимок на смартфон. В запрос передаётся параметр image.

Кнопка «Найти похожие» на карточке товара

Одним кликом извлекает изображение товара и отправляет в поиск. В запросе используется тот же параметр image — серверная сторона предварительно скачивает изображение товара и отправляет его на API.

Рекомендуем реализовать оба сценария как взаимодополняющие — это максимизирует охват и пользу от сервиса.

Архитектура

Все запросы к AnyImages API проходят через ваш сервер. Сжатие и валидация изображений выполняются также на сервере.

Пользовательзагружает фото / кликает «Похожие»
Фронтендпередаёт изображение на ваш сервер
Ваш серверсжатие, валидация, запрос к API
AnyImages APIapi.diginetica.net
Пользовательвидит результаты
Фронтендотображает товары
Ваш серверотдаёт результаты фронтенду
AnyImages APIвозвращает список товаров

Эндпоинт

POST https://api.diginetica.net/v1/imagesearch/search?apiKey=<API-KEY>

Тело запроса — multipart/form-data.

API-ключ передавать только через серверную сторону. Не вставлять в фронтенд-код и не отправлять запросы из браузера напрямую.

Параметры запроса

Все параметры передаются в теле запроса как поля multipart/form-data.

Параметр Тип По умолчанию Описание
imagereq string (binary) Изображение. Обязательный параметр. Форматы: jpg, jpeg, png, webp. Рекомендуемый размер: 1024px по длинной стороне.
productsSize integer 30 Желаемое количество товаров. Ограничивает верхнюю границу, но итоговое число может быть меньше из-за фильтрации по доступности. Минимум: 1.
offset integer 0 Сдвиг (пагинация). Минимум: 0.
showUnavailable boolean false Управление фильтрацией недоступных товаров.
true — в результатах поиска будут недоступные товары (available: false в фиде).
false — в результатах поиска не будет недоступных товаров.
deboostUnavailable boolean true Смещение недоступных товаров вниз выдачи. Работает только при showUnavailable: true.
true — недоступные товары показываются после всех доступных с сохранением ранжирования.
false — недоступные товары показываются вперемешку с доступными, ранжирование только по релевантности.
regionId string global ID регионального фида. Используется при включённой региональности и управлении доступностью на стороне Any.
image — обязательный параметр запроса. Все остальные параметры опциональны.

Логика параметров

Набор передаваемых параметров зависит от сценария:

Сценарий image Откуда брать изображение
Поиск через строку поиска (пользователь загрузил фото) ✅ передаётся Загруженный пользователем файл
Первое открытие выдачи по кнопке «Похожие» ✅ передаётся Сервер предварительно скачивает изображение товара по offer_id из своей БД и отправляет его как image
Кроп изображения пользователем ✅ передаётся Кропнутая область из загруженного фото

Требования к изображению

  • Поддерживаемые форматы: jpg, jpeg, png, webp
  • Оптимальный размер — 1024px по длинной стороне
  • Максимальный размер файла — 10 МБ; файлы большего размера отклоняются. Рекомендуется сжатие при превышении ~1–2 МБ для ускорения передачи.
При превышении оптимального размера обязательно выполняйте сжатие на сервере перед отправкой в API.

Примеры запросов

Поиск через строку поиска (пользователь загрузил фото)

curl --location 'https://api.diginetica.net/v1/imagesearch/search?apiKey=API-KEY' \
  --form 'image=@"picture.jpg"' \
  --form 'productsSize="20"' \
  --form 'showUnavailable="true"' \
  --form 'deboostUnavailable="true"' \
  --form 'regionId="25"'

Поиск по кнопке «Найти похожие» на карточке товара

Сервер по offer_id товара получает URL его основного изображения из своей БД, скачивает изображение и отправляет его на API как обычный параметр image:

curl --request POST \
  --url 'https://api.diginetica.net/v1/imagesearch/search?apiKey=API-KEY' \
  --header 'content-type: multipart/form-data' \
  --form 'image=@"product_image.jpg"' \
  --form 'productsSize="30"' \
  --form 'showUnavailable="true"' \
  --form 'deboostUnavailable="true"' \
  --form 'regionId="msk"'

Структура ответа

Ответ содержит массив объектов products в порядке убывания релевантности.

{
  "products": [
    {
      "id": "85234",
      "groupId": "85234",
      "available": false,
      "name": "Торшер Loft IT Eye",
      "brand": "Loft IT",
      "price": "26235.0",
      "score": 1.0,
      "categories": [
        {
          "id": "52",
          "name": "торшеры",
          "direct": false,
          "link_url": "...",
          "image_url": "..."
        }
      ],
      "attributes": {
        "интерьер": ["Для гостиной"],
        "материал арматуры": ["Металл"]
      },
      "skus": [
        {
          "id": "85234",
          "available": false,
          "name": "Торшер Loft IT Eye",
          "price": "26235.0",
          "attributes": {},
          "link_url": "...",
          "image_url": "..."
        }
      ],
      "ids": ["85234"],
      "link_url": "...",
      "image_url": "..."
    }
  ]
}

Описание полей

Поле Тип Описание
products array Список товаров по убыванию релевантности
product.id string Offer ID из фида
product.groupId string Групповой идентификатор (если применимо)
product.available boolean Доступность товара
product.name string Название товара
product.brand string Бренд
product.price string Актуальная цена в виде строки (например, "26235.0").
product.oldPrice string Старая цена в виде строки (если есть скидка).
product.score number Оценка релевантности (1.0 — максимум)
product.alternative boolean Признак альтернативного товара (найден как альтернатива, а не точное визуальное совпадение).
product.categories array Категории товара. Поля: id, name, direct (boolean), link_url, image_url
product.attributes object Атрибуты товара. Формат: название атрибута → массив значений
product.skuChoiceAttributes array<string> Имена атрибутов, по которым возможен выбор SKU (например, ["Цвет","Размер"]).
product.skus array Варианты товара. Поля: id, available, name, price (string), oldPrice (string), attributes (object — в SKU значения атрибутов — строки, в отличие от верхнего уровня, где значения — массивы строк), link_url, image_url.
product.ids array Дополнительные идентификаторы товара
product.link_url string Ссылка на карточку товара
product.image_url string Ссылка на изображение товара

Ошибки

HTTP-статус Тип Описание
200 OK Успешный ответ
404 SiteNotFoundException Не удаётся связать apiKey и SiteID. Тело ответа — text/plain (не JSON), например: not found api key: <key>.
500 INTERNAL_SERVER_ERROR Внутренняя ошибка сервера. Тело ответа — text/plain (не JSON); обычно содержит unexpected exception, в отдельных случаях может быть пустым.
При отсутствии ответа показывайте пользователю сообщение: «Ничего не найдено, попробуйте другое изображение или воспользуйтесь текстовым поиском».

Безопасность

  • API-ключ хранить только на сервере. Не передавать на фронтенд, не вставлять в браузерный код.
  • Ключ передаётся через query-параметр apiKey в запросе от сервера к API.
  • Настройте ротацию ключей и мониторинг использования (анализ RPS, аномалий).
  • При необходимости ограничьте источники запросов: IP allowlist, прокси.
  • CORS не нужен — запросы к API выполняет ваш сервер, не браузер.

Лимиты и таймауты

  • Рекомендуемый клиентский таймаут — 30 секунд (по спецификации API). Поиск по изображению — более долгая операция, чем текстовый поиск.
  • Ограничьте конкурентность вызовов, добавьте очереди/воркеры для пиковой нагрузки.
  • Кэшируйте пустые результаты на короткое время, чтобы не повторять запросы по одному и тому же изображению.

Трекинг и разметка

Команда Any настраивает трекинг на своей стороне. От вас требуется разметка HTML-блоков выдачи на фронтенде.

Что отслеживается

  • Вызов поиска по фото
  • Загрузка фотографии
  • Клик по кнопке «Похожие» на товаре
  • Кроп выделенной области на фото
  • Клик по товару из результатов выдачи
  • Добавление товара в корзину из результатов выдачи (если есть кнопка)

Необходимая разметка

Добавьте уникальный id родительскому элементу блока выдачи и атрибут с offer ID каждой карточке товара.

<div id="digi-image-search">
    <div class="digi-product" product-id="33526">
        <!-- Контент карточки товара -->
    </div>
    <div class="digi-product" product-id="33527">
        <!-- Контент карточки товара -->
    </div>
</div>
Конкретные значения атрибутов (имя id блока, название атрибута карточки) согласуйте с командой Any — они настраиваются индивидуально под ваш проект.