A powerful and fast RestFul API made with Node.js for fetching comprehensive anime information.
- This API does not store any media files. It exclusively links to media hosted on 3rd party services.
- It is explicitly intended for educational purposes only and is not for commercial usage. The repository maintainers are not responsible for any misuse.
- ⚙️ Installation
- ☁️ Deployment
- 📖 Documentation
- GET Home Info
- GET Top 10 Anime's Info
- GET Top Search
- GET Specified Anime's Info
- GET Random Anime's Info
- GET Categories Info
- GET Producer's & studio's Anime
- GET Search Result's Info
- GET Search Suggestions
- GET Filter Anime
- GET Anime's Episode List
- GET Anime Schedule
- GET Anime's Next Episode's Schedule
- GET Anime Qtip Info
- GET Anime Characters
- GET Character Details
- GET Voice Actor Details
- GET Streaming Info
- GET Anime Backup Stream Info
- GET Anime Episode's Available Servers
- 🤝 Contributing
- 🐛 Reporting Issues
- ⭐ Support
Make sure you have node installed on your device
- Run the following code to clone the repository and install all required dependencies
$ git clone https://github.com/Shineii86/AnimeAPI.git
$ cd AnimeAPI
$ npm install- Refer the .env.example file to setup
.envfile
# Origins you want to allow
ALLOWED_ORIGIN=<https://site1.com>,<https://site2.com>,...- Start the server
$ npm start #or npm run devStartHost your own instance of AnimeAPI on vercel
Host your own instance of AnimeAPI on Render.
GET /api/ /api/import axios from "axios";
const resp = await axios.get("/api/");
console.log(resp.data);{
"success": true,
"results": {
"spotlights": [
{
"id":string,
"data_id": number,
"poster": string,
"title": string,
"japanese_title": string,
"description": string,
"tvInfo": {
"showType": string,
"duration": string,
"releaseDate": string,
"quality": string,
"episodeInfo": [object]
}
},
{...}
],
"trending": [
{
"id":string,
"data_id": number,
"number": number,
"poster": string,
"title": string,
"japanese_title": string,
}
{...}
],
"today":[
"schedule":[
{
"id":string,
"data_id":number,
"title":string,
"japanese_title":string,
"releaseDate":string,
"time":string,
"episode_no":number,
},{...}
]
],
"topAiring":[
{
"id":string,
"data_id":number,
"poster":string,
"title":string,
"japanese_title":string,
"description":string,
tvInfo:[object]
}
],
"mostPopular":[
{
"id":string,
"data_id":number,
"poster":string,
"title":string,
"japanese_title":string,
"description":string,
tvInfo:[object]
},
"mostFavorite":[
{
"id":string,
"data_id":number,
"poster":string,
"title":string,
"japanese_title":string,
"description":string,
tvInfo:[object]
}
],
"latestCompleted":[
{
"id":string,
"data_id":number,
"poster":string,
"title":string,
"japanese_title":string,
"description":string,
tvInfo:[object]
}
],
"latestEpisode":[
{
"id":string,
"data_id":number,
"poster":string,
"title":string,
"japanese_title":string,
"description":string,
tvInfo:[object]
}
],
"genres":[
string,
string,
string,
...
]
}
} GET /api/top-ten /api/top-tenimport axios from "axios";
const resp = await axios.get("/api/top-ten");
console.log(resp.data);{
"success": true,
"results": [
"topTen":[
"today":[
{
"id":string,
"data_id": number,
"number": number,
"name": string,
"poster": string,
"tvInfo": [Object]
},
{...}
],
"week":[
{
"id":string,
"data_id": number,
"number": number,
"name": string,
"poster": string,
"tvInfo": [Object]
},
{...}
],
"month":[
{
"id":string,
"data_id": number,
"number": number,
"name": string,
"poster": string,
"tvInfo": [Object]
},
{...}
],
]
]
} GET /api/top-searchimport axios from "axios";
const resp = await axios.get("/api/top-search");
console.log(resp.data);{
"success": true,
"results": [
{
"title": string,
"link": string
},
{...}
]
} GET /api/info /api/info?id={string}| Parameter | Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|---|
id |
query |
string | anime-id | Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get("/api/info?id=yami-shibai-9-17879");
console.log(resp.data);{
"success": true,
"results": {
"data": {
"adultContent":boolean,
"id":string,
"data_id": number,
"title": string,
"japanese_title": string,
"poster": string,
"showType":string,
"animeInfo": {
"Overview": string,
"Japanese": string,
"Synonyms": string,
"Aired": string,
"Premiered": string,
"Duration": string,
"Status": string,
"MAL Score": string,
"Genres": [Object],
"Studios": string,
"Producers": [Object]
}
},
"seasons": [
{
"id":string,
"data_number": number,
"data_id": number,
"season": string,
"title": string,
"japanese_title": string,
"season_poster": string
},
{...}
],
}
} GET /api/random /api/randomimport axios from "axios";
const resp = await axios.get("/api/random");
console.log(resp.data);{
"success": true,
"results": {
"data": {
"adultContent":boolean,
"id":string,
"data_id": number,
"title": string,
"japanese_title": string,
"poster": string,
"showType":string,
"animeInfo": {
"Overview": string,
"Japanese": string,
"Synonyms": string,
"Aired": string,
"Premiered": string,
"Duration": string,
"Status": string,
"MAL Score": string,
"Genres": [Object],
"Studios": string,
"Producers": [Object]
}
},
"related_data":[
[
{
"duration": "string",
"data_id": "number",
"id": "string",
"title": "string",
"japanese_title": "string",
"poster": "string",
"tvInfo": {
"dub": "number",
"sub": "number",
"showType": "string",
"eps": "number"
}
},{...}
]
],
"recommended_data":[
[
{
"duration": "string",
"data_id": "number",
"id": "string",
"title": "string",
"japanese_title": "string",
"poster": "string",
"tvInfo": {
"dub": "number",
"sub": "number",
"showType": "string",
"eps": "number"
}
},{...}
]
],
"seasons": [
{
"id":string,
"data_number": number,
"data_id": number,
"season": string,
"title": string,
"japanese_title": string,
"season_poster": string
},
{...}
],
}
} GET /api/<category> /api/{string}?page={number}
#or
/api/{string}| Parameter | Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|---|
category |
path |
string |
Category |
Yes ✔️ | -- |
page |
query |
number |
Page-no. |
No ❌ | 1 |
- top-airing
- most-popular
- most-favorite
- completed
- recently-updated
- recently-added
- top-upcoming
- subbed-anime
- dubbed-anime
- top-upcoming
- genre/action
- genre/adventure
- genre/cars
- genre/comedy
- genre/dementia
- genre/demons
- genre/drama
- genre/ecchi
- genre/fantasy
- genre/game
- genre/harem
- genre/historical
- genre/horror
- genre/isekai
- genre/josei
- genre/kids
- genre/magic
- genre/martial-arts
- genre/mecha
- genre/military
- genre/music
- genre/mystery
- genre/parody
- genre/police
- genre/psychological
- genre/romance
- genre/samurai
- genre/school
- genre/sci-fi
- genre/seinen
- genre/shoujo
- genre/shoujo-ai
- genre/shounen
- genre/shounen-ai
- genre/slice-of-life
- genre/space
- genre/sports
- genre/super-power
- genre/supernatural
- genre/thriller
- genre/vampire
- az-list
- az-list/other
- az-list/0-9
- az-list/a
- az-list/b
- az-list/c
- az-list/d
- az-list/e
- az-list/f
- az-list/g
- az-list/h
- az-list/i
- az-list/j
- az-list/k
- az-list/l
- az-list/m
- az-list/n
- az-list/o
- az-list/p
- az-list/q
- az-list/r
- az-list/s
- az-list/t
- az-list/u
- az-list/v
- az-list/w
- az-list/x
- az-list/y
- az-list/z
- movie
- special
- ova
- ona
- tv
import axios from "axios";
const resp = await axios.get("/api/most-popular?page=1");
console.log(resp.data);{
"success": true,
"results": {
"totalPages": number,
"data": [
{
"id":string,
"data_id": number,
"poster": string,
"title": string,
"japanese_title": string,
"description": string,
"tvInfo": {
"showType": string,
"duration": string,
"sub": number,
"dub": number
},
"adultContent":boolean,
},
{
"id":string,
"data_id": number,
"poster": string,
"title": string,
"japanese_title": string,
"description": string,
"tvInfo": {
"showType": sting,
"duration": string,
"sub": number,
"dub": number,
"eps": number
},
"adultContent":boolean,
},
{...}
],
"totalPages":number
}
} GET /api/<producer>/ /api/producer/{string}?page={number}
#or
/api/producer/{string}| Parameter | Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|---|
producer |
path |
string |
Producer |
Yes ✔️ | -- |
page |
query |
number |
Page-no. |
No ❌ | 1 |
import axios from "axios";
const resp = await axios.get("/api/producer/ufotable?page=1");
console.log(resp.data);{
"success": true,
"results": {
"totalPages": number,
"data": [
{
"id":string,
"data_id": number,
"poster": string,
"title": string,
"japanese_title": string,
"description": string,
"tvInfo": {
"showType": string,
"duration": string,
"sub": number,
"dub": number
},
"adultContent":boolean,
},
{
"id":string,
"data_id": number,
"poster": string,
"title": string,
"japanese_title": string,
"description": string,
"tvInfo": {
"showType": sting,
"duration": string,
"sub": number,
"dub": number,
"eps": number
},
"adultContent":boolean,
},
{...}
],
"totalPages":number
}
} GET /api/search /api/search?keyword={string}| Parameter | Parameter-Type | Type | Description | Mandatory ? | Default |
|---|---|---|---|---|---|
keyword |
query |
string |
keyword |
Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get("/api/search?keyword=one%20punch%20man");
console.log(resp.data);{
"success": true,
"results": [
{
"id":string,
"data_id": number,
"poster": string,
"title": string,
"japanese_title": string,
"tvInfo": [Object]
},
{
"id":string,
"data_id": number,
"poster": string,
"title": string,
"japanese_title": string,
"tvInfo": [Object]
},
{...}
]
} GET /api/search/suggest /api/search/suggest?keyword={string}| Parameter | Parameter-Type | Type | Description | Mandatory ? | Default |
|---|---|---|---|---|---|
keyword |
query |
string |
keyword |
Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get("/api/search/suggest?keyword=demon");
console.log(resp.data);{
"success": true,
"results": [
{
"id":"string",
"data_id": number,
"poster": string,
"title": string,
"japanese_title": string,
"releaseDate": string,
"showType": string,
"duration": string,
},
{
"id":"string",
"data_id": number,
"poster": string,
"title": string,
"japanese_title": string,
"releaseDate": string,
"showType": string,
"duration": string,
},
{...}
]
}GET /api/filter/api/filter| Parameter | Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|---|
type |
query |
string | Type of anime (e.g., movie, tv, etc.) |
No ❌ | ALL |
status |
query |
string | Status of anime (e.g., finished, currently_airing, etc.) |
No ❌ | ALL |
rated |
query |
string | Rating of anime (e.g., G, PG, etc.) |
No ❌ | ALL |
score |
query |
string | Score rating (e.g., 1 to 10) |
No ❌ | ALL |
season |
query |
string | Season of anime (e.g., spring, summer, etc.) |
No ❌ | ALL |
language |
query |
string | Language of anime (e.g., sub, dub) |
No ❌ | ALL |
genres |
query |
string | Comma-separated list of genres (e.g., action, comedy) |
No ❌ | ALL |
sort |
query |
string | Sorting method (e.g., default, score, etc.) |
No ❌ | DEFAULT |
page |
query |
number | Page number for pagination | No ❌ | 1 |
sy |
query |
number | Start year | No ❌ | undefined |
sm |
query |
number | Start month | No ❌ | undefined |
sd |
query |
number | Start day | No ❌ | undefined |
ey |
query |
number | End year | No ❌ | undefined |
em |
query |
number | End month | No ❌ | undefined |
ed |
query |
number | End day | No ❌ | undefined |
keyword |
query |
string | Search keyword | No ❌ | undefined |
import axios from "axios";
const params = {
type: "2", // TV
status: "1", // Finished
rated: "5", // R+
sort: "default",
page: 1,
};
const resp = await axios.get("/api/filter", { params });
console.log(resp.data);{
"success": true,
"results": {
"totalPages": number,
"data": [
{
"id": string,
"data_id": number,
"poster": string,
"title": string,
"japanese_title": string,
"description": string,
"tvInfo": {
"showType": string,
"duration": string,
"sub": number,
"dub": number
},
"adultContent": boolean
},
{...}
]
}
} GET /api/episodes/ /api/episodes/{param}| Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|
param |
string | anime-id | Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get("/api/episodes/one-piece-100");
console.log(resp.data);{
"success": true,
"results": [
"totalEpisodes":number,
"episodes":[
{ "episode_no": number,
"id": string,
"data_id": number,
"jname": string,
"title": string,
"japanese_title": string
},
{...}
]
]
} GET /api/schedule /api/schedule?date={string}| Parameter | Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|---|
date |
query | string | date | Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get("/api/schedule?date=2024-09-23");
console.log(resp.data);{
"success": true,
"results": [
{
"id":string,
"data_id":number,
"title":string,
"japanese_title":string,
"releaseDate":string,
"time":string,
"episode_no":number
},
{...}
]
} GET /api/schedule/ /api/schedule/:id| Parameter | Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|---|
id |
param | string | anime-id | Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get("/api/schedule/one-piece-100");
console.log(resp.data);{
"success":true,
"results":
{
"nextEpisodeSchedule":"2025-02-08 16:30:00"
}
} GET /api/qtip/ /api/qtip/{id}| Parameter | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|
param |
number |
id | Yes ✔️ | Yes ✔️ |
import axios from "axios";
const resp = await axios.get("/api/qtip/3365");
console.log(resp.data);{
"success": true,
"results": {
"title": string,
"rating": double,
"quality": string,
"subCount": number,
"dubCount": number,
"episodeCount": number,
"type": string,
"description": string,
"japaneseTitle": string,
"Synonyms": string,
"airedDate": string,
"status": string,
"genres": [Object],
"watchLink": string
}
} GET /api/character/list/ /api/character/list/{id}| Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|
param |
string |
anime-id | Yes ✔️ | Yes ✔️ |
import axios from "axios";
const resp = await axios.get("/api/character/list/one-piece-100");
console.log(resp.data);{
"success": true,
"results": {
"currentPage": number,
"totalPages": number,
"data": [
{
"character": {
"id": string,
"poster": string,
"name": string,
"cast": string
},
"voiceActors": [
{
"id": string,
"poster": string,
"name": string
},
{
"id": string,
"poster": string,
"name": string
},
{...}
]
},{...}
]
}
} GET /api/stream /api/stream?id={string}&server={string}&type={string}| Parameters | Parameter-Type | Type | Mandatory ? | Default |
|---|---|---|---|---|
id , server , type |
query |
string |
Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get(
"/api/stream?id=frieren-beyond-journeys-end-18542?ep=107257&server=hd-1&type=sub"
);
console.log(resp.data);{
"success": true,
"results": {
"streamingLink": [
{
"id":number,
"type": "sub",
"link": {
"file":string,
"type":string,
},
"tracks": [
{
"file": string,
"label": string,
"kind": string,
"default": boolean
},{...}
],
"intro": [Object],
"outro": [Object],
"server":string
}
],
"servers": [
{
"type":string,
"data_id": number,
"server_id": number,
"server_name": string
},
{...}
]
}
}
GET /api/stream/fallback /api/stream/fallback?id={string}&server={string}&type={string}| Parameters | Parameter-Type | Type | Mandatory ? | Default |
|---|---|---|---|---|
id , server , type |
query |
string |
Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get(
"/api/stream/fallback?id=frieren-beyond-journeys-end-18542?ep=107257&server=hd-1&type=sub"
);
console.log(resp.data);{
"success": true,
"results": {
"streamingLink": [
{
"id":number,
"type": "sub",
"link": {
"file":string,
"type":string,
},
"tracks": [
{
"file": string,
"label": string,
"kind": string,
"default": boolean
},{...}
],
"intro": [Object],
"outro": [Object],
"server":string
}
],
"servers": [
{
"type":string,
"data_id": number,
"server_id": number,
"server_name": string
},
{...}
]
}
} GET /api/servers/ /api/servers/{id}| Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|
params |
string |
keyword |
Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get(
"/api/servers/demon-slayer-kimetsu-no-yaiba-hashira-training-arc-19107?ep=124260"
);
console.log(resp.data);{
"success": true,
"results": [
{
"type": string,
"data_id": number,
"server_id": number,
"serverName": string
},
{...},
]
} GET /api/character/ /api/character/{id}| Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|
params |
string |
character-id | Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get("/api/character/asta-340");
console.log(resp.data);{
"success": true,
"results": {
"data": [{
"id": "asta-340",
"name": "Asta",
"profile": "https://cdn.noitatnemucod.net/thumbnail/400x400/100/945515d313d02fdcd33be3085512c550.jpg",
"japaneseName": "アスタ",
"about": {
"description": "Asta is the main protagonist of Black Clover...",
"style": "<p>Asta is the main protagonist of Black Clover...</p>"
},
"voiceActors": [
{
"name": "Kajiwara, Gakuto",
"profile": "https://example.com/profile.jpg",
"language": "Japanese",
"id": "gakuto-kajiwara-534"
},
{
"name": "Dallas Reid",
"profile": "https://example.com/profile2.jpg",
"language": "English",
"id": "dallas-reid-892"
}
],
"animeography": [
{
"title": "Black Clover",
"id": "2404",
"role": "Main",
"type": "TV",
"poster": "https://example.com/poster.jpg"
},
{
"title": "Black Clover: Sword of the Wizard King",
"id": "2405",
"role": "Main",
"type": "Movie",
"poster": "https://example.com/poster2.jpg"
}
]
}]
}
} GET /api/actors/ /api/actors/{id}| Parameter-Type | Data-Type | Description | Mandatory ? | Default |
|---|---|---|---|---|
params |
string |
voice-actor-id | Yes ✔️ | -- |
import axios from "axios";
const resp = await axios.get("/api/actors/gakuto-kajiwara-534");
console.log(resp.data);{
"success": true,
"results": {
"data": [{
"id": "gakuto-kajiwara-534",
"name": "Kajiwara, Gakuto",
"profile": "https://cdn.noitatnemucod.net/thumbnail/400x400/100/945515d313d02fdcd33be3085512c550.jpg",
"japaneseName": "梶原岳人",
"about": {
"description": "Kajiwara Gakuto is a Japanese voice actor...",
"style": "<p>Kajiwara Gakuto is a Japanese voice actor...</p>"
},
"roles": [
{
"anime": {
"title": "Black Clover",
"poster": "https://example.com/poster.jpg",
"type": "TV",
"year": "2017",
"id": "black-clover"
},
"character": {
"name": "Asta",
"profile": "https://example.com/asta.jpg",
"role": "Main"
}
},
// ... more roles ...
]
}]
}
}Contributions are welcome! Feel free to:
- 💡 Suggest features or improvements
- 🐛 Report bugs or usability issues
- 🤝 Submit pull requests
-
Fork this repo
-
Create your feature branch:
git checkout -b feature/amazing-feature
-
Commit your changes:
git commit -m "Add amazing feature" -
Push to your branch:
git push origin feature/amazing-feature
-
Open a Pull Request
Please follow the Contributor Covenant Code of Conduct.
This project is licensed under the MIT License. See the LICENSE file for details.
