Discover API
Discover показва филми през GET /3/discover/movie и сериали през GET /3/discover/tv, филтрирани и сортирани по избрани параметри: жанр, актьори, екип, компания, ключова дума, дати, рейтинг, гласове, продължителност, език и стрийминг доставчик. JSON съвпада с TMDB v3, а резултатите се кешират за 30 минути.
Откриване на филми по филтри
GET /3/discover/movie връща странициран списък с филми, които отговарят на всички подадени филтри, в избрания от вас ред. Това е ендпойнтът за страници за разглеждане, списъци „най-добри“ и препоръки по характеристики и не изисква текст query. Когато потребителят е въвел заглавие, ползвайте търсене.
Примерът показва научнофантастични филми (id на жанра 878) с поне 1000 гласа, първо с най-висок рейтинг.
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)
}
}Параметри
api_keyзаявкаедин от дватаВашият ключ. Ползвайте него или заглавкатаAuthorization: Bearer.sort_byзаявкаПоле и посока, напримерvote_average.desc. Полета:popularity,vote_average,vote_count,primary_release_date,revenue,title,original_title, всяко с.ascили.desc.titleиoriginal_titleи двете сортират по оригиналното заглавие. Непозната стойност се заменя сpopularity.desc, което е и стойността по подразбиране.with_genresзаявкаId на жанрове. Запетаята означава И, вертикалната черта означава ИЛИ.without_genresзаявкаId на жанрове, които да се изключат.with_cast,with_crewзаявкаId на личности. Намерете ги през търсене.with_peopleзаявкаId на личности, които участват като актьорски състав или екип.with_companies,without_companiesзаявкаId на продуцентски компании, които да се включат или изключат. Запетаята и вертикалната черта работят както приwith_genres.with_keywords,without_keywordsзаявкаId на ключови думи, които да се включат или изключат. Вижте ключови думи.with_origin_countryзаявкаДвубуквен код на държавата на производство с главни букви, напримерFR.primary_release_yearзаявкаЧетирицифрена година на основната дата на излизане.yearзаявкаЧетирицифрена година. Съвпада с всяка дата на излизане в тази година, затова връща повече заглавия отprimary_release_year.primary_,release_ date.gte primary_заявкаrelease_ date.lte Долна и горна граница на основната дата на излизане,YYYY-MM-DD.release_date.gte,release_date.lteзаявкаДолна и горна граница на всяка дата на излизане във всяка държава,YYYY-MM-DD.regionзаявкаДвубуквен код на държава с главни букви. Заменяrelease_dateвъв всеки резултат с датата в тази държава. Не премахва заглавия.certification_country,certificationзаявкаФилтър по възрастов рейтинг, напримерUSиPG.certificationсе игнорира без държава.certification.gteиcertification.lteзадават диапазон.vote_average.gte,vote_average.lteзаявкаМинимална и максимална средна оценка, от 0 до 10.vote_count.gte,vote_count.lteзаявкаМинимален и максимален брой гласове.with_runtime.gte,with_runtime.lteзаявкаМинимална и максимална продължителност в минути.with_original_languageзаявкаОригинален език като двубуквен код, напримерfrилиko.with_watch_providersзаявкаId на стрийминг доставчици. Изискваwatch_region, без него се игнорира. Id се вземат от жанрове и справочни списъци.watch_regionзаявкаДвубуквен код на държава с главни букви за наличност при доставчика.include_adultзаявкаПриема се и се игнорира. Заглавия за възрастни никога не се връщат.languageзаявкаТаг на TMDB, напримерen-USилиpl-PL. Поддържат се 14 основни езика. По подразбиранеen-US.pageзаявкаНомер на страница от 1 до 500. По подразбиране 1.
Полета на отговора
| Поле | Тип | Бележки |
|---|---|---|
page, total_pages, total_results | цяло число | Странициране за този набор от филтри. Широките филтри отчитат най-много 1001 страници и 20001 резултата, но могат да се четат само страници от 1 до 500. |
results | масив | До 20 филма. Празен, когато никое заглавие не отговаря на всички филтри. |
id | цяло число | Id на филма за детайли за филм. |
title, original_title, overview | низ | Локализиран текст и оригиналното заглавие. |
original_language | низ | Двубуквен код на езика, на който е заснет филмът. |
release_date | низ | YYYY-MM-DD. |
genre_ids | масив от цели числа | Само id. Съпоставете ги с имена през /genre/movie/list. |
poster_path, backdrop_path | низ или null | Добавя се към https:/. |
vote_average, vote_count, popularity | число | Стойности за оценка и класиране. |
adult, video | булева стойност | adult винаги е false. |
Примерен отговор
{
"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
}Отговорът е взет от работещото API за примерната заявка. Показани са 3 от 20-те записа на страница 1, а дългите низове overview са съкратени.
Комбиниране на филтри
Отделните параметри се комбинират с И. В рамките на един параметър запетаята означава И, а вертикалната черта означава ИЛИ. В суров URL адрес вертикалната черта се записва %7C, а клиентите, които кодират стойностите на заявката, го правят вместо вас.
| Цел | Заявка |
|---|---|
| Най-високо оценена научна фантастика с достатъчно гласове | / |
| Екшън или приключения | / |
| Екшън, но не анимация | / |
| Един актьор с един режисьор | / |
| Дълги филми от една година | / |
| Премиери в рамките на период | / |
| Филми на един оригинален език | / |
| Стрийминг в една държава | / |
| С рейтинг R в САЩ | / |
| Без ключова дума | / |
with_original_language филтрира по езика, на който е заснето заглавието, и приема кодове извън 14-те поддържани езика, например ja или ko. Езикът на текста в отговора все така се определя от параметъра language. В реда със стрийминг доставчик 8 е Netflix. Id на доставчиците четете от /watch/providers/movie.
Откриване на сериали по филтри
GET /3/discover/tv ползва същата структура на отговора и същото странициране. Записите съдържат name, original_name, first_air_date, origin_country и genre_ids, а id на жанровете идват от /genre/tv/list, където са обединените id за сериали, например 10765 за Sci-Fi и Fantasy.
| Параметър | Описание |
|---|---|
first_air_date.gte, first_air_date.lte | Долна и горна граница на датата на първото излъчване, YYYY-MM-DD. |
first_air_date_year | Четирицифрена година на датата на първото излъчване. |
air_date.gte, air_date.lte | Долна и горна граница на датите, в които сериалът излъчва епизоди, YYYY-MM-DD. |
with_networks | Id на телевизионни мрежи. Намерете ги на страницата компании и мрежи. |
with_status | Числов код на статуса: 0 продължава, 2 в производство, 3 приключил, 4 спрян. |
with_type | Числов тип на предаването: 0 документално, 1 новини, 2 минисериал, 3 риалити, 4 сценарно, 5 токшоу, 6 видео. |
sort_by | popularity, vote_average, vote_count, first_air_date, name или original_name, всяко с .asc или .desc. name и original_name и двете сортират по оригиналното име. |
with_genres, without_genres, with_companies, with_keywords, without_keywords | Същите правила като при филмите. |
vote_average.gte, vote_count.gte, with_runtime.gte, with_runtime.lte, with_original_language | Същите правила като при филмите. |
with_watch_providers, watch_region, language, page | Същите правила като при филмите. |
Заявка като / показва драматични сериали, започнали през 2025 или по-късно. Подробности за резултата вижте на страницата сериали.
Грешки
| HTTP | status_code | Кога |
|---|---|---|
| 401 | 7 | Ключът липсва или е грешен. |
| 402 | 36 | Периодът на плана е изтекъл. |
| 405 | 37 | Извикали сте метод за запис. |
| 429 | 25 | Надхвърлен е лимитът на заявки в минута. Изчакайте Retry-After секунди. |
| 500 | 11 | Стойност на page извън диапазона от 1 до 500. |
| 504 | 24 | Бекендът не отговори навреме. Опитайте отново веднъж. |
Набор от филтри, на който не отговаря нищо, не е грешка. Получавате HTTP 200 с празен масив results и total_results със стойност 0. Вижте грешки и лимити на заявките.
Практически бележки
- Edge кешът държи всеки отделен набор от филтри 30 минути и го споделя между ключовете. Ключът на кеша се изгражда от сортираната заявка, така че редът на параметрите няма значение.
- Страницата съдържа 20 записа, а последната е 500, така че един набор от филтри достига 10 000 записа. За да стигнете по-дълбоко, разбивайте заявката на времеви прозорци. Широк филтър отчита
total_resultsсъс стойност 20001, което е таван, а не реален брой. - Винаги комбинирайте
sort_сby= vote_ average.desc vote_count.gte. Без него заглавия с малко гласове заемат върха. - Id във филтрите са числови. Id на личности вземайте през търсене, а id на жанрове и доставчици от жанрове и справочни списъци.
- За готови списъци като популярни или тези, които вървят в момента, вижте тенденции и списъци.