Discover API
Discover vypisuje filmy na GET /3/discover/movie a seriály na GET /3/discover/tv, filtrované a řazené podle zvolených parametrů: žánr, obsazení, štáb, společnost, klíčové slovo, data, hodnocení, hlasy, délka, jazyk a poskytovatel streamování. JSON odpovídá TMDB v3 a výsledky se cachují 30 minut.
Discover pro filmy
GET /3/discover/movie vrací stránkovaný seznam filmů, které odpovídají všem odeslaným filtrům, v pořadí podle vašeho výběru. Je to endpoint pro stránky s procházením, seznamy „nejlepších“ a doporučení podle fasety a nepotřebuje text query. Když máte titul zadaný uživatelem, použijte místo něj vyhledávání.
Příklad vypíše sci-fi filmy (ID žánru 878) s alespoň 1000 hlasy, nejlépe hodnocené první.
curl -sSf --get "https://api.amodb.dev/3/discover/movie" \
--data-urlencode "with_genres=878" \
--data-urlencode "sort_by=vote_average.desc" \
--data-urlencode "vote_count.gte=1000" \
--data-urlencode "language=en-US" \
-H "Authorization: Bearer $AMODB_KEY"const params = new URLSearchParams({
with_genres: '878',
sort_by: 'vote_average.desc',
'vote_count.gte': '1000',
language: 'en-US',
});
const res = await fetch(`https://api.amodb.dev/3/discover/movie?${params}`, {
headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` },
});
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const { results, total_pages } = await res.json();
console.log(`page 1 of ${total_pages}`);
for (const m of results.slice(0, 5)) console.log(m.vote_average, m.title, m.release_date);import os
import requests
r = requests.get(
"https://api.amodb.dev/3/discover/movie",
params={
"with_genres": 878,
"sort_by": "vote_average.desc",
"vote_count.gte": 1000,
"language": "en-US",
},
headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
timeout=10,
)
r.raise_for_status()
data = r.json()
print("page 1 of", data["total_pages"])
for m in data["results"][:5]:
print(m["vote_average"], m["title"], m["release_date"])<?php
$url = 'https://api.amodb.dev/3/discover/movie?' . http_build_query([
'with_genres' => 878,
'sort_by' => 'vote_average.desc',
'vote_count.gte' => 1000,
'language' => 'en-US',
]);
$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");
}
$data = json_decode($body, true);
foreach (array_slice($data['results'], 0, 5) as $m) {
echo $m['vote_average'], ' ', $m['title'], PHP_EOL;
}package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
"time"
)
type Page struct {
TotalPages int `json:"total_pages"`
Results []struct {
Title string `json:"title"`
ReleaseDate string `json:"release_date"`
VoteAverage float64 `json:"vote_average"`
} `json:"results"`
}
func main() {
q := url.Values{
"with_genres": {"878"},
"sort_by": {"vote_average.desc"},
"vote_count.gte": {"1000"},
"language": {"en-US"},
}
req, _ := http.NewRequest("GET", "https://api.amodb.dev/3/discover/movie?"+q.Encode(), nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
client := &http.Client{Timeout: 10 * time.Second}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
panic(res.Status)
}
var p Page
if err := json.NewDecoder(res.Body).Decode(&p); err != nil {
panic(err)
}
fmt.Println("pages:", p.TotalPages)
for _, m := range p.Results {
fmt.Println(m.VoteAverage, m.Title, m.ReleaseDate)
}
}Parametry
api_keyqueryjeden ze dvouVáš klíč. Použijte jej, nebo hlavičkuAuthorization: Bearer.sort_byqueryPole a směr, napříkladvote_average.desc. Pole:popularity,vote_average,vote_count,primary_release_date,revenue,title,original_title, každé s.ascnebo.desc.titleioriginal_titleřadí podle původního názvu. Neznámá hodnota se vrátí kpopularity.desc, což je i výchozí.with_genresqueryID žánrů. Čárka znamená AND, znak svislé čáry OR.without_genresqueryID žánrů k vyloučení.with_cast,with_crewqueryID osob. Najdete je přes vyhledávání.with_peoplequeryID osob, které se objevují jako obsazení nebo štáb.with_companies,without_companiesqueryID produkčních společností k vyžadování nebo vyloučení. Čárka a svislá čára fungují jako uwith_genres.with_keywords,without_keywordsqueryID klíčových slov k vyžadování nebo vyloučení. Viz klíčová slova.with_origin_countryqueryDvoupísmenný kód produkční země velkými písmeny, napříkladFR.primary_release_yearqueryČtyřmístný rok primárního data vydání.yearqueryČtyřmístný rok. Odpovídá libovolnému datu vydání v tom roce, takže vrací víc titulů nežprimary_release_year.primary_,release_ date.gte primary_queryrelease_ date.lte Dolní a horní mez primárního data vydání,YYYY-MM-DD.release_date.gte,release_date.ltequeryDolní a horní mez libovolného data vydání v jakékoli zemi,YYYY-MM-DD.regionqueryDvoupísmenný kód země velkými písmeny. Nahradírelease_datev každém výsledku datem v dané zemi. Tituly neodstraňuje.certification_country,certificationqueryFiltr věkového hodnocení, napříkladUSaPG.certificationse bez země ignoruje.certification.gteacertification.lteudávají rozsah.vote_average.gte,vote_average.ltequeryMinimální a maximální průměrné skóre, 0 až 10.vote_count.gte,vote_count.ltequeryMinimální a maximální počet hlasů.with_runtime.gte,with_runtime.ltequeryMinimální a maximální délka v minutách.with_original_languagequeryPůvodní jazyk jako dvoupísmenný kód, napříkladfrneboko.with_watch_providersqueryID poskytovatelů. Vyžadujewatch_regiona bez něj se ignoruje. ID pocházejí ze stránky žánry a číselníky.watch_regionqueryDvoupísmenný kód země velkými písmeny pro dostupnost poskytovatele.include_adultqueryPřijímá se a ignoruje. Tituly pro dospělé se nikdy nevracejí.languagequeryTag TMDB, napříkladen-USnebopl-PL. Podporuje se 14 základních jazyků. Výchozíen-US.pagequeryČíslo stránky od 1 do 500. Výchozí 1.
Pole odpovědi
| Pole | Typ | Poznámky |
|---|---|---|
page, total_pages, total_results | integer | Stránkování pro tuto sadu filtrů. Široké filtry hlásí nejvýše 1001 stránek a 20001 výsledků, ale číst lze jen stránky 1 až 500. |
results | array | Až 20 filmů. Prázdné, když žádný titul nesplňuje všechny filtry. |
id | integer | ID filmu pro detail filmu. |
title, original_title, overview | string | Lokalizovaný text a původní název. |
original_language | string | Dvoupísmenný kód jazyka, ve kterém byl film natočen. |
release_date | string | YYYY-MM-DD. |
genre_ids | array of integers | Jen ID. Na názvy je převeďte přes /genre/movie/list. |
poster_path, backdrop_path | string nebo null | Připojte k https:/. |
vote_average, vote_count, popularity | number | Skóre a hodnoty pořadí. |
adult, video | boolean | adult je vždy false. |
Příklad odpovědi
{
"page": 1,
"results": [
{
"adult": false,
"backdrop_path": "/wLWvHcQz7N13DvSOTV7bHgwGXpT.jpg",
"genre_ids": [878, 12],
"id": 687163,
"original_language": "en",
"original_title": "Project Hail Mary",
"overview": "Science teacher Ryland Grace wakes up on a spaceship light years from home with no recollection of who he i...",
"popularity": 101.0341,
"poster_path": "/yihdXomYb5kTeSivtFndMy5iDmf.jpg",
"release_date": "2026-03-15",
"title": "Project Hail Mary",
"video": false,
"vote_average": 8.635,
"vote_count": 8354
},
{
"adult": false,
"backdrop_path": "/Ys8UIGWJpd2TMuQk8fU77W3mBz.jpg",
"genre_ids": [12, 18, 878],
"id": 157336,
"original_language": "en",
"original_title": "Interstellar",
"overview": "The adventures of a group of explorers who make use of a newly discovered wormhole to surpass the limitatio...",
"popularity": 74.3949,
"poster_path": "/yQvGrMoipbRoddT0ZR8tPoR7NfX.jpg",
"release_date": "2014-11-04",
"title": "Interstellar",
"video": false,
"vote_average": 8.491,
"vote_count": 41526
},
{
"adult": false,
"backdrop_path": "/tanwf7KOwQ6dxZzehKsXkffIJOd.jpg",
"genre_ids": [878, 28, 12],
"id": 969681,
"original_language": "en",
"original_title": "Spider-Man: Brand New Day",
"overview": "Fighting crime full-time as Spider-Man in a world that doesn't remember him...",
"popularity": 663.5004,
"poster_path": "/bjiS5ipwxb9JFy3XRRN4OAilSeX.jpg",
"release_date": "2026-07-29",
"title": "Spider-Man: Brand New Day",
"video": false,
"vote_average": 8.468,
"vote_count": 5684
}
],
"total_pages": 39,
"total_results": 772
}Odpověď byla stažena z živého API pro příkladový požadavek. Je zkrácena na 3 z 20 položek na stránce 1 a dlouhé řetězce overview jsou zkráceny.
Kombinování filtrů
Samostatné parametry se kombinují přes AND. Uvnitř jednoho parametru znamená čárka AND a znak svislé čáry OR. V surové URL se svislá čára píše %7C a klienti, kteří kódují hodnoty dotazu, to udělají za vás.
| Cíl | Požadavek |
|---|---|
| Nejlépe hodnocené sci-fi s dostatkem hlasů | / |
| Akční nebo dobrodružné | / |
| Akční, ale ne animované | / |
| Jeden herec s jedním režisérem | / |
| Dlouhé filmy z jednoho roku | / |
| Premiéry v okně dat | / |
| Filmy v jednom původním jazyce | / |
| Streaming v jedné zemi | / |
| S hodnocením R v USA | / |
| Bez klíčového slova | / |
with_original_language filtruje podle jazyka, ve kterém byl titul natočen, a přijímá i kódy mimo 14 podporovaných jazyků, například ja nebo ko. Jazyk vráceného textu stále určuje parametr language. V řádku s poskytovatelem je 8 Netflix. ID poskytovatelů čtěte z /watch/providers/movie.
Discover pro seriály
GET /3/discover/tv používá stejný obal a stránkování. Položky obsahují name, original_name, first_air_date, origin_country a genre_ids a ID žánrů pocházejí z /genre/tv/list, který obsahuje sloučená seriálová ID, například 10765 pro Sci-Fi a fantasy.
| Parametr | Popis |
|---|---|
first_air_date.gte, first_air_date.lte | Dolní a horní mez data prvního vysílání, YYYY-MM-DD. |
first_air_date_year | Čtyřmístný rok data prvního vysílání. |
air_date.gte, air_date.lte | Dolní a horní mez dat, kdy seriál vysílá epizody, YYYY-MM-DD. |
with_networks | ID sítí. Najdete je na stránce společnosti a televizní sítě. |
with_status | Číselný kód stavu: 0 pokračující seriál, 2 ve výrobě, 3 skončil, 4 zrušen. |
with_type | Číselný typ pořadu: 0 dokument, 1 zprávy, 2 minisérie, 3 reality, 4 scénářový, 5 talk show, 6 video. |
sort_by | popularity, vote_average, vote_count, first_air_date, name nebo original_name, každé s .asc nebo .desc. name i original_name řadí podle původního názvu. |
with_genres, without_genres, with_companies, with_keywords, without_keywords | Stejná pravidla jako u filmů. |
vote_average.gte, vote_count.gte, with_runtime.gte, with_runtime.lte, with_original_language | Stejná pravidla jako u filmů. |
with_watch_providers, watch_region, language, page | Stejná pravidla jako u filmů. |
Požadavek jako / vypíše dramatické seriály, které začaly v roce 2025 nebo později. Výsledek podrobně čtěte na stránce seriály.
Chyby
| HTTP | status_code | Kdy |
|---|---|---|
| 401 | 7 | Klíč chybí nebo je nesprávný. |
| 402 | 36 | Platnost tarifu skončila. |
| 405 | 37 | Zavolali jste metodu pro zápis. |
| 429 | 25 | Překročen počet požadavků za minutu. Počkejte tolik sekund, kolik říká Retry-After. |
| 500 | 11 | Hodnota page mimo 1 až 500. |
| 504 | 24 | Backend neodpověděl včas. Zkuste to jednou znovu. |
Sada filtrů, která nic nenajde, není chyba. Dostanete HTTP 200 s prázdným polem results a total_results rovným 0. Viz chyby a limity požadavků.
Praktické poznámky
- Edge cachuje každou odlišnou sadu filtrů 30 minut a sdílí ji mezi klíči. Klíč cache používá seřazený dotaz, takže na pořadí parametrů nezáleží.
- Stránka obsahuje 20 položek a poslední stránka je 500, takže jedna sada filtrů dosáhne 10 000 položek. Pro hlubší průchod dělte podle oken dat. Široký filtr hlásí
total_results20001, což je strop, ne skutečný počet. sort_vždy spárujte sby= vote_ average.desc vote_count.gte. Bez něj nahoře zaplní tituly s pár hlasy.- ID ve filtrech jsou číselná. ID osob získáte přes vyhledávání a ID žánrů a poskytovatelů ze stránky žánry a číselníky.
- Hotové seznamy, například populární nebo aktuálně v kinech, najdete na stránce trendy a seznamy.