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 (Master 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 | Letterboxd | AOD | FAL | ALAL | ATIP |
|---|---|---|---|---|---|---|---|---|---|---|---|
| License | AGPL-3.0-only, MIT, CC0 | MIT | AGPL-3.0 | Apache-2.0 | Proprietary | Proprietary | Proprietary | AGPL-3.0 | Unknown | Unknown | Unknown |
| Access | Public | Public | Public | Paid, API Key | API Key | API Key | API Key | Public | Public | Public | Public |
| Format | REST, JSON, TSV | Node.js Package, REST, JSON | REST | 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 | 1000/day | Unapplicable | Unapplicable | Unapplicable | Unapplicable |
| Anime Title | ✔ | ❌ | ❌ | ❌ | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ | ✔ |
| ✔ | ❌ | ✔ | ✔ | ✔ | ❌ | ❌ | ✔ | ✔ | ❌ | ❌ | |
| ✔ | ✔ | ✔ | ✔ | ✔ Result Only | ❌ | ❌ | ✔ | ✔ | ❌ | ❌ | |
| ✔ | ❌ | ❌ | ❌ | ✔ 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 | ✔ 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
- LBX: Letterboxd
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.
Additionally, since the project is object/key-value based and not array, the relation assumed by AnimeAPI is the same across database, where in fact it's not the case, especially with heavily moderated databases like AniDB, AniList, and Anime News Network. So, for any episode 0/prequel, specials, OVAs, movies, or older titles might get incorrect relationship.
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.
Important
- 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 |
animenewsnetwork |
an |
ann, animenewsnetwork.com |
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 |
letterboxd |
lb |
lx, letterboxd.com |
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 |
thetvdb |
tv |
thetvdb.com, thetvdb, tvtime, tt, tvtime.com |
trakt |
tr |
trk, trakt.tv |
So far, AnimeAPI has indexed data from 19 databases, with details as follows:
Last updated: 23 October 2025 05:14:55 UTC
| Platform | Count |
|---|---|
| aniDB | 13988 |
| AniList | 21615 |
| Anime News Network | 11930 |
| Anime-Planet | 26160 |
| aniSearch | 20128 |
| Annict | 12184 |
| IMDb | 5723 |
| Kaize | 24742 |
| Kitsu | 21384 |
| Letterboxd | 1295 |
| LiveChart | 11834 |
| MyAnimeList | 29354 |
| Nautiljon | 8845 |
| Notify.moe | 16822 |
| Otak Otaku | 2998 |
| Shikimori | 29354 |
| Shoboi/Syobocal | 5428 |
| Silver Yasha | 5091 |
| SIMKL | 13973 |
| The Movie Database | 5337 |
| The TVDB | 3697 |
| Trakt | 5028 |
| Total | 38551 |
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 /statusResponse example
{
"mainrepo": "https://github.com/nattadasu/animeApi/tree/v3",
"updated": {
"timestamp": 1761196495,
"iso": "2025-10-23T05:14:55.273896+00:00"
},
"contributors": [
"nattadasu",
"Copilot"
],
"sources": [
"gh:kawaiioverflow/arm",
"gh:manami-project/anime-offline-database",
"gh:rensetsu/db.rensetsu.public-dump",
"gh:rensetsu/db.trakt.extended-anitrakt",
"gh:Fribb/anime-lists",
"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": 13988,
"anilist": 21615,
"animenewsnetwork": 11930,
"animeplanet": 26160,
"anisearch": 20128,
"annict": 12184,
"imdb": 5723,
"kaize": 24742,
"kitsu": 21384,
"letterboxd": 1295,
"livechart": 11834,
"myanimelist": 29354,
"nautiljon": 8845,
"notify": 16822,
"otakotaku": 2998,
"shikimori": 29354,
"shoboi": 5428,
"silveryasha": 5091,
"simkl": 13973,
"themoviedb": 5337,
"thetvdb": 3697,
"trakt": 5028,
"total": 38551
},
"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",
"animenewsnetwork": "(?P<alias>animenewsnetwork)/(?P<media_id>\\d+)",
"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+)",
"letterboxd": "/(?P<alias>letterboxd)/(?P<media_id>[\\w\\-]+)",
"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+)",
"thetvdb": "/(?P<alias>thetvdb)/series/(?P<media_id>\\d+)(?:/seasons/(?P<season_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 /heartbeatResponse example
{
"status": "OK",
"code": 200,
"response_time": "0.000s",
"request_time": "0.000s",
"request_epoch": 1626682566.0,
}MIME Type: text/plain
GET /updatedResponse example
Updated on 23 October 2025 05:14:55 UTCHTTP Status Code: 302 (redirect to GitHub raw file URL)
MIME Type: application/json
GET /animeApi.jsonor
GET /aa.jsonTip
Use this endpoint if you want to import the data to spreadsheet.
MIME Type: text/tab-separated-values
GET /animeApi.tsvor
GET /aa.tsvCaution
This endpoint is deprecated since October 22, 2025. Dataset might not be updated regularly. Please use the TSV/master array endpoint and convert it to your desired format locally.
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.
Caution
This endpoint is deprecated since October 22, 2025. Dataset might not be updated regularly. Please use the TSV/master array endpoint and convert it to your desired format locally.
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.
Important
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:platformcan be one of the following listed in Supported Platforms and Aliases.:mediaidis the ID of the anime in the platform.- To use
kitsu,simkl,shikimori,themoviedb, andtraktpath, 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,
"animenewsnetwork": 13,
"animeplanet": "cowboy-bebop",
"anisearch": 1572,
"annict": 360,
"imdb": "tt0213338",
"kaize": "cowboy-bebop",
"kaize_id": 265,
"kitsu": 1,
"letterboxd_lid": null,
"letterboxd_slug": null,
"letterboxd_uid": null,
"livechart": 3418,
"myanimelist": 1,
"nautiljon": null,
"nautiljon_id": null,
"notify": "Tk3ccKimg",
"otakotaku": 1149,
"shikimori": 1,
"shoboi": 538,
"silveryasha": 2652,
"simkl": 37089,
"themoviedb": 30991,
"themoviedb_season_id": 42587,
"themoviedb_type": "tv",
"thetvdb": 76885,
"thetvdb_season_id": 11636,
"trakt": 30857,
"trakt_may_invalid": "False",
"trakt_season": 1,
"trakt_season_id": 43328,
"trakt_slug": "cowboy-bebop",
"trakt_type": "shows"
}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-bebopThe response will be in JSON format, and you can get the ID from data[0].id
letterboxd uses slug format for movie identification. The API will return the
Letterboxd film URL using the stored slug value.
For lookup operations, use the letterboxd_slug field from the response data.
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 either movie or tv and :mediaid is the ID of the title
in the provider instead of typical :provider/:mediaid format. For TV shows, you
can also specify a season by using the format of
:provider/:mediatype/:mediaid/season/:seasonid where :season_id can be season
index defined by Trakt's season number, or TMDB internal season ID.
For The TVDB, the ID follows the format :provider/series/:mediaid or
:provider/series/:mediaid/seasons/:season_id for season-specific entries.
When querying season data, you can use either the season number (from trakt_season)
or the TVDB season ID (from thetvdb_season_id). Season 1 entries can be accessed
using the base series URL.
For example:
GET https://animeapi.my.id/thetvdb/series/12345
GET https://animeapi.my.id/thetvdb/series/12345/seasons/2
GET https://animeapi.my.id/thetvdb/series/12345/seasons/789012For 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>Important
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.
Caution
/seasons/0 is invalid, and will return 400 status code.
Important
Since Oct 19, 2025, AnimeAPI now features a split cour flag, where
trakt_may_invalid indicates whether a season mapping may be unreliable:
none: The entry is either a special, or a moviefalse: Season found on Trakt and mapping is reliable.true: Season not found separately on Trakt (split cour). Season fields on Trakt, TMDB, and TVDB will benull.
MAL may list split cours as separate seasons while Trakt/TMDB combines them
into one continuous season. When true, episodes are likely in the previous
season on Trakt.
For more information, head to db.trakt.extended-anitrakt.
For example, to get the ID of Mairimashita Iruma-kun Season 3, you can use:
GET https://animeapi.my.id/trakt/shows/152334/seasons/3Response example from Trakt
{
"title": "Mairimashita! Iruma-kun 3rd Season",
"anidb": 16627,
"anilist": 139092,
"animenewsnetwork": 24018,
"animeplanet": "welcome-to-demon-school-iruma-kun-3",
"anisearch": 16582,
"annict": 8883,
"imdb": "tt11034066",
"kaize": "mairimashita-iruma-kun-3rd-season",
"kaize_id": 4989,
"kitsu": 45154,
"letterboxd_lid": null,
"letterboxd_slug": null,
"letterboxd_uid": null,
"livechart": 10780,
"myanimelist": 49784,
"nautiljon": null,
"nautiljon_id": null,
"notify": "Okl9YtInR",
"otakotaku": 2305,
"shikimori": 49784,
"shoboi": 6489,
"silveryasha": 3702,
"simkl": 1728821,
"themoviedb": 91801,
"themoviedb_season_id": 306624,
"themoviedb_type": "tv",
"thetvdb": 369144,
"thetvdb_season_id": 1955315,
"trakt": 152334,
"trakt_may_invalid": "False",
"trakt_season": 3,
"trakt_season_id": 303584,
"trakt_slug": "welcome-to-demon-school-iruma-kun",
"trakt_type": "shows"
}HTTP Status Code: 302 OR 200 (if required)
MIME Type: None OR text/plain (if required)
GET /redirect?platform=:platform&mediaid=:mediaid&target=:platformor
GET /rd?from=:platform&id=:mediaid&to=:platform-
:platformcan be one of the following listed in Supported Platforms and Aliases.Additionally, on
target/toparameter, there are additional supported platforms, and can't be used as source/fromdue to some limitations:Platform 2K Aliases Additional Notes kurozorakrkrz,kurozora.appRequires Kurozora+ subscription and MAL ID myanilimymyani.liRequires MAL ID; a web app to manage list -
:mediaidis 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/1GET https://animeapi.my.id/rd?from=al&id=154587&to=shk
HTTP/1.1 302 Found
Location: https://shikimori.me/animes/52991There 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/49784GET 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/757695If 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_id": {
"type": "number"
}
},
"required": [
"themoviedb_season_id"
]
},
"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"
},
"animenewsnetwork": {
"$ref": "#/definitions/numbernull",
"description": "Anime News Network, website: https://animenewsnetwork.com",
"title": "Anime News Network"
},
"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"
},
"letterboxd_slug": {
"$ref": "#/definitions/stringnull",
"description": "Letterboxd slug, website: https://letterboxd.com/",
"pattern": "^[a-z0-9\\-]+",
"title": "Letterboxd Slug"
},
"letterboxd_lid": {
"$ref": "#/definitions/numbernull",
"description": "Letterboxd Letter ID, only being used on 1st party API requests",
"title": "Letterboxd ID"
},
"letterboxd_uid": {
"$ref": "#/definitions/stringnull",
"description": "Letterboxd General ID, internally used",
"title": "Letterboxd General ID"
},
"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, website: https://www.nautiljon.com/",
"pattern": "^[a-z0-9\\-]+",
"title": "Nautiljon"
},
"nautiljon_id": {
"$ref": "#/definitions/numbernull",
"description": "Nautiljon ID in integer format, not recommended as some entry can't be found its ID compared to slug",
"title": "Nautiljon ID"
},
"notify": {
"$ref": "#/definitions/stringnull",
"description": "Notify.moe slug, website: https://notify.moe/",
"pattern": "^[a-zA-Z0-9]+$",
"title": "Notify.moe"
},
"otakotaku": {
"$ref": "#/definitions/stringnull",
"description": "Otak Otaku slug, website: https://otakotaku.com/",
"pattern": "^[a-z0-9\\-]+$",
"title": "Otak Otaku"
},
"shikimori": {
"$ref": "#/definitions/numbernull",
"description": "Shikimori ID, website: https://shikimori.one/",
"title": "Shikimori"
},
"shoboi": {
"$ref": "#/definitions/numbernull",
"description": "Shoboi/Syobocal ID, website: http://cal.syoboi.jp/",
"title": "Shoboi/Syobocal"
},
"silveryasha": {
"$ref": "#/definitions/stringnull",
"description": "Silver Yasha slug, website: https://silveryasha.com/",
"pattern": "^[a-z0-9\\-]+$",
"title": "Silver Yasha"
},
"simkl": {
"$ref": "#/definitions/numbernull",
"description": "SIMKL ID, website: https://simkl.com/",
"title": "SIMKL"
},
"themoviedb": {
"$ref": "#/definitions/numbernull",
"description": "The Movie Database ID, can be used for movie or tv, website: https://www.themoviedb.org/",
"title": "The Movie Database"
},
"themoviedb_season_id": {
"$ref": "#/definitions/numbernull",
"description": "The Movie Database internal season ID, only available for TV shows",
"title": "The Movie Database season ID"
},
"themoviedb_type": {
"$ref": "#/definitions/stringnull",
"description": "The Movie Database media type, can be movie or tv",
"enum": [
"movie",
"tv"
],
"title": "The Movie Database type"
},
"thetvdb": {
"$ref": "#/definitions/stringnull",
"description": "The TVDB ID, website: https://thetvdb.com/, only to be prefixed with series/ to deep link",
"title": "The TVDB"
},
"thetvdb_season_id": {
"$ref": "#/definitions/numbernull",
"description": "The TVDB internal season ID, can be used to build URL",
"title": "The TVDB season ID"
},
"title": {
"type": "string",
"description": "Title of the anime in English or Romaji",
"title": "Title"
},
"trakt": {
"$ref": "#/definitions/numbernull",
"description": "Trakt ID, can be used for movie or show, website: https://trakt.tv/",
"title": "Trakt"
},
"trakt_may_invalid": {
"$ref": "#/definitions/booleannull",
"description": "Whether the entry is actually a split cour, which both Trakt and TMDB merge it into one",
"title": "Trakt May Invalid"
},
"trakt_season": {
"$ref": "#/definitions/numbernull",
"description": "Trakt season number, only available for shows",
"title": "Trakt season"
},
"trakt_season_id": {
"$ref": "#/definitions/numbernull",
"description": "Trakt season ID",
"title": "Trakt Season ID"
},
"trakt_slug": {
"$ref": "#/definitions/stringnull",
"description": "Trakt slug",
"pattern": "^[a-z0-9\\-]+",
"title": "Trakt Slug"
},
"trakt_type": {
"$ref": "#/definitions/stringnull",
"description": "Trakt media type, can be movie or show",
"enum": [
"movies",
"shows"
],
"title": "Trakt type"
}
},
"required": [
"title"
],
"title": "Anime",
"type": "object"
},
"numbernull": {
"type": [
"number",
"null"
]
},
"stringnull": {
"type": [
"string",
"null"
]
},
"booleannull": {
"type": [
"boolean",
"null"
]
}
},
"properties": {
"data": {
"items": {
"$ref": "#/definitions/anime"
},
"type": "array"
}
},
"title": "anime-api",
"type": "object"
}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;
animenewsnetwork: 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
animenewsnetwork: 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:
- gh:kawaiioverflow/arm
- gh:manami-project/anime-offline-database
- gh:rensetsu/db.takt.extended-anitrakt, which an automatic parser of AniTrakt index page.
- gh:Fribb/anime-lists
- Nautiljon
- Kaize
- Otak Otaku
- Silver-Yasha