API discover
Discover listează filme la GET /3/discover/movie și seriale TV la GET /3/discover/tv, filtrate și sortate după parametrii pe care îi alegi: gen, distribuție, echipă, companie, cuvânt-cheie, date, evaluare, voturi, durată, limbă și furnizor de streaming. JSON-ul se potrivește cu TMDB v3, iar rezultatele sunt ținute în cache 30 de minute.
Descoperă filme
GET /3/discover/movie întoarce o listă paginată de filme care se potrivesc cu fiecare filtru trimis, în ordinea pe care o alegi. Este endpoint-ul pentru pagini de răsfoire, liste „cele mai bune” și recomandări pe fațete și nu cere text query. Când ai un titlu tastat de un utilizator, folosește în schimb căutare.
Exemplul listează filme științifico-fantastice (ID de gen 878) cu cel puțin 1000 de voturi, cele mai bine cotate primele.
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)
}
}Parametri
api_keyinterogareuna dintre cele douăCheia ta. Folosește-o pe aceasta sau antetulAuthorization: Bearer.sort_byinterogareCâmp și direcție, precumvote_average.desc. Câmpuri:popularity,vote_average,vote_count,primary_release_date,revenue,title,original_title, fiecare cu.ascsau.desc.titleșioriginal_titlesortează amândouă după titlul original. O valoare necunoscută revine lapopularity.desc, care este și valoarea implicită.with_genresinterogareID-uri de gen. Virgula înseamnă AND, bara verticală înseamnă OR.without_genresinterogareID-uri de gen de exclus.with_cast,with_crewinterogareID-uri de persoane. Găsește-le cu căutare.with_peopleinterogareID-uri de persoane care apar ca distribuție sau echipă.with_companies,without_companiesinterogareID-uri de companii de producție de cerut sau de exclus. Virgula și bara verticală funcționează ca lawith_genres.with_keywords,without_keywordsinterogareID-uri de cuvinte-cheie de cerut sau de exclus. Vezi cuvinte-cheie.with_origin_countryinterogareCod de țară de producție din 2 litere majuscule, precumFR.primary_release_yearinterogareAn din patru cifre al datei principale de lansare.yearinterogareAn din patru cifre. Se potrivește cu orice dată de lansare din acel an, deci întoarce mai multe titluri decâtprimary_release_year.primary_,release_ date.gte primary_interogarerelease_ date.lte Limita inferioară și superioară pentru data principală de lansare,YYYY-MM-DD.release_date.gte,release_date.lteinterogareLimita inferioară și superioară pentru orice dată de lansare din orice țară,YYYY-MM-DD.regioninterogareCod de țară din 2 litere majuscule. Înlocuieșterelease_datedin fiecare rezultat cu data din acea țară. Nu elimină titluri.certification_country,certificationinterogareFiltru de clasificare pe vârste, de exempluUSșiPG.certificationeste ignorat fără o țară.certification.gteșicertification.ltedau un interval.vote_average.gte,vote_average.lteinterogareScorul mediu minim și maxim, de la 0 la 10.vote_count.gte,vote_count.lteinterogareNumărul minim și maxim de voturi.with_runtime.gte,with_runtime.lteinterogareDurata minimă și maximă în minute.with_original_languageinterogareLimba originală ca cod din 2 litere, precumfrsauko.with_watch_providersinterogareID-uri de furnizori. Cerewatch_regionși este ignorat fără el. ID-urile vin de la genuri și liste de referință.watch_regioninterogareCod de țară din 2 litere majuscule pentru disponibilitatea furnizorilor.include_adultinterogareAcceptat și ignorat. Titlurile pentru adulți nu sunt întoarse niciodată.languageinterogareEtichetă TMDB precumen-USsaupl-PL. Sunt servite 14 limbi de bază. Impliciten-US.pageinterogareNumărul paginii de la 1 la 500. Implicit 1.
Câmpurile răspunsului
| Câmp | Tip | Observații |
|---|---|---|
page, total_pages, total_results | număr întreg | Paginarea pentru acest set de filtre. Filtrele largi raportează cel mult 1001 de pagini și 20001 de rezultate, dar pot fi citite doar paginile de la 1 la 500. |
results | array | Până la 20 de filme. Gol când niciun titlu nu se potrivește cu toate filtrele. |
id | număr întreg | ID-ul filmului pentru detalii film. |
title, original_title, overview | șir | Text localizat și titlul original. |
original_language | șir | Codul din două litere al limbii în care a fost făcut filmul. |
release_date | șir | YYYY-MM-DD. |
genre_ids | array de numere întregi | Doar ID-uri. Mapează-le la nume cu /genre/movie/list. |
poster_path, backdrop_path | șir sau null | Se adaugă la https:/. |
vote_average, vote_count, popularity | număr | Valori de scor și de clasament. |
adult, video | boolean | adult este mereu false. |
Exemplu de răspuns
{
"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
}Răspunsul a fost preluat de la API-ul live pentru cererea din exemplu. Este tăiat la 3 din cele 20 de intrări de pe pagina 1, iar șirurile overview lungi sunt scurtate.
Combină filtrele
Parametrii separați se combină cu AND. În interiorul unui parametru, virgula înseamnă AND, iar bara verticală înseamnă OR. Într-un URL brut bara se scrie %7C, iar clienții care codifică valorile interogării fac asta pentru tine.
| Scop | Cerere |
|---|---|
| Cele mai bine cotate filme SF cu suficiente voturi | / |
| Acțiune sau aventură | / |
| Acțiune, dar nu animație | / |
| Un actor cu un regizor | / |
| Filme lungi dintr-un an | / |
| Lansări dintr-o fereastră de date | / |
| Filme dintr-o singură limbă originală | / |
| Streaming într-o țară | / |
| Clasificate R în SUA | / |
| Fără un cuvânt-cheie | / |
with_original_language filtrează după limba în care a fost făcut un titlu și acceptă coduri din afara celor 14 limbi servite, de exemplu ja sau ko. Parametrul language decide în continuare limba textului primit înapoi. În rândul cu furnizorul, 8 este Netflix. Citește ID-urile furnizorilor de la /watch/providers/movie.
Descoperă seriale TV
GET /3/discover/tv folosește același plic și aceeași paginare. Intrările conțin name, original_name, first_air_date, origin_country și genre_ids, iar ID-urile de gen vin de la /genre/tv/list, care conține ID-urile TV îmbinate, precum 10765 pentru Sci-Fi and Fantasy.
| Parametru | Descriere |
|---|---|
first_air_date.gte, first_air_date.lte | Limita inferioară și superioară pentru prima dată de difuzare, YYYY-MM-DD. |
first_air_date_year | An din patru cifre al primei date de difuzare. |
air_date.gte, air_date.lte | Limita inferioară și superioară pentru datele în care un serial are episoade în difuzare, YYYY-MM-DD. |
with_networks | ID-uri de rețele. Găsește-le la companii și rețele. |
with_status | Cod numeric de stare: 0 serial care revine, 2 în producție, 3 încheiat, 4 anulat. |
with_type | Tip numeric de serial: 0 documentar, 1 știri, 2 miniserial, 3 reality, 4 cu scenariu, 5 talk show, 6 video. |
sort_by | popularity, vote_average, vote_count, first_air_date, name sau original_name, fiecare cu .asc sau .desc. name și original_name sortează amândouă după numele original. |
with_genres, without_genres, with_companies, with_keywords, without_keywords | Aceleași reguli ca la filme. |
vote_average.gte, vote_count.gte, with_runtime.gte, with_runtime.lte, with_original_language | Aceleași reguli ca la filme. |
with_watch_providers, watch_region, language, page | Aceleași reguli ca la filme. |
O cerere precum / listează serialele dramă care au început în 2025 sau mai târziu. Citește un rezultat în detaliu la seriale TV.
Erori
| HTTP | status_code | Când |
|---|---|---|
| 401 | 7 | Cheia lipsește sau este greșită. |
| 402 | 36 | Perioada planului s-a încheiat. |
| 405 | 37 | Ai apelat o metodă de scriere. |
| 429 | 25 | Ai depășit cererile pe minut. Așteaptă numărul de secunde din Retry-After. |
| 500 | 11 | Un page în afara intervalului 1 până la 500. |
| 504 | 24 | Backend-ul nu a răspuns la timp. Reîncearcă o dată. |
Un set de filtre care nu se potrivește cu nimic nu este o eroare. Primești HTTP 200 cu un array results gol și total_results 0. Vezi erori și limite de cereri.
Note practice
- Marginea ține în cache fiecare set distinct de filtre 30 de minute și îl partajează între chei. Cheia de cache folosește interogarea sortată, deci ordinea parametrilor tăi nu contează.
- O pagină are 20 de intrări, iar ultima pagină este 500, deci un set de filtre ajunge la 10,000 de intrări. Împarte pe ferestre de date ca să mergi mai adânc. Un filtru larg raportează
total_results20001, ceea ce este un plafon și nu o numărătoare reală. - Asociază mereu
sort_cuby= vote_ average.desc vote_count.gte. Fără el, titlurile cu câteva voturi aglomerează vârful. - ID-urile din filtre sunt numerice. Ia ID-urile de persoane de la căutare, iar ID-urile de gen și de furnizor de la genuri și liste de referință.
- Pentru liste gata făcute, precum populare sau în cinematografe acum, vezi tendințe și liste.