API документация
Опознавайте фильмы по кадру или текстовому описанию — прямо из своего приложения, расширения или бота. Один HTTP-запрос, JSON-ответ с полными метаданными фильма и confidence-скором.
Быстрый старт
- 1
Получите ключ
Откройте кабинет разработчика и подайте заявку. Ключ выдаётся сразу — но в статусе «pending».
- 2
Дождитесь активации
Мы свяжемся с вами для активации и оплаты. После — статус «active».
- 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.
Authorization: Bearer bdk_live_xxxxxxxxxxxx- Храните ключ только на сервере
- Передавайте через HTTPS
- Ротируйте ключи каждые 6 месяцев
- Не публикуйте ключ в frontend / git / Discord
- Не отправляйте по HTTP — только HTTPS
- Не шарьте между проектами — заведите отдельный
Эндпоинт: опознание фильма
https://bdkino.com/api/v1/identifyПринимает изображение (base64) и/или текстовое описание сцены. Возвращает массив совпадений из базы bdkino, отсортированных по confidence-скору.
Параметры запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
| image_base64 | string | одно из* | JPEG/PNG/WebP в base64, до 15 МБ. |
| description | string | одно из* | Описание сцены, 3–2000 символов. |
| lang | string | — | Язык метаданных в ответе: «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"
}Описание полей
| Поле | Тип | Описание |
|---|---|---|
| found | boolean | true если есть хотя бы один результат |
| source | string | Как найдено: «phash», «clip», «text» или «cinemind» |
| results | array | Массив результатов (≤ 5), сортировка по confidence DESC |
| id | integer | ID фильма в базе bdkino |
| media_type | string | "movie" / "tv" |
| confidence | float (0–1) | Уверенность: ≥ 0.85 — почти всегда верно |
| genres | string[] | Жанры на языке lang |
| keywords | string[] | Теги для поиска |
| cast | string[] | До 10 актёров (top-billed) |
| directors | string[] | Режиссёры |
| tagline | string | null | Слоган на языке lang |
| runtime | integer | null | Длительность в минутах (для movie) |
| age_rating | string | null | MPAA / TV-rating (US) |
| collection_id | integer | null | ID коллекции если фильм её часть |
| fallback_url | string | URL поисковой страницы, если found=false |
Feedback: помогите обучить AI
После каждого вызова /v1/identify вы получаете request_id в ответе. Передайте его обратно с голосом «верно/не тот» — это попадёт в training set Cinemind. Бесплатный feedback loop повышает точность для всех.
https://bdkino.com/api/v1/identify/feedbackПараметры (JSON body)
| Поле | Тип | Описание |
|---|---|---|
| request_id | UUID | Из ответа /v1/identify (поле request_id). Обязательно. |
| vote | "yes" | "no" | «yes» — нашли правильный фильм, «no» — не тот. Обязательно. |
| id | integer | ID конкретного результата если в response было несколько. По умолчанию — top. |
| media_type | "movie" | "tv" | Опц. По умолчанию из top. |
| comment | string | Опц. До 300 символов. Доходит до админа в случае «no». |
Пример
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>"}.
УспехДаже когда found=false — это всё ещё 200.
provide_image_or_description / query_looks_invalidНи image, ни description; кривой base64; либо описание бессмысленное (набор символов).
invalid_api_keyКлюч отсутствует, не существует или отозван.
api_key_not_paid / api_key_expiredПодписка ключа не оплачена или истекла. Активируйте/продлите тариф в /developer.
api_key_pending_activationКлюч ещё не активирован / отклонён админом.
image_too_large / description_too_longimage_too_large: картинка > 15 МБ · description_too_long: описание > 2000 симв.
rate_limitedПревышен часовой лимит. Дождитесь следующего часа и повторите (exponential backoff).
server_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.
Предпочитаете десктоп-приложение или другой инструмент? Есть альтернативы:
bdkino API Tester (GUI)
Десктопное GUI: подсветка JSON, история запросов, сохранение ключа. Требуется установленный Python 3.10+.
Скачать .zip (нужен Python)Postman коллекция
Готовые запросы с переменными окружения — импортируйте и тестируйте.
Скачать .jsonРешение проблем
В PowerShell ругается «Invoke-WebRequest: не удаётся найти -X»›
curl — это псевдоним Invoke-WebRequest, у которого другие параметры. Используйте curl.exe (с расширением — вызывает настоящий бинарник) или нативный Invoke-RestMethod. Перенос строки в PowerShell — бэктик `, не \. Готовые примеры — выберите вкладку PowerShell выше.Получаю 401, ключ скопирован полностью›
Возвращается 413 image_too_large›
found=true, но в results — не тот фильм›
Запросы вдруг стали медленные (>10 сек)›
Как локально тестировать без расхода квоты?›
Готовы начать?
Подайте заявку в кабинете разработчика — мы свяжемся в течение 24 часов для активации и оплаты доступа.