Обзор
AnyImages — сервис поиска товаров по изображениям. Интеграция выполняется на серверной стороне в реальном времени. Браузер пользователя никогда не обращается к API напрямую.
Сценарии использования
Поиск по фото в строке поиска
Пользователь загружает фото с устройства или делает снимок на смартфон. В запрос передаётся параметр image.
Кнопка «Найти похожие» на карточке товара
Одним кликом извлекает изображение товара и отправляет в поиск. В запросе используется тот же параметр image — серверная сторона предварительно скачивает изображение товара и отправляет его на API.
Архитектура
Все запросы к AnyImages API проходят через ваш сервер. Сжатие и валидация изображений выполняются также на сервере.
Эндпоинт
Тело запроса — multipart/form-data.
Параметры запроса
Все параметры передаются в теле запроса как поля 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 | Откуда брать изображение |
|---|---|---|
| Поиск через строку поиска (пользователь загрузил фото) | ✅ передаётся | Загруженный пользователем файл |
| Первое открытие выдачи по кнопке «Похожие» | ✅ передаётся | Сервер предварительно скачивает изображение товара по offer_id из своей БД и отправляет его как image |
| Кроп изображения пользователем | ✅ передаётся | Кропнутая область из загруженного фото |
Требования к изображению
- Поддерживаемые форматы:
jpg,jpeg,png,webp - Оптимальный размер — 1024px по длинной стороне
- Максимальный размер файла — 10 МБ; файлы большего размера отклоняются. Рекомендуется сжатие при превышении ~1–2 МБ для ускорения передачи.
Примеры запросов
Поиск через строку поиска (пользователь загрузил фото)
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 — они настраиваются индивидуально под ваш проект.