A zero-dependency REST API built with Hono on Vercel Edge Runtime that scrapes watchhentai.net and returns clean, structured JSON.
| Layer | Choice |
|---|---|
| Runtime | Vercel Edge (Node.js 18+) |
| Framework | Hono |
| Language | TypeScript |
| Scraping | Regex + custom HtmlDoc class (no Puppeteer, no Cheerio) |
https://your-deployment.vercel.app/api
All routes are prefixed with /api.
Every endpoint returns the same top-level envelope:
{
"success": true,
"data": { ... },
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/..."
}
}On error:
{
"success": false,
"error": "Description of what went wrong"
}Health check.
Response
{
"success": true,
"status": "ok",
"timestamp": "2026-02-21T10:00:00.000Z"
}Site-wide metadata — logo, navigation menu, sidebar popular/new series, full genre list with counts, release years, and footer links. Useful as a one-time bootstrap call for any frontend.
Response
{
"success": true,
"data": {
"logo": {
"url": "https://watchhentai.net/logo.svg",
"alt": "Watch Hentai",
"homeUrl": "https://watchhentai.net"
},
"menu": [
{ "name": "Home", "url": "https://watchhentai.net/", "title": "Watch Hentai" },
{ "name": "Trending", "url": "https://watchhentai.net/trending/", "title": "Trending Hentai" },
{ "name": "Series", "url": "https://watchhentai.net/series/", "title": "Watch Hentai Series" },
{ "name": "Episodes", "url": "https://watchhentai.net/videos/", "title": "Hentai Episodes" },
{ "name": "Uncensored", "url": "https://watchhentai.net/genre/uncensored/", "title": "Watch Uncensored Hentai" },
{ "name": "2025", "url": "https://watchhentai.net/release/2025/", "title": "Watch Hentai of 2025" },
{ "name": "Calendar", "url": "https://watchhentai.net/calendar/", "title": "Hentai Calendar" }
],
"menuGenres": [
{ "name": "3D", "slug": "3d", "url": "https://watchhentai.net/genre/3d/", "title": "3D Hentai" },
{ "name": "Ahegao", "slug": "ahegao", "url": "https://watchhentai.net/genre/ahegao/", "title": "Ahegao Hentai" },
{ "name": "Anal", "slug": "anal", "url": "https://watchhentai.net/genre/anal/", "title": "Anal Hentai" }
],
"popular": [
{
"id": "1014",
"title": "Ane wa Yanmama Junyuu-chuu",
"url": "https://watchhentai.net/series/ane-wa-yanmama-junyuu-chuu-id-01/",
"poster": "https://watchhentai.net/timthumb/sidebar.php?src=https://watchhentai.net/uploads/2022/5/.../poster.jpg",
"rating": "7.5",
"year": "2020"
}
],
"newSeries": [
{
"id": "60827",
"title": "Seikou Senki Pony Celes",
"url": "https://watchhentai.net/series/seikou-senki-pony-celes-id-01/",
"poster": "https://watchhentai.net/timthumb/sidebar.php?src=https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/poster.jpg",
"rating": "8.2",
"year": ""
}
],
"genres": [
{ "name": "3D", "slug": "3d", "url": "https://watchhentai.net/genre/3d/", "count": 40 },
{ "name": "Ahegao", "slug": "ahegao", "url": "https://watchhentai.net/genre/ahegao/", "count": 201 },
{ "name": "Large Breasts","slug": "large-breasts","url": "https://watchhentai.net/genre/large-breasts/","count": 527 },
{ "name": "School Girls", "slug": "school-girls", "url": "https://watchhentai.net/genre/school-girls/", "count": 639 }
],
"years": ["2026", "2025", "2024", "2023", "2022", "2021", "2020", "...", "1984"],
"partnerLinks": [
{ "name": "Hentai World", "url": "https://hentaiworld.tv/" },
{ "name": "Anime Porn", "url": "https://www.xanimeporn.com/" }
],
"footerLinks": [
{ "name": "Contact", "url": "https://watchhentai.net/contact/" }
],
"copyright": "WatchHentai.net © 2025"
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/"
}
}Home page — featured sliders, new episodes, trending, and all section modules.
Response
{
"success": true,
"data": {
"featured": [
{
"title": "Seikou Senki Pony Celes",
"url": "https://watchhentai.net/series/seikou-senki-pony-celes-id-01/",
"poster": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/poster.jpg",
"backdrop": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/backdrop.jpg",
"rating": "8.2",
"year": "2026",
"genres": ["Censored", "Large Breasts"],
"synopsis": "Story synopsis text here..."
}
],
"newEpisodes": [
{
"title": "Seikou Senki Pony Celes – Episode 1",
"url": "https://watchhentai.net/videos/seikou-senki-pony-celes-episode-1-id-01/",
"thumbnail": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1.jpg",
"date": "Feb. 21, 2026"
}
],
"trending": [
{
"title": "Series Title",
"url": "https://watchhentai.net/series/series-slug-id-01/",
"poster": "https://watchhentai.net/uploads/.../poster.jpg",
"rating": "7.5",
"year": "2022"
}
],
"sections": [
{
"title": "Latest Episodes",
"items": [
{ "title": "...", "url": "...", "thumbnail": "..." }
]
}
]
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/"
}
}Trending series list with pagination.
Response
{
"success": true,
"data": {
"page": 1,
"totalPages": 12,
"items": [
{
"title": "Series Title",
"url": "https://watchhentai.net/series/series-slug-id-01/",
"poster": "https://watchhentai.net/uploads/.../poster.jpg",
"rating": "7.5",
"year": "2022",
"censored": "censored"
}
]
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/trending/"
}
}Latest episode videos list with pagination.
Response
{
"success": true,
"data": {
"page": 1,
"totalPages": 50,
"items": [
{
"title": "Seikou Senki Pony Celes – Episode 1",
"url": "https://watchhentai.net/videos/seikou-senki-pony-celes-episode-1-id-01/",
"thumbnail": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1.jpg",
"date": "Feb. 21, 2026",
"views": "1234"
}
]
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/videos/"
}
}Uncensored series list with pagination. Same shape as /api/trending.
Response
{
"success": true,
"data": {
"page": 1,
"totalPages": 8,
"items": [
{
"title": "Series Title",
"url": "https://watchhentai.net/series/series-slug-id-01/",
"poster": "https://watchhentai.net/uploads/.../poster.jpg",
"rating": "7.2",
"year": "2024",
"censored": "uncensored"
}
]
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/genre/uncensored/"
}
}Series released in a specific year. Year must be between 1984 and 2099.
Example: GET /api/release/2026
Response
{
"success": true,
"data": {
"year": "2026",
"page": 1,
"totalPages": 3,
"items": [
{
"title": "Seikou Senki Pony Celes",
"url": "https://watchhentai.net/series/seikou-senki-pony-celes-id-01/",
"poster": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/poster.jpg",
"rating": "8.2",
"year": "2026",
"censored": "censored"
}
]
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/release/2026/"
}
}Release calendar grouped by month, showing upcoming and recent episode schedules.
Response
{
"success": true,
"data": {
"months": [
{
"month": "February 2026",
"episodes": [
{
"date": "21",
"seriesTitle": "Seikou Senki Pony Celes",
"episodeTitle": "Episode 1",
"url": "https://watchhentai.net/videos/seikou-senki-pony-celes-episode-1-id-01/",
"thumbnail": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1.jpg"
}
]
}
]
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/calendar/"
}
}Search for series or episodes. Returns an empty items array (not an error) when no results are found.
Query Parameters
| Param | Required | Description |
|---|---|---|
q |
✅ | Search keyword |
page |
❌ | Page number (default: 1) |
Response — with results
{
"success": true,
"data": {
"query": "kanojo",
"page": 1,
"totalPages": 2,
"total": 18,
"items": [
{
"title": "Kanojo ga Separate o Matou Riyuu",
"url": "https://watchhentai.net/series/kanojo-ga-separate-o-matou-riyuu-id-01/",
"poster": "https://watchhentai.net/uploads/2025/kanojo-ga-separate-o-matou-riyuu/poster.jpg",
"rating": "6.2",
"year": "2025",
"censored": "censored"
}
]
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/?s=kanojo"
}
}Response — no results
{
"success": true,
"data": {
"query": "Chhhhhhhh",
"page": 1,
"totalPages": 0,
"total": 0,
"items": []
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/?s=Chhhhhhhh"
}
}Complete flat list of all genres scraped from the series listing page, with series counts.
Response
{
"success": true,
"data": [
{ "name": "3D", "slug": "3d", "url": "https://watchhentai.net/genre/3d/", "count": 40 },
{ "name": "Ahegao", "slug": "ahegao", "url": "https://watchhentai.net/genre/ahegao/", "count": 201 },
{ "name": "Anal", "slug": "anal", "url": "https://watchhentai.net/genre/anal/", "count": 348 },
{ "name": "Large Breasts","slug": "large-breasts","url": "https://watchhentai.net/genre/large-breasts/","count": 527 },
{ "name": "Rape", "slug": "rape", "url": "https://watchhentai.net/genre/rape/", "count": 533 },
{ "name": "School Girls", "slug": "school-girls", "url": "https://watchhentai.net/genre/school-girls/", "count": 639 }
],
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/series/"
}
}Series list filtered by a single genre slug. Same item shape as /api/trending.
Example: GET /api/genre/uncensored
Response
{
"success": true,
"data": {
"genre": "Uncensored",
"slug": "uncensored",
"page": 1,
"totalPages": 18,
"items": [
{
"title": "Series Title",
"url": "https://watchhentai.net/series/series-slug-id-01/",
"poster": "https://watchhentai.net/uploads/.../poster.jpg",
"rating": "8.7",
"year": "2025",
"censored": "uncensored"
}
]
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/genre/uncensored/"
}
}Paginated list of all series with grid card data.
Response
{
"success": true,
"data": {
"page": 1,
"totalPages": 80,
"items": [
{
"title": "Seikou Senki Pony Celes",
"url": "https://watchhentai.net/series/seikou-senki-pony-celes-id-01/",
"poster": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/poster.jpg",
"rating": "8.2",
"year": "2026",
"censored": "censored",
"episodes": "1"
}
]
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/series/"
}
}Full series detail page. Auto-detected when :slug contains letters (not a pure page number).
Example: GET /api/series/seikou-senki-pony-celes-id-01
Response
{
"success": true,
"data": {
"id": "60827",
"slug": "seikou-senki-pony-celes-id-01",
"title": "Seikou Senki Pony Celes",
"url": "https://watchhentai.net/series/seikou-senki-pony-celes-id-01/",
"poster": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/poster.jpg",
"backdrop": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/backdrop.jpg",
"rating": "8.2",
"votes": "45",
"year": "2026",
"status": "Ongoing",
"studio": "Studio Name",
"censored": "censored",
"synopsis": "Full synopsis text here...",
"genres": [
{ "name": "Censored", "url": "https://watchhentai.net/genre/censored/" },
{ "name": "Large Breasts", "url": "https://watchhentai.net/genre/large-breasts/" }
],
"episodes": [
{
"number": 1,
"title": "Episode 1",
"url": "https://watchhentai.net/videos/seikou-senki-pony-celes-episode-1-id-01/",
"thumbnail": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1.jpg",
"date": "Feb. 21, 2026"
}
],
"related": [
{
"title": "Related Series Title",
"url": "https://watchhentai.net/series/related-series-id-01/",
"poster": "https://watchhentai.net/uploads/.../poster.jpg"
}
],
"backdrops": [
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-1.jpg",
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-2.jpg"
],
"datePublished": "2026-02-02T19:50:25+00:00",
"dateModified": "2026-02-06T00:59:42+00:00"
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/series/seikou-senki-pony-celes-id-01/"
}
}Episode watch / stream page. Makes two requests internally — the main watch page and the embedded jwplayer iframe — to extract all available quality video sources.
Example: GET /api/watch/seikou-senki-pony-celes-episode-1-id-01
Response
{
"success": true,
"data": {
"id": "60829",
"slug": "seikou-senki-pony-celes-episode-1-id-01",
"title": "Seikou Senki Pony Celes – Episode 1",
"episodeTitle": "Episode 1",
"seriesTitle": "Seikou Senki Pony Celes",
"url": "https://watchhentai.net/videos/seikou-senki-pony-celes-episode-1-id-01/",
"player": {
"originalSrc": "https://watchhentai.net/jwplayer/?source=https%3A%2F%2Fhstorage.xyz%2F...&id=60829&type=mp4&quality=1080p,1440p",
"alternateSrc": "https://watchhentai.net/plyr/?source=https%3A%2F%2Fhstorage.xyz%2F...&id=60829&type=mp4",
"src": "https://hstorage.xyz/files/S/seikou-senki-pony-celes/seikou-senki-pony-celes-1.mp4",
"sources": [
{ "src": "https://hstorage.xyz/.../seikou-senki-pony-celes-1_1440p.mp4", "type": "video/mp4", "label": "1440p" },
{ "src": "https://hstorage.xyz/.../seikou-senki-pony-celes-1_1080p.mp4", "type": "video/mp4", "label": "1080p" },
{ "src": "https://hstorage.xyz/.../seikou-senki-pony-celes-1_720p.mp4", "type": "video/mp4", "label": "720p" }
],
"type": "mp4",
"duration": "PT24M50S",
"thumbnail": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1.jpg",
"postId": "60829",
"downloadUrl": "https://watchhentai.net/download/seikou-senki-pony-celes-episode-1-id-01/"
},
"thumbnail": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1.jpg",
"uploadDate": "2026-02-21T00:00:00+00:00",
"views": "1234",
"seriesUrl": "https://watchhentai.net/series/seikou-senki-pony-celes-id-01/",
"seriesPoster": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/poster.jpg",
"censored": "censored",
"genres": [
{ "name": "Censored", "url": "https://watchhentai.net/genre/censored/" },
{ "name": "Large Breasts", "url": "https://watchhentai.net/genre/large-breasts/" }
],
"synopsis": "Synopsis text...",
"prevEpisode": null,
"nextEpisode": {
"title": "Episode 2",
"url": "https://watchhentai.net/videos/seikou-senki-pony-celes-episode-2-id-01/"
},
"episodes": [
{
"number": 1,
"title": "Episode 1",
"url": "https://watchhentai.net/videos/seikou-senki-pony-celes-episode-1-id-01/",
"thumbnail": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1.jpg",
"date": "Feb. 21, 2026",
"isCurrent": true
},
{
"number": 2,
"title": "Episode 2",
"url": "https://watchhentai.net/videos/seikou-senki-pony-celes-episode-2-id-01/",
"thumbnail": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/2.jpg",
"date": "Mar. 07, 2026",
"isCurrent": false
}
]
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/videos/seikou-senki-pony-celes-episode-1-id-01/"
}
}| Field | Type | Description |
|---|---|---|
src |
string |
Default / fallback direct video URL from the jw object |
sources |
array |
All quality variants — use for a quality picker UI |
sources[].src |
string |
Direct streamable MP4 URL |
sources[].type |
string |
Always "video/mp4" |
sources[].label |
string |
Quality label e.g. "1440p", "1080p", "720p" |
duration |
string |
ISO 8601 duration e.g. "PT24M50S" = 24 min 50 sec |
type |
string |
Container hint: "mp4" or "m3u8" |
downloadUrl |
string |
Link to the /download/ page for this episode |
originalSrc |
string |
Full jwplayer iframe URL |
alternateSrc |
string |
Alternate plyr iframe URL |
Episode download page. Returns direct CDN download links for all quality variants, preview screenshots, navigation, and social data.
Example: GET /api/download/seikou-senki-pony-celes-episode-1-id-01
Response
{
"success": true,
"data": {
"id": "60829",
"slug": "seikou-senki-pony-celes-episode-1-id-01",
"title": "Seikou Senki Pony Celes – Episode 1",
"episodeTitle": "Episode 1",
"seriesTitle": "Seikou Senki Pony Celes",
"url": "https://watchhentai.net/download/seikou-senki-pony-celes-episode-1-id-01/",
"watchUrl": "https://watchhentai.net/videos/seikou-senki-pony-celes-episode-1-id-01/",
"downloadUrl": "https://watchhentai.net/download/seikou-senki-pony-celes-episode-1-id-01/",
"thumbnail": "https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1.jpg",
"previews": [
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-1.jpg",
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-2.jpg",
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-3.jpg",
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-4.jpg",
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-5.jpg",
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-6.jpg",
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-7.jpg",
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-8.jpg",
"https://watchhentai.net/uploads/2026/seikou-senki-pony-celes/1-9.jpg"
],
"sources": [
{ "url": "https://xupload.org/download/S/seikou-senki-pony-celes/seikou-senki-pony-celes-1_1440p.mp4", "label": "1440p", "host": "xupload.org" },
{ "url": "https://xupload.org/download/S/seikou-senki-pony-celes/seikou-senki-pony-celes-1_1080p.mp4", "label": "1080p", "host": "xupload.org" },
{ "url": "https://xupload.org/download/S/seikou-senki-pony-celes/seikou-senki-pony-celes-1_720p.mp4", "label": "720p", "host": "xupload.org" }
],
"seriesUrl": "https://watchhentai.net/series/seikou-senki-pony-celes-id-01/",
"prevEpisode": null,
"nextEpisode": {
"title": "Episode 2",
"url": "https://watchhentai.net/download/seikou-senki-pony-celes-episode-2-id-01/"
},
"shareCount": "86",
"related": [
{
"title": "Tsugou no Yoi Sexfriend?",
"url": "https://watchhentai.net/series/tsugou-no-yoi-sexfriend-id-01/",
"poster": "https://watchhentai.net/uploads/2022/11/tsugou-no-yoi-sexfriend/poster.jpg"
}
],
"datePublished": "2026-02-02T19:50:25+00:00",
"dateModified": "2026-02-06T00:59:42+00:00",
"description": "Watch Seikou Senki Pony Celes - Episode 1 online free download HD..."
},
"meta": {
"scrapedAt": "2026-02-21T10:00:00.000Z",
"source": "https://watchhentai.net/download/seikou-senki-pony-celes-episode-1-id-01/"
}
}| Endpoint | Field | CDN Host | Use case |
|---|---|---|---|
/api/watch |
player.sources[].src |
hstorage.xyz |
Direct in-browser video streaming |
/api/download |
sources[].url |
xupload.org |
File download via CDN download page |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/health |
Health check |
GET |
/api/extra |
Logo, menu, genres, years, popular/new, footer |
GET |
/api/home |
Home page featured content |
GET |
/api/trending |
Trending series — page 1 |
GET |
/api/trending?page=N |
Trending series — page N |
GET |
/api/trending/:page |
Trending series — page N (path) |
GET |
/api/videos |
Latest episodes — page 1 |
GET |
/api/videos?page=N |
Latest episodes — page N |
GET |
/api/videos/:page |
Latest episodes — page N (path) |
GET |
/api/uncensored |
Uncensored series — page 1 |
GET |
/api/uncensored?page=N |
Uncensored series — page N |
GET |
/api/uncensored/:page |
Uncensored series — page N (path) |
GET |
/api/release/:year |
Series by release year — page 1 |
GET |
/api/release/:year?page=N |
Series by release year — page N |
GET |
/api/release/:year/:page |
Series by release year — page N (path) |
GET |
/api/calendar |
Release calendar by month |
GET |
/api/search?q=keyword |
Search — page 1 |
GET |
/api/search?q=keyword&page=N |
Search — page N |
GET |
/api/genres |
All genres with series counts |
GET |
/api/genre/:slug |
Series filtered by genre — page 1 |
GET |
/api/genre/:slug?page=N |
Series filtered by genre — page N |
GET |
/api/genre/:slug/:page |
Series filtered by genre — page N (path) |
GET |
/api/series |
All series list — page 1 |
GET |
/api/series?page=N |
All series list — page N |
GET |
/api/series/:page |
All series list — page N (path, digits only) |
GET |
/api/series/:slug |
Series detail (auto-detected by slug) |
GET |
/api/watch/:slug |
Episode stream + all quality sources |
GET |
/api/watch?slug=episode-slug |
Episode stream (query param) |
GET |
/api/download/:slug |
Episode download links + previews |
GET |
/api/download?slug=episode-slug |
Episode download (query param) |
Returned when a required parameter is missing.
{
"success": false,
"error": "Missing slug. Use /api/watch/{slug} or /api/watch?slug={slug}"
}Returned for invalid parameter values (e.g. out-of-range year).
{
"success": false,
"error": "Invalid year. Must be between 1984 and 2099."
}Returned when no route matches the request.
{
"success": false,
"error": "Route not found",
"available": [
"GET /api/home",
"GET /api/trending",
"..."
]
}Returned when the upstream fetch or parse fails.
{
"success": false,
"error": "fetch failed"
}/
├── api/
│ └── [[...route]].ts # Vercel Edge entry point
├── src/
│ ├── index.ts # Hono app + all route registrations
│ ├── config/
│ │ └── index.ts # BASE_URL, default headers, timeouts
│ ├── lib/
│ │ ├── scraper.ts # HtmlDoc class, fetchPage(), scrape* functions
│ │ └── format.ts # cleanText(), resolveUrl(), normalizeThumbnail()
│ └── api/
│ └── pages/
│ ├── home.ts # GET /api/home
│ ├── trending.ts # GET /api/trending
│ ├── videos.ts # GET /api/videos
│ ├── uncensored.ts # GET /api/uncensored
│ ├── release.ts # GET /api/release/:year
│ ├── calendar.ts # GET /api/calendar
│ ├── search.ts # GET /api/search
│ ├── genre.ts # GET /api/genre/:slug
│ ├── series.ts # GET /api/series (list + detail)
│ ├── watch.ts # GET /api/watch/:slug
│ ├── download.ts # GET /api/download/:slug
│ └── extra.ts # GET /api/extra
├── package.json
├── tsconfig.json
└── vercel.json
- No authentication — all endpoints are public, no API key required.
- CORS — enabled on all routes (
*). - Pretty JSON — all responses are indented automatically.
- Pagination —
pageis accepted both as a query param (?page=2) and as a path segment (/2). Default is always1. - Slug detection —
/api/series/:slugauto-routes to list vs detail by checking if the segment is digits-only (list page) or contains letters (detail). - Two-request endpoints —
/api/watchmakes 2 HTTP requests (main page + jwplayer iframe) to extract multi-quality sources. Expect ~300–600ms extra latency vs single-request endpoints. isCurrent— in the/api/watchepisodes list, the currently playing episode has"isCurrent": trueso you can highlight it in a UI without re-parsing the URL.censoredfield — possible values are"censored","uncensored", or""(unknown).duration— returned as an ISO 8601 duration string (PT24M50S). Parse withluxon,dayjs, or the nativeTemporalAPI.