A free restful API serving anime information from aniwatch.to
Bug report
Β·
Feature request
NOTE: 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.
-
Clone the repository and move into the directory.
git clone https://github.com/ghoshRitesh12/aniwatch-api.git cd aniwatch-api
-
Install all the dependencies.
npm i #or yarn install
-
Start the server!
npm start #or yarn 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.
The endpoints exposed by the api are listed below with examples that uses the Fetch API, but you can use any http library.
http://localhost:4000/anime/home
const resp = await fetch("http://localhost:4000/anime/home");
const data = await resp.json();
console.log(data);
{
genres: ["Action", "Cars", "Adventure", ...],
latestEpisodeAnimes: [
{
id: string,
name: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
spotlightAnimes: [
{
id: string,
name: string,
jname: string,
poster: string,
description: string,
rank: 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,
},
{...},
],
}
http://localhost:4000/anime/info?id={anime-id}
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
id |
string | The unique anime id (in kebab case). | Yes | -- |
const resp = await fetch(
"http://localhost:4000/anime/info?id=attack-on-titan-112"
);
const data = await resp.json();
console.log(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
}
}
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
},
{...}
]
}
http://localhost:4000/anime/search?q={query}&page={page}
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 |
const resp = await fetch("http://localhost:4000/anime/search?q=titan&page=1");
const data = await resp.json();
console.log(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
}
http://localhost:4000/anime/search/suggest?q={query}
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
q |
string | The search suggestion query. | Yes | -- |
const resp = await fetch(
"http://localhost:4000/anime/search/suggest?q=monster"
);
const data = await resp.json();
console.log(data);
{
suggestions: [
{
id: string,
name: string,
poster: string,
jname: string,
moreInfo: ["Jan 21, 2022", "Movie", "17m"]
},
{...},
],
}
http://localhost:4000/anime/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(
"http://localhost:4000/anime/producer/toei-animation?page=2"
);
const data = await resp.json();
console.log(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,
}
http://localhost:4000/anime/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("http://localhost:4000/anime/genre/shounen?page=2");
const data = await resp.json();
console.log(data);
{
genreName: "Shounen Anime",
animes: [
{
id: string,
name: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
genres: ["Action", "Cars", "Adventure", ...],
topAiringAnimes: [
{
episodes: {
sub: number,
dub: number,
},
id: string,
jname: string,
name: string,
poster: string,
type: string
},
{...},
],
currentPage: 2,
totalPages: 38,
hasNextPage: true
}
http://localhost:4000/anime/{category}?page={page}
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
category |
string | The category of anime. | Yes | -- |
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
page |
number | The page number of the result. | No | 1 |
const resp = await fetch("http://localhost:4000/anime/tv?page=2");
const data = await resp.json();
console.log(data);
{
category: "TV Series Anime",
animes: [
{
id: string,
name: string,
poster: string,
duration: string,
type: string,
rating: string,
episodes: {
sub: number,
dub: number,
}
},
{...},
],
genres: ["Action", "Cars", "Adventure", ...],
top10Animes: {
today: [
{
episodes: {
sub: number,
dub: number,
},
id: string,
name: string,
poster: string,
rank: number
},
{...},
],
month: [...],
week: [...]
},
currentPage: 2,
totalPages: 100,
hasNextPage: true
}
http://localhost:4000/anime/episodes/{animeId}
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
animeId |
string | The unique anime id. | Yes | -- |
const resp = await fetch("http://localhost:4000/anime/episodes/steinsgate-3");
const data = await resp.json();
console.log(data);
{
totalEpisodes: 24,
episodes: [
{
number: 1,
title: "Turning Point",
episodeId: "steinsgate-3?ep=213"
isFiller: false,
},
{...}
]
}
http://localhost:4000/anime/episode-srcs?id={episodeId}&server={server}&category={category}
Parameter | Type | Description | Required? | Default |
---|---|---|---|---|
id |
string | The id of the episode. | Yes | -- |
server |
string | The name of the server. | No | "vidstreaming" |
category |
string | The category of the episode ('sub' or 'dub'). | No | "sub" |
const resp = await fetch(
"http://localhost:4000/anime/episode-srcs?id=steinsgate-3?ep=230&server=vidstreaming&category=dub"
);
const data = await resp.json();
console.log(data);
{
headers: {
Referer: string,
"User-Agent": string,
...
},
sources: [
{
url: string, // .m3u8 hls streaming file
isM3U8: boolean,
quality?: string,
},
{...}
],
subtitles: [
{
lang: "English",
url: string, // .vtt subtitle file
},
{...}
],
}
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, read the CONTRIBUTING.md file.
Don't forget to leave a star π
This project is licensed under the MIT License - see the LICENSE file for more details.