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

ParameterInRequiredDescription
movie_idpathyesNumeric movie id, for example 550.
api_keyqueryone of twoYour key. Use this or the Authorization: Bearer header.
languagequerynoTMDB tag such as en-US, ru-RU or pt-BR. 14 base languages are served. Default en-US.
append_to_responsequerynoComma separated list of up to 20 sub-resources to merge into the reply.

Response fields

FieldTypeNotes
idintegerMovie id.
imdb_idstring or nullIMDb id such as tt0137523.
title, original_titlestringLocalized and original title.
original_languagestringLanguage code such as en.
overview, taglinestringLocalized text, empty when no translation exists.
homepagestringOfficial site, empty when unknown.
release_datestringYYYY-MM-DD, empty when unknown.
statusstringRelease state, for example Released or In Production.
runtimeintegerMinutes.
budget, revenueintegerUS dollars, 0 when unknown.
genresarrayObjects with id and name.
belongs_to_collectionobject or nullid, name, poster_path, backdrop_path. See collections.
production_companiesarrayid, logo_path, name, origin_country.
production_countriesarrayiso_3166_1, name.
spoken_languagesarrayenglish_name, iso_639_1, name.
origin_countryarrayCountry codes such as US.
poster_path, backdrop_pathstring or nullAppend to https://img.amodb.dev/t/p/{size}. See images.
popularitynumberRelative score used by the popular list.
vote_average, vote_countnumber, integerAggregate user score.
adult, videobooleanBoth 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:

JSON
{
  "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.

ValueAddsDetails
ratingsIMDb, Kinopoisk, Metacritic, Rotten Tomatoes and TMDB scoresRatings
moodsMood metersMoods
soundtracksTracks heard in the movieSoundtracks
wikidataWikidata id, budget, box office, awards, filming locationsFind by external id
showtimesCinema showtimes where knownShowtimes

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.

All paths below share the base https://api.amodb.dev/3 and the language parameter.

Method and pathReturnsExtra parameters
GET /movie/{movie_id}/alternative_titles{id, titles}, often an empty arraynone
GET /movie/{movie_id}/release_datesRelease dates and certifications per countrynone
GET /movie/{movie_id}/recommendationsA list of 20 recommended moviesnone
GET /movie/{movie_id}/similarA list of 20 similar moviesnone
GET /movie/{movie_id}/reviewsresults is empty for most titlesnone
GET /movie/{movie_id}/listsPublic lists that contain the moviepage
GET /movie/{movie_id}/watch/providersStreaming and rental providers per countrynone
GET /movie/latestThe newest movie record addednone

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."}.

HTTPstatus_codeWhen
4017The key is missing or wrong.
40236The plan period has ended.
40434No movie with that id, a path that is not offered, or an adult title.
40537You called a write method such as rating a movie.
42925You 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 id and imdb_id together. 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-US if 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.