MovieAPI Dokumentation
Vollständige Entwickler-Dokumentation für die MovieAPI. Diese API liefert Daten zu Filmen, Serien, Franchises und Personen – angereichert mit umfangreichen TMDb-Daten.
Pflichtattribution: themoviedb.org
Einführung
Alle API-Endpunkte sind unter /api/v1/ erreichbar. Die API ist RESTful und gibt JSON zurück. Bilder werden als Base64 gespeichert und können als PNG-Bild abgerufen werden.
Rate Limiting: 15 Anfragen pro 30 Sekunden pro IP-Adresse.
Authentifizierung
Die API ist derzeit ohne Authentifizierung zugänglich (GET-Endpunkte). POST-Endpunkte (z.B. Franchise erstellen) erfordern keinen Token, sollten aber in Produktion durch einen Reverse-Proxy oder Firewall-Regel abgesichert werden.
TMDb-Integration
Alle Filme und Serien werden automatisch mit TMDb-Daten angereichert. Diese sind im Feld tmdbData gespeichert und enthalten alle wichtigen Informationen aus der TMDb API.
Die Anreicherung erfolgt beim ersten Hinzufügen eines Eintrags durch den Worker (alle 10 Minuten). Der API-Key kann via Umgebungsvariable TMDB_API_KEY gesetzt werden.
Filme & Serien
Alle Einträge abrufen
/api/v1/movies| Parameter | Beschreibung |
|---|---|
page | Seitenzahl (Standard: 1) oder all für alle Einträge |
poster | Base64-Poster im Ergebnis einschließen |
cast | Vollständige Cast-Objekte einschließen |
crew | Vollständige Crew-Objekte einschließen |
franchise | Franchise-Objekt einschließen |
offers | Streaming-Angebote einschließen |
castImages | Profilbilder der Cast-Mitglieder einschließen |
crewImages | Profilbilder der Crew-Mitglieder einschließen |
offerIcons | Anbieter-Icons (Base64) einschließen |
Film/Serie nach ID abrufen
/api/v1/movies/:idGibt einen einzelnen Eintrag zurück. Unterstützt dieselben Query-Parameter wie die Listenansicht.
Poster abrufen
/api/v1/movies/:id/poster.pngGibt das Poster als PNG-Bild zurück (Binary, Content-Type: image/png).
Cast/Crew abrufen
/api/v1/movies/:id/cast/api/v1/movies/:id/crewFranchises
Alle Franchises abrufen
/api/v1/franchisesFranchise erstellen
/api/v1/franchisesErstellt eine neue Franchise. Das Bild wird automatisch heruntergeladen und als Base64 gespeichert.
| Feld | Typ | Beschreibung |
|---|---|---|
name * | string | Name der Franchise (Pflichtfeld) |
imageUrl | string | URL des Franchise-Bildes (wird heruntergeladen) |
image | string | Base64-kodiertes Bild (Alternative zu imageUrl) |
{
"name": "DC Universe",
"imageUrl": "https://example.com/dc-logo.png"
}
Franchise-Bild abrufen
/api/v1/franchises/:id/image.pngFilme einer Franchise abrufen
/api/v1/franchises/:id/moviesPersonen
/api/v1/persons/api/v1/persons/:id/api/v1/persons/:id/image.png/api/v1/persons/:id/moviesDatenmodell – Basis-Felder
Jeder Eintrag enthält folgende Top-Level-Felder (unabhängig von TMDb oder Franchise).
| Feld | Typ | Quelle | Beschreibung |
|---|---|---|---|
id | number | intern | Auto-inkrementierte ID |
type | string | MCUAPI | "movie" oder "series" |
franchiseId | number | intern | ID der zugehörigen Franchise |
name | string | MCUAPI | Titel des Eintrags |
year | number | MCUAPI | Erscheinungsjahr |
releaseDate | date | MCUAPI | Genaues Veröffentlichungsdatum |
ageRating | string | TMDb/MCUAPI | Altersfreigabe, z.B. "12" |
duration | number | MCUAPI | Laufzeit in Minuten (nur Filme) |
genres | string[] | TMDb/MCUAPI | Genre-Namen, z.B. ["Action", "Abenteuer"] |
description | string | TMDb | Deutsche Inhaltsbeschreibung |
poster | string | MCUAPI | Base64-Poster (nur mit ?poster) |
posterUrl | string | TMDb/MCUAPI | Öffentliche Poster-URL |
trailer | string | TMDb/MCUAPI | YouTube-Trailer-URL |
imdbId | string | MCUAPI | IMDb-ID, z.B. tt0371746 |
tmdbId | number | TMDb | TMDb-Datenbank-ID |
tmdbData | object | TMDb | Vollständige TMDb-Daten (s.u.) |
origin | string | intern | "mcuapi" / "swapi" / "hpapi" / "lotrapi" / "breakingbadapi" / "rickandmortyapi" / "dcuniverse" / "gameofthrones" / "pokemon" / "avatar" (automatisch) oder "custom" (manuell) |
cast | array | TMDb | [{ role, person }] – Darsteller (IDs) |
crew | array | TMDb | [{ role, person }] – Crew (IDs) |
flatrateOffers | array | TMDb | Abo-Angebote [{ name, url, retailPrice, currency, seasons, icon }] |
rentOffers | array | TMDb | Leihen-Angebote (gleiche Struktur) |
buyOffers | array | TMDb | Kaufen-Angebote |
adsOffers | array | TMDb | Kostenlos mit Werbung |
Franchise-spezifische Felder (franchiseSpecific)
Das franchiseSpecific-Objekt enthält Felder, die von der jeweiligen Datenquelle geliefert werden.
Welche Felder befüllt sind, hängt vom origin-Wert ab.
Marvel – origin: "mcuapi"
Filme (type: "movie")
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.saga | string | Marvel-Saga, z.B. "The Infinity Saga", "The Multiverse Saga" |
franchiseSpecific.phase | number/string | MCU-Phase, z.B. 1, 2, 3, 4, 5 |
franchiseSpecific.chronology | number | Chronologische Reihenfolge im MCU (nicht Erscheinungsreihenfolge) |
franchiseSpecific.postCreditScenes | number | Anzahl der Post-Credit-Szenen (0, 1, 2 …) |
Serien (type: "series")
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.saga | string | Marvel-Saga |
franchiseSpecific.phase | number/string | MCU-Phase |
Beispiel
{
"franchiseSpecific": {
"saga": "The Infinity Saga",
"phase": 1,
"chronology": 2,
"postCreditScenes": 1
}
}
Star Wars – origin: "swapi"
Nur Filme (alle 9 Episoden). Star Wars hat keine Serien-Einträge in der SWAPI.
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.episodeId | number | Episode-Nummer (1–9) |
franchiseSpecific.saga | string | Trilogie: "Prequel Trilogy", "Original Trilogy", "Sequel Trilogy" |
franchiseSpecific.director | string | Regisseur(e), kommagetrennt (aus SWAPI) |
franchiseSpecific.producer | string | Produzent(en), kommagetrennt (aus SWAPI) |
franchiseSpecific.openingCrawl | string | Der berühmte Opening-Crawl-Text (aus SWAPI) |
franchiseSpecific.characters | string[] | Charakternamen aus dem Film (via SWAPI) |
franchiseSpecific.planets | string[] | Planeten aus dem Film (via SWAPI) |
franchiseSpecific.starships | string[] | Raumschiffe aus dem Film (via SWAPI) |
franchiseSpecific.vehicles | string[] | Fahrzeuge aus dem Film (via SWAPI) |
franchiseSpecific.species | string[] | Spezies aus dem Film (via SWAPI) |
Beispiel
{
"franchiseSpecific": {
"episodeId": 4,
"saga": "Original Trilogy",
"director": "George Lucas",
"producer": "Gary Kurtz, Rick McCallum",
"openingCrawl": "It is a period of civil war.\nRebel spaceships..."
}
}
Harry Potter – origin: "hpapi"
11 Filme: 8 Hauptreihe + 3 Fantastic Beasts Spinoffs.
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.bookNumber | number|null | Buchnummer der Vorlage (1–7; null bei Fantastic Beasts) |
franchiseSpecific.part | number | Chronologischer Filmteil (1–8 Hauptreihe, 1–3 Fantastic Beasts) |
franchiseSpecific.saga | string | "Main Series" oder "Fantastic Beasts" |
franchiseSpecific.villain | string | Haupt-Antagonist(en) des Films |
franchiseSpecific.mainLocation | string | Wichtigster Schauplatz des Films |
Lord of the Rings – origin: "lotrapi"
6 Kinofilme: 3 LOTR + 3 Hobbit. Daten von The One API (optionaler LOTR_API_KEY).
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.trilogy | string | "The Lord of the Rings" oder "The Hobbit" |
franchiseSpecific.academyAwardNominations | number | Anzahl Oscarnominierungen |
franchiseSpecific.academyAwardWins | number | Anzahl gewonnener Oscars |
franchiseSpecific.rottenTomatoesScore | number|null | Rotten-Tomatoes-Score in % |
franchiseSpecific.budgetInMillions | number|null | Produktionsbudget in Mio. USD |
franchiseSpecific.boxOfficeRevenueInMillions | number|null | Einspielergebnis in Mio. USD |
franchiseSpecific.characters | string[] | Charakternamen (via The One API; nur mit LOTR_API_KEY) |
Breaking Bad – origin: "breakingbadapi"
2 Serien (Breaking Bad, Better Call Saul) + 1 Film (El Camino). Episodenzahlen via Breaking Bad API.
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.show | string | "Breaking Bad", "Better Call Saul" oder "El Camino" |
franchiseSpecific.creator | string | Showrunner / Creator |
franchiseSpecific.network | string | Sender ("AMC", "Netflix") |
franchiseSpecific.mainCharacters | string[] | Hauptcharaktere der Show (via Breaking Bad API) |
Rick and Morty – origin: "rickandmortyapi"
1 Serien-Eintrag. Staffel- und Episodenzahlen werden live von der Rick and Morty API geladen.
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.network | string | "Adult Swim" |
franchiseSpecific.creator | string | Creator (Justin Roiland & Dan Harmon) |
franchiseSpecific.seasons | number | Aktuelle Staffelanzahl (via API) |
franchiseSpecific.episodes | number | Aktuelle Gesamtepisodenzahl (via API) |
franchiseSpecific.locations | string[] | Bekannte Locations / Dimensionen (via Rick and Morty API) |
DC Universe – origin: "dcuniverse"
17 DCEU-Filme + 1 DCEU-Serie + 2 DCU-Einträge (Gunn-Ära).
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.continuity | string | "DCEU", "Snyderverse" oder "DCU" |
franchiseSpecific.phase | string | Phase / Chapter, z.B. "Phase 1", "Chapter 1" |
franchiseSpecific.releaseOrder | number | Chronologische Veröffentlichungsreihenfolge im DC-Universum (1–N) |
Game of Thrones – origin: "gameofthrones"
Game of Thrones (8 Staffeln) + House of the Dragon (Spinoff).
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.showType | string | "main" oder "spinoff" |
franchiseSpecific.basedOn | string | Buchvorlage (George R.R. Martin) |
franchiseSpecific.creator | string | Showrunner |
franchiseSpecific.network | string | "HBO" |
franchiseSpecific.sourceBooks | Array<{name, released}> | ASOIAF-Buchmetadaten (via An API of Ice and Fire) |
Pokémon – origin: "pokemon"
11 Animationsfilme + 1 Live-Action-Film + 2 Anime-Serien.
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.generation | number | Pokémon-Generation (1–9) |
franchiseSpecific.saga | string | Saga-Bezeichnung, z.B. "Original", "Live-Action" |
franchiseSpecific.protagonist | string | Hauptfigur, z.B. "Ash Ketchum", "Liko & Roy" |
Avatar – origin: "avatar"
Avatar: The Last Airbender (Animated & Live-Action) + The Legend of Korra.
| Feld | Typ | Beschreibung |
|---|---|---|
franchiseSpecific.books | string[] | Staffel-/Buch-Bezeichnungen, z.B. ["Water", "Earth", "Fire"] |
franchiseSpecific.protagonist | string | "Aang" oder "Korra" |
franchiseSpecific.format | string | "Animated" oder "Live-Action" |
franchiseSpecific.creator | string | Creator |
Serien-spezifische Felder (nur type: "series")
Zusätzliche Top-Level-Felder, die nur bei Serien vorhanden sind:
| Feld | Typ | Quelle | Beschreibung |
|---|---|---|---|
episodes | number | API / statisch | Gesamtzahl aller Episoden (über alle Staffeln) |
seasons | number | API / statisch | Anzahl der Staffeln |
lastAiredDate | date | MCUAPI | Datum der letzten ausgestrahlten Episode (nur MCU-Serien) |
TMDb Film-Felder (movie.tmdbData)
Das Feld tmdbData enthält alle von TMDb geladenen Daten für einen Film.
| Feld | Typ | Beschreibung |
|---|---|---|
tmdbId | number | TMDb-Film-ID |
imdbId | string | IMDb-ID (z.B. tt4154796) |
title | string | Deutscher Titel |
originalTitle | string | Originaltitel |
originalLanguage | string | Originalsprache (ISO 639-1) |
overview | string | Deutsche Beschreibung |
tagline | string | Werbespruch |
status | string | Status (z.B. "Released") |
releaseDate | string | Veröffentlichungsdatum (ISO 8601) |
runtime | number | Laufzeit in Minuten |
budget | number | Budget in USD |
revenue | number | Einspielergebnis in USD |
popularity | number | TMDb Popularitätswert |
voteAverage | number | Durchschnittsbewertung (0–10) |
voteCount | number | Anzahl Bewertungen |
adult | boolean | Erwachseneninhalt |
genres | array | Genres [{id, name}] |
productionCompanies | array | Produktionsfirmen [{id, name, originCountry, logoUrl}] |
productionCountries | array | Produktionsländer [{iso, name}] |
spokenLanguages | array | Gesprochene Sprachen [{iso, name, englishName}] |
posterUrl | string | Poster-URL (w500) |
backdropUrl | string | Hintergrundbild-URL (w1280) |
images.posters | array | Weitere Poster-Varianten |
images.backdrops | array | Weitere Hintergrundbilder |
cast | array | Schauspieler [{tmdbPersonId, name, character, order, profileUrl}] |
crew | array | Crew (Regisseure, Produzenten etc.) [{tmdbPersonId, name, job, department, profileUrl}] |
videos | array | Trailer, Teaser etc. [{id, name, type, site, key, url, official}] |
trailerUrl | string | Direktlink zum offiziellen Trailer (YouTube) |
watchProviders | object | Streaming-Anbieter für DE {flatrate, rent, buy, ads, link} |
watchProviders.flatrate | array | Abo-Anbieter [{id, name, logoUrl, displayPriority}] |
watchProviders.rent | array | Leihen-Anbieter |
watchProviders.buy | array | Kaufen-Anbieter |
watchProviders.ads | array | Kostenlos mit Werbung |
recommendations | array | Empfehlungen [{tmdbId, title, posterUrl, releaseDate, voteAverage}] |
similar | array | Ähnliche Filme (gleiche Struktur) |
keywords | array | Schlagwörter [{id, name}] |
certification | string | FSK-Altersfreigabe (DE), z.B. "12" |
externalIds | object | Externe IDs {imdbId, wikidataId, facebookId, instagramId, twitterId} |
tmdbUrl | string | Link zur TMDb-Seite (Attribution) |
fetchedAt | string | Zeitstempel des letzten Abrufs (ISO 8601) |
TMDb Serien-Felder (serie.tmdbData)
Serien haben zusätzliche Felder (alles von oben plus):
| Feld | Typ | Beschreibung |
|---|---|---|
name | string | Serienname (deutsch) |
originalName | string | Originalname |
type | string | Typ (z.B. "Scripted", "Reality") |
firstAirDate | string | Erstausstrahlung |
lastAirDate | string | Letzte Ausstrahlung |
inProduction | boolean | Ob die Serie noch produziert wird |
numberOfSeasons | number | Anzahl Staffeln |
numberOfEpisodes | number | Gesamtzahl Episoden |
episodeRunTime | array | Durchschnittliche Episodenlaufzeiten (Minuten) |
networks | array | Sender/Netzwerke [{id, name, originCountry, logoUrl}] |
createdBy | array | Schöpfer der Serie [{tmdbPersonId, name, profileUrl}] |
seasons | array | Staffeln mit Episoden (optional, bei fetchSeasons=true) |
seasons[].seasonNumber | number | Staffelnummer |
seasons[].episodes | array | Episoden [{episodeNumber, name, overview, airDate, runtime, voteAverage, stillUrl, guestStars}] |
lastEpisodeToAir | object | Letzte ausgestrahlte Episode {seasonNumber, episodeNumber, name, airDate, overview} |
nextEpisodeToAir | object | Nächste geplante Episode (falls vorhanden) |
externalIds.tvdbId | string | TheTVDB-ID |
originCountry | array | Ursprungsland(e) der Serie |
Beispiel-Response
GET /api/v1/movies/1 (Film mit TMDb-Daten)
{
"data": {
"id": 1,
"type": "movie",
"franchiseId": 1,
"name": "Iron Man",
"year": 2008,
"releaseDate": "2008-04-30",
"ageRating": "12",
"duration": 126,
"genres": ["Action", "Abenteuer", "Science Fiction"],
"description": "Der Rüstungsmilliardär Tony Stark wird bei einem Angriff...",
"posterUrl": "https://image.tmdb.org/t/p/w500/...",
"trailer": "https://www.youtube.com/watch?v=...",
"imdbId": "tt0371746",
"tmdbId": 1726,
"tmdbData": {
"tmdbId": 1726,
"imdbId": "tt0371746",
"title": "Iron Man",
"originalTitle": "Iron Man",
"originalLanguage": "en",
"overview": "Der Rüstungsmilliardär Tony Stark...",
"tagline": "Bereit für den Anzug?",
"status": "Released",
"releaseDate": "2008-04-30",
"runtime": 126,
"budget": 140000000,
"revenue": 585366247,
"popularity": 87.3,
"voteAverage": 7.6,
"voteCount": 24891,
"adult": false,
"genres": [
{ "id": 28, "name": "Action" },
{ "id": 12, "name": "Abenteuer" }
],
"posterUrl": "https://image.tmdb.org/t/p/w500/78lPtwv72eTNqFW9COBYI0dWDJa.jpg",
"backdropUrl": "https://image.tmdb.org/t/p/w1280/...",
"images": {
"posters": [ { "url": "...", "width": 2000, "height": 3000, "lang": "de" } ],
"backdrops": [ { "url": "...", "width": 3840, "height": 2160, "lang": null } ]
},
"cast": [
{ "tmdbPersonId": 3223, "name": "Robert Downey Jr.", "character": "Tony Stark / Iron Man", "order": 0, "profileUrl": "https://image.tmdb.org/t/p/w185/..." },
{ "tmdbPersonId": 16483, "name": "Gwyneth Paltrow", "character": "Pepper Potts", "order": 1, "profileUrl": "..." }
],
"crew": [
{ "tmdbPersonId": 17966, "name": "Jon Favreau", "job": "Director", "department": "Directing", "profileUrl": "..." },
{ "tmdbPersonId": 7624, "name": "Kevin Feige", "job": "Producer", "department": "Production", "profileUrl": "..." }
],
"videos": [
{ "id": "533ec654c3a3685448000004", "name": "Offizieller Trailer", "type": "Trailer", "site": "YouTube", "key": "8ugaeA-nMTc", "url": "https://www.youtube.com/watch?v=8ugaeA-nMTc", "official": true }
],
"trailerUrl": "https://www.youtube.com/watch?v=8ugaeA-nMTc",
"watchProviders": {
"link": "https://www.themoviedb.org/movie/1726/watch",
"flatrate": [
{ "id": 337, "name": "Disney Plus", "logoUrl": "https://image.tmdb.org/t/p/w92/...", "displayPriority": 1 }
],
"rent": [],
"buy": [
{ "id": 10, "name": "Amazon Video", "logoUrl": "...", "displayPriority": 5 }
],
"ads": []
},
"recommendations": [
{ "tmdbId": 1724, "title": "Der unglaubliche Hulk", "posterUrl": "...", "releaseDate": "2008-06-12", "voteAverage": 6.3 }
],
"similar": [ ... ],
"keywords": [
{ "id": 9715, "name": "Superheld" },
{ "id": 180547, "name": "Marvel Cinematic Universe" }
],
"certification": "12",
"externalIds": {
"imdbId": "tt0371746",
"wikidataId": "Q191875",
"facebookId": "IronMan",
"instagramId": null,
"twitterId": null
},
"tmdbUrl": "https://www.themoviedb.org/movie/1726",
"fetchedAt": "2025-01-15T12:00:00.000Z"
}
}
}
POST /api/v1/franchises
// Request:
{
"name": "DC Universe",
"imageUrl": "https://upload.wikimedia.org/wikipedia/commons/.../DC.png"
}
// Response (201 Created):
{
"message": "Franchise erfolgreich erstellt",
"data": {
"id": 2,
"name": "DC Universe"
}
}
TMDb Attribution
Die Nutzung der TMDb API erfordert folgende Attributionen:
- Logo: TMDb Logo & Attributions
- Text: "This product uses the TMDB API but is not endorsed or certified by TMDB."
- Jede Response enthält das Feld
tmdbData.tmdbUrlfür den direkten Link zur TMDb-Seite.
Umgebungsvariablen
| Variable | Standardwert | Beschreibung |
|---|---|---|
TMDB_API_KEY | cd090ac2aeb6662b678eff5a31d7a991 | TMDb API-Schlüssel |
SWAPI_BASE_URL | https://swapi.dev/api | SWAPI-Basis-URL (alternativ: https://swapi.info/api für alle 9 Filme) |
LOTR_API_KEY | – | API-Key für The One API (kostenlos; ohne Key wird eine statische LOTR-Filmliste verwendet) |
PORT | 3000 | HTTP-Port |
MONGODB_URI | – | MongoDB-Verbindungsstring (Produktion) |
MONGODB_URI_DEV | mongodb://localhost:27017/movieapi-test | MongoDB (Entwicklung) |
NODE_ENV | development | Umgebung (development/production/test) |
REQUEST_LIMIT | 100kb | Maximale Request-Größe |
SESSION_SECRET | – | Session-Secret für Cookie-Parser |