v1.7.0: Rebrand AniKatoAPI → AniKotoAPI

BREAKING: Complete project rebrand across 66 files
- AniKatoAPI → AniKotoAPI (project name)
- AniKato → AniKoto (brand references)
- anikato.vercel.app → anikoto.vercel.app (URLs)
- anikototv.to preserved (source website domain)
- Updated: README, package.json, server.js, all controllers,
  extractors, configs, routes, public pages, legal docs
This commit is contained in:
Sʜɪɴᴇɪ Nᴏᴜᴢᴇɴ
2026-06-08 19:41:00 +05:30
parent 6f75bab281
commit b1eb899aa9
66 changed files with 284 additions and 274 deletions
+36 -36
View File
@@ -3,10 +3,10 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AniKatoAPI — Free Anime Data API</title>
<title>AniKotoAPI — Free Anime Data API</title>
<meta name="description" content="Free REST API for anime data. Browse, search, stream episodes. No API key required. Built with Node.js, Express, Cheerio." />
<meta name="keywords" content="anime api, free api, rest api, anime data, streaming, episode servers, nodejs, express" />
<meta property="og:title" content="AniKatoAPI — Free Anime Data API" />
<meta property="og:title" content="AniKotoAPI — Free Anime Data API" />
<meta property="og:description" content="Free REST API for anime data. Browse, search, stream episodes. No API key required." />
<meta property="og:image" content="/og-image.svg" />
<meta property="og:type" content="website" />
@@ -254,14 +254,14 @@
<div class="header-inner">
<a href="/" class="logo">
<svg viewBox="0 0 32 32" fill="none"><circle cx="16" cy="16" r="14" stroke="url(#g1)" stroke-width="2"/><path d="M10 20c0-4 3-7 6-7s6 3 6 7" stroke="url(#g1)" stroke-width="2" stroke-linecap="round"/><circle cx="12" cy="12" r="2" fill="var(--purple)"/><circle cx="20" cy="12" r="2" fill="var(--pink)"/><defs><linearGradient id="g1" x1="0" y1="0" x2="32" y2="32"><stop stop-color="var(--purple)"/><stop offset="1" stop-color="var(--pink)"/></linearGradient></defs></svg>
<span class="logo-text"><span>AniKato</span>API</span>
<span class="logo-text"><span>AniKoto</span>API</span>
</a>
<nav>
<a href="#features">Features</a>
<a href="#endpoints">Endpoints</a>
<a href="#playground">Playground</a>
<a href="https://github.com/Shineii86/AniKatoAPI" target="_blank">GitHub</a>
<a href="https://anikato.vercel.app/api" target="_blank" class="nav-cta">Open API</a>
<a href="https://github.com/Shineii86/AniKotoAPI" target="_blank">GitHub</a>
<a href="https://anikoto.vercel.app/api" target="_blank" class="nav-cta">Open API</a>
</nav>
</div>
</header>
@@ -270,13 +270,13 @@
<section class="hero container">
<div class="hero-badge"><span class="dot"></span> Free &middot; No API key &middot; Open source</div>
<h1>The <span class="grad">Anime Data</span> API<br/>for Your Next Project</h1>
<p class="hero-sub">Browse, search, and stream anime data from AniKato. Real-time scraping with 24+ endpoints, in-memory caching, and zero configuration.</p>
<p class="hero-sub">Browse, search, and stream anime data from AniKoto. Real-time scraping with 24+ endpoints, in-memory caching, and zero configuration.</p>
<div class="hero-actions">
<a href="#playground" class="btn btn-primary">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="5 3 19 12 5 21 5 3"/></svg>
Try It Live
</a>
<a href="https://github.com/Shineii86/AniKatoAPI" target="_blank" class="btn btn-ghost">
<a href="https://github.com/Shineii86/AniKotoAPI" target="_blank" class="btn btn-ghost">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>
Star on GitHub
</a>
@@ -286,11 +286,11 @@
<div class="console" id="heroConsole">
<div class="console-bar">
<span class="console-dot"></span><span class="console-dot"></span><span class="console-dot"></span>
<span class="console-title">anikato.vercel.app — API Console</span>
<span class="console-title">anikoto.vercel.app — API Console</span>
</div>
<div class="console-body">
<textarea class="console-input" id="consoleInput" rows="6" spellcheck="false">// Fetch trending anime
fetch("https://anikato.vercel.app/api")
fetch("https://anikoto.vercel.app/api")
.then(r => r.json())
.then(data => {
console.log(data.trending);
@@ -408,7 +408,7 @@ fetch("https://anikato.vercel.app/api")
API Reference
</div>
<h2 class="section-title">Endpoints</h2>
<p class="section-desc">All endpoints return JSON. Base URL: <code style="color:var(--pink);background:rgba(236,72,153,.1);padding:2px 8px;border-radius:4px">https://anikato.vercel.app/api</code></p>
<p class="section-desc">All endpoints return JSON. Base URL: <code style="color:var(--pink);background:rgba(236,72,153,.1);padding:2px 8px;border-radius:4px">https://anikoto.vercel.app/api</code></p>
</div>
<div class="explorer reveal" id="explorer">
@@ -494,14 +494,14 @@ fetch("https://anikato.vercel.app/api")
<section class="cta">
<div class="container">
<div class="cta-box reveal">
<h2 class="cta-title">Start building with AniKatoAPI</h2>
<h2 class="cta-title">Start building with AniKotoAPI</h2>
<p class="cta-desc">Free, open source, no API key required. Deploy your own instance or use ours.</p>
<div class="cta-actions">
<a href="https://anikato.vercel.app/api" target="_blank" class="btn btn-primary">
<a href="https://anikoto.vercel.app/api" target="_blank" class="btn btn-primary">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="width:16px;height:16px"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>
View API
</a>
<a href="https://github.com/Shineii86/AniKatoAPI" target="_blank" class="btn btn-ghost">
<a href="https://github.com/Shineii86/AniKotoAPI" target="_blank" class="btn btn-ghost">
<svg viewBox="0 0 24 24" fill="currentColor" style="width:16px;height:16px"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>
Source Code
</a>
@@ -517,9 +517,9 @@ fetch("https://anikato.vercel.app/api")
<div class="footer-brand">
<a href="/" class="logo">
<svg viewBox="0 0 32 32" fill="none" width="24" height="24"><circle cx="16" cy="16" r="14" stroke="url(#g2)" stroke-width="2"/><path d="M10 20c0-4 3-7 6-7s6 3 6 7" stroke="url(#g2)" stroke-width="2" stroke-linecap="round"/><circle cx="12" cy="12" r="2" fill="var(--purple)"/><circle cx="20" cy="12" r="2" fill="var(--pink)"/><defs><linearGradient id="g2" x1="0" y1="0" x2="32" y2="32"><stop stop-color="var(--purple)"/><stop offset="1" stop-color="var(--pink)"/></linearGradient></defs></svg>
<span class="logo-text"><span>AniKato</span>API</span>
<span class="logo-text"><span>AniKoto</span>API</span>
</a>
<p>Free REST API for anime data. Browse, search, and stream from AniKato. Built with Node.js and deployed on Vercel.</p>
<p>Free REST API for anime data. Browse, search, and stream from AniKoto. Built with Node.js and deployed on Vercel.</p>
</div>
<div class="footer-col">
<h4>API</h4>
@@ -531,9 +531,9 @@ fetch("https://anikato.vercel.app/api")
</div>
<div class="footer-col">
<h4>Resources</h4>
<a href="https://github.com/Shineii86/AniKatoAPI" target="_blank">GitHub</a>
<a href="https://github.com/Shineii86/AniKatoAPI#readme" target="_blank">Documentation</a>
<a href="https://github.com/Shineii86/AniKatoAPI/blob/main/CHANGELOG.md" target="_blank">Changelog</a>
<a href="https://github.com/Shineii86/AniKotoAPI" target="_blank">GitHub</a>
<a href="https://github.com/Shineii86/AniKotoAPI#readme" target="_blank">Documentation</a>
<a href="https://github.com/Shineii86/AniKotoAPI/blob/main/CHANGELOG.md" target="_blank">Changelog</a>
<a href="/api" target="_blank">API Status</a>
</div>
<div class="footer-col">
@@ -543,9 +543,9 @@ fetch("https://anikato.vercel.app/api")
</div>
</div>
<div class="footer-bottom">
<span>&copy; 2026 AniKatoAPI. Educational use only.</span>
<span>&copy; 2026 AniKotoAPI. Educational use only.</span>
<div class="footer-social">
<a href="https://github.com/Shineii86/AniKatoAPI" target="_blank" aria-label="GitHub">
<a href="https://github.com/Shineii86/AniKotoAPI" target="_blank" aria-label="GitHub">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>
</a>
</div>
@@ -624,7 +624,7 @@ fetch("https://anikato.vercel.app/api")
});
/* ── Console ── */
const BASE = 'https://anikato.vercel.app/api';
const BASE = 'https://anikoto.vercel.app/api';
const endpoints = {
home: { url: '/api', label: 'Home' },
search: { url: '/api/search?keyword=naruto', label: 'Search' },
@@ -663,21 +663,21 @@ fetch("https://anikato.vercel.app/api")
/* ── Explorer ── */
const explorerData = [
{ id: 'home', title: 'Home Info', desc: 'Spotlight, trending, popular, top-airing, genres, and more.', path: '/api', params: [], code: { curl: 'curl https://anikato.vercel.app/api', js: 'const res = await fetch("https://anikato.vercel.app/api");\nconst data = await res.json();\nconsole.log(data.trending);', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api")\nprint(r.json()["trending"])' } },
{ id: 'search', title: 'Search', desc: 'Search anime by keyword with pagination.', path: '/api/search?keyword={q}&page={n}', params: [{ name: 'keyword', type: 'string', desc: 'Search query' }, { name: 'page', type: 'number', desc: 'Page (default 1)' }], code: { curl: 'curl "https://anikato.vercel.app/api/search?keyword=naruto"', js: 'const res = await fetch("https://anikato.vercel.app/api/search?keyword=naruto");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/search", params={"keyword": "naruto"})\nprint(r.json())' } },
{ id: 'suggest', title: 'Search Suggest', desc: 'Autocomplete suggestions for search.', path: '/api/search/suggest?keyword={q}', params: [{ name: 'keyword', type: 'string', desc: 'Partial query' }], code: { curl: 'curl "https://anikato.vercel.app/api/search/suggest?keyword=dea"', js: 'const res = await fetch("https://anikato.vercel.app/api/search/suggest?keyword=dea");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/search/suggest", params={"keyword": "dea"})\nprint(r.json())' } },
{ id: 'info', title: 'Anime Info', desc: 'Detailed info: synopsis, genres, relations, recommendations.', path: '/api/info?id={slug}', params: [{ name: 'id', type: 'string', desc: 'Anime slug' }], code: { curl: 'curl "https://anikato.vercel.app/api/info?id=naruto"', js: 'const res = await fetch("https://anikato.vercel.app/api/info?id=naruto");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/info", params={"id": "naruto"})\nprint(r.json())' } },
{ id: 'episodes', title: 'Episodes', desc: 'Episode list loaded via AJAX.', path: '/api/episodes/{slug}', params: [{ name: 'slug', type: 'string', desc: 'Anime slug' }], code: { curl: 'curl "https://anikato.vercel.app/api/episodes/naruto"', js: 'const res = await fetch("https://anikato.vercel.app/api/episodes/naruto");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/episodes/naruto")\nprint(r.json())' } },
{ id: 'stream', title: 'Stream Servers', desc: 'Streaming servers for an episode.', path: '/api/stream?id={episodeId}', params: [{ name: 'id', type: 'string', desc: 'Episode ID' }], code: { curl: 'curl "https://anikato.vercel.app/api/stream?id=naruto-ep-1"', js: 'const res = await fetch("https://anikato.vercel.app/api/stream?id=naruto-ep-1");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/stream", params={"id": "naruto-ep-1"})\nprint(r.json())' } },
{ id: 'servers', title: 'Servers', desc: 'Resolve streaming server links.', path: '/api/servers?ids={ids}', params: [{ name: 'ids', type: 'string', desc: 'Comma-separated link IDs' }], code: { curl: 'curl "https://anikato.vercel.app/api/servers?ids=123,456"', js: 'const res = await fetch("https://anikato.vercel.app/api/servers?ids=123,456");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/servers", params={"ids": "123,456"})\nprint(r.json())' } },
{ id: 'schedule', title: 'Schedule', desc: 'Anime schedule for a specific date.', path: '/api/schedule?date={YYYY-MM-DD}', params: [{ name: 'date', type: 'string', desc: 'Date (default today)' }], code: { curl: 'curl "https://anikato.vercel.app/api/schedule"', js: 'const res = await fetch("https://anikato.vercel.app/api/schedule");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/schedule")\nprint(r.json())' } },
{ id: 'topten', title: 'Top 10', desc: 'Top 10 anime (today, week, month).', path: '/api/top-ten', params: [], code: { curl: 'curl "https://anikato.vercel.app/api/top-ten"', js: 'const res = await fetch("https://anikato.vercel.app/api/top-ten");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/top-ten")\nprint(r.json())' } },
{ id: 'random', title: 'Random', desc: 'Random anime info.', path: '/api/random', params: [], code: { curl: 'curl "https://anikato.vercel.app/api/random"', js: 'const res = await fetch("https://anikato.vercel.app/api/random");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/random")\nprint(r.json())' } },
{ id: 'filter', title: 'Filter', desc: 'Filter by genre, type, status, season.', path: '/api/filter?keyword={q}&genre[]={g}', params: [{ name: 'keyword', type: 'string', desc: 'Search keyword (required)' }, { name: 'genre[]', type: 'number', desc: 'Genre IDs' }, { name: 'type[]', type: 'number', desc: 'Type IDs' }], code: { curl: 'curl "https://anikato.vercel.app/api/filter?keyword=&genre[]=1&genre[]=4"', js: 'const res = await fetch("https://anikato.vercel.app/api/filter?keyword=&genre[]=1");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/filter", params={"keyword": "", "genre[]": 1})\nprint(r.json())' } },
{ id: 'popular', title: 'Most Popular', desc: 'Most popular anime list.', path: '/api/most-popular?page={n}', params: [{ name: 'page', type: 'number', desc: 'Page (default 1)' }], code: { curl: 'curl "https://anikato.vercel.app/api/most-popular"', js: 'const res = await fetch("https://anikato.vercel.app/api/most-popular");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/most-popular")\nprint(r.json())' } },
{ id: 'genre', title: 'Genre', desc: 'Anime by genre.', path: '/api/genre/{name}', params: [{ name: 'name', type: 'string', desc: 'Genre slug (action, comedy, etc.)' }], code: { curl: 'curl "https://anikato.vercel.app/api/genre/action"', js: 'const res = await fetch("https://anikato.vercel.app/api/genre/action");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/genre/action")\nprint(r.json())' } },
{ id: 'type', title: 'Type', desc: 'Anime by type.', path: '/api/type/{name}', params: [{ name: 'name', type: 'string', desc: 'Type (tv, movie, ova, etc.)' }], code: { curl: 'curl "https://anikato.vercel.app/api/type/tv"', js: 'const res = await fetch("https://anikato.vercel.app/api/type/tv");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/type/tv")\nprint(r.json())' } },
{ id: 'status', title: 'Status', desc: 'Anime by status.', path: '/api/status/{name}', params: [{ name: 'name', type: 'string', desc: 'Status (currently-airing, finished-airing)' }], code: { curl: 'curl "https://anikato.vercel.app/api/status/currently-airing"', js: 'const res = await fetch("https://anikato.vercel.app/api/status/currently-airing");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikato.vercel.app/api/status/currently-airing")\nprint(r.json())' } },
{ id: 'home', title: 'Home Info', desc: 'Spotlight, trending, popular, top-airing, genres, and more.', path: '/api', params: [], code: { curl: 'curl https://anikoto.vercel.app/api', js: 'const res = await fetch("https://anikoto.vercel.app/api");\nconst data = await res.json();\nconsole.log(data.trending);', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api")\nprint(r.json()["trending"])' } },
{ id: 'search', title: 'Search', desc: 'Search anime by keyword with pagination.', path: '/api/search?keyword={q}&page={n}', params: [{ name: 'keyword', type: 'string', desc: 'Search query' }, { name: 'page', type: 'number', desc: 'Page (default 1)' }], code: { curl: 'curl "https://anikoto.vercel.app/api/search?keyword=naruto"', js: 'const res = await fetch("https://anikoto.vercel.app/api/search?keyword=naruto");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/search", params={"keyword": "naruto"})\nprint(r.json())' } },
{ id: 'suggest', title: 'Search Suggest', desc: 'Autocomplete suggestions for search.', path: '/api/search/suggest?keyword={q}', params: [{ name: 'keyword', type: 'string', desc: 'Partial query' }], code: { curl: 'curl "https://anikoto.vercel.app/api/search/suggest?keyword=dea"', js: 'const res = await fetch("https://anikoto.vercel.app/api/search/suggest?keyword=dea");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/search/suggest", params={"keyword": "dea"})\nprint(r.json())' } },
{ id: 'info', title: 'Anime Info', desc: 'Detailed info: synopsis, genres, relations, recommendations.', path: '/api/info?id={slug}', params: [{ name: 'id', type: 'string', desc: 'Anime slug' }], code: { curl: 'curl "https://anikoto.vercel.app/api/info?id=naruto"', js: 'const res = await fetch("https://anikoto.vercel.app/api/info?id=naruto");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/info", params={"id": "naruto"})\nprint(r.json())' } },
{ id: 'episodes', title: 'Episodes', desc: 'Episode list loaded via AJAX.', path: '/api/episodes/{slug}', params: [{ name: 'slug', type: 'string', desc: 'Anime slug' }], code: { curl: 'curl "https://anikoto.vercel.app/api/episodes/naruto"', js: 'const res = await fetch("https://anikoto.vercel.app/api/episodes/naruto");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/episodes/naruto")\nprint(r.json())' } },
{ id: 'stream', title: 'Stream Servers', desc: 'Streaming servers for an episode.', path: '/api/stream?id={episodeId}', params: [{ name: 'id', type: 'string', desc: 'Episode ID' }], code: { curl: 'curl "https://anikoto.vercel.app/api/stream?id=naruto-ep-1"', js: 'const res = await fetch("https://anikoto.vercel.app/api/stream?id=naruto-ep-1");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/stream", params={"id": "naruto-ep-1"})\nprint(r.json())' } },
{ id: 'servers', title: 'Servers', desc: 'Resolve streaming server links.', path: '/api/servers?ids={ids}', params: [{ name: 'ids', type: 'string', desc: 'Comma-separated link IDs' }], code: { curl: 'curl "https://anikoto.vercel.app/api/servers?ids=123,456"', js: 'const res = await fetch("https://anikoto.vercel.app/api/servers?ids=123,456");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/servers", params={"ids": "123,456"})\nprint(r.json())' } },
{ id: 'schedule', title: 'Schedule', desc: 'Anime schedule for a specific date.', path: '/api/schedule?date={YYYY-MM-DD}', params: [{ name: 'date', type: 'string', desc: 'Date (default today)' }], code: { curl: 'curl "https://anikoto.vercel.app/api/schedule"', js: 'const res = await fetch("https://anikoto.vercel.app/api/schedule");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/schedule")\nprint(r.json())' } },
{ id: 'topten', title: 'Top 10', desc: 'Top 10 anime (today, week, month).', path: '/api/top-ten', params: [], code: { curl: 'curl "https://anikoto.vercel.app/api/top-ten"', js: 'const res = await fetch("https://anikoto.vercel.app/api/top-ten");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/top-ten")\nprint(r.json())' } },
{ id: 'random', title: 'Random', desc: 'Random anime info.', path: '/api/random', params: [], code: { curl: 'curl "https://anikoto.vercel.app/api/random"', js: 'const res = await fetch("https://anikoto.vercel.app/api/random");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/random")\nprint(r.json())' } },
{ id: 'filter', title: 'Filter', desc: 'Filter by genre, type, status, season.', path: '/api/filter?keyword={q}&genre[]={g}', params: [{ name: 'keyword', type: 'string', desc: 'Search keyword (required)' }, { name: 'genre[]', type: 'number', desc: 'Genre IDs' }, { name: 'type[]', type: 'number', desc: 'Type IDs' }], code: { curl: 'curl "https://anikoto.vercel.app/api/filter?keyword=&genre[]=1&genre[]=4"', js: 'const res = await fetch("https://anikoto.vercel.app/api/filter?keyword=&genre[]=1");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/filter", params={"keyword": "", "genre[]": 1})\nprint(r.json())' } },
{ id: 'popular', title: 'Most Popular', desc: 'Most popular anime list.', path: '/api/most-popular?page={n}', params: [{ name: 'page', type: 'number', desc: 'Page (default 1)' }], code: { curl: 'curl "https://anikoto.vercel.app/api/most-popular"', js: 'const res = await fetch("https://anikoto.vercel.app/api/most-popular");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/most-popular")\nprint(r.json())' } },
{ id: 'genre', title: 'Genre', desc: 'Anime by genre.', path: '/api/genre/{name}', params: [{ name: 'name', type: 'string', desc: 'Genre slug (action, comedy, etc.)' }], code: { curl: 'curl "https://anikoto.vercel.app/api/genre/action"', js: 'const res = await fetch("https://anikoto.vercel.app/api/genre/action");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/genre/action")\nprint(r.json())' } },
{ id: 'type', title: 'Type', desc: 'Anime by type.', path: '/api/type/{name}', params: [{ name: 'name', type: 'string', desc: 'Type (tv, movie, ova, etc.)' }], code: { curl: 'curl "https://anikoto.vercel.app/api/type/tv"', js: 'const res = await fetch("https://anikoto.vercel.app/api/type/tv");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/type/tv")\nprint(r.json())' } },
{ id: 'status', title: 'Status', desc: 'Anime by status.', path: '/api/status/{name}', params: [{ name: 'name', type: 'string', desc: 'Status (currently-airing, finished-airing)' }], code: { curl: 'curl "https://anikoto.vercel.app/api/status/currently-airing"', js: 'const res = await fetch("https://anikoto.vercel.app/api/status/currently-airing");\nconst data = await res.json();', python: 'import requests\nr = requests.get("https://anikoto.vercel.app/api/status/currently-airing")\nprint(r.json())' } },
];
const navEl = document.getElementById('explorerNav');
const panelEl = document.getElementById('explorerPanel');