Skip to content

A RESTful API for anime relation mapping and auto redirect service across multiple anime databases

License

AGPL-3.0 and 2 other licenses found

Licenses found

AGPL-3.0
LICENSE
CC0-1.0
LICENSE-CC0
MIT
LICENSE-MIT
Notifications You must be signed in to change notification settings

nattadasu/animeApi

nattadasu's AnimeAPI RESTful API

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?.

Table of Contents

Click to expand

Why use AnimeAPI?

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
f:kz f:oo f:ntj
f:ntf FAL f:al f:kts f:ntf f:tvdb f:adb f:tmdb - f:mal f:al f:adb f:kts f:lc f:as f:ap f:ntf AOD, ALAL f:adb f:tvdb f:tmdb f:imdb aniTrakt
Rate Limit - - - - 1000/day for unverified 1000/5 mins 1000/day Unapplicable Unapplicable Unapplicable Unapplicable
Anime Title ✔ ❌ ❌ ❌ ✔ ✔ ✔ ✔ ❌ ✔ ✔
f:adb aniDB ✔ ❌ ✔ ✔ ✔ ❌ ❌ ✔ ✔ ❌ ❌
f:al AniList ✔ ✔ ✔ ✔ ✔ Result Only ❌ ❌ ✔ ✔ ❌ ❌
f:an ANN ✔ ❌ ❌ ❌ ✔ Result Only ❌ ❌ ✔ ❌ ❌ ❌
f:ap Anime-Planet ✔ ❌ ✔ ❌ ✔ Result Only ❌ ❌ ✔ ✔ ❌ ❌
f:as AniSearch ✔ ❌ ✔ ❌ ✔ Result Only ❌ ❌ ✔ ✔ ❌ ❌
f:ac Annict ✔ ✔ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌
f:bgm Bangumi ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌
f:imdb IMDB ✔ ❌ ✔ ❌ ✔ ✔ ✔ ❌ ✔ ✔ ❌
f:kz Kaize ✔ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌
f:kts Kitsu ✔ ❌ ✔ ✔ ✔ Result Only ❌ ❌ ✔ ✔ ❌ ❌
f:lbx Letterboxd ✔ ❌ ❌ ❌ ❌ ❌ ✔ ❌ ❌ ❌ ❌
f:lc LiveChart ✔ ❌ ✔ ❌ ✔ Result Only ❌ ❌ ✔ ✔ ❌ ❌
f:mal MyAnimeList ✔ ✔ ✔ ✔ ✔ ❌ ❌ ✔ ✔ ❌ ✔
f:ntj Nautiljon ✔ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌
f:ntf Notify ✔ ❌ ✔ ✔ ❌ ❌ ❌ ✔ ✔ ❌ ❌
f:oo Otak Otaku ✔ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌
f:shk Shikimori ✔ ✔ via MAL ✔ via MAL ✔ via MAL ✔ via MAL ❌ ❌ ✔ via MAL ✔ via MAL ❌ ✔ via MAL
f:shb Shoboi Calendar ✔ ✔ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌
f:sy SilverYasha DBTI ✔ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌ ❌
f:smk SIMKL ✔ ❌ ❌ ❌ ✔ ❌ ❌ ✔ ❌ ❌ ❌
f:tmdb TMDB ✔, only movie ❌ ✔, only movie ❌ ✔ ✔ ✔ ❌ ✔, only movie ✔, only movie ❌
f:trk Trakt ✔ ❌ ❌ ❌ ✔ ✔ ❌ ❌ ❌ ❌ ✔
f:tvdb TVDB ✔ ❌ ❌ ❌ ✔ ✔ ❌ ❌ ✔ ✔ ❌
f:tvtm TVTime ✔ via TVDB ❌ ❌ ❌ ✔ via TVDB ✔ via TVDB ❌ ❌ ✔ via TVDB ✔ via TVDB ❌

Legends

Why Avoid Using AnimeAPI?

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.

Featured on

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.

Libraries

Package Name Language Package Link Description
animeapi-py Python pypi A Python wrapper for AnimeAPI with type hinting and additional async support

Projects, Apps, and Websites

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

Supported Platforms and Aliases

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

Statistic

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

Usage

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.

Get status and statistics

MIME Type: application/json

GET /status
Response 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"
  }
}

Get latency report

MIME Type: application/json

GET /heartbeat
Response example
{
  "status": "OK",
  "code": 200,
  "response_time": "0.000s",
  "request_time": "0.000s",
  "request_epoch": 1626682566.0,
}

Get updated date and time

MIME Type: text/plain

GET /updated
Response example
Updated on 23 October 2025 05:14:55 UTC

Get all items in Array (Master Array)

HTTP Status Code: 302 (redirect to GitHub raw file URL)
MIME Type: application/json

GET /animeApi.json

or

GET /aa.json

Fetch all item as TSV (Tab Separated Values) file

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

Get All ID in Object/Dictionary format of each provider

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.

Get All ID in Array/List format of each provider

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.

Get anime relation mapping data

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, and trakt 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,
  "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"
}

Provider exclusive rules

Kitsu

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

Letterboxd

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.

SIMKL

Note

Also applicable to AnimeCountdown

simkl ID is only applicable for media entries in Anime category.

Shikimori

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

The Movie DB

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.

The TVDB

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/789012
Trakt

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>

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 movie
  • false: 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 be null.

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/3
Response 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"
}

Redirect to provider's page

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
    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.

Redirect: Parameters

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.

Redirect: Response

Recommended/verbose path format
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
Short/aliased/alternative path format
GET https://animeapi.my.id/rd?from=al&id=154587&to=shk

HTTP/1.1 302 Found
Location: https://shikimori.me/animes/52991
Provider with slash (/) in mediaid

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
Raw path format
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

Schema

If you want to validate the response from the API, you can use the following schema in JSON Schema, TypeScript, or Python Dataclass.

JSON Schema

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.

TypeScript

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;
}

Python Dataclass

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]

Acknowledgements

This project uses multiple sources to compile the data, including:

About

A RESTful API for anime relation mapping and auto redirect service across multiple anime databases

Topics

Resources

License

AGPL-3.0 and 2 other licenses found

Licenses found

AGPL-3.0
LICENSE
CC0-1.0
LICENSE-CC0
MIT
LICENSE-MIT

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages