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.

Diese App verwendet die TMDb API. Sie ist nicht von TMDB gesponsert oder zertifiziert.
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

GET/api/v1/movies
ParameterBeschreibung
pageSeitenzahl (Standard: 1) oder all für alle Einträge
posterBase64-Poster im Ergebnis einschließen
castVollständige Cast-Objekte einschließen
crewVollständige Crew-Objekte einschließen
franchiseFranchise-Objekt einschließen
offersStreaming-Angebote einschließen
castImagesProfilbilder der Cast-Mitglieder einschließen
crewImagesProfilbilder der Crew-Mitglieder einschließen
offerIconsAnbieter-Icons (Base64) einschließen

Film/Serie nach ID abrufen

GET/api/v1/movies/:id

Gibt einen einzelnen Eintrag zurück. Unterstützt dieselben Query-Parameter wie die Listenansicht.

Poster abrufen

GET/api/v1/movies/:id/poster.png

Gibt das Poster als PNG-Bild zurück (Binary, Content-Type: image/png).

Cast/Crew abrufen

GET/api/v1/movies/:id/cast
GET/api/v1/movies/:id/crew

Franchises

Alle Franchises abrufen

GET/api/v1/franchises

Franchise erstellen

POST/api/v1/franchises

Erstellt eine neue Franchise. Das Bild wird automatisch heruntergeladen und als Base64 gespeichert.

FeldTypBeschreibung
name *stringName der Franchise (Pflichtfeld)
imageUrlstringURL des Franchise-Bildes (wird heruntergeladen)
imagestringBase64-kodiertes Bild (Alternative zu imageUrl)
{
  "name": "DC Universe",
  "imageUrl": "https://example.com/dc-logo.png"
}

Franchise-Bild abrufen

GET/api/v1/franchises/:id/image.png

Filme einer Franchise abrufen

GET/api/v1/franchises/:id/movies

Personen

GET/api/v1/persons
GET/api/v1/persons/:id
GET/api/v1/persons/:id/image.png
GET/api/v1/persons/:id/movies

Datenmodell – Basis-Felder

Jeder Eintrag enthält folgende Top-Level-Felder (unabhängig von TMDb oder Franchise).

FeldTypQuelleBeschreibung
idnumberinternAuto-inkrementierte ID
typestringMCUAPI"movie" oder "series"
franchiseIdnumberinternID der zugehörigen Franchise
namestringMCUAPITitel des Eintrags
yearnumberMCUAPIErscheinungsjahr
releaseDatedateMCUAPIGenaues Veröffentlichungsdatum
ageRatingstringTMDb/MCUAPIAltersfreigabe, z.B. "12"
durationnumberMCUAPILaufzeit in Minuten (nur Filme)
genresstring[]TMDb/MCUAPIGenre-Namen, z.B. ["Action", "Abenteuer"]
descriptionstringTMDbDeutsche Inhaltsbeschreibung
posterstringMCUAPIBase64-Poster (nur mit ?poster)
posterUrlstringTMDb/MCUAPIÖffentliche Poster-URL
trailerstringTMDb/MCUAPIYouTube-Trailer-URL
imdbIdstringMCUAPIIMDb-ID, z.B. tt0371746
tmdbIdnumberTMDbTMDb-Datenbank-ID
tmdbDataobjectTMDbVollständige TMDb-Daten (s.u.)
originstringintern"mcuapi" / "swapi" / "hpapi" / "lotrapi" / "breakingbadapi" / "rickandmortyapi" / "dcuniverse" / "gameofthrones" / "pokemon" / "avatar" (automatisch) oder "custom" (manuell)
castarrayTMDb[{ role, person }] – Darsteller (IDs)
crewarrayTMDb[{ role, person }] – Crew (IDs)
flatrateOffersarrayTMDbAbo-Angebote [{ name, url, retailPrice, currency, seasons, icon }]
rentOffersarrayTMDbLeihen-Angebote (gleiche Struktur)
buyOffersarrayTMDbKaufen-Angebote
adsOffersarrayTMDbKostenlos 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")

FeldTypBeschreibung
franchiseSpecific.sagastringMarvel-Saga, z.B. "The Infinity Saga", "The Multiverse Saga"
franchiseSpecific.phasenumber/stringMCU-Phase, z.B. 1, 2, 3, 4, 5
franchiseSpecific.chronologynumberChronologische Reihenfolge im MCU (nicht Erscheinungsreihenfolge)
franchiseSpecific.postCreditScenesnumberAnzahl der Post-Credit-Szenen (0, 1, 2 …)

Serien (type: "series")

FeldTypBeschreibung
franchiseSpecific.sagastringMarvel-Saga
franchiseSpecific.phasenumber/stringMCU-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.

FeldTypBeschreibung
franchiseSpecific.episodeIdnumberEpisode-Nummer (1–9)
franchiseSpecific.sagastringTrilogie: "Prequel Trilogy", "Original Trilogy", "Sequel Trilogy"
franchiseSpecific.directorstringRegisseur(e), kommagetrennt (aus SWAPI)
franchiseSpecific.producerstringProduzent(en), kommagetrennt (aus SWAPI)
franchiseSpecific.openingCrawlstringDer berühmte Opening-Crawl-Text (aus SWAPI)
franchiseSpecific.charactersstring[]Charakternamen aus dem Film (via SWAPI)
franchiseSpecific.planetsstring[]Planeten aus dem Film (via SWAPI)
franchiseSpecific.starshipsstring[]Raumschiffe aus dem Film (via SWAPI)
franchiseSpecific.vehiclesstring[]Fahrzeuge aus dem Film (via SWAPI)
franchiseSpecific.speciesstring[]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.

FeldTypBeschreibung
franchiseSpecific.bookNumbernumber|nullBuchnummer der Vorlage (1–7; null bei Fantastic Beasts)
franchiseSpecific.partnumberChronologischer Filmteil (1–8 Hauptreihe, 1–3 Fantastic Beasts)
franchiseSpecific.sagastring"Main Series" oder "Fantastic Beasts"
franchiseSpecific.villainstringHaupt-Antagonist(en) des Films
franchiseSpecific.mainLocationstringWichtigster Schauplatz des Films

Lord of the Rings – origin: "lotrapi"

6 Kinofilme: 3 LOTR + 3 Hobbit. Daten von The One API (optionaler LOTR_API_KEY).

FeldTypBeschreibung
franchiseSpecific.trilogystring"The Lord of the Rings" oder "The Hobbit"
franchiseSpecific.academyAwardNominationsnumberAnzahl Oscarnominierungen
franchiseSpecific.academyAwardWinsnumberAnzahl gewonnener Oscars
franchiseSpecific.rottenTomatoesScorenumber|nullRotten-Tomatoes-Score in %
franchiseSpecific.budgetInMillionsnumber|nullProduktionsbudget in Mio. USD
franchiseSpecific.boxOfficeRevenueInMillionsnumber|nullEinspielergebnis in Mio. USD
franchiseSpecific.charactersstring[]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.

FeldTypBeschreibung
franchiseSpecific.showstring"Breaking Bad", "Better Call Saul" oder "El Camino"
franchiseSpecific.creatorstringShowrunner / Creator
franchiseSpecific.networkstringSender ("AMC", "Netflix")
franchiseSpecific.mainCharactersstring[]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.

FeldTypBeschreibung
franchiseSpecific.networkstring"Adult Swim"
franchiseSpecific.creatorstringCreator (Justin Roiland & Dan Harmon)
franchiseSpecific.seasonsnumberAktuelle Staffelanzahl (via API)
franchiseSpecific.episodesnumberAktuelle Gesamtepisodenzahl (via API)
franchiseSpecific.locationsstring[]Bekannte Locations / Dimensionen (via Rick and Morty API)

DC Universe – origin: "dcuniverse"

17 DCEU-Filme + 1 DCEU-Serie + 2 DCU-Einträge (Gunn-Ära).

FeldTypBeschreibung
franchiseSpecific.continuitystring"DCEU", "Snyderverse" oder "DCU"
franchiseSpecific.phasestringPhase / Chapter, z.B. "Phase 1", "Chapter 1"
franchiseSpecific.releaseOrdernumberChronologische Veröffentlichungsreihenfolge im DC-Universum (1–N)

Game of Thrones – origin: "gameofthrones"

Game of Thrones (8 Staffeln) + House of the Dragon (Spinoff).

FeldTypBeschreibung
franchiseSpecific.showTypestring"main" oder "spinoff"
franchiseSpecific.basedOnstringBuchvorlage (George R.R. Martin)
franchiseSpecific.creatorstringShowrunner
franchiseSpecific.networkstring"HBO"
franchiseSpecific.sourceBooksArray<{name, released}>ASOIAF-Buchmetadaten (via An API of Ice and Fire)

Pokémon – origin: "pokemon"

11 Animationsfilme + 1 Live-Action-Film + 2 Anime-Serien.

FeldTypBeschreibung
franchiseSpecific.generationnumberPokémon-Generation (1–9)
franchiseSpecific.sagastringSaga-Bezeichnung, z.B. "Original", "Live-Action"
franchiseSpecific.protagoniststringHauptfigur, z.B. "Ash Ketchum", "Liko & Roy"

Avatar – origin: "avatar"

Avatar: The Last Airbender (Animated & Live-Action) + The Legend of Korra.

FeldTypBeschreibung
franchiseSpecific.booksstring[]Staffel-/Buch-Bezeichnungen, z.B. ["Water", "Earth", "Fire"]
franchiseSpecific.protagoniststring"Aang" oder "Korra"
franchiseSpecific.formatstring"Animated" oder "Live-Action"
franchiseSpecific.creatorstringCreator

Serien-spezifische Felder (nur type: "series")

Zusätzliche Top-Level-Felder, die nur bei Serien vorhanden sind:

FeldTypQuelleBeschreibung
episodesnumberAPI / statischGesamtzahl aller Episoden (über alle Staffeln)
seasonsnumberAPI / statischAnzahl der Staffeln
lastAiredDatedateMCUAPIDatum 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.

FeldTypBeschreibung
tmdbIdnumberTMDb-Film-ID
imdbIdstringIMDb-ID (z.B. tt4154796)
titlestringDeutscher Titel
originalTitlestringOriginaltitel
originalLanguagestringOriginalsprache (ISO 639-1)
overviewstringDeutsche Beschreibung
taglinestringWerbespruch
statusstringStatus (z.B. "Released")
releaseDatestringVeröffentlichungsdatum (ISO 8601)
runtimenumberLaufzeit in Minuten
budgetnumberBudget in USD
revenuenumberEinspielergebnis in USD
popularitynumberTMDb Popularitätswert
voteAveragenumberDurchschnittsbewertung (0–10)
voteCountnumberAnzahl Bewertungen
adultbooleanErwachseneninhalt
genresarrayGenres [{id, name}]
productionCompaniesarrayProduktionsfirmen [{id, name, originCountry, logoUrl}]
productionCountriesarrayProduktionsländer [{iso, name}]
spokenLanguagesarrayGesprochene Sprachen [{iso, name, englishName}]
posterUrlstringPoster-URL (w500)
backdropUrlstringHintergrundbild-URL (w1280)
images.postersarrayWeitere Poster-Varianten
images.backdropsarrayWeitere Hintergrundbilder
castarraySchauspieler [{tmdbPersonId, name, character, order, profileUrl}]
crewarrayCrew (Regisseure, Produzenten etc.) [{tmdbPersonId, name, job, department, profileUrl}]
videosarrayTrailer, Teaser etc. [{id, name, type, site, key, url, official}]
trailerUrlstringDirektlink zum offiziellen Trailer (YouTube)
watchProvidersobjectStreaming-Anbieter für DE {flatrate, rent, buy, ads, link}
watchProviders.flatratearrayAbo-Anbieter [{id, name, logoUrl, displayPriority}]
watchProviders.rentarrayLeihen-Anbieter
watchProviders.buyarrayKaufen-Anbieter
watchProviders.adsarrayKostenlos mit Werbung
recommendationsarrayEmpfehlungen [{tmdbId, title, posterUrl, releaseDate, voteAverage}]
similararrayÄhnliche Filme (gleiche Struktur)
keywordsarraySchlagwörter [{id, name}]
certificationstringFSK-Altersfreigabe (DE), z.B. "12"
externalIdsobjectExterne IDs {imdbId, wikidataId, facebookId, instagramId, twitterId}
tmdbUrlstringLink zur TMDb-Seite (Attribution)
fetchedAtstringZeitstempel des letzten Abrufs (ISO 8601)

TMDb Serien-Felder (serie.tmdbData)

Serien haben zusätzliche Felder (alles von oben plus):

FeldTypBeschreibung
namestringSerienname (deutsch)
originalNamestringOriginalname
typestringTyp (z.B. "Scripted", "Reality")
firstAirDatestringErstausstrahlung
lastAirDatestringLetzte Ausstrahlung
inProductionbooleanOb die Serie noch produziert wird
numberOfSeasonsnumberAnzahl Staffeln
numberOfEpisodesnumberGesamtzahl Episoden
episodeRunTimearrayDurchschnittliche Episodenlaufzeiten (Minuten)
networksarraySender/Netzwerke [{id, name, originCountry, logoUrl}]
createdByarraySchöpfer der Serie [{tmdbPersonId, name, profileUrl}]
seasonsarrayStaffeln mit Episoden (optional, bei fetchSeasons=true)
seasons[].seasonNumbernumberStaffelnummer
seasons[].episodesarrayEpisoden [{episodeNumber, name, overview, airDate, runtime, voteAverage, stillUrl, guestStars}]
lastEpisodeToAirobjectLetzte ausgestrahlte Episode {seasonNumber, episodeNumber, name, airDate, overview}
nextEpisodeToAirobjectNächste geplante Episode (falls vorhanden)
externalIds.tvdbIdstringTheTVDB-ID
originCountryarrayUrsprungsland(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:

Umgebungsvariablen

VariableStandardwertBeschreibung
TMDB_API_KEYcd090ac2aeb6662b678eff5a31d7a991TMDb API-Schlüssel
SWAPI_BASE_URLhttps://swapi.dev/apiSWAPI-Basis-URL (alternativ: https://swapi.info/api für alle 9 Filme)
LOTR_API_KEYAPI-Key für The One API (kostenlos; ohne Key wird eine statische LOTR-Filmliste verwendet)
PORT3000HTTP-Port
MONGODB_URIMongoDB-Verbindungsstring (Produktion)
MONGODB_URI_DEVmongodb://localhost:27017/movieapi-testMongoDB (Entwicklung)
NODE_ENVdevelopmentUmgebung (development/production/test)
REQUEST_LIMIT100kbMaximale Request-Größe
SESSION_SECRETSession-Secret für Cookie-Parser