API גילוי
Discover מציג סרטים ב-GET /3/discover/movie וסדרות ב-GET /3/discover/tv, מסוננים וממוינים לפי הפרמטרים שתבחרו: ז'אנר, שחקנים, צוות, חברה, מילת מפתח, תאריכים, דירוג, הצבעות, משך, שפה וספק סטרימינג. ה-JSON זהה ל-TMDB v3, והתוצאות נשמרות במטמון 30 דקות. לדוגמה, with_genres=878 יחד עם sort_by=vote_average.desc ו-vote_count.gte=1000 מסנן וממיין בבקשה אחת.
גילוי סרטים
GET /3/discover/movie מחזיר רשימה מדורגת של סרטים שמתאימים לכל מסנן ששלחתם, בסדר שבחרתם. זו נקודת הקצה לעמודי עיון, לרשימות "הטובים ביותר" ולהמלצות לפי היבט, והיא לא צריכה טקסט query. כשיש לכם כותרת שמשתמש הקליד, השתמשו בחיפוש במקום.
הדוגמה מציגה סרטי מדע בדיוני (מזהה ז'אנר 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שאילתהמזהי ז'אנרים. פסיק פירושו AND, תו קו אנכי פירושו OR.without_genresשאילתהמזהי ז'אנרים להחרגה.with_cast,with_crewשאילתהמזהי אנשים. מוצאים אותם עם חיפוש.with_peopleשאילתהמזהי אנשים שמופיעים כשחקנים או כצוות.with_companies,without_companiesשאילתהמזהי חברות הפקה לדרוש או להחריג. פסיק וקו אנכי פועלים כמו ב-with_genres.with_keywords,without_keywordsשאילתהמזהי מילות מפתח לדרוש או להחריג. ראו מילות מפתח.with_origin_countryשאילתהקוד מדינת הפקה בן 2 אותיות גדולות כמו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שאילתהקוד מדינה בן 2 אותיות גדולות. מחליף את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שאילתהשפת מקור כקוד בן 2 אותיות כמוfrאוko.with_watch_providersשאילתהמזהי ספקים. דורשwatch_region, ומתעלמים ממנו בלעדיו. המזהים מגיעים מעמוד ז'אנרים ורשימות חיפוש.watch_regionשאילתהקוד מדינה בן 2 אותיות גדולות לזמינות אצל ספקים.include_adultשאילתהמתקבל ומתעלמים ממנו. כותרים למבוגרים לא מוחזרים לעולם.languageשאילתהתגית TMDB כמוen-USאוpl-PL. מוגשות 14 שפות בסיס. ברירת מחדלen-US.pageשאילתהמספר עמוד מ-1 עד 500. ברירת מחדל 1.
שדות התגובה
| שדה | סוג | הערות |
|---|---|---|
page, total_pages, total_results | integer | דפדוף לקבוצת המסננים הזו. מסננים רחבים מדווחים על 1001 עמודים ו-20001 תוצאות לכל היותר, אבל אפשר לקרוא רק עמודים 1 עד 500. |
results | array | עד 20 סרטים. ריק כשאף כותר לא מתאים לכל המסננים. |
id | integer | מזהה סרט עבור פרטי סרט. |
title, original_title, overview | string | טקסט מתורגם והכותרת המקורית. |
original_language | string | קוד בן שתי אותיות של השפה שבה הסרט נעשה. |
release_date | string | YYYY-MM-DD. |
genre_ids | array of integers | מזהים בלבד. ממפים אותם לשמות עם /genre/movie/list. |
poster_path, backdrop_path | string או null | מצרפים ל-https:/. |
vote_average, vote_count, popularity | number | ציון וערכי דירוג. |
adult, video | boolean | 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 ארוכות קוצרו.
שילוב מסננים
פרמטרים נפרדים משתלבים עם AND. בתוך פרמטר אחד פסיק פירושו AND ותו קו אנכי פירושו OR. בכתובת גולמית הקו האנכי נכתב %7C, ולקוחות שמקודדים ערכי שאילתה עושים זאת בשבילכם.
| מטרה | בקשה |
|---|---|
| מדע בדיוני בדירוג הגבוה ביותר עם מספיק הצבעות | / |
| אקשן או הרפתקאות | / |
| אקשן אבל לא אנימציה | / |
| שחקן אחד עם במאי אחד | / |
| סרטים ארוכים משנה אחת | / |
| יציאות בחלון תאריכים | / |
| סרטים בשפת מקור אחת | / |
| בסטרימינג במדינה אחת | / |
| דירוג R בארצות הברית | / |
| בלי מילת מפתח | / |
with_original_language מסנן לפי השפה שבה הכותר נעשה, והוא מקבל גם קודים מחוץ ל-14 השפות המוגשות, למשל ja או ko. הפרמטר language עדיין קובע את שפת הטקסט שמקבלים בחזרה. בשורת הספקים, 8 הוא Netflix. את מזהי הספקים קראו מ-/watch/providers/movie.
גילוי סדרות
GET /3/discover/tv משתמש באותה מעטפת ובאותו דפדוף. הפריטים מחזיקים name, original_name, first_air_date, origin_country ו-genre_ids, ומזהי הז'אנרים מגיעים מ-/genre/tv/list, שמחזיק את מזהי הטלוויזיה המאוחדים כמו 10765 למדע בדיוני ופנטזיה.
| פרמטר | תיאור |
|---|---|
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 | מזהי רשתות. מוצאים אותם בעמוד חברות ורשתות שידור. |
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. ראו שגיאות ומגבלות קצב.
הערות מעשיות
- הקצה שומר כל קבוצת מסננים נפרדת במטמון 30 דקות ומשתף אותה בין מפתחות. מפתח המטמון משתמש בשאילתה ממוינת, ולכן סדר הפרמטרים שלכם לא משנה.
- עמוד מחזיק 20 פריטים והעמוד האחרון הוא 500, ולכן קבוצת מסננים אחת מגיעה ל-10,000 פריטים. פצלו לפי חלונות תאריכים כדי להעמיק. מסנן רחב מדווח על
total_resultsשל 20001, שהוא תקרה ולא ספירה אמיתית. - תמיד שלבו את
sort_עםby= vote_ average.desc vote_count.gte. בלעדיו כותרים עם כמה הצבעות ממלאים את ראש הרשימה. - המזהים במסננים הם מספריים. את מזהי האנשים קחו מעמוד חיפוש, ואת מזהי הז'אנרים והספקים מעמוד ז'אנרים ורשימות חיפוש.
- לרשימות מוכנות כמו פופולריים או מוצגים עכשיו, ראו טרנדים ורשימות.