t proxytmdb · docs ← Retour

API proxytmdb

Cache local TMDB enrichi des notes IMDb avec recherche par titre / année / épisode.

Tous les endpoints retournent du JSON (sauf /search qui rend du HTML pour compat avec l'ancien PHP). Aucune authentification requise — limite globale 50 requêtes/seconde par IP.

URL de base

https://tmdb.uklm.xyz

Tous les exemples ci-dessous utilisent des chemins relatifs.

Endpoints

GET /api?t=movie&q=<tmdb_id>

Retourne le détail TMDB complet d'un film + note IMDb fusionnée.

Paramètres

ParamTypeRequisDescription
tstringouiDoit être movie
qintegerouiID TMDB du film

Exemple

curl 'https://tmdb.uklm.xyz/api?t=movie&q=27205'

Réponse (extrait)

{
  "id": 27205,
  "title": "Inception",
  "original_title": "Inception",
  "imdb_id": "tt1375666",
  "release_date": "2010-07-15",
  "runtime": 148,
  "vote_average": 8.4,
  "vote_count": 39044,
  "note_imdb": "8.8",
  "vote_imdb": "2809792",
  "budget": 160000000,
  "revenue": 839030630,
  "tagline": "Votre esprit abrite la scène du crime.",
  "overview": "Dom Cobb est un voleur expérimenté…",
  "genres": [{"id": 28, "name": "Action"}, …],
  "production_countries": [{"iso_3166_1": "US", …}],
  "poster_path": "/aej3LRUga5rhgkmRP6XMFw3ejbl.jpg",
  "external_ids": {…},
  "credits": {…},
  "images": {…},
  "videos": {…},
  "translations": {…}
}

Le format complet correspond à l'objet TMDB /movie/{id}?append_to_response=credits,external_ids,release_dates,translations,images,videos avec note_imdb et vote_imdb ajoutés.

GET /api?t=tv&q=<tmdb_id>

Idem pour les séries. imdb_id est dans external_ids.imdb_id pour les séries.

Exemple

curl 'https://tmdb.uklm.xyz/api?t=tv&q=1408'

Champs supplémentaires propres aux séries : seasons, aggregate_credits, first_air_date, last_air_date, name, original_name.

GET /api?t=imdb&q=<imdb_id>

Lookup direct par IMDb ID. Renvoie le détail movie ou tv correspondant. Tente movie d'abord, puis tv.

Paramètres

ParamTypeRequisDescription
tstringouiDoit être imdb
qstringouiIMDb ID au format tt0133093

Exemple

curl 'https://tmdb.uklm.xyz/api?t=imdb&q=tt0133093'
# → renvoie l'objet complet de Matrix (TMDB 603)

Si non trouvé

{"error": "IMDb id not found in local mappings"}
GET /api?t=providers&type=<movie|tv>&q=<tmdb_id>

Watch providers JustWatch par pays (FR, US, GB, etc.) — données du endpoint TMDB /watch/providers.

Paramètres

ParamTypeRequisDescription
tstringouiDoit être providers
typestringouimovie ou tv
qintegerouiID TMDB

Exemple

curl 'https://tmdb.uklm.xyz/api?t=providers&type=movie&q=603'

Réponse

{
  "id": 603,
  "results": {
    "FR": {
      "link": "https://www.themoviedb.org/movie/603/watch?locale=FR",
      "flatrate": [
        {"provider_id": 8, "provider_name": "Netflix", "logo_path": "/…"},
        …
      ],
      "rent": [...],
      "buy": [...]
    },
    "US": {…},
    …
  }
}

Catégories possibles par pays : flatrate (abonnement), rent, buy, free, ads.

GET /search?query=<requête>

Même recherche, mais rendue en HTML (vignettes posters + panneaux d'info inline). Compat avec l'ancien search.php.

curl 'https://tmdb.uklm.xyz/search?query=Inception%202010'
GET /health

Liveness/readiness JSON. 200 si l'index IMDb est chargé, 503 sinon.

{
  "status": "ok",
  "uptime": 86400,
  "pid": 12345,
  "node": "v22.18.0",
  "memory_mb": 943,
  "imdb_ratings": 1664245
}

Exempté du rate limit.

GET /metrics

Format Prometheus standard. Métriques exposées :

  • http_requests_total{method, route, status} — counter
  • http_request_duration_seconds{method, route, status} — histogram
  • search_cache_hits_total, search_cache_misses_total
  • imdb_ratings_total, search_workers{type}
  • Métriques process Node par défaut (CPU, RSS, heap, event loop lag, GC)

Vue humaine disponible sur /admin (onglet Métriques). Exempté du rate limit.

Codes d'erreur

CodeCas
200OK (même si {"error": "..."} dans le body — voir ci-dessous)
429Rate limit dépassé (50 req/s)
503Service dégradé (sur /health uniquement)

Erreurs applicatives (status 200 + champ error)

{"error": "Year or episode not found in query"}
{"error": "Not found in localized and original titles database"}
{"error": "IMDb id not found in local mappings"}
{"error": "providers requires type=movie|tv and q=<id>"}
{"error": "Not found"}

Le statut HTTP reste 200 — vérifier la présence de la clé error dans le JSON.

Rate limit

50 requêtes par seconde par IP, global tous endpoints confondus (sauf /health et /metrics). Configurable via RATE_LIMIT_PER_SEC.

En cas de dépassement, le serveur renvoie 429 Too Many Requests avec un header retry-after.

CORS

Tous les endpoints /api renvoient Access-Control-Allow-Origin: *. Utilisable depuis n'importe quel domaine en JS browser.