Note
The API has shifted to version 2, thereby naturally introducing breaking changes. If you'd want to use the previous version of this API, then refer to the last stable version.
Important
https://api-aniwatch.onrender.com is only meant to demo the API and has rate-limiting enabled to minimise bandwidth consumption. It is recommended to deploy your own instance for personal use by customizing the api as you need it to be.
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.
Installation
Local
Docker
Envs
Host your instance
Vercel
Render
Documentation
GET Anime Home Page
GET Anime About Info
GET Search Results
GET Search Suggestions
GET Producer Animes
GET Genre Animes
GET Category Animes
GET Estimated Schedules
GET Anime Episodes
GET Anime Episode Servers
GET Anime Episode Streaming Links
Development
Contributors
Thanks
Support
License
Star History
Clone the repository and move into the directory.
git clone https://github.com/ghoshRitesh12/aniwatch-api.gitcd aniwatch-api
Install all the dependencies.
npm i #or yarn install or pnpm i
Start the server!
npm start #or yarn start or pnpm start
Now the server should be running on http://localhost:4000
Docker image is available at GitHub Container Registry.
Run the following commands to pull and run the docker image.
docker pull ghcr.io/ghoshritesh12/aniwatch docker run -p 4000:4000 ghcr.io/ghoshritesh12/aniwatch
The above command will start the server on port 4000. You can access the server at http://localhost:4000 and you can also change the port by changing the -p
option to -p <port>:4000
.
You can also add the -d
flag to run the container in detached mode.
More info can be found in .env.example
file
ANIWATCH_API_PORT
: port number of the aniwatch api
ANIWATCH_API_WINDOW_MS
: duration to track requests for rate limitting (in milliseconds)
ANIWATCH_API_MAX_REQS
: maximum number of requests in the ANIWATCH_API_WINDOW_MS
timeperiod
ANIWATCH_API_CORS_ALLOWED_ORIGINS
: allowed origins, separated by commas and no spaces in between
ANIWATCH_VERCEL_DEPLOYMENT
: required for distinguishing vercel deployment from other ones, set it to true of any other non-zero value
ANIWATCH_API_HOSTNAME
: set this to your api instance's hostname to enable rate limitting, don't have this value if you don't wish to rate limit
Caution
For personal deployments:
If you wanna have rate limitting in your application, then set the ANIWATCH_API_HOSTNAME
env to your deployed instance's hostname, otherwise don't set or have this env at all. If you set this env to an incorrect value, you may face other issues.
Remove the if block from the server.ts
file, spanning from lines 71 to 83.
Deploy your own instance of Aniwatch API on Vercel.
Note
When deploying to vercel, set an env named ANIWATCH_VERCEL_DEPLOYMENT
to true
or any non-zero value, but this env must be present.
Deploy your own instance of Aniwatch API on Render.
The endpoints exposed by the api are listed below with examples that uses the Fetch API, but you can use any http library.
GET
Anime Home Page/api/v2/hianime/home
const resp = await fetch("/api/v2/hianime/home");const data = await resp.json();console.log(data);
{ success: true, data: {genres: ["Action", "Cars", "Adventure", ...],latestEpisodeAnimes: [ {id: string,name: string,poster: string,type: string,episodes: { sub: number, dub: number,} }, {...},],spotlightAnimes: [ {id: string,name: string,jname: string,poster: string,description: string,rank: number,otherInfo: string[],episodes: { sub: number, dub: number,}, }, {...},],top10Animes: { today: [{ episodes: {sub: number,dub: number, }, id: string, name: string, poster: string, rank: number},{...}, ], month: [...], week: [...]},topAiringAnimes: [ {id: string,name: string,jname: string,poster: string, }, {...},],topUpcomingAnimes: [ {id: string,name: string,poster: string,duration: string,type: string,rating: string,episodes: { sub: number, dub: number,} }, {...},],trendingAnimes: [ {id: string,name: string,poster: string,rank: number, }, {...},],mostPopularAnimes: [ {id: string,name: string,poster: string,type: string,episodes: { sub: number, dub: number,} }, {...},],mostFavoriteAnimes: [ {id: string,name: string,poster: string,type: string,episodes: { sub: number, dub: number,} }, {...},],latestCompletedAnimes: [ {id: string,name: string,poster: string,type: string,episodes: { sub: number, dub: number,} }, {...},], }}
? Back to Top
GET
Anime About Info/api/v2/hianime/anime/{animeId}
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
animeId | string | The unique anime id (in kebab case). | Yes | -- |
const resp = await fetch("/api/v2/hianime/anime/attack-on-titan-112");const data = await resp.json();console.log(data);
{ success: true, data: {anime: [ info: {id: string,name: string,poster: string,description: string,stats: { rating: string, quality: string, episodes: {sub: number,dub: number }, type: string, duration: string},promotionalVideos: [ {title: string | undefined,source: string | undefined,thumbnail: string | undefined }, {...},],characterVoiceActor: [ {character: { id: string, poster: string, name: string, cast: string},voiceActor: { id: string, poster: string, name: string, cast: string} }, {...},] } moreInfo: {aired: string,genres: ["Action", "Mystery", ...],status: string,studios: string,duration: string... }],mostPopularAnimes: [ {episodes: { sub: number, dub: number,},id: string,jname: string,name: string,poster: string,type: string }, {...},],recommendedAnimes: [ {id: string,name: string,poster: string,duration: string,type: string,rating: string,episodes: { sub: number, dub: number,} }, {...},],relatedAnimes: [ {id: string,name: string,poster: string,duration: string,type: string,rating: string,episodes: { sub: number, dub: number,} }, {...},],seasons: [ {id: string,name: string,title: string,poster: string,isCurrent: boolean }, {...}] }}
? Back to Top
GET
Search Results# basic example/api/v2/hianime/search?q={query}&page={page}# advanced example/api/v2/hianime/search?q={query}&page={page}&genres={genres}&type={type}&sort={sort}&season={season}&language={sub_or_dub}&status={status}&rated={rating}&start_date={yyyy-mm-dd}&end_date={yyyy-mm-dd}&score={score}
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
q | string | The search query, i.e. the title of the item you are looking for. | Yes | -- |
page | number | The page number of the result. | No | 1 |
type | string | Type of the anime. eg: movie | No | -- |
status | string | Status of the anime. eg: finished-airing | No | -- |
rated | string | Rating of the anime. eg: r+ or pg-13 | No | -- |
score | string | Score of the anime. eg: good or very-good | No | -- |
season | string | Season of the aired anime. eg: spring | No | -- |
language | string | Language category of the anime. eg: sub or sub-&-dub | No | -- |
start_date | string | Start date of the anime(yyyy-mm-dd). eg: 2014-10-2 | No | -- |
end_date | string | End date of the anime(yyyy-mm-dd). eg: 2010-12-4 | No | -- |
sort | string | Order of sorting the anime result. eg: recently-added | No | -- |
genres | string | Genre of the anime, separated by commas. eg: isekai,shounen | No | -- |
[!TIP] For both
start_date
andend_date
, year must be mentioned. If you wanna omit date or month specify0
instead. Eg: omitting date -> 2014-10-0, omitting month -> 2014-0-12, omitting both -> 2014-0-0
// basic exampleconst resp = await fetch("/api/v2/hianime/search?q=titan&page=1");const data = await resp.json();console.log(data);// advanced exampleconst resp = await fetch( "/api/v2/hianime/search?q=girls&genres=action,adventure&type=movie&sort=score&season=spring&language=dub&status=finished-airing&rated=pg-13&start_date=2014-0-0&score=good");const data = await resp.json();console.log(data);
{ success: true, data: {animes: [ {id: string,name: string,poster: string,duration: string,type: string,rating: string,episodes: { sub: number, dub: number,} }, {...},],mostPopularAnimes: [ {episodes: { sub: number, dub: number,},id: string,jname: string,name: string,poster: string,type: string }, {...},],currentPage: 1,totalPages: 1,hasNextPage: false,searchQuery: string,searchFilters: { [filter_name]: [filter_value] ...} }}
? Back to Top
GET
Search Suggestions/api/v2/hianime/search/suggestion?q={query}
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
q | string | The search suggestion query. | Yes | -- |
const resp = await fetch("/api/v2/hianime/search/suggestion?q=monster");const data = await resp.json();console.log(data);
{ success: true, data: {suggestions: [ {id: string,name: string,poster: string,jname: string,moreInfo: ["Jan 21, 2022", "Movie", "17m"] }, {...},] }}
? Back to Top
GET
Producer Animes/api/v2/hianime/producer/{name}?page={page}
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
name | string | The name of anime producer (in kebab case). | Yes | -- |
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
page | number | The page number of the result. | No | 1 |
const resp = await fetch("/api/v2/hianime/producer/toei-animation?page=2");const data = await resp.json();console.log(data);
{ success: true, data: {producerName: "Toei Animation Anime",animes: [ {id: string,name: string,poster: string,duration: string,type: string,rating: string,episodes: { sub: number, dub: number,} }, {...},],top10Animes: { today: [{ episodes: {sub: number,dub: number, }, id: string, name: string, poster: string, rank: number},{...}, ], month: [...], week: [...]},topAiringAnimes: [ {episodes: { sub: number, dub: number,},id: string,jname: string,name: string,poster: string,type: string }, {...},],currentPage: 2,totalPages: 11,hasNextPage: true }}
? Back to Top
GET
Genre Animes/api/v2/hianime/genre/{name}?page={page}
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
name | string | The name of anime genre (in kebab case). | Yes | -- |
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
page | number | The page number of the result. | No | 1 |
const resp = await fetch("/api/v2/hianime/genre/shounen?page=2");const data = await resp.json();console.log(data);
{ success: true, data: {genreName: "Shounen Anime",animes: [ {