{
  "name": "STREAMIX Developer API",
  "version": "v1",
  "baseUrl": "https://flix.syrixvision.com/api/developer/v1",
  "authentication": {
    "header": "X-API-Key",
    "alternative": "Authorization: Bearer <key>",
    "notes": "Ne jamais exposer la clé côté navigateur. Les clés sont affichées une seule fois et stockées hachées."
  },
  "response": {
    "success": {
      "success": true,
      "data": {},
      "meta": {}
    },
    "failure": {
      "success": false,
      "error": {
        "code": "string",
        "message": "string"
      }
    }
  },
  "headers": {
    "x-syrix-tokens-used": "Nombre de tokens débités pour la requête (0 en mode gratuit)."
  },
  "limits": {
    "requestsPerMinute": "120 par défaut, selon le plan",
    "search": "q entre 2 et 100 caractères"
  },
  "caching": "Catalogue, détails et liens de lecture : 5 minutes. Recherche : 10 minutes.",
  "scope": "Films, séries, animes, K-Dramas, manga, manhwa, webtoons (/comics, gratuit), lecture des épisodes et des chapitres, recherche. Contenu 18+ exclu.",
  "concepts": [
    {
      "term": "slug",
      "meaning": "Identifiant lisible d'un titre (ex. one-piece). Il vient des listes et de la recherche et sert dans /movies/{slug}, /series/{slug}, /anime/{slug}, /dramas/{slug}, /webtoons/{slug}."
    },
    {
      "term": "episode_id",
      "meaning": "Identifiant d'un épisode, fourni par le DÉTAIL du titre (episodes[].episode_id). Films : first_episode_id. Séries : numérique, à envoyer à /episodes/{episode_id}/servers. Anime et dramas : texte (ex. one-piece-1100-vostfr), à envoyer au paramètre ?episode=."
    },
    {
      "term": "chapter_id",
      "meaning": "Identifiant d'un chapitre (chapters[].chapter_id). Manga / manhwa / webtoon : UUID à envoyer à /comics/chapters/{chapter_id}/pages. Ancienne source /webtoons : paramètre ?chapter=."
    },
    {
      "term": "type (comics)",
      "meaning": "Catégorie de /comics : manga (Japon), manhwa (Corée), manhua (Chine) ou webtoon (lecture verticale). Un titre peut être à la fois manhwa et webtoon (is_webtoon = true)."
    },
    {
      "term": "server_type",
      "meaning": "embed = page de lecteur à afficher dans une balise <iframe>. direct = fichier vidéo (.mp4, .m3u8) à lire avec une balise <video> (les .m3u8 demandent hls.js sur la plupart des navigateurs de bureau)."
    },
    {
      "term": "version",
      "meaning": "Langue / sous-titres de la source : VF, VOSTFR, etc. Un même titre peut exister en plusieurs versions."
    },
    {
      "term": "image",
      "meaning": "URL absolue d'une affiche ou d'une page, servie par le proxy SYRIX (https). Elle peut être affichée directement dans <img>."
    },
    {
      "term": "meta",
      "meaning": "Informations de pagination : page, last_page, genre, sort. Bouclez de page à last_page pour tout lire."
    }
  ],
  "guides": [
    {
      "id": "watch-movie",
      "title": "Regarder un film",
      "intro": "Trois appels : chercher, ouvrir la fiche, récupérer les liens de lecture.",
      "steps": [
        "GET /search?q=<titre> (ou GET /movies) : récupérez le slug du film.",
        "GET /movies/{slug} : lisez data.first_episode_id.",
        "GET /episodes/{first_episode_id}/servers : vous obtenez la liste des serveurs.",
        "Affichez le premier serveur : <iframe src=server_link> si server_type = embed, sinon <video src=server_link>. Gardez les autres serveurs comme solutions de secours."
      ],
      "code": [
        {
          "label": "cURL",
          "code": "curl \"https://flix.syrixvision.com/api/developer/v1/movies/my-movie\" \\\n  -H \"X-API-Key: syrix-your-key\"\n\n# data.first_episode_id = 48213\ncurl \"https://flix.syrixvision.com/api/developer/v1/episodes/48213/servers\" \\\n  -H \"X-API-Key: syrix-your-key\""
        }
      ]
    },
    {
      "id": "watch-series",
      "title": "Regarder un épisode de série",
      "intro": "Même principe que pour un film, mais l'episode_id vient de la liste des épisodes.",
      "steps": [
        "GET /series/{slug} : parcourez data.episodes (season, number, episode_id).",
        "Choisissez un épisode, puis GET /episodes/{episode_id}/servers.",
        "Lisez le serveur choisi (iframe ou video selon server_type)."
      ],
      "code": [
        {
          "label": "cURL",
          "code": "curl \"https://flix.syrixvision.com/api/developer/v1/series/my-series\" \\\n  -H \"X-API-Key: syrix-your-key\"\n\n# episodes[0].episode_id = 90211\ncurl \"https://flix.syrixvision.com/api/developer/v1/episodes/90211/servers\" \\\n  -H \"X-API-Key: syrix-your-key\""
        }
      ]
    },
    {
      "id": "watch-anime",
      "title": "Regarder un anime ou un K-Drama",
      "intro": "Ici le slug du titre ET l'episode_id (texte) sont nécessaires. Le numéro d'épisode seul ne suffit pas.",
      "steps": [
        "GET /anime/{slug} (ou /dramas/{slug}) : récupérez data.episodes.",
        "Prenez episodes[n].episode_id, par exemple one-piece-1100-vostfr.",
        "GET /anime/{slug}/servers?episode={episode_id}.",
        "Affichez server_link dans un <iframe> (server_type = embed)."
      ],
      "code": [
        {
          "label": "cURL",
          "code": "curl \"https://flix.syrixvision.com/api/developer/v1/anime/one-piece\" \\\n  -H \"X-API-Key: syrix-your-key\"\n\ncurl \"https://flix.syrixvision.com/api/developer/v1/anime/one-piece/servers?episode=one-piece-1100-vostfr\" \\\n  -H \"X-API-Key: syrix-your-key\""
        }
      ]
    },
    {
      "id": "read-webtoon",
      "title": "Lire un webtoon",
      "intro": "Liste des chapitres, puis images d'un chapitre.",
      "steps": [
        "GET /webtoons/{slug} : lisez data.chapters.",
        "GET /webtoons/{slug}/pages?chapter={chapter_id} : affichez chaque image dans l'ordre (champ page)."
      ],
      "code": [
        {
          "label": "cURL",
          "code": "curl \"https://flix.syrixvision.com/api/developer/v1/webtoons/my-webtoon/pages?chapter=12\" \\\n  -H \"X-API-Key: syrix-your-key\""
        }
      ]
    },
    {
      "id": "read-comic",
      "title": "Lire un manga, un manhwa ou un webtoon",
      "intro": "Quatre étapes : lister, ouvrir la fiche, choisir un chapitre, afficher les pages. Tout est gratuit (aucun token).",
      "steps": [
        "GET /comics?type=manhwa&lang=fr (ou /comics/home?type=manhwa) : récupérez le slug (UUID) d'un titre.",
        "GET /comics/{slug}?lang=fr : lisez data.chapters. Vide ? Voyez available_languages et réessayez avec une autre langue.",
        "GET /comics/chapters/{chapter_id}/pages?quality=data-saver : récupérez data.pages.",
        "Affichez chaque page.image dans une balise <img> à la suite (lecture verticale), dans l'ordre du champ page. Affichez aussi « Source : MangaDex » et le nom de data.group."
      ],
      "code": [
        {
          "label": "cURL",
          "code": "curl \"https://flix.syrixvision.com/api/developer/v1/comics?type=manhwa&lang=fr&per_page=5\" \\\n  -H \"X-API-Key: syrix-your-key\"\n\n# data[0].slug = 11111111-1111-4111-8111-111111111111\ncurl \"https://flix.syrixvision.com/api/developer/v1/comics/11111111-1111-4111-8111-111111111111?lang=fr\" \\\n  -H \"X-API-Key: syrix-your-key\"\n\n# data.chapters[0].chapter_id = aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa\ncurl \"https://flix.syrixvision.com/api/developer/v1/comics/chapters/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/pages?quality=data-saver\" \\\n  -H \"X-API-Key: syrix-your-key\""
        }
      ]
    },
    {
      "id": "paginate",
      "title": "Récupérer tout un catalogue",
      "intro": "Toutes les listes sont paginées : parcourez les pages jusqu'à meta.last_page.",
      "steps": [
        "GET /anime?page=1 : lisez meta.last_page.",
        "Répétez avec page=2, 3 … jusqu'à last_page.",
        "Respectez la limite par minute de votre plan et mettez les résultats en cache chez vous (5 minutes minimum)."
      ]
    }
  ],
  "endpoints": [
    {
      "method": "GET",
      "path": "/",
      "title": "Découverte de l'API",
      "description": "Renvoie la liste des endpoints disponibles. Gratuit (0 token) : pratique pour vérifier qu'une clé fonctionne.",
      "params": [],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": {\n    \"name\": \"STREAMIX Developer API\",\n    \"version\": \"v1\",\n    \"base_url\": \"https://flix.syrixvision.com/api/developer/v1\",\n    \"endpoints\": [ { \"path\": \"/movies\", \"title\": \"...\" } ]\n  }\n}"
    },
    {
      "method": "GET",
      "path": "/search",
      "title": "Rechercher partout",
      "description": "Recherche unifiée dans les films, séries, animes et K-Dramas. Chaque résultat contient son type : utilisez-le pour choisir l'endpoint de détail. Le contenu 18+ n'est jamais renvoyé.",
      "params": [
        {
          "name": "q",
          "type": "string",
          "required": true,
          "description": "Texte recherché (2 caractères minimum, 100 maximum)."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/search?q=naruto\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    { \"type\": \"anime\", \"slug\": \"naruto\", \"title\": \"Naruto\", \"image\": \"https://...\" },\n    { \"type\": \"movie\", \"slug\": \"naruto-the-movie\", \"title\": \"Naruto the Movie\", \"image\": \"https://...\" }\n  ],\n  \"meta\": { \"query\": \"naruto\", \"count\": 2 }\n}"
    },
    {
      "method": "GET",
      "path": "/movies",
      "title": "Lister les films",
      "description": "Catalogue des films, du plus récent au plus ancien. Chaque élément contient le slug à utiliser dans /movies/{slug}.",
      "params": [
        {
          "name": "page",
          "type": "number",
          "required": false,
          "description": "Numéro de page (défaut 1). La réponse contient meta.last_page."
        },
        {
          "name": "genre",
          "type": "string (slug)",
          "required": false,
          "description": "Filtre par genre, ex. action, romance, drama."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/movies?page=1\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    {\n      \"title\": \"Exemple\",\n      \"slug\": \"exemple\",\n      \"image\": \"https://flix.syrixvision.com/api/image-proxy?url=...\",\n      \"version\": \"VOSTFR\",\n      \"type\": \"movie\"\n    }\n  ],\n  \"meta\": { \"page\": 1, \"last_page\": 12, \"genre\": null }\n}"
    },
    {
      "method": "GET",
      "path": "/movies/{slug}",
      "title": "Détail d'un film",
      "description": "Fiche complète : synopsis, genres, année, et surtout first_episode_id — l'identifiant à envoyer à /episodes/{episode_id}/servers pour obtenir les liens de lecture.",
      "params": [
        {
          "name": "slug",
          "type": "string (chemin)",
          "required": true,
          "description": "Identifiant du film, pris dans le champ slug d'une liste ou d'une recherche."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/movies/my-movie\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": {\n    \"title\": \"My Movie\",\n    \"slug\": \"my-movie\",\n    \"type\": \"movie\",\n    \"image\": \"https://...\",\n    \"synopsis\": \"...\",\n    \"genres\": [\"Action\", \"Thriller\"],\n    \"year\": \"2024\",\n    \"status\": \"Completed\",\n    \"version\": \"VF\",\n    \"first_episode_id\": \"48213\",\n    \"related\": [ { \"title\": \"...\", \"slug\": \"...\", \"image\": \"...\" } ]\n  }\n}"
    },
    {
      "method": "GET",
      "path": "/series",
      "title": "Lister les séries",
      "description": "Catalogue des séries. Même format que /movies.",
      "params": [
        {
          "name": "page",
          "type": "number",
          "required": false,
          "description": "Numéro de page (défaut 1). La réponse contient meta.last_page."
        },
        {
          "name": "genre",
          "type": "string (slug)",
          "required": false,
          "description": "Filtre par genre, ex. action, romance, drama."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/series?page=1\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    {\n      \"title\": \"Exemple\",\n      \"slug\": \"exemple\",\n      \"image\": \"https://flix.syrixvision.com/api/image-proxy?url=...\",\n      \"version\": \"VOSTFR\",\n      \"type\": \"series\"\n    }\n  ],\n  \"meta\": { \"page\": 1, \"last_page\": 12, \"genre\": null }\n}"
    },
    {
      "method": "GET",
      "path": "/series/{slug}",
      "title": "Détail d'une série + épisodes",
      "description": "Fiche de la série avec la liste complète de ses épisodes (saison, numéro, episode_id). Pour regarder un épisode : /episodes/{episode_id}/servers.",
      "params": [
        {
          "name": "slug",
          "type": "string (chemin)",
          "required": true,
          "description": "Identifiant de la série, pris dans le champ slug d'une liste ou d'une recherche."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/series/my-series\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": {\n    \"title\": \"My Series\",\n    \"slug\": \"my-series\",\n    \"type\": \"series\",\n    \"synopsis\": \"...\",\n    \"genres\": [\"Crime\"],\n    \"episodes\": [\n      { \"episode_id\": \"90211\", \"season\": \"1\", \"number\": \"1\", \"title\": \"Épisode 1\" },\n      { \"episode_id\": \"90212\", \"season\": \"1\", \"number\": \"2\", \"title\": \"Épisode 2\" }\n    ],\n    \"first_episode_id\": \"90211\"\n  }\n}"
    },
    {
      "method": "GET",
      "path": "/episodes/{episode_id}/servers",
      "title": "Liens de lecture — films & séries",
      "description": "Retourne les serveurs de lecture d'un film (utilisez first_episode_id) ou d'un épisode de série (episodes[].episode_id). C'est CET endpoint qui permet de regarder les films et les séries.",
      "params": [
        {
          "name": "episode_id",
          "type": "string (chemin)",
          "required": true,
          "description": "Identifiant numérique pris dans le détail du film (first_episode_id) ou de la série (episodes[].episode_id)."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/episodes/90211/servers\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    {\n      \"server_name\": \"Serveur 1\",\n      \"server_link\": \"https://player.example/embed/abc123\",\n      \"server_type\": \"embed\",\n      \"version\": \"VOSTFR\"\n    }\n  ]\n}"
    },
    {
      "method": "GET",
      "path": "/anime",
      "title": "Lister les animes",
      "description": "Catalogue des animes. Tri par défaut : les plus récents.",
      "params": [
        {
          "name": "page",
          "type": "number",
          "required": false,
          "description": "Numéro de page (défaut 1). La réponse contient meta.last_page."
        },
        {
          "name": "genre",
          "type": "string (slug)",
          "required": false,
          "description": "Filtre par genre, ex. action, romance, drama."
        },
        {
          "name": "sort",
          "type": "latest | az",
          "required": false,
          "description": "Tri : latest (défaut) = plus récents, az = ordre alphabétique."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/anime?sort=latest&page=1\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    {\n      \"title\": \"Exemple\",\n      \"slug\": \"exemple\",\n      \"image\": \"https://flix.syrixvision.com/api/image-proxy?url=...\",\n      \"version\": \"VOSTFR\",\n      \"type\": \"anime\"\n    }\n  ],\n  \"meta\": { \"page\": 1, \"last_page\": 12, \"genre\": null }\n}"
    },
    {
      "method": "GET",
      "path": "/anime/{slug}",
      "title": "Détail d'un anime + épisodes",
      "description": "Fiche de l'anime avec tous ses épisodes. Le champ episodes[].episode_id est la valeur à passer au paramètre episode des serveurs.",
      "params": [
        {
          "name": "slug",
          "type": "string (chemin)",
          "required": true,
          "description": "Identifiant de l'anime, pris dans le champ slug d'une liste ou d'une recherche."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/anime/one-piece\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": {\n    \"title\": \"One Piece\",\n    \"slug\": \"one-piece\",\n    \"type\": \"anime\",\n    \"synopsis\": \"...\",\n    \"genres\": [\"Aventure\"],\n    \"year\": \"1999\",\n    \"status\": \"En cours\",\n    \"episodes\": [\n      { \"episode_id\": \"one-piece-1100-vostfr\", \"number\": \"1100\", \"title\": \"Épisode 1100\", \"version\": \"VOSTFR\" }\n    ],\n    \"first_episode_id\": \"one-piece-1-vostfr\"\n  }\n}"
    },
    {
      "method": "GET",
      "path": "/anime/{slug}/servers",
      "title": "Liens de lecture — anime",
      "description": "Serveurs de lecture d'un épisode d'anime. Le slug ET l'episode_id doivent venir du détail de l'anime. Forme équivalente : /anime/{slug}?episode={episode_id}.",
      "params": [
        {
          "name": "slug",
          "type": "string (chemin)",
          "required": true,
          "description": "Identifiant de l'anime, pris dans le champ slug d'une liste ou d'une recherche."
        },
        {
          "name": "episode",
          "type": "string",
          "required": true,
          "description": "episode_id pris dans episodes[] du détail (ex. one-piece-1100-vostfr). Ce n'est PAS un simple numéro."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/anime/one-piece/servers?episode=one-piece-1100-vostfr\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    {\n      \"server_name\": \"Serveur 1\",\n      \"server_link\": \"https://player.example/embed/abc123\",\n      \"server_type\": \"embed\",\n      \"version\": \"VOSTFR\"\n    }\n  ]\n}"
    },
    {
      "method": "GET",
      "path": "/dramas",
      "title": "Lister les K-Dramas",
      "description": "Catalogue des K-Dramas. Même format et mêmes paramètres que /anime.",
      "params": [
        {
          "name": "page",
          "type": "number",
          "required": false,
          "description": "Numéro de page (défaut 1). La réponse contient meta.last_page."
        },
        {
          "name": "genre",
          "type": "string (slug)",
          "required": false,
          "description": "Filtre par genre, ex. action, romance, drama."
        },
        {
          "name": "sort",
          "type": "latest | az",
          "required": false,
          "description": "Tri : latest (défaut) = plus récents, az = ordre alphabétique."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/dramas?page=1\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    {\n      \"title\": \"Exemple\",\n      \"slug\": \"exemple\",\n      \"image\": \"https://flix.syrixvision.com/api/image-proxy?url=...\",\n      \"version\": \"VOSTFR\",\n      \"type\": \"drama\"\n    }\n  ],\n  \"meta\": { \"page\": 1, \"last_page\": 12, \"genre\": null }\n}"
    },
    {
      "method": "GET",
      "path": "/dramas/{slug}",
      "title": "Détail d'un K-Drama + épisodes",
      "description": "Fiche du drama avec la liste des épisodes (episode_id, numéro, version).",
      "params": [
        {
          "name": "slug",
          "type": "string (chemin)",
          "required": true,
          "description": "Identifiant du drama, pris dans le champ slug d'une liste ou d'une recherche."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/dramas/my-drama\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": {\n    \"title\": \"My Drama\",\n    \"slug\": \"my-drama\",\n    \"type\": \"drama\",\n    \"episodes\": [ { \"episode_id\": \"my-drama-1-vostfr\", \"number\": \"1\", \"title\": \"Épisode 1\", \"version\": \"VOSTFR\" } ],\n    \"first_episode_id\": \"my-drama-1-vostfr\"\n  }\n}"
    },
    {
      "method": "GET",
      "path": "/dramas/{slug}/servers",
      "title": "Liens de lecture — K-Drama",
      "description": "Serveurs de lecture d'un épisode de K-Drama. Forme équivalente : /dramas/{slug}?episode={episode_id}.",
      "params": [
        {
          "name": "slug",
          "type": "string (chemin)",
          "required": true,
          "description": "Identifiant du drama, pris dans le champ slug d'une liste ou d'une recherche."
        },
        {
          "name": "episode",
          "type": "string",
          "required": true,
          "description": "episode_id pris dans episodes[] du détail du drama."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/dramas/my-drama/servers?episode=my-drama-1-vostfr\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    {\n      \"server_name\": \"Serveur 1\",\n      \"server_link\": \"https://player.example/embed/abc123\",\n      \"server_type\": \"embed\",\n      \"version\": \"VOSTFR\"\n    }\n  ]\n}"
    },
    {
      "method": "GET",
      "path": "/webtoons",
      "title": "Lister les webtoons",
      "description": "Source héritée (peut être indisponible). Préférez GET /comics?type=webtoon, plus complet et fiable.",
      "params": [
        {
          "name": "page",
          "type": "number",
          "required": false,
          "description": "Numéro de page (défaut 1). La réponse contient meta.last_page."
        },
        {
          "name": "genre",
          "type": "string (slug)",
          "required": false,
          "description": "Filtre par genre, ex. action, romance, drama."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/webtoons\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    {\n      \"title\": \"Exemple\",\n      \"slug\": \"exemple\",\n      \"image\": \"https://flix.syrixvision.com/api/image-proxy?url=...\",\n      \"version\": \"VOSTFR\",\n      \"type\": \"webtoon\"\n    }\n  ],\n  \"meta\": { \"page\": 1, \"last_page\": 12, \"genre\": null }\n}"
    },
    {
      "method": "GET",
      "path": "/webtoons/{slug}",
      "title": "Détail d'un webtoon + chapitres",
      "description": "Fiche du webtoon avec la liste des chapitres. chapters[].chapter_id sert à récupérer les pages.",
      "params": [
        {
          "name": "slug",
          "type": "string (chemin)",
          "required": true,
          "description": "Identifiant du webtoon, pris dans le champ slug d'une liste ou d'une recherche."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/webtoons/my-webtoon\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": {\n    \"title\": \"My Webtoon\",\n    \"slug\": \"my-webtoon\",\n    \"type\": \"webtoon\",\n    \"chapters\": [ { \"chapter_id\": \"12\", \"number\": \"12\", \"title\": \"Chapitre 12\" } ],\n    \"first_chapter_id\": \"1\"\n  }\n}"
    },
    {
      "method": "GET",
      "path": "/webtoons/{slug}/pages",
      "title": "Pages d'un chapitre",
      "description": "Retourne les images (dans l'ordre de lecture) d'un chapitre de webtoon.",
      "params": [
        {
          "name": "slug",
          "type": "string (chemin)",
          "required": true,
          "description": "Identifiant du webtoon, pris dans le champ slug d'une liste ou d'une recherche."
        },
        {
          "name": "chapter",
          "type": "string",
          "required": true,
          "description": "chapter_id pris dans chapters[] du détail."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/webtoons/my-webtoon/pages?chapter=12\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    { \"page\": 1, \"image\": \"https://flix.syrixvision.com/api/image-proxy?url=...\" },\n    { \"page\": 2, \"image\": \"https://flix.syrixvision.com/api/image-proxy?url=...\" }\n  ]\n}"
    },
    {
      "method": "GET",
      "path": "/comics",
      "title": "Manga, manhwa & webtoon — lister / rechercher",
      "description": "Catalogue unifié (source MangaDex). Filtrez par catégorie avec type. Seuls les titres ayant des chapitres lisibles dans la langue demandée sont renvoyés. Gratuit : aucun token débité.",
      "params": [
        {
          "name": "type",
          "type": "manga | manhwa | manhua | webtoon",
          "required": false,
          "description": "manga (Japon), manhwa (Corée), manhua (Chine) ou webtoon (lecture verticale, toutes origines). Absent = tout."
        },
        {
          "name": "q",
          "type": "string",
          "required": false,
          "description": "Recherche texte (2 à 100 caractères)."
        },
        {
          "name": "page",
          "type": "number",
          "required": false,
          "description": "Page ≥ 1 (défaut 1). Voir meta.last_page."
        },
        {
          "name": "per_page",
          "type": "number",
          "required": false,
          "description": "1 à 40 (défaut 20)."
        },
        {
          "name": "lang",
          "type": "string",
          "required": false,
          "description": "Langue des chapitres : fr (défaut), en, es, pt-br, it, de… ou all."
        },
        {
          "name": "sort",
          "type": "popular | latest | new | rating | az | relevance",
          "required": false,
          "description": "popular (défaut), latest = nouveaux chapitres, new = nouveaux titres, rating, az. relevance avec q."
        },
        {
          "name": "genre",
          "type": "string",
          "required": false,
          "description": "Nom de genre exact, voir /comics/genres (ex. Action, Romance)."
        },
        {
          "name": "status",
          "type": "ongoing | completed | hiatus | cancelled",
          "required": false,
          "description": "Statut de publication."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/comics?type=manhwa&lang=fr&sort=popular\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [\n    {\n      \"title\": \"Mon manhwa\",\n      \"slug\": \"11111111-1111-4111-8111-111111111111\",\n      \"url\": \"https://mangadex.org/title/...\",\n      \"image\": \"https://flix.syrixvision.com/api/comic-image?u=...\",\n      \"version\": \"FR\",\n      \"type\": \"manhwa\",\n      \"is_webtoon\": true,\n      \"status\": \"ongoing\",\n      \"year\": 2022,\n      \"genres\": [\"Action\", \"Fantasy\"],\n      \"latest_chapter\": \"120\"\n    }\n  ],\n  \"meta\": { \"page\": 1, \"per_page\": 20, \"total\": 340, \"last_page\": 17, \"source\": \"MangaDex\" }\n}"
    },
    {
      "method": "GET",
      "path": "/comics/home",
      "title": "Manga, manhwa & webtoon — rangées d'accueil",
      "description": "Trois rangées prêtes à afficher pour une page catégorie : popular, latest (nouveaux chapitres), new (nouveaux titres).",
      "params": [
        {
          "name": "type",
          "type": "manga | manhwa | manhua | webtoon",
          "required": false,
          "description": "Catégorie."
        },
        {
          "name": "lang",
          "type": "string",
          "required": false,
          "description": "Langue des chapitres (défaut fr)."
        },
        {
          "name": "per_page",
          "type": "number",
          "required": false,
          "description": "1 à 24 (défaut 12)."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/comics/home?type=webtoon\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": { \"popular\": [ { \"title\": \"...\", \"slug\": \"...\", \"image\": \"...\" } ], \"latest\": [ ], \"new\": [ ] },\n  \"meta\": { \"type\": \"webtoon\", \"lang\": \"fr\", \"source\": \"MangaDex\" }\n}"
    },
    {
      "method": "GET",
      "path": "/comics/{id}",
      "title": "Manga, manhwa & webtoon — détail + chapitres",
      "description": "Fiche complète et liste de TOUS les chapitres lisibles (du premier au dernier, une version par numéro). Si chapters est vide, le titre n'a que des liens officiels ou aucun chapitre dans cette langue : essayez une autre langue (voir available_languages).",
      "params": [
        {
          "name": "id",
          "type": "UUID (chemin)",
          "required": true,
          "description": "Le champ slug d'une liste ou d'une recherche."
        },
        {
          "name": "lang",
          "type": "string",
          "required": false,
          "description": "Langue des chapitres (défaut fr)."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/comics/11111111-1111-4111-8111-111111111111?lang=fr\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": {\n    \"title\": \"Mon manhwa\",\n    \"slug\": \"11111111-1111-4111-8111-111111111111\",\n    \"type\": \"manhwa\",\n    \"is_webtoon\": true,\n    \"synopsis\": \"...\",\n    \"genres\": [\"Action\"],\n    \"authors\": [\"Auteur\"],\n    \"status\": \"ongoing\",\n    \"available_languages\": [\"fr\", \"en\"],\n    \"lang\": \"fr\",\n    \"chapters\": [\n      { \"chapter_id\": \"aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa\", \"number\": \"1\", \"title\": \"Chapitre 1\", \"language\": \"fr\", \"pages\": 35, \"group\": \"Nom du groupe\", \"published_at\": \"2024-05-01T10:00:00+00:00\" }\n    ],\n    \"first_chapter_id\": \"aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa\",\n    \"credits\": { \"source\": \"MangaDex\", \"source_url\": \"https://mangadex.org/title/...\" }\n  }\n}"
    },
    {
      "method": "GET",
      "path": "/comics/{id}/chapters",
      "title": "Manga, manhwa & webtoon — chapitres paginés",
      "description": "Même liste de chapitres que le détail, paginée (utile pour les très longues séries).",
      "params": [
        {
          "name": "id",
          "type": "UUID (chemin)",
          "required": true,
          "description": "Identifiant du titre."
        },
        {
          "name": "lang",
          "type": "string",
          "required": false,
          "description": "Langue (défaut fr)."
        },
        {
          "name": "order",
          "type": "asc | desc",
          "required": false,
          "description": "Ordre (défaut asc = du premier au dernier)."
        },
        {
          "name": "page",
          "type": "number",
          "required": false,
          "description": "Page ≥ 1."
        },
        {
          "name": "per_page",
          "type": "number",
          "required": false,
          "description": "1 à 500 (défaut 100)."
        },
        {
          "name": "dedupe",
          "type": "1 | 0",
          "required": false,
          "description": "1 (défaut) = une seule version par numéro ; 0 = toutes les versions (groupes)."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/comics/11111111-1111-4111-8111-111111111111/chapters?order=desc&per_page=50\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [ { \"chapter_id\": \"...\", \"number\": \"120\", \"title\": \"Chapitre 120\", \"pages\": 40, \"group\": \"Nom du groupe\" } ],\n  \"meta\": { \"page\": 1, \"per_page\": 50, \"total\": 120, \"last_page\": 3, \"first_chapter_id\": \"...\", \"last_chapter_id\": \"...\" }\n}"
    },
    {
      "method": "GET",
      "path": "/comics/chapters/{chapter_id}/pages",
      "title": "Manga, manhwa & webtoon — pages d'un chapitre",
      "description": "Images d'un chapitre, dans l'ordre de lecture. Les URLs sont absolues (https, servies par STREAMIX) et valables quelques minutes : demandez-les à l'ouverture du lecteur, ne les stockez pas.",
      "params": [
        {
          "name": "chapter_id",
          "type": "UUID (chemin)",
          "required": true,
          "description": "chapters[].chapter_id du détail ou de la liste des chapitres."
        },
        {
          "name": "quality",
          "type": "data-saver | data",
          "required": false,
          "description": "data-saver (défaut) = images compressées, rapides sur mobile ; data = qualité originale."
        }
      ],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/comics/chapters/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa/pages?quality=data-saver\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": {\n    \"chapter_id\": \"aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa\",\n    \"manga_title\": \"Mon manhwa\",\n    \"chapter\": \"1\",\n    \"language\": \"fr\",\n    \"group\": { \"id\": \"...\", \"name\": \"Nom du groupe\" },\n    \"quality\": \"data-saver\",\n    \"count\": 35,\n    \"pages\": [ { \"page\": 1, \"image\": \"https://flix.syrixvision.com/api/comic-image?u=...\" } ],\n    \"credits\": { \"source\": \"MangaDex\", \"source_url\": \"https://mangadex.org/chapter/...\", \"scanlation_group\": \"Nom du groupe\" }\n  }\n}"
    },
    {
      "method": "GET",
      "path": "/comics/genres",
      "title": "Manga, manhwa & webtoon — genres",
      "description": "Liste des genres, thèmes et formats. Passez le champ name au paramètre genre de /comics.",
      "params": [],
      "example": "curl \"https://flix.syrixvision.com/api/developer/v1/comics/genres\" \\\n  -H \"X-API-Key: syrix-your-key\"",
      "response": "{\n  \"success\": true,\n  \"data\": [ { \"id\": \"391b0423-d847-456f-aff0-8b0cfc03066b\", \"name\": \"Action\", \"group\": \"genre\" } ]\n}"
    }
  ],
  "errors": [
    {
      "code": "api_key_required",
      "status": 401,
      "description": "Aucune clé fournie. Envoyez X-API-Key ou un Bearer token."
    },
    {
      "code": "invalid_api_key",
      "status": 401,
      "description": "Clé invalide, révoquée ou expirée."
    },
    {
      "code": "insufficient_tokens",
      "status": 402,
      "description": "Solde de tokens insuffisant pour cette requête."
    },
    {
      "code": "rate_limited",
      "status": 429,
      "description": "Trop de requêtes par minute. Ralentissez puis réessayez."
    },
    {
      "code": "not_found",
      "status": 404,
      "description": "Ressource, titre ou épisode introuvable (vérifiez slug et episode_id)."
    },
    {
      "code": "wrong_type",
      "status": 404,
      "description": "Le slug existe mais pas dans cette catégorie (ex. une série demandée via /movies)."
    },
    {
      "code": "missing_episode",
      "status": 400,
      "description": "Le paramètre episode est obligatoire sur /anime/{slug}/servers et /dramas/{slug}/servers."
    },
    {
      "code": "missing_chapter",
      "status": 400,
      "description": "Le paramètre chapter est obligatoire sur /webtoons/{slug}/pages."
    },
    {
      "code": "query_too_short",
      "status": 400,
      "description": "La recherche q doit faire au moins 2 caractères."
    },
    {
      "code": "invalid_id",
      "status": 400,
      "description": "Identifiant invalide : /comics attend un UUID (champ slug / chapter_id)."
    },
    {
      "code": "invalid_type",
      "status": 400,
      "description": "type doit valoir manga, manhwa, manhua ou webtoon."
    },
    {
      "code": "invalid_lang",
      "status": 400,
      "description": "lang invalide (exemples : fr, en, es, pt-br, all)."
    },
    {
      "code": "invalid_status",
      "status": 400,
      "description": "status doit valoir ongoing, completed, hiatus ou cancelled."
    },
    {
      "code": "unknown_genre",
      "status": 400,
      "description": "Genre inconnu : utilisez un name renvoyé par /comics/genres."
    },
    {
      "code": "adult_disabled",
      "status": 403,
      "description": "Le contenu adulte n'est pas disponible via l'API."
    },
    {
      "code": "source_rate_limited",
      "status": 503,
      "description": "La source limite temporairement les requêtes : réessayez dans quelques secondes."
    },
    {
      "code": "no_servers",
      "status": 404,
      "description": "Aucune source de lecture disponible pour l'instant."
    },
    {
      "code": "no_pages",
      "status": 404,
      "description": "Aucune page disponible pour ce chapitre."
    },
    {
      "code": "source_unavailable",
      "status": 502,
      "description": "Le catalogue source est temporairement indisponible. Réessayez dans quelques instants."
    }
  ],
  "troubleshooting": [
    {
      "problem": "not_found sur /anime/{slug}/servers",
      "solution": "Le slug et l'episode_id doivent venir du MÊME détail (/anime/{slug}). L'episode_id d'un anime est un texte (ex. one-piece-1100-vostfr), pas un numéro."
    },
    {
      "problem": "Je ne trouve pas comment lire un film ou une série",
      "solution": "Utilisez /episodes/{episode_id}/servers avec first_episode_id (film) ou episodes[].episode_id (série), tirés de /movies/{slug} ou /series/{slug}."
    },
    {
      "problem": "no_servers",
      "solution": "Aucune source disponible pour cet épisode à cet instant. Réessayez plus tard ou choisissez une autre version (VF / VOSTFR)."
    },
    {
      "problem": "Le lecteur reste noir ou refuse de s'afficher",
      "solution": "Testez les autres serveurs de la liste. Les lecteurs embed doivent être affichés dans un <iframe> (pas téléchargés). Ne mettez pas de sandbox trop strict ; autorisez allow-scripts et allow-same-origin."
    },
    {
      "problem": "Les liens de lecture ne marchent plus après quelques heures",
      "solution": "Les liens sont temporaires : ne les stockez pas, redemandez-les à chaque lecture (cache de 5 minutes maximum)."
    },
    {
      "problem": "401 invalid_api_key",
      "solution": "Clé erronée, révoquée ou expirée. Envoyez-la dans X-API-Key ou Authorization: Bearer. Plusieurs clés invalides depuis la même IP bloquent temporairement l'IP."
    },
    {
      "problem": "402 insufficient_tokens",
      "solution": "Votre solde de tokens est insuffisant. Rechargez-le depuis votre compte."
    },
    {
      "problem": "429 rate_limited",
      "solution": "Vous dépassez la limite par minute de votre plan (120/min par défaut). Ajoutez un délai ou un cache entre vos appels."
    },
    {
      "problem": "Mes appels échouent depuis le navigateur (CORS) ou ma clé fuit",
      "solution": "N'appelez jamais l'API depuis le navigateur : créez un petit backend (Node, Python…) qui détient la clé et expose vos propres routes à votre frontend."
    },
    {
      "problem": "/comics/{id} renvoie chapters vide",
      "solution": "Beaucoup de séries très populaires sont licenciées : seuls des liens officiels existent, aucun chapitre lisible. Regardez available_languages et réessayez avec lang=en (ou une autre langue), ou choisissez un autre titre."
    },
    {
      "problem": "Les images manga ne s'affichent pas",
      "solution": "Utilisez directement les URLs image renvoyées (https, domaine STREAMIX). N'essayez pas d'appeler MangaDex vous-même : il bloque le hotlink. Les URLs de pages expirent après quelques minutes : redemandez /pages à l'ouverture du chapitre."
    },
    {
      "problem": "Obligations pour utiliser les données manga",
      "solution": "Affichez « Source : MangaDex » et le nom du groupe de scan (data.group / credits). Pas de publicité ni de service payant autour de ces données, et retirez un titre si un groupe le demande."
    },
    {
      "problem": "Le sport (scores, matchs en direct) est-il disponible avec une clé ?",
      "solution": "Non : les scores ESPN sont limités à un usage non commercial et les flux sont gratuits/publics, donc ils restent réservés au site STREAMIX (page Sport). Les clés couvrent films, séries, animes, K-Dramas, manga, manhwa et webtoons."
    },
    {
      "problem": "Où est le contenu 18+ ?",
      "solution": "Il n'est pas disponible via les clés développeur (vérification d'âge obligatoire). Il reste réservé au site, après contrôle d'âge."
    }
  ],
  "examples": {
    "javascript": "// syrix-client.js — client minimal (Node 18+). La clé reste côté serveur.\nconst BASE = \"https://flix.syrixvision.com/api/developer/v1\";\n\nexport class SyrixClient {\n  constructor(apiKey) { this.apiKey = apiKey; }\n\n  async get(path, params = {}) {\n    const url = new URL(BASE + path);\n    for (const [k, v] of Object.entries(params)) if (v != null) url.searchParams.set(k, v);\n    const res = await fetch(url, { headers: { \"X-API-Key\": this.apiKey } });\n    const body = await res.json();\n    if (!body.success) throw new Error(body.error.code + \": \" + body.error.message);\n    return body;\n  }\n\n  search(q)                 { return this.get(\"/search\", { q }).then((b) => b.data); }\n  list(type, page = 1)      { return this.get(\"/\" + type, { page }); }          // movies | series | anime | dramas | webtoons\n  detail(type, slug)        { return this.get(\"/\" + type + \"/\" + slug).then((b) => b.data); }\n\n  // Liens de lecture quel que soit le type de contenu\n  async servers(type, slug, episodeId) {\n    if (type === \"movies\" || type === \"series\") return (await this.get(\"/episodes/\" + episodeId + \"/servers\")).data;\n    return (await this.get(\"/\" + type + \"/\" + slug + \"/servers\", { episode: episodeId })).data;\n  }\n\n  // Manga / manhwa / webtoon (gratuit). type = manga | manhwa | manhua | webtoon\n  comics(params = {})       { return this.get(\"/comics\", params); }\n  comic(id, lang = \"fr\")    { return this.get(\"/comics/\" + id, { lang }).then((b) => b.data); }          // détail + chapters[]\n  comicPages(chapterId, quality = \"data-saver\") { return this.get(\"/comics/chapters/\" + chapterId + \"/pages\", { quality }).then((b) => b.data); }\n\n  // Raccourci : cherche un titre et renvoie le premier lien de lecture\n  async watch(query) {\n    const [hit] = (await this.search(query)).filter((r) => r.type !== \"webtoon\");\n    if (!hit) throw new Error(\"Aucun résultat\");\n    const type = { movie: \"movies\", series: \"series\", anime: \"anime\", drama: \"dramas\" }[hit.type];\n    const d = await this.detail(type, hit.slug);\n    const episodeId = d.episodes?.[0]?.episode_id ?? d.first_episode_id;\n    const servers = await this.servers(type, hit.slug, episodeId);\n    return { title: d.title, episodeId, servers };\n  }\n}\n\n// Utilisation\n// const syrix = new SyrixClient(process.env.SYRIX_KEY);\n// const { servers } = await syrix.watch(\"one piece\");\n// const { data } = await syrix.comics({ type: \"manhwa\", lang: \"fr\" });           // lister\n// const title = await syrix.comic(data[0].slug);                                  // fiche + chapitres\n// const reader = await syrix.comicPages(title.chapters[0].chapter_id);            // pages -> <img src=page.image>\n// console.log(servers[0].server_link, servers[0].server_type);",
    "python": "# syrix_client.py — client minimal (requests)\nimport os, requests\n\nBASE = \"https://flix.syrixvision.com/api/developer/v1\"\nTYPES = {\"movie\": \"movies\", \"series\": \"series\", \"anime\": \"anime\", \"drama\": \"dramas\"}\n\nclass Syrix:\n    def __init__(self, key=None):\n        self.key = key or os.environ[\"SYRIX_KEY\"]\n\n    def get(self, path, **params):\n        r = requests.get(BASE + path, params=params, headers={\"X-API-Key\": self.key}, timeout=15)\n        body = r.json()\n        if not body[\"success\"]:\n            raise RuntimeError(f'{body[\"error\"][\"code\"]}: {body[\"error\"][\"message\"]}')\n        return body\n\n    def search(self, q):\n        return self.get(\"/search\", q=q)[\"data\"]\n\n    def detail(self, type_, slug):\n        return self.get(f\"/{type_}/{slug}\")[\"data\"]\n\n    def servers(self, type_, slug, episode_id):\n        if type_ in (\"movies\", \"series\"):\n            return self.get(f\"/episodes/{episode_id}/servers\")[\"data\"]\n        return self.get(f\"/{type_}/{slug}/servers\", episode=episode_id)[\"data\"]\n\n    def comics(self, **params):               # type = manga | manhwa | manhua | webtoon\n        return self.get(\"/comics\", **params)\n\n    def comic(self, id_, lang=\"fr\"):          # détail + chapters[]\n        return self.get(f\"/comics/{id_}\", lang=lang)[\"data\"]\n\n    def comic_pages(self, chapter_id, quality=\"data-saver\"):\n        return self.get(f\"/comics/chapters/{chapter_id}/pages\", quality=quality)[\"data\"]\n\n# Utilisation\n# s = Syrix()\n# hit = next(r for r in s.search(\"one piece\") if r[\"type\"] == \"anime\")\n# d = s.detail(\"anime\", hit[\"slug\"])\n# print(s.servers(\"anime\", hit[\"slug\"], d[\"episodes\"][0][\"episode_id\"]))",
    "html": "<!-- Lecture d'un serveur renvoyé par l'API -->\n<!-- server_type = \"embed\" -->\n<iframe src=\"SERVER_LINK\" allow=\"autoplay; fullscreen\" allowfullscreen\n        referrerpolicy=\"no-referrer\" style=\"width:100%;aspect-ratio:16/9;border:0\"></iframe>\n\n<!-- server_type = \"direct\" (.mp4) -->\n<video src=\"SERVER_LINK\" controls playsinline style=\"width:100%\"></video>\n\n<!-- server_type = \"direct\" (.m3u8) -->\n<video id=\"v\" controls playsinline style=\"width:100%\"></video>\n<script src=\"https://cdn.jsdelivr.net/npm/hls.js@1\"></script>\n<script>\n  const v = document.getElementById(\"v\"), src = \"SERVER_LINK\";\n  if (v.canPlayType(\"application/vnd.apple.mpegurl\")) v.src = src;\n  else if (Hls.isSupported()) { const h = new Hls(); h.loadSource(src); h.attachMedia(v); }\n</script>"
  }
}