diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9592859..88182f9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,52 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [1.9.0] - 2026-06-09
+
+### Fixed
+- **CRITICAL**: Added global Express error handler (returns JSON instead of HTML)
+- **CRITICAL**: Removed caching from random endpoint (defeated purpose)
+- **CRITICAL**: Renamed share.jpg to share.png (MIME type mismatch)
+- **CRITICAL**: Fixed OG image dimensions (630 → 601)
+- **CRITICAL**: Fixed manifest.json icon sizes (192x192 → 512x512)
+- **CRITICAL**: Fixed implicit global event variable in console
+- **CRITICAL**: Added 9 missing endpoints to docs/endpoints.md
+- Imported version from package.json (no hardcoded drift)
+- Added dynamic endpoint count in stats
+- Added input sanitization for mapper API (SSRF prevention)
+- Added homepage caching (reduced 5 duplicate HTTP requests)
+- Added rate limiting (100 requests/minute per IP)
+- Added rel="noopener noreferrer" to all target="_blank" links
+- Fixed trailing slash inconsistency in console
+- Added noindex meta to 404.html
+- Fixed docs/architecture.md controller filenames and dependency versions
+- Fixed README.md dependency versions
+- Added 12 missing endpoint tests
+- Added escapeHtml helper for error messages
+- Consistent favicon across all pages
+- Added meta descriptions to privacy.html and tos.html
+- Added OG/Twitter meta tags to privacy.html and tos.html
+- Added aria-label to playground inputs
+- Added aria-hidden to decorative SVGs
+- Synced Twitter description with OG description
+- Fixed robots.txt to disallow /api
+- Added PWA fields to manifest.json
+- Removed 5 unused imports
+- Removed unused cookie-parser dependency
+- Fixed inconsistent error handling in extractors
+- Fixed resolvedSlug returning numeric ID
+- Added /watch endpoint to streaming docs
+- Improved test assertions and status code validation
+- Deleted orphaned og-image.svg and logo.png
+- Removed redundant try/catch from extractPages
+- Added max size eviction to cache
+- Added cache key sorting in filter controller
+- Added author meta tag
+- Fixed favicon.svg font
+
+### Changed
+- Version bumped to 1.9.0
+
## [1.8.0] - 2026-06-08
### Fixed
diff --git a/README.md b/README.md
index 107a4de..04c7da9 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@
-
+
@@ -225,11 +225,11 @@ flowchart TD
| Technology | Purpose | Version | Documentation |
|:---|:---|:---|:---|
| 🟢 [Node.js](https://nodejs.org/) | JavaScript runtime | >= 20 | [Docs](https://nodejs.org/docs/) |
-| ⚡ [Express](https://expressjs.com/) | HTTP server framework | 5.2 | [Docs](https://expressjs.com/en/5x/api.html) |
+| ⚡ [Express | 4.21 | [Docs](https://expressjs.com/en/5x/api.html) |
| ▲ [Vercel Functions](https://vercel.com/docs/functions) | Serverless deployment | — | [Docs](https://vercel.com/docs/functions) |
| 🔍 [Cheerio](https://cheerio.js.org/) | HTML parsing & scraping | 1.0 | [Docs](https://cheerio.js.org/docs/) |
-| 🌐 [Axios](https://axios-http.com/) | HTTP client | 1.11 | [Docs](https://axios-http.com/docs/intro) |
-| 🔧 [dotenv](https://github.com/motdotla/dotenv) | Environment variables | 17.2 | [Docs](https://github.com/motdotla/dotenv) |
+| 🌐 [Axios | 1.8 | [Docs](https://axios-http.com/docs/intro) |
+| 🔧 [dotenv | 16.4 | [Docs](https://github.com/motdotla/dotenv) |
| 🔒 [cors](https://github.com/expressjs/cors) | CORS middleware | 2.8 | [Docs](https://github.com/expressjs/cors) |
| 🍪 [cookie-parser](https://github.com/expressjs/cookie-parser) | Cookie parsing | 1.4 | [Docs](https://github.com/expressjs/cookie-parser) |
@@ -238,10 +238,10 @@ flowchart TD
```json
{
"express": "^5.2.0", // HTTP server
- "axios": "^1.11.0", // HTTP client for scraping
+ "axios": "^1.8.0", // HTTP client for scraping
"cheerio": "^1.0.0-rc.12", // HTML parsing
"cors": "^2.8.5", // CORS middleware
- "dotenv": "^17.2.0", // Environment variables
+ "dotenv | 16.4.0", // Environment variables
"cookie-parser": "^1.4.7" // Cookie parsing
}
```
diff --git a/docs/architecture.md b/docs/architecture.md
index 7dcd6a6..fbecf7d 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -37,23 +37,23 @@ AniKotoAPI/
│ │ └── category.route.js # genre/:name, type/:name, status/:name
│ │
│ ├── controllers/
-│ │ ├── home.controller.js # Homepage data
+│ │ ├── homeInfo.controller.js # Homepage data
│ │ ├── search.controller.js # Anime search
-│ │ ├── info.controller.js # Anime info
-│ │ ├── episodes.controller.js # Episode list
+│ │ ├── animeInfo.controller.js # Anime info
+│ │ ├── episodeList.controller.js # Episode list
│ │ ├── servers.controller.js # Server list
│ │ ├── stream.controller.js # Stream URL
│ │ ├── suggestion.controller.js # Anime suggestions
│ │ ├── spotlight.controller.js # Spotlight anime
│ │ ├── trending.controller.js # Trending anime
-│ │ ├── topTen.controller.js # Top 10
+│ │ ├── topten.controller.js # Top 10
│ │ ├── schedule.controller.js # Schedule
│ │ ├── random.controller.js # Random anime
│ │ ├── newRelease.controller.js # New releases
-│ │ ├── mostPopular.controller.js # Most popular
-│ │ ├── genre.controller.js # Genre filter
-│ │ ├── type.controller.js # Type filter
-│ │ ├── status.controller.js # Status filter
+│ │ ├── popular.controller.js # Most popular
+│ │ ├── category.controller.js # Genre filter
+│ │ ├── category.controller.js # Type filter
+│ │ ├── category.controller.js # Status filter
│ │ └── filter.controller.js # Advanced filter
│ │
│ ├── extractors/
@@ -204,9 +204,9 @@ Error responses:
| Package | Version | Purpose |
|---------|---------|---------|
-| express | ^4.18.2 | Web framework |
+| express | ^4.21.0 | Web framework |
| cheerio | ^1.0.0-rc.12 | HTML parsing |
-| axios | ^1.6.0 | HTTP requests |
+| axios | ^1.8.0 | HTTP requests |
| cors | ^2.8.5 | CORS headers |
-| cookie-parser | ^1.4.6 | Cookie parsing |
-| dotenv | ^16.3.1 | Environment variables |
+| cookie-parser | ^1.4.7 | Cookie parsing |
+| dotenv | ^16.4.0 | Environment variables |
diff --git a/docs/endpoints.md b/docs/endpoints.md
index a1b75bf..cf74a36 100644
--- a/docs/endpoints.md
+++ b/docs/endpoints.md
@@ -454,3 +454,147 @@ curl "https://anikototvapi.vercel.app/api/filter?keyword=&genre[]=1"
```
Returns filtered and paginated anime list.
+
+---
+
+## GET /watch
+
+Get full watch page data including servers, trending, and recommended anime.
+
+| Param | Type | Required | Description |
+|-------|------|----------|-------------|
+| `slug` | string | Yes | Anime slug (e.g., `one-piece-100`) |
+| `ep` | number | Yes | Episode number |
+
+```bash
+curl "https://anikototvapi.vercel.app/api/watch?slug=one-piece-100&ep=1"
+```
+
+Returns episode data with server list, trending sidebar, and recommended anime.
+
+---
+
+## GET /search/suggest
+
+Get search autocomplete suggestions.
+
+| Param | Type | Required | Description |
+|-------|------|----------|-------------|
+| `keyword` | string | Yes | Search keyword |
+
+```bash
+curl "https://anikototvapi.vercel.app/api/search/suggest?keyword=naruto"
+```
+
+Returns array of suggestion objects with title, ID, and image.
+
+---
+
+## GET /episodes-ajax/:id
+
+Get AJAX-loaded episode list for an anime.
+
+| Param | Type | Required | Description |
+|-------|------|----------|-------------|
+| `id` | string | Yes | Anime ID or slug |
+
+```bash
+curl "https://anikototvapi.vercel.app/api/episodes-ajax/one-piece-100"
+```
+
+Returns episode list with filters, ranges, and server IDs.
+
+---
+
+## GET /mapper-servers
+
+Get cross-server mapping for gogoanime/anivibe servers.
+
+| Param | Type | Required | Description |
+|-------|------|----------|-------------|
+| `malId` | number | Yes | MyAnimeList ID |
+| `slug` | string | Yes | Anime slug |
+| `timestamp` | number | Yes | Timestamp |
+
+```bash
+curl "https://anikototvapi.vercel.app/api/mapper-servers?malId=21&slug=one-piece-100×tamp=1234567890"
+```
+
+Returns mapped server URLs for gogoanime/anivibe.
+
+---
+
+## GET /newly-added
+
+Get newly added anime series.
+
+| Param | Type | Required | Description |
+|-------|------|----------|-------------|
+| `page` | number | No | Page number (default: 1) |
+
+```bash
+curl "https://anikototvapi.vercel.app/api/newly-added"
+```
+
+Returns paginated list of newly added anime.
+
+---
+
+## GET /trending-sidebar
+
+Get trending sidebar widget data.
+
+```bash
+curl "https://anikototvapi.vercel.app/api/trending-sidebar"
+```
+
+Returns trending anime for sidebar display.
+
+---
+
+## GET /seasons/:id
+
+Get season information for an anime.
+
+| Param | Type | Required | Description |
+|-------|------|----------|-------------|
+| `id` | string | Yes | Anime slug |
+
+```bash
+curl "https://anikototvapi.vercel.app/api/seasons/one-piece-100"
+```
+
+Returns season data including related seasons.
+
+---
+
+## GET /watch-order/:id
+
+Get recommended watch order for an anime.
+
+| Param | Type | Required | Description |
+|-------|------|----------|-------------|
+| `id` | string | Yes | Anime slug |
+
+```bash
+curl "https://anikototvapi.vercel.app/api/watch-order/one-piece-100"
+```
+
+Returns recommended watch order sequence.
+
+---
+
+## GET /az-list/:letter
+
+Get anime alphabetically by letter.
+
+| Param | Type | Required | Description |
+|-------|------|----------|-------------|
+| `letter` | string | Yes | Letter (a-z, or # for numbers) |
+| `page` | number | No | Page number (default: 1) |
+
+```bash
+curl "https://anikototvapi.vercel.app/api/az-list/a"
+```
+
+Returns paginated list of anime starting with the specified letter.
diff --git a/docs/streaming.md b/docs/streaming.md
index 38ee9b6..cb7b028 100644
--- a/docs/streaming.md
+++ b/docs/streaming.md
@@ -251,3 +251,24 @@ player.source = {
| "No servers found" | The `server_ids` may be invalid, try another episode |
| Stream URL 403 | Some servers require specific referrer headers |
| CORS error | Use a proxy or access from server-side |
+
+---
+
+## Alternative: All-in-One /watch Endpoint
+
+For a simpler approach, use the `/watch` endpoint which returns episode data, servers, and recommendations in a single call.
+
+**Request:**
+
+```bash
+curl "https://anikototvapi.vercel.app/api/watch?slug=road-of-naruto-ggjw8&ep=1"
+```
+
+**Response includes:**
+- Episode data with title, number, and description
+- Server list (sub and dub)
+- Trending sidebar anime
+- Recommended anime
+- Next episode schedule
+
+This is useful when you need all watch page data at once instead of making 3 separate requests.
diff --git a/package.json b/package.json
index eb3fe51..d598a4f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "AniKotoAPI",
- "version": "1.8.0",
+ "version": "1.9.0",
"description": "A restful API to provide all information about anime from anikototv.to",
"main": "./server.js",
"scripts": {
@@ -13,7 +13,6 @@
"dependencies": {
"axios": "^1.8.0",
"cheerio": "^1.0.0-rc.12",
- "cookie-parser": "^1.4.7",
"cors": "^2.8.5",
"dotenv": "^16.4.0",
"express": "^4.21.0"
diff --git a/public/404.html b/public/404.html
index 24fc272..b82b6e4 100644
--- a/public/404.html
+++ b/public/404.html
@@ -2,10 +2,11 @@
+
404 — AniKotoAPI
-
+
diff --git a/public/favicon.svg b/public/favicon.svg
index 2541541..e2f9113 100644
--- a/public/favicon.svg
+++ b/public/favicon.svg
@@ -6,5 +6,5 @@
- AK
+ AK
diff --git a/public/index.html b/public/index.html
index a3025d6..5a640fa 100644
--- a/public/index.html
+++ b/public/index.html
@@ -9,16 +9,16 @@
-
+
-
+
-
+
@@ -26,13 +26,14 @@
-
-
+
+
+
@@ -277,7 +278,7 @@
"name": "AniKotoAPI",
"description": "Free REST API for anime data. Browse, search, stream episodes. 30+ endpoints, no API key required.",
"url": "https://anikototvapi.vercel.app",
- "image": "https://anikototvapi.vercel.app/share.jpg",
+ "image": "https://anikototvapi.vercel.app/share.png",
"documentation": "https://github.com/Shineii86/AniKotoAPI",
"provider": {
"@type": "Organization",
@@ -306,14 +307,14 @@