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.