Movie details API
The movie details endpoint returns one movie by id at GET /3/movie/{movie_id}. The JSON matches TMDB v3, so existing clients only need a new base URL. Add append_to_response to fetch credits, videos, images and the amodb extras ratings, moods, soundtracks, wikidata and showtimes in one request.
Get movie details
GET /3/movie/{movie_id} returns the core record for one movie: titles, overview, runtime, genres, release date, budget, revenue, production companies and image paths. The id is the same numeric id TMDB uses, so a movie you already store as 550 keeps that id here.
The example below asks for the movie in English and appends its ratings in the same call.
curl -s "https://api.amodb.dev/3/movie/550?language=en-US&append_to_response=ratings" \
-H "Authorization: Bearer $AMODB_KEY"const url = 'https://api.amodb.dev/3/movie/550?language=en-US&append_to_response=ratings';
const res = await fetch(url, { headers: { Authorization: `Bearer ${process.env.AMODB_KEY}` } });
if (!res.ok) throw new Error(`amodb returned ${res.status}`);
const movie = await res.json();
console.log(movie.title, movie.runtime, movie.ratings.imdb?.value);import os
import requests
r = requests.get(
"https://api.amodb.dev/3/movie/550",
params={"language": "en-US", "append_to_response": "ratings"},
headers={"Authorization": f"Bearer {os.environ['AMODB_KEY']}"},
timeout=10,
)
r.raise_for_status()
movie = r.json()
imdb = movie["ratings"]["imdb"]
print(movie["title"], movie["runtime"], imdb and imdb["value"])<?php
$url = 'https://api.amodb.dev/3/movie/550?language=en-US&append_to_response=ratings';
$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");
}
$movie = json_decode($body, true);
echo $movie['title'], ' ', $movie['runtime'], ' ', $movie['ratings']['imdb']['value'] ?? 'n/a', PHP_EOL;package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
type Movie struct {
Title string `json:"title"`
Runtime int `json:"runtime"`
}
func main() {
url := "https://api.amodb.dev/3/movie/550?language=en-US"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("AMODB_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
panic(res.Status)
}
var m Movie
json.NewDecoder(res.Body).Decode(&m)
fmt.Println(m.Title, m.Runtime)
}Parameters
| Parameter | In | Required | Description |
|---|---|---|---|
movie_id | path | yes | Numeric movie id, for example 550. |
api_key | query | one of two | Your key. Use this or the Authorization: Bearer header. |
language | query | no | TMDB tag such as en-US, ru-RU or pt-BR. 14 base languages are served. Default en-US. |
append_to_response | query | no | Comma separated list of up to 20 sub-resources to merge into the reply. |
Response fields
| Field | Type | Notes |
|---|---|---|
id | integer | Movie id. |
imdb_id | string or null | IMDb id such as tt0137523. |
title, original_title | string | Localized and original title. |
original_language | string | Language code such as en. |
overview, tagline | string | Localized text, empty when no translation exists. |
homepage | string | Official site, empty when unknown. |
release_date | string | YYYY-MM-DD, empty when unknown. |
status | string | Release state, for example Released or In Production. |
runtime | integer | Minutes. |
budget, revenue | integer | US dollars, 0 when unknown. |
genres | array | Objects with id and name. |
belongs_to_collection | object or null | id, name, poster_path, backdrop_path. See collections. |
production_companies | array | id, logo_path, name, origin_country. |
production_countries | array | iso_3166_1, name. |
spoken_languages | array | english_name, iso_639_1, name. |
origin_country | array | Country codes such as US. |
poster_path, backdrop_path | string or null | Append to https://img.amodb.dev/t/p/{size}. See images. |
popularity | number | Relative score used by the popular list. |
vote_average, vote_count | number, integer | Aggregate user score. |
adult, video | boolean | Both are false. Adult titles are never served. |
Example response
GET /3/movie/550?language=en-US&append_to_response=ratings, with long arrays and text shortened:
{
"adult": false,
"backdrop_path": "/b9HyPoxwxjxkWEUL5ErZdhApQe2.jpg",
"belongs_to_collection": null,
"budget": 63000000,
"genres": [
{
"id": 18,
"name": "Drama"
},
{
"id": 53,
"name": "Thriller"
}
],
"homepage": "https://www.20thcenturystudios.com/movies/fight-club",
"id": 550,
"imdb_id": "tt0137523",
"origin_country": [
"US",
"DE"
],
"original_language": "en",
"original_title": "Fight Club",
"overview": "A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking n...",
"popularity": 39.0054,
"poster_path": "/jSziioSwPVrOy9Yow3XhWIBDjq1.jpg",
"production_companies": [
{
"id": 25,
"logo_path": "/nM2MfoMqzJQRiSynsDabOtFKetD.png",
"name": "20th Century Fox",
"origin_country": "US"
},
{
"id": 508,
"logo_path": "/4sGWXoboEkWPphI6es6rTmqkCBh.png",
"name": "Regency Enterprises",
"origin_country": "US"
}
],
"production_countries": [
{
"iso_3166_1": "US",
"name": "United States of America"
},
{
"iso_3166_1": "DE",
"name": "Germany"
}
],
"release_date": "1999-10-15",
"revenue": 101209702,
"runtime": 139,
"spoken_languages": [
{
"english_name": "English",
"iso_639_1": "en",
"name": "English"
}
],
"status": "Released",
"tagline": "Mischief. Mayhem. Soap.",
"title": "Fight Club",
"video": false,
"vote_average": 8.437,
"vote_count": 33039,
"ratings": {
"imdb": {
"value": 8.8,
"votes": 2669989
},
"kinopoisk": {
"value": 8.7,
"votes": null
},
"metacritic": {
"value": 67,
"votes": null
},
"rotten_tomatoes": {
"value": 81,
"votes": null
},
"tmdb": {
"value": 8.437,
"votes": 33039
}
}
}The ratings block comes from append_to_response. Each provider is a {value, votes} object or null, as described on ratings.
Combine data with append_to_response
One call can replace six. List the sub-resources you need and each arrives under its own key. The standard TMDB values work: credits, videos, images, keywords, translations, external_ids, release_dates, alternative_titles, recommendations, similar, reviews, lists and watch/providers. amodb adds five more.
| Value | Adds | Details |
|---|---|---|
ratings | IMDb, Kinopoisk, Metacritic, Rotten Tomatoes and TMDB scores | Ratings |
moods | Mood meters | Moods |
soundtracks | Tracks heard in the movie | Soundtracks |
wikidata | Wikidata id, budget, box office, awards, filming locations | Find by external id |
showtimes | Cinema showtimes where known | Showtimes |
Each appended block counts as part of one HTTP request. A request with ten appended values still uses one of your 20, 40 or 120 requests per minute. The appended ratings, moods and soundtracks blocks leave out the id key that the standalone paths return.
Related movie endpoints
All paths below share the base https://api.amodb.dev/3 and the language parameter.
| Method and path | Returns | Extra parameters |
|---|---|---|
GET /movie/{movie_id}/alternative_titles | {id, titles}, often an empty array | none |
GET /movie/{movie_id}/release_dates | Release dates and certifications per country | none |
GET /movie/{movie_id}/recommendations | A list of 20 recommended movies | none |
GET /movie/{movie_id}/similar | A list of 20 similar movies | none |
GET /movie/{movie_id}/reviews | results is empty for most titles | none |
GET /movie/{movie_id}/lists | Public lists that contain the movie | page |
GET /movie/{movie_id}/watch/providers | Streaming and rental providers per country | none |
GET /movie/latest | The newest movie record added | none |
The recommendations and similar lists always return page 1 with 20 items. The lists reply is paged with page, 20 lists per page. Paged lists elsewhere on the API take page from 1 to 500.
Credits, images, videos, translations, keywords and external ids have their own pages: credits, images, videos and trailers, translations, keywords and find by external id. amodb does not offer the TMDB changes paths.
Errors
Errors use the TMDB body, for example {"success": false, "status_code": 34, "status_message": "The resource you requested could not be found."}.
| HTTP | status_code | When |
|---|---|---|
| 401 | 7 | The key is missing or wrong. |
| 402 | 36 | The plan period has ended. |
| 404 | 34 | No movie with that id, a path that is not offered, or an adult title. |
| 405 | 37 | You called a write method such as rating a movie. |
| 429 | 25 | You went over your requests per minute. Wait for the Retry-After seconds. |
The full list is on the errors page, and limits per plan are on rate limits.
Practical notes
- Store the
idandimdb_idtogether. Either one finds the movie again through find by external id. - Request the language you display. A text field can be empty when no translation exists in that language, so check for an empty string and re-request in
en-USif you need a fallback. - Cache details on your side for a few hours. The server cache already holds them for 6 hours, so a shorter client cache gains nothing.
- To list movies instead of reading one, see search, discover and trending and lists.