# Эндпоинт, совместимый с OMDb

> GET https://api.amodb.dev/omdb/ отвечает на запросы в стиле OMDb с теми же именами параметров и полей. Ищите тайтл по IMDb ID через i или по названию через t, а список получайте через s. Ссылки на постеры ведут на img.amodb.dev. Работают только r=json, фильмы и сериалы. Смените базовый URL и ключ, и типичный клиент продолжит работать.

## Эндпоинт

`GET /omdb/`

```bash
curl "https://api.amodb.dev/omdb/?i=tt0137523&plot=short&apikey=$AMODB_KEY"
```

Ответ:

```json
{
  "Title": "Fight Club",
  "Year": "1999",
  "Rated": "R",
  "Released": "15 Oct 1999",
  "Runtime": "139 min",
  "Genre": "Crime, Drama, Thriller",
  "Director": "David Fincher",
  "Writer": "Chuck Palahniuk, Jim Uhls",
  "Actors": "Brad Pitt, Edward Norton, Meat Loaf",
  "Plot": "A nameless first-person narrator attends support groups in an attempt to subdue his emotional state and relieve his insomniac state.",
  "Language": "English",
  "Country": "United States, Germany",
  "Awards": "Nominated for 1 Oscar. 12 wins & 38 nominations total",
  "Poster": "https://img.amodb.dev/t/p/w300/pfPob0mrC1KiPVP9NXZnqvpks9u.jpg",
  "Ratings": [
    {
      "Source": "Internet Movie Database",
      "Value": "8.8/10"
    },
    {
      "Source": "Rotten Tomatoes",
      "Value": "81%"
    },
    {
      "Source": "Metacritic",
      "Value": "67/100"
    }
  ],
  "Metascore": "67",
  "imdbRating": "8.8",
  "imdbVotes": "2,669,989",
  "imdbID": "tt0137523",
  "Type": "movie",
  "DVD": "N/A",
  "BoxOffice": "$38,003,039",
  "Production": "N/A",
  "Website": "N/A",
  "Response": "True"
}
```

## Поиск тайтла по IMDb ID или названию

`GET https://api.amodb.dev/omdb/` возвращает один тайтл в виде плоского JSON с именами полей OMDb. Передайте `i` с IMDb ID, например `tt0137523`, или `t` с названием. Аутентификация идет через параметр запроса `apikey`. В ответе `Response` равно `True` при успехе и `False` при ошибке.

Пример загружает Fight Club по IMDb ID и останавливается с текстом ошибки OMDb, когда `Response` равно `False`.

```bash
curl -sf "https://api.amodb.dev/omdb/?i=tt0137523&plot=short&apikey=$AMODB_KEY"
```

```js
const params = new URLSearchParams({ i: 'tt0137523', plot: 'short', apikey: process.env.AMODB_KEY });
const res = await fetch(`https://api.amodb.dev/omdb/?${params}`);
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const data = await res.json();
if (data.Response === 'False') throw new Error(data.Error);
console.log(data.Title, data.Year, data.imdbRating);
```

```python
import os
import requests

r = requests.get(
    "https://api.amodb.dev/omdb/",
    params={"i": "tt0137523", "plot": "short", "apikey": os.environ["AMODB_KEY"]},
    timeout=10,
)
r.raise_for_status()
data = r.json()
if data["Response"] == "False":
    raise SystemExit(data["Error"])
print(data["Title"], data["Year"], data["imdbRating"])
```

```php
<?php
$query = http_build_query(['i' => 'tt0137523', 'plot' => 'short', 'apikey' => getenv('AMODB_KEY')]);
$ch = curl_init('https://api.amodb.dev/omdb/?' . $query);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($status !== 200) {
    throw new RuntimeException("amodb returned $status");
}
$data = json_decode($body, true);
if ($data['Response'] === 'False') {
    throw new RuntimeException($data['Error']);
}
echo $data['Title'], ' ', $data['Year'], ' ', $data['imdbRating'], PHP_EOL;
```

```go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
	"os"
	"time"
)

type Title struct {
	Title      string `json:"Title"`
	Year       string `json:"Year"`
	ImdbRating string `json:"imdbRating"`
	Response   string `json:"Response"`
	Error      string `json:"Error"`
}

func main() {
	q := url.Values{"i": {"tt0137523"}, "plot": {"short"}, "apikey": {os.Getenv("AMODB_KEY")}}
	client := &http.Client{Timeout: 10 * time.Second}
	res, err := client.Get("https://api.amodb.dev/omdb/?" + q.Encode())
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		panic(res.Status)
	}
	var t Title
	if err := json.NewDecoder(res.Body).Decode(&t); err != nil {
		panic(err)
	}
	if t.Response == "False" {
		panic(t.Error)
	}
	fmt.Println(t.Title, t.Year, t.ImdbRating)
}
```

### Параметры

| Параметр | Где   | Обязателен            | Описание                                                             |
| -------- | ----- | --------------------- | -------------------------------------------------------------------- |
| `apikey` | query | да                    | Ваш ключ amodb.                                                      |
| `i`      | query | один из `i`, `t`, `s` | IMDb ID тайтла: `tt` и от 7 до 9 цифр, например `tt0137523`.         |
| `t`      | query | один из `i`, `t`, `s` | Название для поиска, возвращает лучшее совпадение.                   |
| `s`      | query | один из `i`, `t`, `s` | Текст поиска не короче 3 букв, возвращает список.                    |
| `type`   | query | нет                   | `movie` или `series`. `episode` ничего не находит.                   |
| `y`      | query | нет                   | Год выхода.                                                          |
| `plot`   | query | нет                   | `short` или `full`. По умолчанию `short`.                            |
| `page`   | query | нет                   | Страница результатов поиска, от 1 до 100. Используется вместе с `s`. |
| `r`      | query | нет                   | Только `json`. Любое другое значение возвращает HTTP 400.            |

Параметры `Season`, `Episode`, `callback` и `v` из оригинального OMDb API не поддерживаются и игнорируются.

### Поля ответа

| Поле                                             | Примечания                                                                                                                |
| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
| `Title`, `Year`, `Rated`, `Released`, `Runtime`  | Текст. `Released` выглядит как `15 Oct 1999`.                                                                             |
| `Genre`, `Director`, `Writer`, `Actors`          | Имена через запятую.                                                                                                      |
| `Plot`, `Language`, `Country`, `Awards`          | Текст.                                                                                                                    |
| `Poster`                                         | Адрес на `https://img.amodb.dev/t/p/w300/`.                                                                               |
| `Ratings`                                        | Массив объектов с `Source` и `Value`.                                                                                     |
| `Metascore`, `imdbRating`, `imdbVotes`, `imdbID` | Текст, включая число голосов с запятыми.                                                                                  |
| `Type`                                           | `movie` или `series`.                                                                                                     |
| `DVD`, `BoxOffice`, `Production`, `Website`      | Только для фильмов. `BoxOffice` содержит значение, если оно известно. `DVD`, `Production` и `Website` всегда равны `N/A`. |
| `totalSeasons`                                   | Только для сериалов, текстом. В ответах для сериалов нет `DVD`, `BoxOffice`, `Production` и `Website`.                    |
| `Response`                                       | `True` или `False`, всегда строка.                                                                                        |

Поля повторяют OMDb, поэтому существующему парсеру OMDb не нужны изменения, кроме базового URL.

### Пример ответа

```json
{
  "Title": "Fight Club",
  "Year": "1999",
  "Rated": "R",
  "Released": "15 Oct 1999",
  "Runtime": "139 min",
  "Genre": "Crime, Drama, Thriller",
  "Director": "David Fincher",
  "Writer": "Chuck Palahniuk, Jim Uhls",
  "Actors": "Brad Pitt, Edward Norton, Meat Loaf",
  "Plot": "A nameless first-person narrator attends support groups in an attempt to subdue his emotional state and relieve his insomniac state.",
  "Language": "English",
  "Country": "United States, Germany",
  "Awards": "Nominated for 1 Oscar. 12 wins & 38 nominations total",
  "Poster": "https://img.amodb.dev/t/p/w300/qkrH7rjYKU4KOwwIl6wF6H3ISvm.jpg",
  "Ratings": [
    { "Source": "Internet Movie Database", "Value": "8.8/10" },
    { "Source": "Rotten Tomatoes", "Value": "81%" },
    { "Source": "Metacritic", "Value": "67/100" }
  ],
  "Metascore": "67",
  "imdbRating": "8.8",
  "imdbVotes": "2,669,989",
  "imdbID": "tt0137523",
  "Type": "movie",
  "DVD": "N/A",
  "BoxOffice": "$38,003,039",
  "Production": "N/A",
  "Website": "N/A",
  "Response": "True"
}
```

Для сериала вроде The Wire (`i=tt0306414`) ответ заканчивается полями `"Type": "series"`, `"totalSeasons": "5"` и `"Response": "True"`.

## Поиск через s

Передайте `s`, чтобы получить список вместо одного тайтла. На странице 10 элементов, а `totalResults` дает полное количество строкой. Запросите `page=2` для элементов с 11 по 20 и продолжайте, пока не прочитаете `totalResults` элементов. Страница за последней отвечает `Movie not found!`.

```bash
curl -sf "https://api.amodb.dev/omdb/?s=Matrix&type=movie&page=1&apikey=$AMODB_KEY"
```

| Поле           | Примечания                                                            |
| -------------- | --------------------------------------------------------------------- |
| `Search`       | Массив до 10 элементов с `Title`, `Year`, `imdbID`, `Type`, `Poster`. |
| `totalResults` | Количество всех совпадений, строкой.                                  |
| `Response`     | `True` или `False`.                                                   |

```json
{
  "Search": [
    {
      "Title": "The Matrix",
      "Year": "1999",
      "imdbID": "tt0133093",
      "Type": "movie",
      "Poster": "https://img.amodb.dev/t/p/w300/kEDbym5htJgDQNenjUtSJxAHysB.jpg"
    },
    {
      "Title": "The Matrix Reloaded",
      "Year": "2003",
      "imdbID": "tt0234215",
      "Type": "movie",
      "Poster": "https://img.amodb.dev/t/p/w300/d0xVNNxIYxId2qHkqpgE39soOvD.jpg"
    }
  ],
  "totalResults": "20",
  "Response": "True"
}
```

Список сокращен до 2 из 10 элементов.

## Чтение массива Ratings

`Ratings` содержит по одному объекту на источник, у каждого есть `Source` и `Value`, причем `Value` представляет собой текст вида `8.8/10`. Источники: `Internet Movie Database`, `Rotten Tomatoes` и `Metacritic`, и в списке только те, что известны для тайтла. Плоские поля `imdbRating`, `imdbVotes` и `Metascore` повторяют часть тех же данных. Если нужно число, разделите `Value` по символу косой черты. Для значений в числовом типе, а также оценок Kinopoisk и TMDB используйте эндпоинт [рейтинги](https://amodb.dev/ru/ratings/).

## Ошибки

Ошибки поиска возвращают `{"Response":"False","Error":"..."}`. Большинство из них приходят с HTTP 200, поэтому читайте `Error` и ориентируйтесь на текст, а не только на HTTP-статус.

| Текст `Error`                                 | HTTP | Когда                                                                                                        |
| --------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------ |
| `Movie not found!`                            | 200  | Ни один тайтл не соответствует `t`, значение `i` корректно, но неизвестно, или страница поиска за последней. |
| `Incorrect IMDb ID.`                          | 200  | Значение `i` не похоже на IMDb ID.                                                                           |
| `Too many results.`                           | 200  | Текст поиска короче 3 букв или подходит слишком многим тайтлам. Удлините текст или добавьте `type` или `y`.  |
| `Something went wrong.`                       | 200  | Не передан ни один из `i`, `t` и `s`.                                                                        |
| `Only r=json is supported.`                   | 400  | `r` равен чему угодно, кроме `json`.                                                                         |
| `No API key provided.` или `Invalid API key!` | 401  | Параметр `apikey` отсутствует или неверен.                                                                   |
| `Request limit reached!`                      | 429  | Превышен лимит запросов в минуту. Подождите `Retry-After` секунд.                                            |

Закончившийся тариф отвечает HTTP 402. См. [ошибки](https://amodb.dev/ru/errors/) и [лимиты запросов](https://amodb.dev/ru/rate-limits/).

## Миграция клиента OMDb

Миграция сводится к двум правкам: базовому URL и ключу. Больше в запросе ничего не меняется.

```js
// Before: the base URL and key of your current OMDb setup.
// After:
const OMDB_BASE = 'https://api.amodb.dev/omdb/';
const OMDB_KEY = process.env.AMODB_KEY;
```

Уберите `r=xml`, если вы его отправляете. Клиенту, который читает серии, `Season` или `callback`, для этих частей нужен другой источник. Лимит запросов действует на ключ, поэтому вызовы в стиле OMDb и [вызовы в стиле TMDB](https://amodb.dev/ru/movies/) делят один бюджет в 20, 40 или 120 запросов в минуту.

## Практические советы

- Считайте каждое значение текстом. Преобразуйте `Year`, `imdbRating` и `totalResults` самостоятельно, а `N/A` воспринимайте как отсутствие значения.
- Используйте `plot=full` только тогда, когда показываете длинное описание сюжета. С `short` ответы меньше.
- Запросы по `i` или `t` кэшируются дольше, чем поиск через `s`, поэтому повторный запрос возвращает сохраненный ответ.
- Чтобы получить TMDB ID по IMDb ID, вызовите [поиск по внешнему ID](https://amodb.dev/ru/find-by-external-id/).
- Постеры отдаются в размере `w300`. Для других размеров собирайте адрес из `poster_path` в стиле TMDB и списка размеров на странице [API изображений](https://amodb.dev/ru/images-api/).
- Храните ключ на сервере. `apikey` в URL страницы виден каждому посетителю.

## Вопросы и ответы

### Нужен ли другой ключ для эндпоинта OMDb?

Нет. Один и тот же ключ из 32 символов работает на путях в стиле TMDB и на эндпоинте OMDb. Передавайте его в параметре запроса apikey, так же как это делает клиент OMDb сегодня.

### Можно ли запросить XML?

Нет. Обслуживается только r=json. Запрос с r=xml возвращает HTTP 400 с текстом «Only r=json is supported.», поэтому уберите этот параметр или установите json, прежде чем менять базовый URL.

### Почему все значения приходят строками?

Тело ответа повторяет OMDb поле в поле, а этот формат отдает числа вроде Year, imdbRating и totalResults строками. Преобразуйте их в своем коде. Неизвестные значения читаются как N/A.

### Поддерживаются ли сезоны и серии?

Нет. Параметры Season, Episode, callback и v игнорируются, а type=episode ничего не находит. В ответе для сериала есть totalSeasons, но нет данных о сериях. Для сезонов используйте эндпоинты tv в стиле TMDB.

### Откуда берутся постеры?

Поле Poster содержит адрес на img.amodb.dev размера w300. Изображениям ключ не нужен, поэтому адрес можно сразу подставлять в тег img.

## Связанные страницы

- [Альтернатива OMDb API](https://amodb.dev/ru/omdb-api-alternative/): Уперлись в суточный лимит OMDb или нужно больше одной записи за запрос? amodb отвечает на запросы в стиле OMDb и отдает эндпоинты TMDB v3 с тем же ключом.
- [Поиск по внешнему ID](https://amodb.dev/ru/find-by-external-id/): Найдите фильм, сериал или персону по ID IMDb, TVDB, Wikidata или Kinopoisk через эндпоинт find TMDB, а также прочитайте внешние ID и факты Wikidata о проекте.
- [API деталей фильма](https://amodb.dev/ru/movies/): API деталей фильма с теми же путями и JSON, что в TMDB v3. Получите фильм по ID, добавьте актеров, рейтинги и настроения через append_to_response, на 14 языках.
- [API изображений и хост изображений](https://amodb.dev/ru/images-api/): API изображений фильмов с путями TMDB v3: списки постеров, фонов, логотипов и кадров для каждого проекта, загрузка с img.amodb.dev в 10 размерах без ключа.
- [Аутентификация](https://amodb.dev/ru/authentication/): Как передать ключ amodb: api_key в запросе, заголовок Authorization Bearer или apikey для вызовов OMDb. Формат ключа, хранение, ротация и ошибки 401.
- [Быстрый старт](https://amodb.dev/ru/quickstart/): Первый вызов amodb: получите ключ, запросите детали фильма через curl, JavaScript, Python, PHP или Go и загрузите постер с img.amodb.dev. Меньше 2 минут.

Обновлено: 2026-10-18. Source: https://amodb.dev/ru/omdb-endpoint/
