nattadasu / animeApi

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

Home Page:https://animeapi.my.id

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 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
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 Unapplicable Unapplicable Unapplicable Unapplicable
Anime Title
f:adb aniDB
f:al AniList ✔ Result Only
f:ap Anime-Planet ✔ Result Only
f:as AniSearch ✔ Result Only
f:an Annict
f:bgm Bangumi
f:imdb IMDB
f:kz Kaize
f:kts Kitsu ✔ Result Only
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 ✔ via IMDb
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

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.

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

Statistic

So far, AnimeAPI has indexed data from 17 databases, with details as follows:

Last updated: 30 May 2024 05:17:14 UTC

Platform ID Count
aniDB anidb 13266
AniList anilist 19932
Anime-Planet animeplanet 23784
aniSearch anisearch 18559
Annict annict 10202
IMDb imdb 2268
Kaize kaize 22972
Kitsu kitsu 20277
LiveChart livechart 11229
MyAnimeList myanimelist 27108
Nautiljon nautiljon 8204
Notify.moe notify 16228
Otak Otaku otakotaku 2671
Shikimori shikimori 27108
Shoboi/Syobocal shoboi 4957
Silver Yasha silveryasha 4289
The Movie Database themoviedb 510
Trakt trakt 4711
Total 33657

Usage

To use this API, you can access the following base URLs:

  • Latest/v3:

    GET https://animeapi.my.id
  • v2:

    GET https://aniapi.nattadasu.my.id

All requests must be GET, and response always will be in JSON format.

Warning

In v2, If an entry can not be found, the API will return default GitHub Pages' 404 html page, NOT JSON response. This is because v2 and earlier versions are hosted on GitHub Pages and API was a mock RESTful response.

Differences between v1, v2, and v3

AnimeAPI has 3 versions, which are v1, v2, and v3. The differences between each version are as follows:

v2 v3
Base URL inactive https://animeapi.my.id
EOL discontinued Until further verion
Host GitHub Pages Vercel
Language Python Python
Backend GitHub Pages Flask
Database JSON JSON
Expected MIME Type application/octet-stream application/json
Status Codes 200, 404 200, 302, 400, 404, 500
Response Schema - JSON Schema
Documented

Get status and statistics

Warning

This endpoint is only available on v3

MIME Type: application/json

GET /status
Response example
{
  "mainrepo": "https://github.com/nattadasu/animeApi/tree/v3",
  "updated": {
    "timestamp": 1717046234,
    "iso": "2024-05-30T05:17:14.967127+00:00"
  },
  "contributors": [
    "nattadasu"
  ],
  "sources": [
    "manami-project/anime-offline-database",
    "kawaiioverflow/arm",
    "ryuuganime/aniTrakt-IndexParser",
    "https://db.silveryasha.web.id",
    "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": 13266,
    "anilist": 19932,
    "animeplanet": 23784,
    "anisearch": 18559,
    "annict": 10202,
    "imdb": 2268,
    "kaize": 22972,
    "kitsu": 20277,
    "livechart": 11229,
    "myanimelist": 27108,
    "nautiljon": 8204,
    "notify": 16228,
    "otakotaku": 2671,
    "shikimori": 27108,
    "shoboi": 4957,
    "silveryasha": 4289,
    "themoviedb": 510,
    "trakt": 4711,
    "total": 33657
  },
  "endpoints": {
    "$comment": "The endpoints are stated in Python regex format",
    "anidb": "/anidb/(?P<media_id>\\d+)",
    "anilist": "/anilist/(?P<media_id>\\d+)",
    "animeapi_tsv": "/anime(a|A)pi.tsv",
    "animeplanet": "/animeplanet/(?P<media_id>[\\w\\-]+)",
    "anisearch": "/anisearch/(?P<media_id>\\d+)",
    "annict": "/annict/(?P<media_id>\\d+)",
    "heartbeat": "/(heartbeat|ping)",
    "imdb": "/imdb/(?P<media_id>tt[\\d]+)",
    "kaize": "/kaize/(?P<media_id>[\\w\\-]+)",
    "kitsu": "/kitsu/(?P<media_id>\\d+)",
    "livechart": "/livechart/(?P<media_id>\\d+)",
    "myanimelist": "/myanimelist/(?P<media_id>\\d+)",
    "nautiljon": "/nautiljon/(?P<media_id>[\\w\\+!\\-_\\(\\)\\[\\]]+)",
    "notify": "/notify/(?P<media_id>[\\w\\-_]+)",
    "otakotaku": "/otakotaku/(?P<media_id>\\d+)",
    "redirect": "/(redirect|rd)",
    "repo": "/",
    "schema": "/schema(?:.json)?",
    "shikimori": "/shikimori/(?P<media_id>\\d+)",
    "shoboi": "/shoboi/(?P<media_id>\\d+)",
    "silveryasha": "/silveryasha/(?P<media_id>\\d+)",
    "status": "/status",
    "syobocal": "/syobocal/(?P<media_id>\\d+)",
    "themoviedb": "/themoviedb/movie/(?P<media_id>\\d+)",
    "trakt": "/trakt/(?P<media_type>show|movie)(s)?/(?P<media_id>\\d+)(?:/season(s)?/(?P<season_id>\\d+))?",
    "updated": "/updated"
  }
}

Get latency report

Warning

This endpoint is only available on v3

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 05/30/2024 05:17:14 UTC

Get all items in Array

MIME Type: application/json

GET /animeApi.json

On v3, you will automatically redirected to GitHub raw file URL of the provider's JSON file. Make sure to allow 302 status code on your application if you want to use this endpoint.

Fetch all item as TSV (Tab Separated Values) file

Warning

This endpoint is only available on v3

Tip

Use this endpoint if you want to import the data to spreadsheet.

MIME Type: text/tab-separated-values

GET /animeApi.tsv

Get All ID in Object/Dictionary format of each provider

MIME Type: application/json

GET /:platform.json

:platform can be one of the following:

anidb, anilist, animeplanet, anisearch, annict, kaize, kitsu, livechart, myanimelist, notify, otakotaku, shikimori, shoboi, silveryasha, trakt

Additionally, on v3, you can use imdb, nautiljon, and themoviedb on :platform.

On v3, you will automatically redirected to GitHub raw file URL of the provider's JSON file. Make sure to allow 302 status code on your application if you want to use this endpoint.

Get All ID in Array/List format of each provider

MIME Type: application/json

GET /:platform().json

:platform can be one of the following:

anidb, anilist, animeplanet, anisearch, annict, kaize, kitsu, livechart, myanimelist, notify, otakotaku, shikimori, shoboi, silveryasha, trakt

Additionally, on v3, you can use imdb, nautiljon, and themoviedb on :platform.

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.

On v3, you will automatically redirected to GitHub raw file URL of the provider's JSON file. Make sure to allow 302 status code on your application if you want to use this endpoint.

Get anime relation mapping data

MIME Type: application/json on v3, application/octet-stream on v2

GET /:platform/:mediaid
  • :platform can be one of the following:

    anidb, anilist, animeplanet, anisearch, annict, kaize, kitsu, livechart, myanimelist, notify, otakotaku, shikimori, shoboi, silveryasha, trakt

    Additionally, on v3, you can use imdb, nautiljon, and themoviedb on :platform.

  • :mediaid is the ID of the anime in the platform.

  • To use kitsu, 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,
  "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,
  "themoviedb": null,
  "trakt": 30857,
  "trakt_type": "shows",
  "trakt_season": 1
}

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.io/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.io/api/edge/anime?filter[slug]=cowboy-bebop

The response will be in JSON format, and you can get the ID from data[0].id

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: z218218

The Movie DB

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.

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>

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,
  "themoviedb": null,
  "trakt": 152334,
  "trakt_type": "shows",
  "trakt_season": 3
}

Redirect to provider's page

Warning

This endpoint is only available on v3

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:

    Platform Aliases
    anidb adb, anidb.net
    anilist al, anilist.co
    animeplanet ap, anime-planet.com anime-planet
    anisearch as, anisearch.com, anisearch.de, anisearch.it, anisearch.es, anisearch.fr, anisearch.jp
    annict anc, act, ac, annict.com, annict.jp, en.annict.com
    imdb imdb.com
    kaize kz, kaize.io
    kitsu kt, kts, kitsu.io
    livechart lc, livechart.me
    myanimelist mal, myanimelist.net
    nautiljon ntj, nautiljon.com
    notify ntf, ntm, nf, nm, notifymoe, notify.moe
    otakotaku oo, otakotaku.com
    shikimori shiki, shk, shikimori.me, shikimori.one, shikimori.org
    shoboi shb, syb, sb, shobocal, syoboi, syobocal, cal.syoboi.jp
    silveryasha sy, dbti, db.silveryasha.web.id
    themoviedb tmdb, themoviedb.org
    trakt trk, trakt.tv

    Additionally, on target/to parameter, there are additional supported platforms, and can't be used as source/from due to some limitations:

    Platform Aliases
    simkl smk, simkl.com
  • :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 Yes The platform you want to get the data from.
mediaid id Yes The ID of the anime in the platform.
target to No The platform you want to redirect to. If you don't specify this parameter, the API will redirect to specified platform's homepage.
raw r No If you set this parameter to true, the API will only show the URI link instead of redirecting automatically

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&raw=true

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8

https://api.simkl.com/redirect?to=Simkl&anidb=13743

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#",
  "title": "JSON Schema for animeApi base, support for v2 and v3",
  "definitions": {
    "stringnull": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "$comment": "Type: string or null"
    },
    "numbernull": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "$comment": "Type: number or null"
    },
    "trakttype": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "movies",
            "shows"
          ]
        },
        {
          "type": "null"
        }
      ],
      "$comment": "Type: 'movies', 'shows', or null"
    },
    "themoviedbtype": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "movie",
            "tv"
          ]
        },
        {
          "type": "null"
        }
      ],
      "$comment": "Type: 'movie', 'tv', or null"
    },
    "anime": {
      "$comment": "Interface: Anime",
      "type": "object",
      "properties": {
        "title": {
          "title": "Title",
          "description": "Title of the anime",
          "type": "string"
        },
        "anidb": {
          "title": "aniDB",
          "description": "aniDB ID, website: https://anidb.net/",
          "$ref": "#/definitions/numbernull"
        },
        "anilist": {
          "title": "AniList",
          "description": "AniList ID, website: https://anilist.co/",
          "$ref": "#/definitions/numbernull"
        },
        "animeplanet": {
          "title": "Anime-Planet",
          "description": "Anime-Planet slug, website: https://www.anime-planet.com/",
          "$ref": "#/definitions/stringnull",
          "pattern": "^[a-z0-9\\-]+$"
        },
        "anisearch": {
          "title": "AniSearch",
          "description": "AniSearch ID, website: https://www.anisearch.com/, https://anisearch.de, https://anisearch.it, https://anisearch.es, https://anisearch.fr, https://anisearch.jp",
          "$ref": "#/definitions/numbernull"
        },
        "annict": {
          "title": "Annict",
          "description": "Annict ID, website: https://annict.com/, https://en.annict.com/, https://annict.jp/",
          "$ref": "#/definitions/numbernull"
        },
        "imdb": {
          "title": "IMDb",
          "description": "IMDb ID, website: https://www.imdb.com/",
          "$ref": "#/definitions/stringnull",
          "pattern": "^tt[\\d]+$"
        },
        "kaize": {
          "title": "Kaize",
          "description": "Kaize slug, website: https://kaize.io/",
          "$ref": "#/definitions/stringnull",
          "pattern": "^[a-z0-9\\-]+$"
        },
        "kaize_id": {
          "title": "Kaize ID",
          "description": "Kaize ID in integer format, not recommended as some entry can't be found its ID compared to slug",
          "$ref": "#/definitions/numbernull"
        },
        "kitsu": {
          "title": "Kitsu",
          "description": "Kitsu ID in integer, slug not suppported, website: https://kitsu.io/",
          "$ref": "#/definitions/numbernull"
        },
        "livechart": {
          "title": "LiveChart",
          "description": "LiveChart ID, website: https://www.livechart.me/",
          "$ref": "#/definitions/numbernull"
        },
        "myanimelist": {
          "title": "MyAnimeList",
          "description": "MyAnimeList ID, website: https://myanimelist.net/",
          "$ref": "#/definitions/numbernull"
        },
        "nautiljon": {
          "title": "Nautiljon",
          "description": "Nautiljon slug in plus, website: https://www.nautiljon.com/",
          "$ref": "#/definitions/stringnull"
        },
        "nautiljon_id": {
          "title": "Nautiljon ID",
          "description": "Nautiljon ID in integer format, used internally",
          "$ref": "#/definitions/numbernull"
        },
        "notify": {
          "title": "Notify.moe",
          "description": "Notify.moe Base64 ID, website: https://notify.moe/",
          "$ref": "#/definitions/stringnull",
          "pattern": "^[a-zA-Z0-9\\-\\_]+$"
        },
        "otakotaku": {
          "title": "Otak Otaku",
          "description": "Otak Otaku ID, website: https://otakotaku.com/",
          "$ref": "#/definitions/numbernull"
        },
        "shikimori": {
          "title": "Shikimori/Шикимори",
          "description": "Shikimori ID (nonprefixed), based on MyAnimeList ID. Remove prefix if found on the ID, website: https://shikimori.one/",
          "$ref": "#/definitions/numbernull"
        },
        "shoboi": {
          "title": "Shoboi/Syobocal/しょぼいカレンダー",
          "description": "Shoboi ID, website: http://cal.syoboi.jp/",
          "$ref": "#/definitions/numbernull"
        },
        "silveryasha": {
          "title": "Silveryasha",
          "description": "Silveryasha ID, website: https://db.silveryasha.web.id/",
          "$ref": "#/definitions/numbernull"
        },
        "themoviedb": {
          "title": "The Movie Database (TMDB)",
          "description": "The Movie Database ID, website: https://www.themoviedb.org/",
          "$ref": "#/definitions/numbernull"
        },
        "themoviedb_type": {
          "title": "The Movie Database (TMDB) Type",
          "description": "The Movie Database type, either 'movies' or 'shows'",
          "$ref": "#/definitions/themoviedbtype"
        },
        "themoviedb_season": {
          "title": "The Movie Database (TMDB) Season",
          "description": "The Movie Database season number, only used if themoviedb_type is 'shows', else null",
          "$ref": "#/definitions/numbernull"
        },
        "trakt": {
          "title": "Trakt",
          "description": "Trakt ID, slug not supported, website: https://trakt.tv/",
          "$ref": "#/definitions/numbernull"
        },
        "trakt_type": {
          "title": "Trakt Type",
          "description": "Trakt type, either 'movies' or 'shows'",
          "$ref": "#/definitions/trakttype"
        },
        "trakt_season": {
          "title": "Trakt Season",
          "description": "Trakt season number, only used if trakt_type is 'shows', else null",
          "$ref": "#/definitions/numbernull"
        }
      },
      "required": [
        "title",
        "anidb",
        "anilist",
        "animeplanet",
        "anisearch",
        "annict",
        "kaize",
        "kitsu",
        "livechart",
        "myanimelist",
        "notify",
        "otakotaku",
        "shikimori",
        "shoboi",
        "silveryasha",
        "trakt",
        "trakt_type",
        "trakt_season"
      ],
      "additionalProperties": false
    }
  },
  "oneOf": [
    {
      "$comment": "Use this schema if you want to validate an array of anime",
      "type": "array",
      "items": {
        "$ref": "#/definitions/anime"
      }
    },
    {
      "$comment": "Use this schema if you want to validate an object known in each provider",
      "type": "object",
      "oneOf": [
        {
          "$ref": "#/definitions/anime"
        },
        {
          "additionalProperties": {
            "$ref": "#/definitions/anime"
          }
        }
      ]
    }
  ]
}

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

https://animeapi.my.id

License:GNU Affero General Public License v3.0


Languages

Language:Python 100.0%