AniList

AniList records, keyed by anilist_id. Every record carries id_mal, AniList's own pointer at MyAnimeList — hand it to /api/map/{mal_id} and you have the other services too.

Routes

GET/api/anilist/ids

Every anilist_id animap has actually fetched, with its romaji title, ordered by anilist_id. Every id it returns resolves on /api/anilist/{id}. An empty dataset returns [], never null. title may be null.

curl https://animap.id/api/anilist/ids
[
  {"anilist_id": 1, "title": "Cowboy Bebop"},
  {"anilist_id": 5, "title": "Cowboy Bebop: Tengoku no Tobira"},
  {"anilist_id": 6, "title": "Trigun"}
]

GET/api/anilist/{id}

The parsed record for one anilist_id. 404 if that id has not been fetched. Scores, popularity and favourites are not in this projection — they change constantly, so they are served only by /api/anilist/{id}/raw. Air dates are split into _year / _month / _day parts, any of which can be null on its own. See the field reference below.

curl https://animap.id/api/anilist/1
{
  "anilist_id": 1,
  "id_mal": 1,
  "title_romaji": "Cowboy Bebop",
  "title_english": "Cowboy Bebop",
  "title_native": "カウボーイビバップ",
  "synonyms": ["Kaubōi Bibappu"],
  "format": "TV",
  "status": "FINISHED",
  "source": "ORIGINAL",
  "country_of_origin": "JP",
  "is_licensed": true,
  "episodes": 26,
  "duration": 24,
  "start_year": 1998, "start_month": 4, "start_day": 3,
  "end_year": 1999, "end_month": 4, "end_day": 24,
  "season": "SPRING",
  "season_year": 1998,
  "description": "In the year 2071, humanity has colonized…",
  "cover_image": "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx1.png",
  "banner_image": "https://s4.anilist.co/file/anilistcdn/media/anime/banner/1.jpg",
  "genres": ["Action", "Adventure", "Drama", "Sci-Fi"],
  "tags": ["Space", "Crime", "Episodic"],
  "studios": ["Sunrise"],
  "producers": ["Bandai Visual", "Bandai Entertainment"],
  "absent": false,
  "absent_at": null
}

GET/api/anilist/{id}/raw

The full upstream AniList GraphQL Media object for this id, served verbatim as stored. Much richer than the parsed record: this is where averageScore, meanScore, popularity and favourites live, along with the full tags (with per-tag rank), relations, trailer, coverImage variants and nextAiringEpisode. 404 if the id is unknown or its payload has not been fetched yet. There is no /api/anilist/{id}/raw/xml — AniList is JSON only.

These counters are a snapshot taken when we last fetched the record, not a live value. Treat them as stale by up to a day.

curl https://animap.id/api/anilist/1/raw
{
  "id": 1,
  "idMal": 1,
  "title": {"romaji": "Cowboy Bebop", "english": "Cowboy Bebop", "native": "カウボーイビバップ"},
  "format": "TV",
  "status": "FINISHED",
  "averageScore": 86,
  "meanScore": 86,
  "popularity": 456596,
  "favourites": 32527,
  "tags": [{"id": 63, "name": "Space", "rank": 94}],
  "studios": {"nodes": [{"id": 14, "name": "Sunrise", "isAnimationStudio": true}]},
  "relations": {"edges": [{"relationType": "SIDE_STORY", "node": {"id": 5, "type": "ANIME"}}]},
  "nextAiringEpisode": null
}

Field reference — /api/anilist/{id}

Field Type Notes
anilist_id integer The AniList id. Stable primary key. Unrelated to anidb_id and mal_id.
id_mal integer · null AniList's own pointer to the matching MyAnimeList id — usable against /api/mal/{id} and /api/map/{id}. null when AniList records no mapping; not guaranteed unique (AniList and MAL split/merge differently).
title_romaji string · null AniList's canonical romaji title. Effectively always present.
title_english
title_native
string · null title_english is null for about half of entries.
synonyms array of string Alternative titles. Empty [] when there are none, never null.
format string · null AniList's uppercase enum, verbatim: TV, TV_SHORT, MOVIE, OVA, ONA, SPECIAL, MUSIC.
status string · null FINISHED, RELEASING, NOT_YET_RELEASED, CANCELLED, HIATUS.
source string · null What it was adapted from: ORIGINAL, MANGA, LIGHT_NOVEL, VISUAL_NOVEL, VIDEO_GAME, OTHER, …
country_of_origin string · null ISO 3166 country code: JP, CN, KR, TW.
is_licensed boolean Whether AniList marks the title as officially licensed.
episodes integer · null null when unknown (often for currently-airing or unaired entries).
duration integer · null Runtime in minutes per episode, as a number (unlike MAL's free-form duration string). null when unknown.
start_year
start_month
start_day
end_year
end_month
end_day
integer · null Air-start / air-end date, as separate parts. AniList often knows only part of a date, so each part is independently null — a year with a null month and day is common. See the note below.
season string · null WINTER, SPRING, SUMMER or FALL. null together with season_year for entries with no seasonal slot.
season_year integer · null The premiere season's year. null exactly when season is.
description string · null Synopsis, as written on AniList. Contains HTML markup (<br>, <i>, …) — render or strip it yourself.
cover_image string · null Full cover-art URL on s4.anilist.co (the largest variant). Fetch it from there, not through this API.
banner_image string · null Full banner-image URL, or null (most entries have none).
genres
tags
array of string Names only. tags drops each tag's id and relevance rank (those are in /raw). Empty [] rather than null.
studios
producers
array of string Company names only. AniList keeps one studio list and flags each with isAnimationStudio; studios is the animation studios, producers the rest. Empty [] rather than null.
absent boolean true when the id has disappeared from AniList since we archived it (usually a duplicate AniList merged away). The record is kept and still served — that is when this mirror is most useful. The flag clears if the entry reappears.
absent_at string · null RFC 3339 timestamp of when the entry was first observed missing. null whenever absent is false.

AniList dates come in parts. Unlike AniDB and MyAnimeList, which we fold into a single YYYY-MM-DD string, AniList models a date as a year / month / day triple where any part can be missing on its own — a show may have a known year but no month or day. We keep those parts as-is (start_year, start_month, start_day, and the end_* trio) so nothing is lost. Build a full date only when all three parts are present; otherwise use whatever parts you have.

No scores, popularity or favourites here. averageScore, meanScore, popularity and favourites move for nearly every title every time we refresh it, so they are left out of the parsed projection for the same reason as MAL's counters. They are still archived, and /api/anilist/{id}/raw returns them verbatim — read them as a snapshot, not a live figure.