AnimeAPI (also known as aniApi) is a RESTful API that provides anime relation mapping across multiple anime databases. It mainly focuses on providing relations between anime titles from different databases.
This project was derived on anime-offline-database by manami-project and arm by kawaiioverflow, while adding support for more databases.
This project is primarily licensed under AGPL-3.0-only, unless otherwise stated. Please read more information regarding using the API on your project in Why avoid using AnimeAPI?.
Click to expand
- Why use AnimeAPI?
- Why Avoid Using AnimeAPI?
- Featured on
- Supported Platforms and Aliases
- Statistic
- Usage
- Get status and statistics
- Get latency report
- Get updated date and time
- Get all items in Array
- Fetch all item as TSV (Tab Separated Values) file
- Get All ID in Object/Dictionary format of each provider
- Get All ID in Array/List format of each provider
- Get anime relation mapping data
- Redirect to provider's page
- Schema
- Acknowledgements
Compared to other relation mapping API, AnimeAPI provides more databases yet it's still easy to use. It also provides more data than other relation mapping API, such as the anime title itself.
Also, AnimeAPI uses object/dictionary format instead of array/list for each provider when you want to get individual relation mapping data. This makes it easier and faster to get the data you want since the machine doesn't need to iterate through the array/list to get the data you want, although with the cost of larger repository size.
Below is the comparison between AnimeAPI and other relation mapping API.
Highlights | AnimeAPI | ARM | BQA | Hato | SIMKL | Trakt | AOD | FAL | ALAL | ATIP |
---|---|---|---|---|---|---|---|---|---|---|
License | AGPL-3.0-only, MIT, CC0 | MIT | AGPL-3.0 | Apache-2.0 | Proprietary | Proprietary | AGPL-3.0 | Unknown | Unknown | Unknown |
Access | Public | Public | Public | Paid, API Key | API Key | API Key | Public | Public | Public | Public |
Format | REST, JSON, TSV | Node.js Package, REST, JSON | REST | REST | REST | REST | JSON | JSON | XML | JSON |
Main Languages | Python, JSON | JavaScript, JSON | TypeScript, SQLite | C#, MySQL, PostgreSQL | - | - | JSON | JSON | XLSL, XML | PowerShell, JSON |
Base Data | AOD, ARM, ATIP, FAL |
FAL | AOD, ALAL | aniTrakt | ||||||
Rate Limit | - | - | - | - | 1000/day for unverified | 1000/5 mins | Unapplicable | Unapplicable | Unapplicable | Unapplicable |
Anime Title | ✔ | ❌ | ❌ | ❌ | ✔ | ✔ | ✔ | ❌ | ✔ | ✔ |
✔ | ❌ | ✔ | ✔ | ✔ | ❌ | ✔ | ✔ | ❌ | ❌ | |
✔ | ✔ | ✔ | ✔ | ✔ Result Only | ❌ | ✔ | ✔ | ❌ | ❌ | |
✔ | ❌ | ✔ | ❌ | ✔ Result Only | ❌ | ✔ | ✔ | ❌ | ❌ | |
✔ | ❌ | ✔ | ❌ | ✔ Result Only | ❌ | ✔ | ✔ | ❌ | ❌ | |
✔ | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | |
❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | |
✔ | ❌ | ✔ | ❌ | ✔ | ✔ | ❌ | ✔ | ✔ | ❌ | |
✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | |
✔ | ❌ | ✔ | ✔ | ✔ Result Only | ❌ | ✔ | ✔ | ❌ | ❌ | |
✔ | ❌ | ✔ | ❌ | ✔ Result Only | ❌ | ✔ | ✔ | ❌ | ❌ | |
✔ | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ | ✔ | ❌ | ✔ | |
✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | |
✔ | ❌ | ✔ | ✔ | ❌ | ❌ | ✔ | ✔ | ❌ | ❌ | |
✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | |
✔ | ✔ via MAL | ✔ via MAL | ✔ via MAL | ✔ via MAL | ❌ | ✔ via MAL | ✔ via MAL | ❌ | ✔ via MAL | |
✔ | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | |
✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | |
✔ | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ❌ | ❌ | ❌ | |
✔, only movie | ❌ | ✔, only movie | ❌ | ✔ | ✔ | ❌ | ✔, only movie | ✔, only movie | ❌ | |
✔ | ❌ | ❌ | ❌ | ✔ | ✔ | ❌ | ❌ | ❌ | ✔ | |
❌ | ❌ | ❌ | ❌ | ✔ | ✔ | ❌ | ✔ | ✔ | ❌ | |
❌ | ❌ | ❌ | ❌ | ✔ via TVDB | ✔ via TVDB | ❌ | ✔ via TVDB | ✔ via TVDB | ❌ |
- ALAL: Anime-Lists/anime-lists
- AOD: manami-project/anime-offline-database
- ARM: kawaiioverflow/arm
- ATIP: ryuuganime/aniTrakt-IndexParser
- BQA: BeeeQueue/arm-server
- FAL: Fribb/anime-lists
AnimeAPI is licensed under the AGPL-3.0-only, primarily because it's derived from the manami-project/anime-offline-database. We strongly discourage integrating this project into your own if you intend to maintain a permissive licensing model for your work.
There is an alternative approach you can consider. You could make your project closed-source and set up a private instance of AnimeAPI for your specific use. However, it's essential to recognize that this approach raises ethical considerations, and we recommend proceeding with caution while also exploring other options or alternatives.
It's worth noting that there are exceptions to this rule, particularly regarding
the raw files from original sources. The scraper scripts for Kaize, Nautiljon,
and Otak-Otaku are licensed under the MIT license, and the raw JSON files they
generate are licensed under the CC0 license instead. You are free to use these
files and build your own database with them. For more information, please refer
to database/raw/README.md
.
Do you want to integrate AnimeAPI into your project? Or do you want to see how AnimeAPI is used in other projects and their use cases? Check out the list below!
Tip
If you want to add your project to this list, please open a pull request adding your project to the table below. Please make sure to add a short description of your project and a link to your project's homepage.
Package Name | Language | Package Link | Description |
---|---|---|---|
animeapi-py |
Python | pypi | A Python wrapper for AnimeAPI with type hinting and additional async support |
Name | Language | Homepage | Description |
---|---|---|---|
Ryuuzaki Ryuusei | Python | GitHub | A Discord bot that uses AnimeAPI to fetch anime maps |
animeManga-autoBackup | Powershell, Python | GitHub | A script that uses AnimeAPI to get info one of your anime/manga lists and save it to a file |
Hikaru Aegis (codename) | Python | GitHub | Rewrite of animeManga-autoBackup in Python |
AnimeAPI supported following sites for media lookup. You can use this as an alias cheatsheet as well.
Note
- The aliases are case-insensitive. You can use any of the aliases to get the data you want.
- 2K is the two-letter abbreviation for the platform.
Platform | 2K | Aliases |
---|---|---|
anidb |
ad |
adb , anidb.net |
anilist |
al |
anilist.co |
animeplanet |
ap |
anime-planet.com anime-planet , animeplanet.com |
anisearch |
as |
anisearch.com , anisearch.de , anisearch.it , anisearch.es , anisearch.fr , anisearch.jp |
annict |
ac |
anc , act , annict.com , annict.jp , en.annict.com |
imdb |
im |
imdb.com |
kaize |
kz |
kaize.io |
kitsu |
kt |
kts , kitsu.io , kitsu.app |
livechart |
lc |
livechart.me |
myanimelist |
ma |
mal , myanimelist.net |
nautiljon |
nj |
ntj , nautiljon.com |
notify |
nf |
ntf , ntm , notifymoe , notify.moe |
otakotaku |
oo |
otakotaku.com |
shikimori |
sh |
shiki , shk , shikimori.me , shikimori.one , shikimori.org |
shoboi |
sb |
shb , syb , shobocal , syoboi , syobocal , cal.syoboi.jp |
silveryasha |
sy |
dbti , db.silveryasha.id , db.silveryasha.web.id |
simkl |
sm |
smk , simkl.com , animecountdown , animecountdown.com |
themoviedb |
tm |
tmdb , themoviedb.org |
trakt |
tr |
trk , trakt.tv |
So far, AnimeAPI has indexed data from 17 databases, with details as follows:
Last updated: 23 March 2025 05:17:22 UTC
Platform | Count |
---|---|
aniDB | 13720 |
AniList | 21135 |
Anime-Planet | 24573 |
aniSearch | 19546 |
Annict | 11619 |
IMDb | 2271 |
Kaize | 23161 |
Kitsu | 20951 |
LiveChart | 11637 |
MyAnimeList | 28660 |
Nautiljon | 8534 |
Notify.moe | 16671 |
Otak Otaku | 2885 |
Shikimori | 28660 |
Shoboi/Syobocal | 5246 |
Silver Yasha | 4712 |
SIMKL | 13685 |
The Movie Database | 577 |
Trakt | 4928 |
Total | 35331 |
To use this API, you can access the following base URLs:
-
Latest/v3:
GET https://animeapi.my.id
All requests must be GET
, and response always will be in JSON format.
MIME Type: application/json
GET /status
Response example
{
"mainrepo": "https://github.com/nattadasu/animeApi/tree/v3",
"updated": {
"timestamp": 1742707042,
"iso": "2025-03-23T05:17:22.621082+00:00"
},
"contributors": [
"nattadasu"
],
"sources": [
"kawaiioverflow/arm",
"manami-project/anime-offline-database",
"rensetsu/db.rensetsu.public-dump",
"rensetsu/db.trakt.anitrakt",
"https://kaize.io",
"https://nautiljon.com",
"https://otakotaku.com"
],
"license": "AGPL-3.0-only AND MIT AND CC0-1.0+",
"website": "https://animeapi.my.id",
"counts": {
"anidb": 13720,
"anilist": 21135,
"animeplanet": 24573,
"anisearch": 19546,
"annict": 11619,
"imdb": 2271,
"kaize": 23161,
"kitsu": 20951,
"livechart": 11637,
"myanimelist": 28660,
"nautiljon": 8534,
"notify": 16671,
"otakotaku": 2885,
"shikimori": 28660,
"shoboi": 5246,
"silveryasha": 4712,
"simkl": 13685,
"themoviedb": 577,
"trakt": 4928,
"total": 35331
},
"endpoints": {
"$comment": "The endpoints are stated in Python regex format. Platform aliases supported for direct lookup for platform specific endpoints (see ?P<alias> in regex).",
"anidb": "/(?P<alias>anidb)/(?P<media_id>\\d+)",
"anilist": "/(?P<alias>anilist)/(?P<media_id>\\d+)",
"animeapi_dump": "/(anime(?:a|A)pi|aa)(?:\\\\\\.json)?",
"animeapi_tsv": "/(anime(?:a|A)pi|aa).tsv",
"animeplanet": "/(?P<alias>animeplanet)/(?P<media_id>[\\w\\-]+)",
"anisearch": "/(?P<alias>anisearch)/(?P<media_id>\\d+)",
"annict": "/(?P<alias>annict)/(?P<media_id>\\d+)",
"heartbeat": "/(heartbeat|ping)",
"imdb": "/(?P<alias>imdb)/(?P<media_id>tt[\\d]+)",
"kaize": "/(?P<alias>kaize)/(?P<media_id>[\\w\\-]+)",
"kitsu": "/(?P<alias>kitsu)/(?P<media_id>\\d+)",
"livechart": "/(?P<alias>livechart)/(?P<media_id>\\d+)",
"myanimelist": "/(?P<alias>myanimelist)/(?P<media_id>\\d+)",
"nautiljon": "/(?P<alias>nautiljon)/(?P<media_id>[\\w\\+!\\-_\\(\\)\\[\\]]+)",
"notify": "/(?P<alias>notify)/(?P<media_id>[\\w\\-_]+)",
"otakotaku": "/(?P<alias>otakotaku)/(?P<media_id>\\d+)",
"platform_dump": "/(?P<alias>[\\w\\-]+)(?:\\\\\\.json)?",
"redirect": "/(redirect|rd)",
"repo": "/",
"schema": "/schema(?:\\\\\\.json)?",
"shikimori": "/(?P<alias>shikimori)/(?P<media_id>\\d+)",
"shoboi": "/(?P<alias>shoboi)/(?P<media_id>\\d+)",
"silveryasha": "/(?P<alias>silveryasha)/(?P<media_id>\\d+)",
"simkl": "/(?P<alias>simkl)/(?P<media_id>\\d+)",
"status": "/status",
"syobocal": "/(?P<alias>syobocal)/(?P<media_id>\\d+)",
"themoviedb": "/(?P<alias>themoviedb)/movie/(?P<media_id>\\d+)",
"trakt": "/(?P<alias>trakt)/(?P<media_type>show|movie)(s)?/(?P<media_id>\\d+)(?:/season(s)?/(?P<season_id>\\d+))?",
"updated": "/updated"
}
}
MIME Type: application/json
GET /heartbeat
Response example
{
"status": "OK",
"code": 200,
"response_time": "0.000s",
"request_time": "0.000s",
"request_epoch": 1626682566.0,
}
MIME Type: text/plain
GET /updated
Response example
Updated on 03/23/2025 05:17:22 UTC
HTTP Status Code: 302
(redirect to GitHub raw file URL)
MIME Type: application/json
GET /animeApi.json
or
GET /aa.json
Tip
Use this endpoint if you want to import the data to spreadsheet.
MIME Type: text/tab-separated-values
GET /animeApi.tsv
or
GET /aa.tsv
HTTP Status Code: 302
(redirect to GitHub raw file URL)
MIME Type: application/json
GET /:platform.json
:platform
can be one of the following listed in
Supported Platforms and Aliases.
HTTP Status Code: 302
(redirect to GitHub raw file URL)
MIME Type: application/json
GET /:platform().json
:platform
can be one of the following listed in
Supported Platforms and Aliases.
Note
The ()
in the endpoint is not a typo, it's part of the endpoint.
If you can't access the endpoint, try to encode the ()
to %28%29
.
MIME Type: application/json
GET /:platform/:mediaid
:platform
can be one of the following listed in Supported Platforms and Aliases.:mediaid
is the ID of the anime in the platform.- To use
kitsu
,simkl
,shikimori
,themoviedb
, andtrakt
path, please read additional information in # Provider exclusive rules before proceeding to avoid unwanted error.
Response example
GET https://animeapi.my.id/myanimelist/1
{
"title": "Cowboy Bebop",
"anidb": 23,
"anilist": 1,
"animeplanet": "cowboy-bebop",
"anisearch": 1572,
"annict": 360,
"imdb": null,
"kaize": "cowboy-bebop",
"kaize_id": 265,
"kitsu": 1,
"livechart": 3418,
"myanimelist": 1,
"nautiljon": null,
"nautiljon_id": null,
"notify": "Tk3ccKimg",
"otakotaku": 1149,
"shikimori": 1,
"shoboi": 538,
"silveryasha": 2652,
"simkl": 37089,
"themoviedb": null,
"trakt": 30857,
"trakt_type": "shows",
"trakt_season": 1
}
kitsu
ID must in numerical value. If your application obtained slug as ID
instead, you can resolve/convert it to ID using following Kitsu API endpoint:
GET https://kitsu.app/api/edge/anime?filter[slug]=<ID>
For example, if you want to get anime data from Kitsu with slug cowboy-bebop
,
you can use the following endpoint:
GET https://kitsu.app/api/edge/anime?filter[slug]=cowboy-bebop
The response will be in JSON format, and you can get the ID from data[0].id
Note
Also applicable to AnimeCountdown
simkl
ID is only applicable for media entries in Anime category.
shikimori
IDs are basically the same as myanimelist
IDs. If you get a 404
status code, remove any alphabetical prefix from the ID and try again.
For example: z218
→ 218
For The Movie DB (TMDB), the ID is in the format of :provider/:mediatype/:mediaid
where :mediatype
is only movie
and :mediaid
is the ID of the title in the
provider instead of typical :provider/:mediaid
format.
For Trakt, the ID is in the format of :provider/:mediatype/:mediaid
where
:mediatype
is either movies
or shows
and :mediaid
is the ID of the title
in the provider instead of typical :provider/:mediaid
format.
An ID on Trakt must in numerical value. If your application obtained slug as ID instead, you can resolve/convert it to ID using following Trakt API endpoint:
GET https://api.trakt.tv/search/trakt/<ID>?type=<movie|show>
Note
The Trakt API requires an API key to access the endpoint. You can get the API key by registering on the Trakt website.
To get exact season mapping, append /seasons/:season_inc
to the end of the ID,
where :season_inc
is the season number of the title in the provider.
Warning
/seasons/0
is invalid, and will return 400
status code.
For example, to get the ID of Mairimashita Iruma-kun Season 3, you can use:
GET https://animeapi.my.id/trakt/shows/152334/seasons/3
Response example from Trakt
{
"title": "Mairimashita! Iruma-kun 3rd Season",
"anidb": 16627,
"anilist": 139092,
"animeplanet": "welcome-to-demon-school-iruma-kun-3",
"anisearch": 16582,
"annict": 8883,
"imdb": null,
"kaize": "mairimashita-iruma-kun-3rd-season",
"kaize_id": 4989,
"kitsu": 45154,
"livechart": 10780,
"myanimelist": 49784,
"nautiljon": null,
"nautiljon_id": null,
"notify": "Okl9YtInR",
"otakotaku": null,
"shikimori": 49784,
"shoboi": 6489,
"silveryasha": 3702,
"simkl": 1728821,
"themoviedb": null,
"trakt": 152334,
"trakt_type": "shows",
"trakt_season": 3
}
HTTP Status Code: 302
OR 200
(if required)
MIME Type: None OR text/plain
(if required)
GET /redirect?platform=:platform&mediaid=:mediaid&target=:platform
or
GET /rd?from=:platform&id=:mediaid&to=:platform
-
:platform
can be one of the following listed in Supported Platforms and Aliases.Additionally, on
target
/to
parameter, there are additional supported platforms, and can't be used as source/from
due to some limitations:Platform 2K Aliases Additional Notes kurozora
kr
krz
,kurozora.app
Requires Kurozora+ subscription and MAL ID letterboxd
lb
letterboxd.com
Only available for movies, requires TMDB ID myanili
my
myani.li
Requires MAL ID; a web app to manage list -
:mediaid
is the ID of the anime in the platform. Please follow the instruction written in Provider exclusive rules to avoid any conflict during redirection.
In AnimeAPI, we use query parameters to specify the output of the API. The query parameters are as follows:
Parameter | Aliases | Is Required | Description |
---|---|---|---|
platform |
from , f |
Yes | The platform you want to get the data from. |
mediaid |
id , i |
Yes | The ID of the anime in the platform. |
target |
to , t |
No | The platform you want to redirect to. If you don't specify this parameter, the API will redirect to specified platform's homepage. |
israw |
raw , r |
No | As long as this parameter is present, the API will return the raw URL instead of redirecting. |
GET https://animeapi.my.id/redirect?platform=myanimelist&mediaid=1&target=trakt
HTTP/1.1 302 Found
Location: https://trakt.tv/shows/30857/seasons/1
GET https://animeapi.my.id/rd?from=al&id=154587&to=shk
HTTP/1.1 302 Found
Location: https://shikimori.me/animes/52991
There is no exclusive rule in this, as AnimeAPI will automatically understand your query
GET https://animeapi.my.id/redirect?platform=trakt&mediaid=shows/152334/seasons/3&target=myanimelist
HTTP/1.1 302 Found
Location: https://myanimelist.net/anime/49784
GET https://animeapi.my.id/redirect?platform=animeplanet&mediaid=cells-at-work&target=simkl&israw
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
https://simkl.com/anime/757695
If you want to validate the response from the API, you can use the following schema in JSON Schema, TypeScript, or Python Dataclass.
Add the following schema URI to your JSON file.
{ "$schema": "https://animeapi.my.id/schema.json" }
Click to expand, if you want to see the content of the schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"anime": {
"$comment": "Interface: Anime",
"additionalProperties": false,
"dependencies": {
"themoviedb_type": {
"properties": {
"themoviedb_season": {
"type": "number"
}
},
"required": [
"themoviedb_season"
]
},
"trakt_type": {
"properties": {
"trakt_season": {
"type": "number"
}
},
"required": [
"trakt_season"
]
}
},
"description": "Schema for anime",
"properties": {
"anidb": {
"$ref": "#/definitions/numbernull",
"description": "aniDB ID, website: https://anidb.net/",
"title": "aniDB"
},
"anilist": {
"$ref": "#/definitions/numbernull",
"description": "AniList ID, website: https://anilist.co/",
"title": "AniList"
},
"animeplanet": {
"$ref": "#/definitions/stringnull",
"description": "Anime-Planet slug, website: https://www.anime-planet.com/",
"pattern": "^[a-z0-9\\-]+$",
"title": "Anime-Planet"
},
"anisearch": {
"$ref": "#/definitions/numbernull",
"description": "AniSearch ID, website: https://www.anisearch.com/, https://anisearch.de, https://anisearch.it, https://anisearch.es, https://anisearch.fr, https://anisearch.jp",
"title": "AniSearch"
},
"annict": {
"$ref": "#/definitions/numbernull",
"description": "Annict ID, website: https://annict.com/, https://en.annict.com/, https://annict.jp/",
"title": "Annict"
},
"imdb": {
"$ref": "#/definitions/stringnull",
"description": "IMDb ID, website: https://www.imdb.com/",
"pattern": "^tt[\\d]+$",
"title": "IMDb"
},
"kaize": {
"$ref": "#/definitions/stringnull",
"description": "Kaize slug, website: https://kaize.io/",
"pattern": "^[a-z0-9\\-]+$",
"title": "Kaize"
},
"kaize_id": {
"$ref": "#/definitions/numbernull",
"description": "Kaize ID in integer format, not recommended as some entry can't be found its ID compared to slug",
"title": "Kaize ID"
},
"kitsu": {
"$ref": "#/definitions/numbernull",
"description": "Kitsu ID in integer, slug not suppported, website: https://kitsu.app/",
"title": "Kitsu"
},
"livechart": {
"$ref": "#/definitions/numbernull",
"description": "LiveChart ID, website: https://www.livechart.me/",
"title": "LiveChart"
},
"myanimelist": {
"$ref": "#/definitions/numbernull",
"description": "MyAnimeList ID, website: https://myanimelist.net/",
"title": "MyAnimeList"
},
"nautiljon": {
"$ref": "#/definitions/stringnull",
"description": "Nautiljon slug in plus, website: https://www.nautiljon.com/",
"title": "Nautiljon"
},
"nautiljon_id": {
"$ref": "#/definitions/numbernull",
"description": "Nautiljon ID in integer format, used internally",
"title": "Nautiljon ID"
},
"notify": {
"$ref": "#/definitions/stringnull",
"description": "Notify.moe Base64 ID, website: https://notify.moe/",
"pattern": "^[a-zA-Z0-9\\-\\_]+$",
"title": "Notify.moe"
},
"otakotaku": {
"$ref": "#/definitions/numbernull",
"description": "Otak Otaku ID, website: https://otakotaku.com/",
"title": "Otak Otaku"
},
"shikimori": {
"$ref": "#/definitions/numbernull",
"description": "Shikimori ID (nonprefixed), based on MyAnimeList ID. Remove prefix if found on the ID, website: https://shikimori.one/",
"title": "Shikimori/Шикимори"
},
"shoboi": {
"$ref": "#/definitions/numbernull",
"description": "Shoboi ID, website: http://cal.syoboi.jp/",
"title": "Shoboi/Syobocal/しょぼいカレンダー"
},
"silveryasha": {
"$ref": "#/definitions/numbernull",
"description": "Silveryasha ID, website: https://db.silveryasha.id/",
"title": "Silveryasha"
},
"simkl": {
"$ref": "#/definitions/numbernull",
"description": "SIMKL ID, website: https://simkl.com/",
"title": "SIMKL"
},
"themoviedb": {
"$ref": "#/definitions/numbernull",
"description": "The Movie Database ID, website: https://www.themoviedb.org/",
"title": "The Movie Database (TMDB)"
},
"themoviedb_season": {
"$ref": "#/definitions/numbernull",
"description": "The Movie Database season number, only used if themoviedb_type is 'shows', else null",
"title": "The Movie Database (TMDB) Season"
},
"themoviedb_type": {
"$ref": "#/definitions/themoviedbtype",
"description": "The Movie Database type, either 'movie' or 'tv'",
"title": "The Movie Database (TMDB) Type"
},
"title": {
"description": "Title of the anime",
"title": "Title",
"type": "string"
},
"trakt": {
"$ref": "#/definitions/numbernull",
"description": "Trakt ID, slug not supported, website: https://trakt.tv/",
"title": "Trakt"
},
"trakt_season": {
"$ref": "#/definitions/numbernull",
"description": "Trakt season number, only used if trakt_type is 'shows', else null",
"title": "Trakt Season"
},
"trakt_type": {
"$ref": "#/definitions/trakttype",
"description": "Trakt type, either 'movies' or 'shows'",
"title": "Trakt Type"
}
},
"required": [
"title",
"anidb",
"anilist",
"animeplanet",
"anisearch",
"annict",
"imdb",
"kaize",
"kaize_id",
"kitsu",
"livechart",
"myanimelist",
"nautiljon",
"nautiljon_id",
"notify",
"otakotaku",
"shikimori",
"shoboi",
"silveryasha",
"simkl",
"themoviedb",
"trakt",
"trakt_type",
"trakt_season"
],
"title": "Anime Schema",
"type": "object"
},
"numbernull": {
"$comment": "Type: number or null",
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"description": "Type: this field value is either number or null",
"title": "Number or Null"
},
"stringnull": {
"$comment": "Type: string or null",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Type: this field value is either string or null",
"title": "String or Null"
},
"themoviedbtype": {
"$comment": "Type: 'movie', 'tv', or null",
"anyOf": [
{
"enum": [
"movie",
"tv"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Type: this field value is either an enum of['movie', 'tv'], or null",
"title": "The Movie Database Type"
},
"trakttype": {
"$comment": "Type: 'movies', 'shows', or null",
"anyOf": [
{
"enum": [
"movies",
"shows"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Type: this field value is either an enum of['movies', 'shows'], or null",
"title": "Trakt Type"
}
},
"description": "This schema is used to validate the JSON response from AnimeAPI V3. Schema is not backward compatible with previous versions. Website: https://animeapi.my.id",
"oneOf": [
{
"$comment": "Use this schema if you want to validate an array of anime",
"description": "Schema for array of anime",
"items": {
"$ref": "#/definitions/anime"
},
"title": "Array of Anime",
"type": "array"
},
{
"$comment": "Use this schema if you want to validate an object known in each provider",
"description": "Schema for anime object",
"oneOf": [
{
"$ref": "#/definitions/anime"
},
{
"additionalProperties": {
"$ref": "#/definitions/anime"
}
}
],
"title": "Anime Object",
"type": "object"
}
],
"title": "JSON Schema for AnimeAPI V3"
}
You can also read human-readable schema in JSON Schema if you want to create your own wrapper.
Click to expand
type StringNull = string | null;
type NumberNull = number | null;
// type TmdbType = "movie" | "tv" | null;
type TraktType = "movies" | "shows" | null;
interface Anime = {
title: string; // Required, title of the anime
anidb: NumberNull;
anilist: NumberNull;
animeplanet: StringNull; // Slug based
anisearch: NumberNull;
annict: NumberNull;
imdb: StringNull; // ttXXXXXXX format
kaize: StringNull; // Slug based
kaize_id: NumberNull; // int counterpart of Kaize slug, not recommended
kitsu: NumberNull; // Kitsu ID, slug is not supported
livechart: NumberNull;
myanimelist: NumberNull;
nautiljon: StringNull; // Plus Slug based
nautiljon_id: NumberNull; // int counterpart of Nautiljon slug, used internally
notify: StringNull; // Base64 based
otakotaku: NumberNull;
simkl: NumberNull;
shikimori: NumberNull;
shoboi: NumberNull;
silveryasha: NumberNull;
themoviedb: NumberNull;
// themoviedb_type: TmdbType; // Not supported yet
// themoviedb_season: NumberNull; // Not supported yet
trakt: NumberNull; // Trakt ID, slug is not supported
trakt_type: TraktType;
trakt_season: NumberNull;
}
// Array/List format
type AnimeList = Anime[];
// Object/Dictionary format
type AnimeObject = {
[key: string]: Anime;
}
Click to expand
from enum import Enum
from typing import Dict, List, Literal, Optional
StringNull = Optonal[str]
NumberNull = Optional[int]
# TmdbType = Optional[Literal["movie", "tv"]]
TraktType = Optional[Literal["shows", "movies"]]
@dataclass
class Anime:
title: str # Required, title of the anime
anidb: NumberNull
anilist: NumberNull
animeplanet: StringNull # Slug based
anisearch: NumberNull
annict: NumberNull
imdb: StringNull # ttXXXXXXX format
kaize: StringNull # Slug based
kaize_id: NumberNull # int counterpart of Kaize slug, not recommended
kitsu: NumberNull # Kitsu ID, slug is not supported
livechart: NumberNull
myanimelist: NumberNull
nautiljon: StringNull # Plus Slug based
nautijlon_id: NumberNull # int counterpart of Nautiljon slug, used internally
notify: StringNull # Base64 based
otakotaku: NumberNull
simkl: NumberNull
shikimori: NumberNull
shoboi: NumberNull
silveryasha: NumberNull
themoviedb: NumberNull
# themoviedb_type: TmdbType # Not supported yet
# themoviedb_season: NumberNull # Not supported yet
trakt: NumberNull # Trakt ID, slug is currently not supported
trakt_type: TraktType
trakt_season: NumberNull
# Array/List format
anime_list = List[Anime]
# Object/Dictionary format
anime_object = Dict[str, Anime]
This project uses multiple sources to compile the data, including:
- GitHub:kawaiioverflow/arm
- GitHub:manami-project/anime-offline-database
- GitHub:ryuuganime/aniTrakt-IndexParser, which an automatic parser of AniTrakt index page.
- Nautiljon
- Kaize
- Otak Otaku
- Silver-Yasha