A RESTful API that utilizes web scraping to fetch anime content from hianime.to
- Overview
- Important Notice
- Installation
- Deployment
- Documentation
- Anime Home Page
- Anime Schedule
- Next Episode Schedule
- Anime List Page
- Anime Details
- Search Results
- Search Suggestions
- Filter Anime
- Filter Options
- Anime Characters
- Character Details
- Anime Episodes
- Episode Servers
- Streaming Links
- All Genres
- Top Airing
- Most Popular
- Most Favorite
- Completed Anime
- Recently Added
- Recently Updated
- Top Upcoming
- Genre List
- Subbed Anime
- Dubbed Anime
- Movies
- TV Series
- OVA
- ONA
- Special
- Events
- Development
- Contributors
- Acknowledgments
- Support
hianime-api is a comprehensive RESTful API that provides endpoints to retrieve anime details, episodes, and streaming links by scraping content from hianime.to. Built with modern web technologies, it offers a robust solution for anime content aggregation.
⚠️ Disclaimer
-
This API is recommended for personal use only. Deploy your own instance and customize it as needed.
-
This API is just an unofficial API for hianime.to and is in no other way officially related to the same.
-
The content that this API provides is not mine, nor is it hosted by me. These belong to their respective owners. This API just demonstrates how to build an API that scrapes websites and uses their content.
Make sure you have Bun.js installed on your system.
Install Bun.js:
https://bun.sh/docs/installationStep 1: Clone the repository
git clone https://github.com/ryanwtf88/hianime-api.gitStep 2: Navigate to the project directory
cd hianime-apiStep 3: Install dependencies
bun installStep 4: Start the development server
bun run devThe server will be running at http://localhost:3030
Prerequisites:
- Docker installed (Install Docker)
Build the Docker image:
docker build -t hianime-api .Run the container:
docker run -p 3030:3030 hianime-apiWith environment variables:
docker run -p 3030:3030 \
-e NODE_ENV=production \
-e PORT=3030 \
hianime-apiUsing Docker Compose:
Create a docker-compose.yml file:
version: '3.8'
services:
hianime-api:
build: .
ports:
- "3030:3030"
environment:
- NODE_ENV=production
- PORT=3030
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3030/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40sThen run:
docker-compose up -dOne-Click Deploy:
Manual Deployment:
- Fork or clone the repository to your GitHub account
- Create a new Web Service on Render Dashboard
- Connect your GitHub repository
- Configure the service:
- Name:
hianime-api - Region: Choose your preferred region
- Branch:
master - Runtime: Docker
- Instance Type: Free or paid plan
- Name:
- Add environment variables:
NODE_ENV=productionPORT=3030
- Click "Create Web Service"
Environment Variables:
| Key | Value | Required |
|---|---|---|
NODE_ENV |
production |
Yes |
PORT |
3030 |
Yes |
UPSTASH_REDIS_REST_URL |
Your Upstash Redis URL | Optional* |
UPSTASH_REDIS_REST_TOKEN |
Your Upstash Redis Token | Optional* |
*Required if you're using Redis for caching
- Import this repository into Replit
- Click the Run button
- Your API will be available at your Replit URL
For detailed deployment instructions, troubleshooting, and best practices, see the DEPLOYMENT.md guide.
All endpoints return JSON responses. Base URL: /api/v1
Retrieve the home page data including spotlight anime, trending shows, top airing, and more.
Endpoint:
GET /api/v1/home
Request Example:
const resp = await fetch('/api/v1/home');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"spotlight": [...],
"trending": [...],
"topAiring": [...],
"mostPopular": [...],
"mostFavorite": [...],
"latestCompleted": [...],
"latestEpisode": [...],
"newAdded": [...],
"topUpcoming": [...],
"top10": {
"today": [...],
"week": [...],
"month": [...]
},
"genres": [...]
}
}Retrieve the schedule of anime releases.
Endpoint:
GET /api/v1/schadule
Request Example:
const resp = await fetch('/api/v1/schadule');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"scheduledAnimes": [...]
}
}Get the next episode schedule for a specific anime.
Endpoint:
GET /api/v1/schadule/next/:id
Request Example:
const resp = await fetch('/api/v1/schadule/next/one-piece-100');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"nextEpisode": {
"episodeNumber": 1120,
"releaseDate": "2024-12-15"
}
}
}Retrieve anime lists based on various categories and filters.
Endpoint:
GET /api/v1/animes/:query/:category?page=:page
Valid Queries:
| Query | Has Category | Category Options |
|---|---|---|
top-airing |
No | - |
most-popular |
No | - |
most-favorite |
No | - |
completed |
No | - |
recently-added |
No | - |
recently-updated |
No | - |
top-upcoming |
No | - |
genre |
Yes | action, adventure, cars, comedy, dementia, demons, drama, ecchi, fantasy, game, harem, historical, horror, isekai, josei, kids, magic, martial arts, mecha, military, music, mystery, parody, police, psychological, romance, samurai, school, sci-fi, seinen, shoujo, shoujo ai, shounen, shounen ai, slice of life, space, sports, super power, supernatural, thriller, vampire |
az-list |
Yes | 0-9, all, a-z |
subbed-anime |
No | - |
dubbed-anime |
No | - |
movie |
No | - |
tv |
No | - |
ova |
No | - |
ona |
No | - |
special |
No | - |
events |
No | - |
Request Example:
const resp = await fetch('/api/v1/animes/az-list/a?page=1');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"pageInfo": {
"totalPages": 10,
"currentPage": 1,
"hasNextPage": true
},
"animes": [
{
"title": "Attack on Titan",
"alternativeTitle": "Shingeki no Kyojin",
"id": "attack-on-titan-112",
"poster": "https://cdn.noitatnemucod.net/thumbnail/300x400/100/...",
"episodes": {
"sub": 25,
"dub": 25,
"eps": 25
},
"type": "TV",
"duration": "24m"
}
]
}
}Retrieve comprehensive information about a specific anime.
Endpoint:
GET /api/v1/anime/:id
Request Example:
const resp = await fetch('/api/v1/anime/attack-on-titan-112');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"title": "Attack on Titan",
"alternativeTitle": "Shingeki no Kyojin",
"japanese": "進撃の巨人",
"id": "attack-on-titan-112",
"poster": "https://cdn.noitatnemucod.net/thumbnail/300x400/100/...",
"rating": "R",
"type": "TV",
"episodes": {
"sub": 25,
"dub": 25,
"eps": 25
},
"synopsis": "...",
"synonyms": "AoT",
"aired": {
"from": "Apr 7, 2013",
"to": "Sep 29, 2013"
},
"premiered": "Spring 2013",
"duration": "24m",
"status": "Finished Airing",
"MAL_score": "8.52",
"genres": [...],
"studios": "Wit Studio",
"producers": [...],
"moreSeasons": [...],
"related": [...],
"mostPopular": [...],
"recommended": [...]
}
}Search for anime by keyword with pagination support.
Endpoint:
GET /api/v1/search?keyword=:query&page=:page
Request Example:
const resp = await fetch('/api/v1/search?keyword=one+piece&page=1');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"pageInfo": {
"totalPages": 5,
"currentPage": 1,
"hasNextPage": true
},
"animes": [
{
"title": "One Piece",
"alternativeTitle": "One Piece",
"id": "one-piece-100",
"poster": "https://cdn.noitatnemucod.net/thumbnail/300x400/100/...",
"episodes": {
"sub": 1100,
"dub": 1050,
"eps": 1100
},
"type": "TV",
"duration": "24m"
}
]
}
}Get autocomplete suggestions while searching for anime.
Endpoint:
GET /api/v1/suggestion?keyword=:query
Request Example:
const resp = await fetch('/api/v1/suggestion?keyword=naruto');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": [
{
"title": "Naruto",
"alternativeTitle": "Naruto",
"poster": "https://cdn.noitatnemucod.net/thumbnail/300x400/100/...",
"id": "naruto-677",
"aired": "Oct 3, 2002",
"type": "TV",
"duration": "23m"
}
]
}Filter anime based on multiple criteria.
Endpoint:
GET /api/v1/filter?type=:type&status=:status&rated=:rated&score=:score&season=:season&language=:language&start_date=:start_date&end_date=:end_date&sort=:sort&genres=:genres&page=:page
Query Parameters:
type- all, tv, movie, ova, ona, special, musicstatus- all, finished_airing, currently_airing, not_yet_airedrated- all, g, pg, pg-13, r, r+, rxscore- all, appalling, horrible, very_bad, bad, average, fine, good, very_good, great, masterpieceseason- all, spring, summer, fall, winterlanguage- all, sub, dub, sub_dubstart_date- YYYY-MM-DD formatend_date- YYYY-MM-DD formatsort- default, recently-added, recently-updated, score, name-az, released-date, most-watchedgenres- Comma-separated genre slugs (action, adventure, cars, comedy, dementia, demons, mystery, drama, ecchi, fantasy, game, historical, horror, kids, magic, martial_arts, mecha, music, parody, samurai, romance, school, sci-fi, shoujo, shoujo_ai, shounen, shounen_ai, space, sports, super_power, vampire, harem, slice_of_life, supernatural, military, police, psychological, thriller, seinen, josei, isekai)page- Page number (default: 1)
Request Example:
const resp = await fetch('/api/v1/filter?type=tv&status=currently_airing&sort=score&genres=action,fantasy&page=1');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"pageInfo": {
"totalPages": 20,
"currentPage": 1,
"hasNextPage": true
},
"animes": [...]
}
}Get all available filter options.
Endpoint:
GET /api/v1/filter/options
Request Example:
const resp = await fetch('/api/v1/filter/options');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"types": [...],
"statuses": [...],
"ratings": [...],
"scores": [...],
"seasons": [...],
"languages": [...],
"sorts": [...],
"genres": [...]
}
}Retrieve character list for a specific anime.
Endpoint:
GET /api/v1/characters/:id?page=:page
Request Example:
const resp = await fetch('/api/v1/characters/one-piece-100?page=1');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"pageInfo": {
"totalPages": 5,
"currentPage": 1,
"hasNextPage": true
},
"characters": [
{
"name": "Monkey D. Luffy",
"image": "https://...",
"id": "character:monkey-d-luffy-1",
"role": "Main",
"voiceActors": [...]
}
]
}
}Get detailed information about a character or voice actor.
Endpoint:
GET /api/v1/character/:id
Request Example (Character):
const resp = await fetch('/api/v1/character/character:roronoa-zoro-7');
const data = await resp.json();
console.log(data);Request Example (Actor):
const resp = await fetch('/api/v1/character/people:kana-hanazawa-1');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"name": "Roronoa Zoro",
"image": "https://...",
"role": "Main",
"animeAppearances": [...],
"biography": "...",
"voiceActors": [...]
}
}Retrieve the episode list for a specific anime.
Endpoint:
GET /api/v1/episodes/:id
Request Example:
const resp = await fetch('/api/v1/episodes/steins-gate-3');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"totalEpisodes": 24,
"episodes": [
{
"title": "Turning Point",
"alternativeTitle": "Hajimari to Owari no Prologue",
"episodeNumber": 1,
"id": "steinsgate-3?ep=213",
"isFiller": false
}
]
}
}Get available streaming servers for a specific episode.
Endpoint:
GET /api/v1/servers?id=:episodeId
Request Example:
const resp = await fetch('/api/v1/servers?id=steinsgate-3?ep=213');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"episodeNumber": 1,
"sub": [
{
"serverName": "HD-1",
"serverId": 4
},
{
"serverName": "HD-2",
"serverId": 1
}
],
"dub": [
{
"serverName": "HD-1",
"serverId": 4
}
]
}
}Retrieve streaming links and metadata for a specific episode.
Endpoint:
GET /api/v1/stream?id=:episodeId&server=:server&type=:type
Query Parameters:
id- Episode ID (required)server- Server name (default: hd-1)type- sub or dub (default: sub)
Request Example:
const resp = await fetch('/api/v1/stream?id=steinsgate-3?ep=213&server=hd-1&type=sub');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": {
"tracks": [
{
"file": "https://...",
"label": "English",
"kind": "captions"
}
],
"intro": {
"start": 75,
"end": 165
},
"outro": {
"start": 1330,
"end": 1419
},
"sources": [
{
"url": "https://...",
"type": "hls"
}
],
"anilistID": 9253,
"malID": 9253
}
}Retrieve all available anime genres.
Endpoint:
GET /api/v1/genres
Request Example:
const resp = await fetch('/api/v1/genres');
const data = await resp.json();
console.log(data);Response Schema:
{
"success": true,
"data": [
{
"name": "Action",
"slug": "action"
},
{
"name": "Adventure",
"slug": "adventure"
}
]
}Retrieve currently airing top anime.
Endpoint:
GET /api/v1/animes/top-airing?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/top-airing?page=1');
const data = await resp.json();
console.log(data);Retrieve most popular anime.
Endpoint:
GET /api/v1/animes/most-popular?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/most-popular?page=1');
const data = await resp.json();
console.log(data);Retrieve most favorited anime.
Endpoint:
GET /api/v1/animes/most-favorite?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/most-favorite?page=1');
const data = await resp.json();
console.log(data);Retrieve completed anime series.
Endpoint:
GET /api/v1/animes/completed?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/completed?page=1');
const data = await resp.json();
console.log(data);Retrieve recently added anime.
Endpoint:
GET /api/v1/animes/recently-added?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/recently-added?page=1');
const data = await resp.json();
console.log(data);Retrieve recently updated anime.
Endpoint:
GET /api/v1/animes/recently-updated?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/recently-updated?page=1');
const data = await resp.json();
console.log(data);Retrieve top upcoming anime.
Endpoint:
GET /api/v1/animes/top-upcoming?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/top-upcoming?page=1');
const data = await resp.json();
console.log(data);Retrieve anime filtered by specific genre.
Endpoint:
GET /api/v1/animes/genre/:genre?page=:page
Available Genres: action, adventure, cars, comedy, dementia, demons, drama, ecchi, fantasy, game, harem, historical, horror, isekai, josei, kids, magic, martial arts, mecha, military, music, mystery, parody, police, psychological, romance, samurai, school, sci-fi, seinen, shoujo, shoujo ai, shounen, shounen ai, slice of life, space, sports, super power, supernatural, thriller, vampire
Request Example:
const resp = await fetch('/api/v1/animes/genre/action?page=1');
const data = await resp.json();
console.log(data);Retrieve anime with subtitles available.
Endpoint:
GET /api/v1/animes/subbed-anime?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/subbed-anime?page=1');
const data = await resp.json();
console.log(data);Retrieve anime with English dub available.
Endpoint:
GET /api/v1/animes/dubbed-anime?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/dubbed-anime?page=1');
const data = await resp.json();
console.log(data);Retrieve anime movies.
Endpoint:
GET /api/v1/animes/movie?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/movie?page=1');
const data = await resp.json();
console.log(data);Retrieve anime TV series.
Endpoint:
GET /api/v1/animes/tv?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/tv?page=1');
const data = await resp.json();
console.log(data);Retrieve Original Video Animation (OVA) content.
Endpoint:
GET /api/v1/animes/ova?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/ova?page=1');
const data = await resp.json();
console.log(data);Retrieve Original Net Animation (ONA) content.
Endpoint:
GET /api/v1/animes/ona?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/ona?page=1');
const data = await resp.json();
console.log(data);Retrieve special anime episodes.
Endpoint:
GET /api/v1/animes/special?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/special?page=1');
const data = await resp.json();
console.log(data);Retrieve anime events.
Endpoint:
GET /api/v1/animes/events?page=:page
Request Example:
const resp = await fetch('/api/v1/animes/events?page=1');
const data = await resp.json();
console.log(data);Pull requests and stars are always welcome. If you encounter any bug or want to add a new feature to this API, consider creating a new issue. If you wish to contribute to this project, feel free to make a pull request.
bun run devbun startThanks to the following people for keeping this project alive and relevant:
Want to contribute? Check out our contribution guidelines and feel free to submit a pull request!
Special thanks to the following projects for inspiration and reference:
If you find this project useful, please consider giving it a star on GitHub!
Made with ❤️ by RY4N