A RESTful API that utilizes web scraping to fetch anime content from hianime.to
- Overview
- Important Notice
- Installation
- Deployment
- Video Integration
- 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
- Anime Schedules
- All Genres
- Top Airing
- Most Popular
- Most Favorite
- Completed Anime
- Recently Added
- Recently Updated
- Top Upcoming
- Genre List
- Producer List
- Subbed Anime
- Dubbed Anime
- Movies
- TV Series
- OVA
- ONA
- Special
- Events
- Anime News
- Anime News
- Random Anime
- 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.
-
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.
For video playback, it is recommended to use the following external player. You can embed it using an iframe with the dynamic parameters retrieved from this API.
Embed Example URL: https://cdn.4animo.xyz/api/embed/hd-1/13825/sub?k=1&autoPlay=1&skipIntro=1&skipOutro=1
Usage Example:
<iframe src="https://cdn.4animo.xyz/api/embed/hd-1/13825/sub?k=1&autoPlay=1&skipIntro=1&skipOutro=1" width="100%" height="500" frameborder="0" allow="autoplay; fullscreen; picture-in-picture"> </iframe>This API is used by the following projects:
- ANIMO: A comprehensive anime streaming platform that leverages this API for real-time anime data, schedules, and streaming links. Check it out to see the API in action!
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/ryanwtf7/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
- Sign up at Vercel
- Create a new project and import your repository
- Click "Deploy"
Why Vercel?
Serverless architecture with automatic scaling
Global CDN for fast response times
Free tier with generous limits
Automatic HTTPS and custom domains
Git-based deployments (auto-deploy on push)
All endpoints return JSON responses. Base URL: /api/v2
Retrieve the home page data including spotlight anime, trending shows, top airing, and more.
Endpoint:
GET /api/v2/home
Request Example:
const resp = await fetch('/api/v2/home');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": {
"spotlight": [...],
"trending": [...],
"topAiring": [...],
"mostPopular": [...],
"mostFavorite": [...],
"latestCompleted": [...],
"latestEpisode": [...],
"newAdded": [...],
"topUpcoming": [...],
"top10": {
"today": [...],
"week": [...],
"month": [...]
},
"genres": [...]
}
}Get the next episode schedule for a specific anime.
Endpoint:
GET /api/v2/schedule/next/:id
Request Example:
const resp = await fetch('/api/v2/schedule/next/one-piece-100');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": {
"nextEpisode": {
"episodeNumber": 1120,
"releaseDate": "2024-12-15"
}
}
}Retrieve anime lists based on various categories and filters.
Endpoint:
GET /api/v2/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 |
producer |
Yes | Any producer slug (e.g., bones, toei-animation, mappa) |
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/v2/animes/az-list/a?page=1');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"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/v2/anime/:id
Request Example:
const resp = await fetch('/api/v2/anime/attack-on-titan-112');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"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/v2/search?keyword=:query&page=:page
Request Example:
const resp = await fetch('/api/v2/search?keyword=one+piece&page=1');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"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/v2/suggestion?keyword=:query
Request Example:
const resp = await fetch('/api/v2/suggestion?keyword=naruto');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"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/v2/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/v2/filter?type=tv&status=currently_airing&sort=score&genres=action,fantasy&page=1');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": {
"pageInfo": {
"totalPages": 20,
"currentPage": 1,
"hasNextPage": true
},
"animes": [...]
}
}Get all available filter options.
Endpoint:
GET /api/v2/filter/options
Request Example:
const resp = await fetch('/api/v2/filter/options');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": {
"types": [...],
"statuses": [...],
"ratings": [...],
"scores": [...],
"seasons": [...],
"languages": [...],
"sorts": [...],
"genres": [...]
}
}Retrieve character list for a specific anime.
Endpoint:
GET /api/v2/characters/:id?page=:page
Request Example:
const resp = await fetch('/api/v2/characters/one-piece-100?page=1');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"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/v2/character/:id
Request Example (Character):
const resp = await fetch('/api/v2/character/character:roronoa-zoro-7');
const data = await resp.json();
console.log(data);Request Example (Actor):
const resp = await fetch('/api/v2/character/people:kana-hanazawa-1');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": {
"name": "Roronoa Zoro",
"image": "https://...",
"role": "Main",
"animeAppearances": [...],
"biography": "...",
"voiceActors": [...]
}
}Retrieve the episode list for a specific anime.
Endpoint:
GET /api/v2/episodes/:id
Request Example:
const resp = await fetch('/api/v2/episodes/steins-gate-3');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": {
"totalEpisodes": 24,
"episodes": [
{
"title": "Turning Point",
"alternativeTitle": "Hajimari to Owari no Prologue",
"episodeNumber": 1,
"id": "steinsgate-3?ep=213",
"isFiller": false
}
]
}
}Retrieve anime schedules for 7 days starting from the given date (or today).
Endpoint:
GET /api/v2/schedules
Query Parameters:
date- Start date in YYYY-MM-DD format (optional, defaults to today)
Request Example:
const resp = await fetch('/api/v2/schedules?date=2024-01-01');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": {
"2024-01-01": [
{
"id": "anime-id",
"time": "10:30",
"title": "Anime Title",
"jname": "Japanese Title",
"episode": 12
}
],
"2024-01-02": [ ... ]
}
}Retrieve all available anime genres.
Endpoint:
GET /api/v2/genres
Request Example:
const resp = await fetch('/api/v2/genres');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": [
{
"name": "Action",
"slug": "action"
},
{
"name": "Adventure",
"slug": "adventure"
}
]
}Retrieve currently airing top anime.
Endpoint:
GET /api/v2/animes/top-airing?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/top-airing?page=1');
const data = await resp.json();
console.log(data);Retrieve most popular anime.
Endpoint:
GET /api/v2/animes/most-popular?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/most-popular?page=1');
const data = await resp.json();
console.log(data);Retrieve most favorited anime.
Endpoint:
GET /api/v2/animes/most-favorite?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/most-favorite?page=1');
const data = await resp.json();
console.log(data);Retrieve completed anime series.
Endpoint:
GET /api/v2/animes/completed?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/completed?page=1');
const data = await resp.json();
console.log(data);Retrieve recently added anime.
Endpoint:
GET /api/v2/animes/recently-added?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/recently-added?page=1');
const data = await resp.json();
console.log(data);Retrieve recently updated anime.
Endpoint:
GET /api/v2/animes/recently-updated?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/recently-updated?page=1');
const data = await resp.json();
console.log(data);Retrieve top upcoming anime.
Endpoint:
GET /api/v2/animes/top-upcoming?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/top-upcoming?page=1');
const data = await resp.json();
console.log(data);Retrieve anime filtered by specific genre.
Endpoint:
GET /api/v2/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/v2/animes/genre/action?page=1');
const data = await resp.json();
console.log(data);Retrieve anime filtered by production studio or company.
Endpoint:
GET /api/v2/animes/producer/:producer?page=:page
Producer Examples: bones, toei-animation, mappa, ufotable, kyoto-animation, wit-studio, madhouse, a-1-pictures, trigger, cloverworks
Request Example:
const resp = await fetch('/api/v2/animes/producer/bones?page=1');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": {
"pageInfo": {
"totalPages": 15,
"currentPage": 1,
"hasNextPage": true
},
"animes": [
{
"title": "My Hero Academia",
"alternativeTitle": "Boku no Hero Academia",
"id": "my-hero-academia-67",
"poster": "https://cdn.noitatnemucod.net/thumbnail/300x400/100/...",
"episodes": {
"sub": 13,
"dub": 13,
"eps": 13
},
"type": "TV",
"duration": "24m"
}
]
}
}Retrieve anime with subtitles available.
Endpoint:
GET /api/v2/animes/subbed-anime?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/subbed-anime?page=1');
const data = await resp.json();
console.log(data);Retrieve anime with English dub available.
Endpoint:
GET /api/v2/animes/dubbed-anime?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/dubbed-anime?page=1');
const data = await resp.json();
console.log(data);Retrieve anime movies.
Endpoint:
GET /api/v2/animes/movie?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/movie?page=1');
const data = await resp.json();
console.log(data);Retrieve anime TV series.
Endpoint:
GET /api/v2/animes/tv?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/tv?page=1');
const data = await resp.json();
console.log(data);Retrieve Original Video Animation (OVA) content.
Endpoint:
GET /api/v2/animes/ova?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/ova?page=1');
const data = await resp.json();
console.log(data);Retrieve Original Net Animation (ONA) content.
Endpoint:
GET /api/v2/animes/ona?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/ona?page=1');
const data = await resp.json();
console.log(data);Retrieve special anime episodes.
Endpoint:
GET /api/v2/animes/special?page=:page
Request Example:
const resp = await fetch('/api/v2/animes/special?page=1');
const data = await resp.json();
console.log(data);Retrieve anime events.
Endpoint:
GET /api/v2/animes/events?page=:page
Request Example:
const resp = await fetch('/api/v2/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 startRetrieve latest anime news articles.
Endpoint:
GET /api/v2/news?page=:page
Request Example:
const resp = await fetch('/api/v2/news?page=1');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": {
"news": [
{
"id": "article-id",
"title": "Article Title",
"description": "...",
"thumbnail": "https://...",
"uploadedAt": "2 hours ago"
}
]
}
}Retrieve a random anime ID.
Endpoint:
GET /api/v2/random
Request Example:
const resp = await fetch('/api/v2/random');
const data = await resp.json();
console.log(data);Response Schema:
Example
{
"success": true,
"data": {
"id": "anime-id-123"
}
}Thanks 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 by RY4N