# API klíčových slov

> Endpointy klíčových slov vracejí dějové štítky připojené k filmu nebo seriálu, každý jako ID a název. Můžete vyhledat jedno klíčové slovo, vypsat filmy, které ho nesou, nebo předat ID do discover přes with_keywords a sestavit tematické stránky. Filmy odpovídají pod keywords, seriály pod results.

## Endpoint

`GET /3/movie/{movie_id}/keywords`

```bash
curl "https://api.amodb.dev/3/movie/550/keywords" \
  -H "Authorization: Bearer $AMODB_KEY"
```

Odpověď:

```json
{
  "id": 550,
  "keywords": [
    {
      "id": 818,
      "name": "based on novel or book"
    },
    {
      "id": 825,
      "name": "support group"
    },
    {
      "id": 851,
      "name": "dual identity"
    }
  ]
}
```

## Získání klíčových slov filmu

`GET /3/movie/{movie_id}/keywords` vrací dějové štítky jednoho filmu. Klíčové slovo je krátká fráze, například téma, prostředí nebo druh předlohy, a má číselné ID, které můžete znovu použít v [discover](https://amodb.dev/cs/discover/).

Příklad načte klíčová slova filmu a pak se discover zeptá na nejpopulárnější filmy, které sdílejí jeho první klíčové slovo.

```bash
curl -s "https://api.amodb.dev/3/movie/550/keywords" \
  -H "Authorization: Bearer $AMODB_KEY"

curl -s "https://api.amodb.dev/3/discover/movie?with_keywords=818&sort_by=popularity.desc" \
  -H "Authorization: Bearer $AMODB_KEY"
```

```js
const base = 'https://api.amodb.dev/3';
const headers = { Authorization: `Bearer ${process.env.AMODB_KEY}` };

const kw = await fetch(`${base}/movie/550/keywords`, { headers });
if (!kw.ok) throw new Error(`keywords failed with ${kw.status}`);
const { keywords } = await kw.json();
console.log(keywords.map((k) => `${k.id}:${k.name}`).join(', '));

if (keywords.length > 0) {
  const first = keywords[0];
  const found = await fetch(`${base}/discover/movie?with_keywords=${first.id}&sort_by=popularity.desc`, { headers });
  if (!found.ok) throw new Error(`discover failed with ${found.status}`);
  const page = await found.json();
  console.log(first.name, page.results.slice(0, 5).map((m) => m.title));
}
```

```python
import os
import requests

base = "https://api.amodb.dev/3"
headers = {"Authorization": f"Bearer {os.environ['AMODB_KEY']}"}

r = requests.get(f"{base}/movie/550/keywords", headers=headers, timeout=10)
r.raise_for_status()
keywords = r.json()["keywords"]
print(", ".join(f"{k['id']}:{k['name']}" for k in keywords))

if keywords:
    first = keywords[0]
    d = requests.get(
        f"{base}/discover/movie",
        params={"with_keywords": first["id"], "sort_by": "popularity.desc"},
        headers=headers,
        timeout=10,
    )
    d.raise_for_status()
    print(first["name"], [m["title"] for m in d.json()["results"][:5]])
```

```php
<?php
function amodb_get(string $url): array {
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('AMODB_KEY')],
    ]);
    $body = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($status !== 200) {
        throw new RuntimeException("amodb returned $status");
    }
    return json_decode($body, true);
}

$base = 'https://api.amodb.dev/3';
$keywords = amodb_get("$base/movie/550/keywords")['keywords'];
if ($keywords) {
    $first = $keywords[0];
    $found = amodb_get("$base/discover/movie?with_keywords={$first['id']}&sort_by=popularity.desc");
    $titles = array_column(array_slice($found['results'], 0, 5), 'title');
    echo $first['name'], ': ', implode(', ', $titles), PHP_EOL;
}
```

```go
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"os"
	"time"
)

var client = &http.Client{Timeout: 10 * time.Second}

func get(path string, out any) error {
	req, _ := http.NewRequest("GET", "https://api.amodb.dev/3"+path, nil)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
	res, err := client.Do(req)
	if err != nil {
		return err
	}
	defer res.Body.Close()
	if res.StatusCode != http.StatusOK {
		return fmt.Errorf("amodb returned %s", res.Status)
	}
	return json.NewDecoder(res.Body).Decode(out)
}

type Keywords struct {
	Keywords []struct {
		ID   int    `json:"id"`
		Name string `json:"name"`
	} `json:"keywords"`
}

type Page struct {
	Results []struct {
		Title string `json:"title"`
	} `json:"results"`
}

func main() {
	var kw Keywords
	if err := get("/movie/550/keywords", &kw); err != nil {
		panic(err)
	}
	if len(kw.Keywords) == 0 {
		return
	}
	first := kw.Keywords[0]
	var page Page
	if err := get(fmt.Sprintf("/discover/movie?with_keywords=%d&sort_by=popularity.desc", first.ID), &page); err != nil {
		panic(err)
	}
	fmt.Println(first.Name)
	for i, m := range page.Results {
		if i == 5 {
			break
		}
		fmt.Println(" ", m.Title)
	}
}
```

### Parametry

| Parametr   | Kde   | Povinný       | Popis                                                          |
| ---------- | ----- | ------------- | -------------------------------------------------------------- |
| `movie_id` | path  | ano           | Číselné ID filmu, například `550`.                             |
| `api_key`  | query | jeden ze dvou | Váš klíč. Použijte jej, nebo hlavičku `Authorization: Bearer`. |

### Pole odpovědi

| Pole              | Typ     | Poznámky                                                                             |
| ----------------- | ------- | ------------------------------------------------------------------------------------ |
| `id`              | integer | ID filmu.                                                                            |
| `keywords`        | array   | Objekty s `id` a `name`. Prázdné, když film žádné nemá.                              |
| `keywords[].id`   | integer | ID klíčového slova. Použijte jej ve `with_keywords` a v cestách klíčových slov níže. |
| `keywords[].name` | string  | Text klíčového slova.                                                                |

### Příklad odpovědi

```json
{
  "id": 550,
  "keywords": [
    { "id": 818, "name": "based on novel or book" },
    { "id": 825, "name": "support group" },
    { "id": 851, "name": "dual identity" }
  ]
}
```

Skutečná odpověď obsahuje 14 klíčových slov. Tato je zkrácena na první 3. Názvy klíčových slov se nepřekládají, takže `language` zde nemá žádný účinek.

## Klíčová slova seriálu

`GET /3/tv/{series_id}/keywords` přijímá stejný klíč a vrací stejné objekty, ale pole se jmenuje `results`. ID v cestě je ID seriálu, například `1396`.

```json
{
  "id": 1396,
  "results": [
    { "id": 1508, "name": "new mexico" },
    { "id": 2231, "name": "drug dealer" }
  ]
}
```

Skutečná odpověď obsahuje 29 položek a tato je zkrácena na první 2. Klient, který obsluhuje oba typy médií, může číst `data.keywords ?? data.results` a oba zacházet stejně.

## Záznamy klíčových slov a jejich filmy

| Metoda a cesta                     | Vrací                                                                              | Parametry          |
| ---------------------------------- | ---------------------------------------------------------------------------------- | ------------------ |
| `GET /keyword/{keyword_id}`        | `{ id, name }`                                                                     | žádné              |
| `GET /keyword/{keyword_id}/movies` | Stránkovaný seznam filmů s `id`, `page`, `results`, `total_pages`, `total_results` | `language`, `page` |

Obě cesty používají číselné ID z pole klíčových slov. Seznam filmů má stejný tvar položek jako ostatní [seznamy filmů](https://amodb.dev/cs/trending-lists/), včetně `genre_ids` a `poster_path`, plus `id` klíčového slova nahoře. `include_adult` se přijímá a ignoruje. Stránka za `total_pages` vrací prázdné pole `results`. Seznam seriálů pro klíčové slovo neexistuje, použijte proto pro seriály `/discover/tv?with_keywords=`.

## Kombinování klíčových slov s discover

Pro cokoli nad rámec prostého seznamu filtrujte v [discover](https://amodb.dev/cs/discover/). Řadí, stránkuje a kombinuje klíčová slova s dalšími filtry a pokrývá seriály stejně jako filmy.

| Cíl                                         | Řetězec dotazu                                     |
| ------------------------------------------- | -------------------------------------------------- |
| Filmy s jedním klíčovým slovem              | `/discover/movie?with_keywords=818`                |
| Filmy s oběma ze dvou klíčových slov        | `/discover/movie?with_keywords=818,4565`           |
| Filmy bez klíčového slova                   | `/discover/movie?without_keywords=818`             |
| Seriály s klíčovým slovem                   | `/discover/tv?with_keywords=9712`                  |
| Seriály s kterýmkoli ze dvou klíčových slov | `/discover/tv?with_keywords=818%7C9712`            |
| Jedno klíčové slovo v rámci žánru           | `/discover/movie?with_keywords=818&with_genres=18` |

Čárka mezi ID znamená všechna. Svislou čáru mezi ID, jako ve `with_keywords=818|4565`, napište, pokud stačí kterékoli. Výsledky discover se na edge cachují 30 minut.

## Hledání ID klíčového slova

Chcete-li změnit text na ID, zavolejte `GET /3/search/keyword?query=heist`. Vrací stránkovaný seznam dvojic `id` a `name`, 20 na stránku. Úplnou sadu cest pro hledání viz [vyhledávání](https://amodb.dev/cs/search/). Hledání klíčového slova, které nic nenajde, aktuálně odpovídá 500 se `status_code` 11 místo prázdného seznamu. Odpovědi hledání se cachují 10 minut, ale každé volání se stále počítá do vašich požadavků za minutu, proto u našeptávače používejte debounce.

## Chyby

| HTTP | status_code | Kdy                                                                                         |
| ---- | ----------- | ------------------------------------------------------------------------------------------- |
| 401  | 7           | Klíč chybí nebo je nesprávný.                                                               |
| 402  | 36          | Platnost tarifu skončila.                                                                   |
| 404  | 34          | Klíčové slovo s tímto ID na `/keyword/{keyword_id}` a jeho seznamu filmů neexistuje.        |
| 405  | 37          | Použili jste metodu pro zápis na cestě klíčového slova.                                     |
| 429  | 25          | Překročili jste počet požadavků za minutu. Počkejte tolik sekund, kolik říká `Retry-After`. |
| 500  | 11          | Dotaz `/search/keyword`, který nic nenajde.                                                 |

Neznámé ID filmu nebo seriálu na cestách klíčových slov není 404. Dostanete HTTP 200 s ID a prázdným polem.

Všechny kódy viz [chyby](https://amodb.dev/cs/errors/) a limity tarifů viz [limity požadavků](https://amodb.dev/cs/rate-limits/).

## Praktické poznámky

- Ukládejte `id` klíčového slova, ne název. Název lze přeformulovat, ID se nemění.
- Seznamy klíčových slov se cachují spolu s detaily titulu, 6 hodin. Pro stránky se štítky stačí týdenní obnova.
- Jeden titul má krátký seznam štítků. Pro tematické stránky začněte od ID klíčového slova a vypište jeho tituly v discover, ne obráceně.
- Pomocí `without_keywords` odstraňte šum, například štítek, který na rodinné stránce nikdy nechcete.
- Prázdné pole je platná odpověď u málo známých titulů. Řádek se štítky skryjte místo zobrazení chyby.

## Otázky a odpovědi

### Proč odpověď seriálu používá results, zatímco filmy keywords?

Tak TMDB v3 tvaruje odpovědi a amodb to zachovává, aby stávající klienti fungovali. Filmy vracejí pole keywords. Seriály vracejí stejné objekty pod results. Čtěte data.keywords ?? data.results.

### Jak najdu ID klíčového slova podle jeho názvu?

Zavolejte cestu pro hledání klíčových slov s dotazem, například /3/search/keyword?query=heist. Vrací stránkovaný seznam dvojic id a name. Vyberte přesnou shodu a uložte id.

### Mohu použít jedno ID klíčového slova pro filmy i seriály?

Ano. ID klíčového slova je stejná hodnota v discover pro filmy i v discover pro seriály, takže with_keywords funguje na obou cestách. Uložte jedno ID na téma a použijte ho pro oba typy médií.

### Jak zkombinuji více klíčových slov v jednom dotazu?

Spojte ID ve with_keywords čárkou, pokud požadujete všechna, nebo svislou čarou, pokud stačí kterékoli. K vyloučení ID použijte without_keywords. Držte URL v mezích délky, kterou váš klient HTTP dovoluje.

## Související stránky

- [Discover API](https://amodb.dev/cs/discover/): Discover API se stejnými filtry jako TMDB v3. Vypisujte filmy a seriály podle žánru, společnosti, klíčového slova, roku, hodnocení, délky a poskytovatele.
- [API vyhledávání](https://amodb.dev/cs/search/): API vyhledávání se stejnými cestami a JSON jako TMDB v3. Najděte filmy, seriály, osoby, kolekce, společnosti a klíčová slova podle textu s filtrem roku.
- [API detailu filmu](https://amodb.dev/cs/movies/): API detailu filmu se stejnými cestami a JSON jako TMDB v3. Načtěte film podle ID, přidejte obsazení, hodnocení a nálady přes append_to_response, 14 jazyků.
- [API detailu seriálu](https://amodb.dev/cs/tv-series/): API detailu seriálu se stejnými cestami a JSON jako TMDB v3. Seriál podle ID se sezónami, sítěmi, věkovým hodnocením a poskytovateli streamování.
- [Žánry a číselníky](https://amodb.dev/cs/genres/): Seznam žánrů API s cestami TMDB v3: ID žánrů filmů a seriálů s přeloženými názvy a také číselníky zemí, jazyků, profesí, věkových hodnocení a poskytovatelů.
- [Rychlý start](https://amodb.dev/cs/quickstart/): První volání amodb: získejte klíč, vyžádejte detail filmu v curl, JavaScriptu, Pythonu, PHP nebo Go a načtěte plakát z img.amodb.dev. Za méně než 2 minuty.

Aktualizováno: 2026-10-18. Source: https://amodb.dev/cs/keywords/
