# Endpoint zgodny z OMDb

> GET https://api.amodb.dev/omdb/ odpowiada na żądania w stylu OMDb z tymi samymi nazwami parametrów i pól. Tytuł znajdziesz po ID z IMDb przez i albo po tytule przez t, a szukać możesz przez s. Linki do plakatów wskazują na img.amodb.dev. Obsługiwane są tylko r=json, filmy i seriale. Zmień bazowy URL i klucz, a typowy klient działa dalej.

## Endpoint

`GET /omdb/`

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

Odpowiedź:

```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"
}
```

## Wyszukiwanie tytułu po ID z IMDb lub tytule

`GET https://api.amodb.dev/omdb/` zwraca jeden tytuł jako płaski JSON z nazwami pól OMDb. Przekaż `i` dla ID z IMDb, na przykład `tt0137523`, albo `t` dla tytułu. Uwierzytelnianie to parametr zapytania `apikey`. Odpowiedź ma `Response` ustawione na `True` przy sukcesie i `False` przy błędzie.

Przykład pobiera Fight Club po ID z IMDb i kończy z tekstem błędu OMDb, gdy `Response` ma wartość `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)
}
```

### Parametry

| Parametr | Gdzie | Wymagany              | Opis                                                              |
| -------- | ----- | --------------------- | ----------------------------------------------------------------- |
| `apikey` | query | tak                   | Twój klucz amodb.                                                 |
| `i`      | query | jeden z `i`, `t`, `s` | ID tytułu z IMDb: `tt` plus 7 do 9 cyfr, na przykład `tt0137523`. |
| `t`      | query | jeden z `i`, `t`, `s` | Tytuł do wyszukania, zwraca najlepsze dopasowanie.                |
| `s`      | query | jeden z `i`, `t`, `s` | Tekst wyszukiwania o długości co najmniej 3 liter, zwraca listę.  |
| `type`   | query | nie                   | `movie` lub `series`. `episode` nic nie znajduje.                 |
| `y`      | query | nie                   | Rok premiery.                                                     |
| `plot`   | query | nie                   | `short` lub `full`. Domyślnie `short`.                            |
| `page`   | query | nie                   | Strona wyników wyszukiwania, od 1 do 100. Używana z `s`.          |
| `r`      | query | nie                   | Tylko `json`. Każda inna wartość zwraca HTTP 400.                 |

Parametry `Season`, `Episode`, `callback` i `v` z oryginalnego API OMDb nie są obsługiwane i są ignorowane.

### Pola odpowiedzi

| Pole                                             | Uwagi                                                                                                              |
| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ |
| `Title`, `Year`, `Rated`, `Released`, `Runtime`  | Tekst. `Released` wygląda jak `15 Oct 1999`.                                                                       |
| `Genre`, `Director`, `Writer`, `Actors`          | Imiona i nazwiska oddzielone przecinkami.                                                                          |
| `Plot`, `Language`, `Country`, `Awards`          | Tekst.                                                                                                             |
| `Poster`                                         | Adres w `https://img.amodb.dev/t/p/w300/`.                                                                         |
| `Ratings`                                        | Tablica obiektów z `Source` i `Value`.                                                                             |
| `Metascore`, `imdbRating`, `imdbVotes`, `imdbID` | Tekst, w tym liczba głosów z przecinkami.                                                                          |
| `Type`                                           | `movie` lub `series`.                                                                                              |
| `DVD`, `BoxOffice`, `Production`, `Website`      | Tylko filmy. `BoxOffice` niesie wartość, gdy jest znana. `DVD`, `Production` i `Website` zawsze mają postać `N/A`. |
| `totalSeasons`                                   | Tylko seriale, jako tekst. Odpowiedzi seriali nie mają `DVD`, `BoxOffice`, `Production` ani `Website`.             |
| `Response`                                       | `True` lub `False`, zawsze ciąg.                                                                                   |

Pola odpowiadają OMDb, więc istniejący parser OMDb nie wymaga zmian poza bazowym URL.

### Przykładowa odpowiedź

```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"
}
```

Dla serialu, takiego jak The Wire (`i=tt0306414`), odpowiedź kończy się `"Type": "series"`, `"totalSeasons": "5"` i `"Response": "True"`.

## Wyszukiwanie przez s

Wyślij `s`, by dostać listę zamiast jednego tytułu. Każda strona zawiera 10 pozycji, a `totalResults` podaje pełną liczbę jako ciąg. Zażądaj `page=2` dla pozycji od 11 do 20 i kontynuuj, aż odczytasz `totalResults` pozycji. Strona za ostatnią odpowiada `Movie not found!`.

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

| Pole           | Uwagi                                                                |
| -------------- | -------------------------------------------------------------------- |
| `Search`       | Tablica do 10 pozycji z `Title`, `Year`, `imdbID`, `Type`, `Poster`. |
| `totalResults` | Liczba wszystkich dopasowań, jako ciąg.                              |
| `Response`     | `True` lub `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"
}
```

Lista jest przycięta do 2 z 10 pozycji.

## Odczyt tablicy Ratings

`Ratings` zawiera jeden obiekt na źródło, każdy z `Source` i `Value`, a `Value` to tekst taki jak `8.8/10`. Źródła to `Internet Movie Database`, `Rotten Tomatoes` i `Metacritic`, a wymienione są tylko te, które są znane dla tytułu. Płaskie pola `imdbRating`, `imdbVotes` i `Metascore` powtarzają część tych samych danych. Jeśli potrzebujesz liczby, podziel `Value` po ukośniku. Dla typowanych liczb oraz ocen z Kinopoisk i TMDB użyj zamiast tego endpointu [oceny](https://amodb.dev/pl/ratings/).

## Błędy

Niepowodzenia wyszukiwania zwracają `{"Response":"False","Error":"..."}`. Większość z nich przychodzi z HTTP 200, więc czytaj `Error` i rozgałęziaj po tekście, a nie tylko po statusie HTTP.

| Tekst `Error`                                 | HTTP | Kiedy                                                                                                                  |
| --------------------------------------------- | ---- | ---------------------------------------------------------------------------------------------------------------------- |
| `Movie not found!`                            | 200  | Żaden tytuł nie pasuje do `t`, wartość `i` jest poprawna, ale nieznana, albo strona wyszukiwania jest za ostatnią.     |
| `Incorrect IMDb ID.`                          | 200  | Wartość `i` nie ma kształtu ID z IMDb.                                                                                 |
| `Too many results.`                           | 200  | Tekst wyszukiwania jest krótszy niż 3 litery lub pasuje do zbyt wielu tytułów. Wydłuż tekst albo dodaj `type` lub `y`. |
| `Something went wrong.`                       | 200  | Nie wysłano żadnego z `i`, `t` i `s`.                                                                                  |
| `Only r=json is supported.`                   | 400  | `r` ma inną wartość niż `json`.                                                                                        |
| `No API key provided.` lub `Invalid API key!` | 401  | `apikey` brakuje lub jest błędny.                                                                                      |
| `Request limit reached!`                      | 429  | Przekroczono limit żądań na minutę. Poczekaj tyle sekund, ile podaje `Retry-After`.                                    |

Zakończony plan odpowiada HTTP 402. Zobacz [błędy](https://amodb.dev/pl/errors/) i [limity żądań](https://amodb.dev/pl/rate-limits/).

## Migracja klienta OMDb

Migracja to dwie zmiany: bazowy URL i klucz. Nic więcej w żądaniu się nie zmienia.

```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;
```

Usuń `r=xml`, jeśli go wysyłasz. Klient, który czyta odcinki, `Season` lub `callback`, potrzebuje innego źródła dla tych części. Limit żądań dotyczy klucza, więc wywołania w stylu OMDb i [wywołania w stylu TMDB](https://amodb.dev/pl/movies/) dzielą jeden budżet 20, 40 lub 120 żądań na minutę.

## Praktyczne uwagi

- Traktuj każdą wartość jako tekst. `Year`, `imdbRating` i `totalResults` przekonwertuj samodzielnie, a `N/A` traktuj jako brak.
- Używaj `plot=full` tylko wtedy, gdy pokazujesz długi opis fabuły. `short` zmniejsza odpowiedzi.
- Wyszukiwania przez `i` lub `t` są w cache dłużej niż wyszukiwania przez `s`, więc powtórne wyszukanie zwraca zapisaną odpowiedź.
- Aby z ID z IMDb dostać ID z TMDB, wywołaj [wyszukiwanie po zewnętrznym ID](https://amodb.dev/pl/find-by-external-id/).
- Plakaty mają rozmiar `w300`. Dla innych rozmiarów zbuduj adres z `poster_path` w stylu TMDB i listy rozmiarów ze strony [obrazy](https://amodb.dev/pl/images-api/).
- Trzymaj klucz na serwerze. `apikey` w URL strony widzi każdy odwiedzający.

## Pytania i odpowiedzi

### Czy potrzebuję innego klucza do endpointu OMDb?

Nie. Ten sam 32-znakowy klucz działa na ścieżkach w stylu TMDB i na endpoincie OMDb. Wyślij go jako parametr zapytania apikey, dokładnie tak, jak robi to dziś klient OMDb.

### Czy mogę zażądać XML?

Nie. Obsługiwane jest tylko r=json. Żądanie z r=xml zwraca HTTP 400 z tekstem Only r=json is supported., więc usuń ten parametr albo ustaw go na json przed zmianą bazowego URL.

### Dlaczego wszystkie wartości są ciągami?

Treść odpowiada OMDb pole po polu, a ten format wysyła liczby takie jak Year, imdbRating i totalResults jako ciągi. Przekonwertuj je w swoim kodzie. Nieznane wartości mają postać N/A.

### Czy sezony i odcinki są obsługiwane?

Nie. Parametry Season, Episode, callback i v są ignorowane, a type=episode nic nie znajduje. Odpowiedź serialu ma totalSeasons, ale nie ma danych odcinków. Dla sezonów użyj endpointów seriali w stylu TMDB.

### Skąd pochodzą plakaty?

Pole Poster zawiera adres na img.amodb.dev w rozmiarze w300. Obrazy nie wymagają klucza, więc adres możesz wstawić prosto do znacznika img.

## Powiązane strony

- [Alternatywa dla OMDb API](https://amodb.dev/pl/omdb-api-alternative/): Dzienny limit OMDb to za mało? amodb odpowiada na żądania w stylu OMDb i obsługuje też TMDB v3 na jednym kluczu, bez większych zmian w kodzie klienta.
- [Wyszukiwanie po zewnętrznym ID](https://amodb.dev/pl/find-by-external-id/): Znajdź film, serial lub osobę po ID z IMDb, TVDB, Wikidata lub Kinopoisk przez endpoint find z TMDB oraz odczytaj zewnętrzne ID i fakty z Wikidata o tytule.
- [API szczegółów filmu](https://amodb.dev/pl/movies/): API szczegółów filmu z tymi samymi ścieżkami i JSON co TMDB v3. Pobierz film po ID, dołącz obsadę, oceny i nastroje przez append_to_response, 14 języków.
- [API obrazów i host obrazów](https://amodb.dev/pl/images-api/): API obrazów filmów ze ścieżkami TMDB v3: wypisz plakaty, tła, loga i kadry każdego tytułu, a potem ładuj je z img.amodb.dev w 10 rozmiarach bez klucza.
- [Uwierzytelnianie](https://amodb.dev/pl/authentication/): Jak wysłać klucz amodb: api_key w zapytaniu, nagłówek Authorization Bearer albo apikey dla wywołań OMDb. Format klucza, przechowywanie, rotacja i błędy 401.
- [Szybki start](https://amodb.dev/pl/quickstart/): Pierwsze wywołanie amodb: zdobądź klucz, pobierz szczegóły filmu w curl, JavaScript, Python, PHP lub Go, potem załaduj plakat z img.amodb.dev. Poniżej 2 minut.

Zaktualizowano: 2026-10-18. Source: https://amodb.dev/pl/omdb-endpoint/
