Все гайды
REST API · v1

API документация

Опознавайте фильмы по кадру или текстовому описанию — прямо из своего приложения, расширения или бота. Один HTTP-запрос, JSON-ответ с полными метаданными фильма и confidence-скором.

JSON over HTTPS Bearer auth 120 запросов/час en · ru

Быстрый старт

  1. 1

    Получите ключ

    Откройте кабинет разработчика и подайте заявку. Ключ выдаётся сразу — но в статусе «pending».

  2. 2

    Дождитесь активации

    Мы свяжемся с вами для активации и оплаты. После — статус «active».

  3. 3

    Сделайте первый запрос

    Передайте ключ в заголовке Authorization: Bearer и отправьте POST на /v1/identify.

curl -X POST https://bdkino.com/api/v1/identify \
  -H "Authorization: Bearer bdk_live_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "robot collects garbage on an abandoned Earth",
    "lang": "en"
  }'

Аутентификация

Каждый запрос должен содержать заголовок с активным ключом. Без него — 401.

HTTP Header
Authorization: Bearer bdk_live_xxxxxxxxxxxx
Правильно
  • Храните ключ только на сервере
  • Передавайте через HTTPS
  • Ротируйте ключи каждые 6 месяцев
Нельзя
  • Не публикуйте ключ в frontend / git / Discord
  • Не отправляйте по HTTP — только HTTPS
  • Не шарьте между проектами — заведите отдельный

Эндпоинт: опознание фильма

POSThttps://bdkino.com/api/v1/identify

Принимает изображение (base64) и/или текстовое описание сцены. Возвращает массив совпадений из базы bdkino, отсортированных по confidence-скору.

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

ПолеТипОбязательноОписание
image_base64stringодно из*JPEG/PNG/WebP в base64, до 15 МБ.
descriptionstringодно из*Описание сцены, 3–2000 символов.
langstringЯзык метаданных в ответе: «en» или «ru». Default «en».

* Нужно передать минимум одно поле — image_base64 ИЛИ description (можно оба).

Пример: поиск по описанию

curl -X POST https://bdkino.com/api/v1/identify \
  -H "Authorization: Bearer bdk_live_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "robot collects garbage on an abandoned Earth",
    "lang": "en"
  }'

Пример: поиск по кадру

# Закодируйте JPEG/PNG/WebP в base64 и подставьте вместо <BASE64>
curl -X POST https://bdkino.com/api/v1/identify \
  -H "Authorization: Bearer bdk_live_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "image_base64": "<BASE64>",
    "lang": "en"
  }'

Формат ответа

{
  "found": true,
  "source": "text",
  "request_id": "550e8400-e29b-41d4-a716-446655440000",
  "results": [
    {
      "id": 10681,
      "media_type": "movie",
      "title": "WALL·E",
      "year": 2008,
      "overview": "In the distant future, a small waste-collecting robot...",
      "poster_url": "https://bdkino.com/api/img/w500/hbhFnRzhIxs...",
      "blur_b64": "data:image/webp;base64,UklGRk...",
      "vote_average": 8.0,
      "vote_count": 19234,
      "popularity": 87.5,
      "confidence": 0.91,
      "genres":             ["Animation", "Family", "Sci-Fi"],
      "keywords":           ["robot", "earth", "garbage", "love"],
      "cast":               ["Ben Burtt", "Elissa Knight", "Jeff Garlin"],
      "directors":          ["Andrew Stanton"],
      "origin_country":     ["US"],
      "original_language":  "en",
      "tagline":            "An adventure beyond the ordinary world.",
      "runtime":            98,
      "age_rating":         "G",
      "collection_id":      null,
      "collection_name":    null
    }
  ],
  "fallback_url": "https://bdkino.com/search"
}

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

ПолеТипОписание
foundbooleantrue если есть хотя бы один результат
sourcestringКак найдено: «phash», «clip», «text» или «cinemind»
resultsarrayМассив результатов (≤ 5), сортировка по confidence DESC
idintegerID фильма в базе bdkino
media_typestring"movie" / "tv"
confidencefloat (0–1)Уверенность: ≥ 0.85 — почти всегда верно
genresstring[]Жанры на языке lang
keywordsstring[]Теги для поиска
caststring[]До 10 актёров (top-billed)
directorsstring[]Режиссёры
taglinestring | nullСлоган на языке lang
runtimeinteger | nullДлительность в минутах (для movie)
age_ratingstring | nullMPAA / TV-rating (US)
collection_idinteger | nullID коллекции если фильм её часть
fallback_urlstringURL поисковой страницы, если found=false

Feedback: помогите обучить AI

После каждого вызова /v1/identify вы получаете request_id в ответе. Передайте его обратно с голосом «верно/не тот» — это попадёт в training set Cinemind. Бесплатный feedback loop повышает точность для всех.

POSThttps://bdkino.com/api/v1/identify/feedback

Параметры (JSON body)

ПолеТипОписание
request_idUUIDИз ответа /v1/identify (поле request_id). Обязательно.
vote"yes" | "no"«yes» — нашли правильный фильм, «no» — не тот. Обязательно.
idintegerID конкретного результата если в response было несколько. По умолчанию — top.
media_type"movie" | "tv"Опц. По умолчанию из top.
commentstringОпц. До 300 символов. Доходит до админа в случае «no».

Пример

cURL
curl -X POST https://bdkino.com/api/v1/identify/feedback \
  -H "Authorization: Bearer bdk_live_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -H "Accept-Language: ru" \
  -d '{
    "request_id": "550e8400-e29b-41d4-a716-446655440000",
    "vote": "yes",
    "id": 603,
    "media_type": "movie"
  }'

Ответ

{
  "ok": true,
  "vote": "yes",
  "training_pair_added": true,
  "message": "Спасибо! Ваш голос помогает обучить AI."
}

💎 Зачем это вам

Каждый голос «верно» добавляет positive training pair, каждый «не тот» — negative. Через несколько месяцев накопленные пары пойдут в fine-tune Cinemind v2 — модель станет точнее на ваших же запросах. Это win-win.

Коды ошибок

Все ошибки возвращают JSON вида {"detail":"<error_code>"}.

200Успех

Даже когда found=false — это всё ещё 200.

400provide_image_or_description / query_looks_invalid

Ни image, ни description; кривой base64; либо описание бессмысленное (набор символов).

401invalid_api_key

Ключ отсутствует, не существует или отозван.

402api_key_not_paid / api_key_expired

Подписка ключа не оплачена или истекла. Активируйте/продлите тариф в /developer.

403api_key_pending_activation

Ключ ещё не активирован / отклонён админом.

413image_too_large / description_too_long

image_too_large: картинка > 15 МБ · description_too_long: описание > 2000 симв.

429rate_limited

Превышен часовой лимит. Дождитесь следующего часа и повторите (exponential backoff).

5xxserver_error

Временный сбой. Сделайте retry с exponential backoff.

Лимиты и поведение

Базовый лимит120 req / hour / key
Размер картинки≤ 15 MB
Размер описания3 – 2000 chars
Таймаут запроса≤ 30 s (text) / ≤ 60 s (image)
Кол-во результатов≤ 5
Серверный кэш ответанет — кешируйте на своей стороне
Доступность99.5 % monthly SLA

При 429 дождитесь начала следующего часа и повторите запрос; рекомендуем exponential backoff на стороне клиента.

Лучшие практики

Используйте exponential backoff

При 429 / 5xx — пауза 1s → 2s → 4s → 8s до 60s. Не зацикливайтесь на retry для 4xx (кроме 408/429).

Дедуплицируйте запросы

Если ваш сервис может получить одно и то же видео дважды — кешируйте ответ по hash(image)+description, чтобы не жечь квоту.

Сжимайте картинки

1280×720 JPEG q=80 даёт ~120 KB и точность не хуже, чем у оригинала 4K. Перед base64 — обязательно ресайз.

Проверяйте confidence

≥ 0.85 — показывайте как совпадение. 0.55–0.85 — «возможно, это:», предложите подтвердить. < 0.55 — не показывайте.

Логируйте на своей стороне

Сохраняйте request_id из ответа — поможет нам быстрее найти проблему в саппорте.

Graceful degradation

Если /v1/identify недоступен — перенаправьте на fallback_url (поисковая страница bdkino) и не блокируйте UX.

Песочница

Попробуйте прямо здесь

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

Ключ хранится только в этом браузере (localStorage) и отправляется напрямую на bdkino.

2000 симв.

Предпочитаете десктоп-приложение или другой инструмент? Есть альтернативы:

Python · Tkinter

bdkino API Tester (GUI)

Десктопное GUI: подсветка JSON, история запросов, сохранение ключа. Требуется установленный Python 3.10+.

Скачать .zip (нужен Python)
Postman

Postman коллекция

Готовые запросы с переменными окружения — импортируйте и тестируйте.

Скачать .json

Решение проблем

В PowerShell ругается «Invoke-WebRequest: не удаётся найти -X»
В PowerShell curl — это псевдоним Invoke-WebRequest, у которого другие параметры. Используйте curl.exe (с расширением — вызывает настоящий бинарник) или нативный Invoke-RestMethod. Перенос строки в PowerShell — бэктик `, не \. Готовые примеры — выберите вкладку PowerShell выше.
Получаю 401, ключ скопирован полностью
Проверьте: 1) заголовок написан как Authorization: Bearer <key> (а не «Token» или просто <key>); 2) статус ключа в /developer — должен быть «active», а не «pending»; 3) перед ключом не прилип пробел при копировании.
Возвращается 413 image_too_large
Лимит — 15 МБ на размер самого файла (сервер проверяет декодированные байты, а не длину base64-строки). Решение: уменьшите разрешение до 1280×720 и сжимайте JPEG quality 80.
found=true, но в results — не тот фильм
Посмотрите confidence: если < 0.7 — поиск неуверенный (часто бывает с обрезанным кадром / низким разрешением / водяными знаками). Также пришлите вместе с image_base64 ещё и description — это резко поднимает точность.
Запросы вдруг стали медленные (>10 сек)
Образ был выгружен с GPU и нужно прогреть. Первый запрос после простоя — 5–15 сек, последующие — 200–800 мс. Если высокая нагрузка не спадает > 5 минут — напишите в support@bdkino.com.
Как локально тестировать без расхода квоты?
Используйте Playground (GUI выше) — он показывает потребление квоты в реальном времени. Или включите кеширование на своей стороне (Redis/LRU) — идентичные запросы в одно и то же изображение не должны лететь в API.

Готовы начать?

Подайте заявку в кабинете разработчика — мы свяжемся в течение 24 часов для активации и оплаты доступа.