Documentation développeurs
API Frembed
Intégrez nos films, séries et animés sur votre plateforme via nos endpoints JSON ou nos lecteurs en iframe. 100 % gratuit, aucune clé, aucune inscription : une ligne de HTML suffit.
- Gratuit
- Sans clé ni compte
- ID TMDB ou IMDb
- CORS ouvert
<iframe src="https://frembed.bar/embed/movie/27205"
width="100%" height="500" frameborder="0" allowfullscreen
allow="autoplay *; encrypted-media *; picture-in-picture *; fullscreen *"></iframe>Pour commencer
Démarrage rapide
Trois étapes, aucune configuration. Le lecteur s'affiche dans une iframe : rien à installer, rien à héberger.
- 1
Trouvez l'identifiant
L'ID TMDB est le nombre dans l'adresse de la fiche sur themoviedb.org :
themoviedb.org/movie/27205donne27205. Un ID IMDb (tt1375666) marche aussi. - 2
Collez l'iframe
Une seule ligne de HTML, à mettre là où le lecteur doit apparaître. Aucune clé, aucune inscription.
- 3
C'est en ligne
Vos visiteurs regardent dans le lecteur Frembed, avec le choix du serveur et de la version (VF, VOSTFR, VO).
Le code d'intégration classique
<iframe src="https://frembed.bar/embed/movie/27205" width="100%" height="500px" frameborder="0" allowfullscreen="yes" allow="autoplay *; encrypted-media *; picture-in-picture *; fullscreen *" scrolling="no" style="overflow:hidden;"></iframe>Remplacez 27205 par l'ID de votre film. Pour un épisode, voir Lecteur série.
À lire une fois
Domaine actuel
Quand un domaine est bloqué par certains fournisseurs d'accès, Frembed passe sur un nouveau domaine. Tous les exemples de cette page utilisent le domaine sur lequel vous la lisez : frembed.bar.
Conseil : gardez le domaine dans une seule variable de votre site. Pour le suivre automatiquement, interrogez /api/domain depuis votre serveur : la réponse donne le domaine principal du moment.
https://frembed.bar/api/domainPas de CORS : à appeler côté serveur<?php
// Domaine actuel de Frembed, gardé 1 heure en cache fichier.
function frembed_base(): string {
$cache = sys_get_temp_dir() . "/frembed_domain.txt";
if (is_file($cache) && time() - filemtime($cache) < 3600) {
return trim(file_get_contents($cache));
}
$json = @file_get_contents("https://frembed.bar/api/domain");
$data = $json ? json_decode($json, true) : null;
if (!empty($data["domain"])) {
$base = "https://" . $data["domain"];
file_put_contents($cache, $base);
return $base;
}
// Pas de réponse : on garde le dernier domaine connu.
return is_file($cache) ? trim(file_get_contents($cache)) : "https://frembed.bar";
}
$src = frembed_base() . "/embed/movie/27205";{
"domain": "frembed.bar",
"status": "active",
"timestamp": 1759392000000
}Lecteur iframe
Lecteur film
Une URL par film, à mettre dans le src d'une iframe.
https://frembed.bar/embed/movie/{id}idrequisDans le cheminchemin—ID TMDB (27205) ou IMDB (tt1375666) du film.
https://frembed.bar/embed/movie/27205https://frembed.bar/embed/movie/tt1375666<!-- Lecteur responsive 16/9 -->
<div style="position:relative;width:100%;aspect-ratio:16/9;background:#000">
<iframe src="https://frembed.bar/embed/movie/27205"
style="position:absolute;inset:0;width:100%;height:100%;border:0"
allow="autoplay *; encrypted-media *; picture-in-picture *; fullscreen *"
allowfullscreen loading="lazy"></iframe>
</div>Lecteur iframe
Lecteur série et animé
Une URL par épisode : l'ID de la série, puis la saison et l'épisode.
https://frembed.bar/embed/serie/{id}?sa={saison}&epi={episode}idrequisDans le cheminchemin—ID TMDB (1396) ou IMDB (tt0903747) de la série.sarequisDans la requêterequête—Numéro de saison.epirequisDans la requêterequête—Numéro d'épisode.
sa et epi sont obligatoires
Sans saison ni épisode, le lecteur reste vide. Pour connaître les épisodes disponibles, utilisez /api/public/v1/tv/{id}.<!-- Lecteur responsive 16/9 -->
<div style="position:relative;width:100%;aspect-ratio:16/9;background:#000">
<iframe src="https://frembed.bar/embed/serie/1396?sa=1&epi=1"
style="position:absolute;inset:0;width:100%;height:100%;border:0"
allow="autoplay *; encrypted-media *; picture-in-picture *; fullscreen *"
allowfullscreen loading="lazy"></iframe>
</div>Et les animés ?
Les animes utilisent les mêmes endpoints que les films (/embed/movie/{ID}) ou les séries (/embed/serie/{ID}?sa={S}&epi={E}), selon le type.Changement d'épisode
Le visiteur peut passer à l'épisode suivant dans le lecteur. Votre page en est prévenue par un messageepisode_change (ci-dessous).Être prévenu du changement d'épisode
// Le lecteur prévient votre page quand le visiteur change d'épisode
window.addEventListener("message", (event) => {
const data = event.data;
if (!data || data.type !== "episode_change") return;
console.log("Saison", data.season, "épisode", data.episode);
// ex. : mettre à jour le titre, l'URL ou votre liste d'épisodes
});Message reçu : { "type": "episode_change", "season": 1, "episode": 2 }
Outil
Générateur et aperçu en direct
Saisissez un identifiant TMDB ou IMDB : vous obtenez le lien, le code HTML à intégrer et le vrai lecteur en aperçu.
Choisissez un titre puis cliquez sur Afficher l'aperçu : le vrai lecteur se charge ici, exactement comme sur votre site.
L'aperçu ne se charge qu'au clic. Si un titre n'est pas encore disponible, le lecteur reste vide : vérifiez-le avant avec l'API JSON.
Intégration
Bonnes pratiques
Ce qui fait la différence entre un lecteur qui marche partout et un lecteur qui pose problème.
- Un lecteur qui s’adapteDonnez à l'iframe
width:100%etaspect-ratio:16/9(exemple HTML ci-dessus) plutôt qu'une hauteur fixe : parfait sur mobile comme sur grand écran. - Gardez l’attribut allow
allow="autoplay *; encrypted-media *; picture-in-picture *; fullscreen *"etallowfullscreen: sans eux, le plein écran et certaines sources ne marchent pas. - Pas de sandboxL'attribut
sandboxest déconseillé : beaucoup d'hébergeurs vidéo le détectent et refusent de lire la vidéo. - Chargement différéAjoutez
loading="lazy"si le lecteur est bas dans la page : il ne se charge que lorsqu'on s'en approche. - Vérifiez avant d’afficherUn appel à /api/public/v1/movies/{id} vous dit si le film est disponible : n'affichez le bouton « Regarder » que dans ce cas.
- Un seul endroit pour le domaineLe domaine change parfois : une seule variable de configuration, mise à jour avec /api/domain.
Données
API JSON
Pour lister le catalogue, afficher les nouveautés ou vérifier qu'un titre est disponible. Chaque élément renvoyé contient déjà son link : l'URL du lecteur, prête à mettre dans une iframe.
URL de base
https://frembed.bar/api/public/v1
Authentification
Pas d'auth requise
Format
JSON, méthode GET
Cache
5 min (listes), 2 min (un titre)
Appelable depuis le navigateur
Les endpoints/api/public/v1 renvoient Access-Control-Allow-Origin: * : vous pouvez les appeler en JavaScript depuis n'importe quel site. GET /api/public/v1 liste les endpoints disponibles.Liste des films
Récupère la liste paginée de tous les films disponibles. Pour les nouveautés : order=latest ; pour les derniers mis à jour : order=update.
https://frembed.bar/api/public/v1/movieslimitoptionDans la requêterequêtePar défaut :20Résultats / page (max 100)pageoptionDans la requêterequêtePar défaut :1Numéro de pageorderoptionDans la requêterequêtePar défaut :latestlatestderniers ajouts ·popularles plus vus ·updatederniers mis à jour ·yearpar année de sortie
curl "https://frembed.bar/api/public/v1/movies?order=latest&limit=20&page=1"titletexte- Titre du film.
tmdb / imdbtexte- Identifiants.
imdbpeut valoirnull. yeartexte- Année de sortie.
qualitytexteHD,CAMouDVDSCR(ounull).versiontexteFrench,TrueFrenchouVostFR(ounull).posterURL- Affiche TMDB (w780), ou null.
linkURL- URL du lecteur, prête pour l'iframe.
{
"status": 200,
"result": {
"page": 1,
"totalPages": 214,
"moviesPerPage": 20,
"total": 4271,
"items": [{
"title": "Inception",
"tmdb": "27205",
"imdb": "tt1375666",
"year": "2010",
"quality": "HD",
"version": "TrueFrench",
"poster": "https://image.tmdb.org/t/p/w780/…",
"link": "https://frembed.bar/embed/movie/27205"
}]
}
}Récupérer un film
Récupère les données d'un film spécifique en passant son identifiant TMDB ou IMDB directement dans l'URL. C'est le moyen le plus simple de savoir si un film est disponible.
https://frembed.bar/api/public/v1/movies/{id}idrequisDans le cheminchemin—ID TMDB (27205) ou IMDB (tt1375666). Si l'ID commence par tt, la recherche s'effectue dans la colonne IMDB, et lelinkrenvoyé utilise aussi l'ID IMDb.
curl "https://frembed.bar/api/public/v1/movies/27205"Film introuvable = 200, pas 404
Un film absent du catalogue renvoiestatus: 200 avec total: 0 et une liste items vide. Testez total, pas le code HTTP.{
"status": 200,
"result": {
"total": 1,
"items": [{
"title": "Inception",
"tmdb": "27205",
"imdb": "tt1375666",
"year": "2010",
"quality": "HD",
"version": "TrueFrench",
"poster": "https://image.tmdb.org/t/p/w780/…",
"link": "https://frembed.bar/embed/movie/27205"
}]
}
}{
"status": 200,
"result": { "total": 0, "items": [] }
}Liste des épisodes
Récupère la liste paginée de tous les épisodes disponibles : un élément par épisode (le compteur totalSeries compte donc des épisodes). Avec order=latest, ce sont les derniers épisodes ajoutés.
https://frembed.bar/api/public/v1/tvlimitoptionDans la requêterequêtePar défaut :20Résultats / page (max 100)pageoptionDans la requêterequêtePar défaut :1Numéro de pageorderoptionDans la requêterequêtePar défaut :latestlatestderniers ajouts ·popularles plus vus ·yearpar année de sortie
curl "https://frembed.bar/api/public/v1/tv?order=latest&limit=20&page=1"titletexte- Titre de la série.
tmdb / imdbtexte- Identifiants de la série.
yearnombre- Année.
sa / epinombre- Saison et épisode.
versiontexteVF,VOSTFRouVF_VOSTFR.linkURL- URL du lecteur de l'épisode.
{
"status": 200,
"result": {
"page": 1,
"totalPages": 850,
"seriesPerPage": 20,
"totalSeries": 16983,
"items": [{
"title": "Breaking Bad",
"tmdb": "1396",
"imdb": "tt0903747",
"year": 2008,
"sa": 1,
"epi": 1,
"version": "VF",
"link": "https://frembed.bar/embed/serie/1396?sa=1&epi=1"
}]
}
}Récupérer les épisodes d'une série
Récupère les épisodes d'une série en passant l'ID dans l'URL. Filtrage par saison et épisode optionnels.
https://frembed.bar/api/public/v1/tv/{id}idrequisDans le cheminchemin—ID TMDB ou IMDB de la sériesaoptionDans la requêterequête—Numéro de saison (sans = toute la série)epioptionDans la requêterequête—Numéro d'épisode (à utiliser avec sa)
/tv/1396Tous les épisodes/tv/1396?sa=1Saison 1 complète/tv/1396?sa=1&epi=1S01E01 uniquement
curl "https://frembed.bar/api/public/v1/tv/1396?sa=1&epi=1"sa, la réponse ajoute season et, selon le cas, totalEpisodes (saison entière) ou "episode number" (un épisode). Série ou épisode absent : totalItems: 0.{
"status": 200,
"result": {
"totalItems": 1,
"items": [{
"title": "Breaking Bad",
"tmdb": "1396",
"imdb": "tt0903747",
"year": 2008,
"sa": 1,
"epi": 1,
"version": "VF",
"link": "https://frembed.bar/embed/serie/1396?sa=1&epi=1"
}],
"season": "1",
"episode number": "1"
}
}Liste des animés
Récupère la liste paginée de tous les animes (films et/ou séries TV). Une série animée n'apparaît qu'une fois.
https://frembed.bar/api/public/v1/animelimitoptionDans la requêterequêtePar défaut :20Résultats / page (max 100)pageoptionDans la requêterequêtePar défaut :1Numéro de pageorderoptionDans la requêterequêtePar défaut :latestlatestderniers ajouts ·popularles plus vus ·yearpar année de sortietypeoptionDans la requêterequêtePar défaut :allalltout ·moviefilms ·tvséries
curl "https://frembed.bar/api/public/v1/anime?type=tv&order=popular&limit=20"{
"status": 200,
"result": {
"page": 1,
"totalPages": 12,
"perPage": 20,
"total": 230,
"items": [{
"type": "tv",
"title": "Attack on Titan",
"tmdb": "1429",
"imdb": "tt2560140",
"year": "2013",
"version": "VOSTFR",
"link": "https://frembed.bar/embed/serie/1429?sa=1&epi=1"
}]
}
}Récupérer un animé
Récupère les données d'un anime par ID TMDB ou IMDB. Fonctionne pour les films et les séries, avec titre et résumé en français.
https://frembed.bar/api/public/v1/anime/{id}idrequisDans le cheminchemin—ID TMDB ou IMDBsaoptionDans la requêterequête—Numéro de saison (sans = toute la série)epioptionDans la requêterequête—Numéro d'épisode (à utiliser avec sa)
/anime/1429Tous les épisodes/anime/1429?sa=1Saison 1 complète/anime/635302Film anime par ID TMDB/anime/tt2560140Série anime par ID IMDB
curl "https://frembed.bar/api/public/v1/anime/1429?sa=1"Ici, un titre absent renvoie 404
Contrairement aux films et séries, un ID qui n'est pas un animé disponible renvoie404 avec "Anime not found".{
"status": 200,
"result": {
"type": "tv",
"title_fr": "L'Attaque des Titans",
"overview": "…",
"overview_fr": "…",
"totalItems": 25,
"items": [{
"title": "Attack on Titan",
"tmdb": "1429",
"imdb": "tt2560140",
"year": 2013,
"sa": 1,
"epi": 1,
"version": "VOSTFR",
"link": "https://frembed.bar/embed/serie/1429?sa=1&epi=1"
}],
"season": "1",
"totalEpisodes": 25
}
}Référence
Codes de réponse
200, avec total: 0 ou totalItems: 0.OPTIONS), envoyée automatiquement par le navigateur.-L pour suivre.order ou de type inconnue (le message liste les valeurs permises), ou tmdb manquant sur /api/vip/token./api/public/v1/anime/{id}.{ "error": "catalog_unavailable" }.Les erreurs ont la forme { "status": 400, "message": "…" }. Les lecteurs en iframe, eux, n'ont pas de code : un titre absent laisse le lecteur vide.
Compatibilité
Anciennes URLs
Vos anciennes intégrations continuent de marcher : ces adresses redirigent (301) vers les nouvelles. Pour un nouveau site, utilisez directement les nouvelles.
/api/film.php?id={id}/embed/movie/{id}/api/app.php?id={id}/embed/movie/{id}/api/serie.php?id={id}&sa={S}&epi={E}/embed/serie/{id}?sa={S}&epi={E}/api/appserie.php?id={id}&sa={S}&epi={E}/embed/serie/{id}?sa={S}&epi={E}/api/public/v1/movies/check?id={id}/api/public/v1/movies/{id}/api/public/v1/tv/check?id={id}&sa=&epi=/api/public/v1/tv/{id}?sa=&epi=Aide
Questions fréquentes
Faut-il une clé API ou un compte ?
Non. Les lecteurs et l'API JSON sont publics et gratuits, sans inscription. Les endpoints JSON acceptent les appels depuis n'importe quel site.
Quelle différence entre l'API gratuite et le Premium ?
Le lecteur gratuit (/embed/…) s'utilise partout, est financé par la publicité et s'appuie sur des hébergeurs vidéo. Le lecteur Premium sert des sources directes jusqu'à la 4K, sans publicité, à vos couleurs, et seulement sur vos domaines. Voir les offres.
Le domaine a changé, mes lecteurs ne marchent plus ?
Remplacez l'ancien domaine par le nouveau dans votre variable de configuration. Pour ne plus y penser, lisez le domaine du moment avec /api/domain depuis votre serveur. Les anciennes URLs /api/film.php et /api/serie.php restent valables sur le nouveau domaine.
Comment savoir si un titre est disponible ?
Film : /api/public/v1/movies/{id} (regardez total). Épisode : /api/public/v1/tv/{id}?sa=1&epi=1 (regardez totalItems).
Puis-je utiliser un ID IMDb ?
Oui, pour les films et les séries, dans le lecteur comme dans l'API : tout ID qui commence par tt est traité comme un ID IMDb.
Le visiteur peut-il choisir VF ou VOSTFR ?
Oui, directement dans le lecteur. L'API indique la version disponible dans le champ version.
Y a-t-il une limite de requêtes ?
Il n'y a pas de quota sur l'API gratuite. Les réponses sont mises en cache de notre côté (5 minutes pour les listes, 2 minutes pour un titre) : inutile d'appeler plus souvent. Gardez aussi les résultats en cache chez vous, vos pages seront plus rapides.
Pourquoi la liste des séries renvoie des épisodes ?
/api/public/v1/tv renvoie un élément par épisode, c'est pratique pour afficher les « derniers épisodes ajoutés ». Pour toute une série, utilisez /api/public/v1/tv/{id}.
Les animés ont-ils un lecteur à part ?
Non. Un film animé utilise /embed/movie/{id}, une série animée /embed/serie/{id}?sa=&epi=. Les endpoints /anime servent seulement à lister les animés.
Besoin d'un lecteur sans pub, en 4K, à vos couleurs ?
Le lecteur Premium est réservé à vos domaines, dès 30 USD par mois.
Une question qui n'est pas ici ? Écrivez-nous