# Ендпойнт, съвместим с 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`  | заявка | да                    | Вашият ключ за amodb.                                                |
| `i`       | заявка | един от `i`, `t`, `s` | IMDb id на заглавието: `tt` плюс 7 до 9 цифри, например `tt0137523`. |
| `t`       | заявка | един от `i`, `t`, `s` | Заглавие за търсене, връща най-доброто съвпадение.                   |
| `s`       | заявка | един от `i`, `t`, `s` | Текст за търсене от поне 3 букви, връща списък.                      |
| `type`    | заявка | не                    | `movie` или `series`. `episode` не намира нищо.                      |
| `y`       | заявка | не                    | Година на излизане.                                                  |
| `plot`    | заявка | не                    | `short` или `full`. По подразбиране `short`.                         |
| `page`    | заявка | не                    | Страница с резултати от търсене, от 1 до 100. Ползва се със `s`.     |
| `r`       | заявка | не                    | Само `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/bg/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/bg/errors/) и [лимити на заявките](https://amodb.dev/bg/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/bg/movies/) споделят един бюджет от 20, 40 или 120 заявки в минута.

## Практически бележки

- Третирайте всяка стойност като текст. Преобразувайте `Year`, `imdbRating` и `totalResults` сами и считайте `N/A` за липсваща.
- Ползвайте `plot=full` само когато показвате дългото описание на сюжета. `short` държи отговорите по-малки.
- Търсенията по `i` или `t` се кешират по-дълго от търсенията със `s`, така че повторно търсене връща запазения отговор.
- За да получите TMDB id от IMDb id, извикайте [търсене по външен идентификатор](https://amodb.dev/bg/find-by-external-id/).
- Постерите са с размер `w300`. За други размери построете адреса от `poster_path` в стил TMDB и списъка с размери на страницата [изображения](https://amodb.dev/bg/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/bg/omdb-api-alternative/): Стигнахте дневния лимит на OMDb или ви трябва повече от един запис на извикване? amodb отговаря в стил OMDb и дава ендпойнти на TMDB v3 със същия ключ.
- [Търсене по външен идентификатор](https://amodb.dev/bg/find-by-external-id/): Търсете филм, сериал или личност по IMDb, TVDB, Wikidata или Kinopoisk id с ендпойнта find на TMDB и четете външни id и факти от Wikidata за заглавие.
- [API за детайли на филм](https://amodb.dev/bg/movies/): API за детайли на филм със същите пътища и JSON като TMDB v3. Един филм по id, а актьори, рейтинги и настроения през append_to_response, на 14 езика.
- [API за изображения и хост за изображения](https://amodb.dev/bg/images-api/): API за изображения на филми с пътища на TMDB v3: списъци с постери, фонови изображения, лога и кадри, после зареждане от img.amodb.dev в 10 размера без ключ.
- [Удостоверяване](https://amodb.dev/bg/authentication/): Как да изпратите ключа си за amodb: api_key в заявката, заглавка Authorization с Bearer или apikey за OMDb. Формат, съхранение, смяна на ключ и грешките 401.
- [Бърз старт](https://amodb.dev/bg/quickstart/): Първата ви заявка към amodb: вземете ключ, поискайте детайли за филм с curl, JavaScript, Python, PHP или Go и заредете постера от img.amodb.dev. До 2 минути.

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