animedex jikan
Jikan v4 is a REST scraper of MyAnimeList, hosted at
https://api.jikan.moe/v4. It is the deepest catalogue of the
backends animedex wraps: every anime / manga / character / person /
producer / season / club / user / magazine / genre that MAL knows
about, with score distributions, news threads, forum posts, episode
lists and theme songs. animedex covers all 87 anonymous v4
endpoints as 92 high-level Python functions (a few endpoints get
multiple entry points for ergonomic kwargs).
References
Site |
|
API documentation |
|
GitHub repo |
|
MyAnimeList (data source) |
|
Python module |
|
Rich models |
Backend: Jikan v4 (api.jikan.moe).
Rate limit: 60 req/min, 3 req/sec.
Auth: never. Jikan is read-only and anonymous by design; there is no token concept.
Eleven endpoints, in detail
Anime by MAL ID — show()
animedex jikan show 52991 --jq '.data | {title, score, status, broadcast: .broadcast.string}'
# => {
# "title": "Sousou no Frieren",
# "score": 9.31,
# "status": "Finished Airing",
# "broadcast": "Fridays at 23:00 (JST)"
# }
Anime search — search()
animedex jikan search "Frieren" --type tv --limit 3 --jq '.[] | {mal_id, title}'
Cast on a show — anime_characters()
animedex jikan anime-characters 52991 --jq '.rows[:3] | map({character: .character.name, role})'
Image gallery — anime_pictures()
animedex jikan anime-pictures 52991 --jq '.rows[].jpg.large_image_url' | head -3
Manga by MAL ID — manga_show()
animedex jikan manga-show 2 --jq '.data | {title, score, chapters, status}'
# => {
# "title": "Berserk",
# "score": 9.47,
# "chapters": null, # null = ongoing
# "status": "Publishing"
# }
Character lookup — character_show()
animedex jikan character-show 11 --jq '.data | {name, favourites: .favorites}'
# => {
# "name": "Edward Elric",
# "favourites": 100000
# }
Person lookup — person_show()
animedex jikan person-show 1870 --jq '.data | {name, family_name, given_name, birthday}'
Seasonal grid — season()
animedex jikan season 2024 spring --limit 5 --jq '.[].title'
Top by popularity — top_anime()
animedex jikan top-anime --filter bypopularity --limit 5 --jq '.[] | {title, members}'
Random pick — random_anime()
animedex jikan random-anime --jq '.title'
# => "<random anime title>"
User profile — user_show()
animedex jikan user-show "nekomata1037" --jq '.data | {username, joined, statistics: .statistics.anime}'
Endpoint summary
Nine “core” entities (anime, manga, character, person, producer,
magazine, genre, club, user) have typed dataclass returns; the
long-tail sub-endpoints return
JikanGenericResponse (a
permissive extra='allow' envelope). Use --jq to project the
fields you need.
/anime/{id}/...
Command |
Python entry point |
Returns |
|---|---|---|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/manga/{id}/...
Command |
Python entry point |
Returns |
|---|---|---|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/characters/{id}/...
Command |
Python entry point |
Returns |
|---|---|---|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/people/{id}/...
Command |
Python entry point |
Returns |
|---|---|---|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/producers/{id}/...
Command |
Python entry point |
Returns |
|---|---|---|
|
||
|
|
|
|
|
Magazines, genres, clubs
Command |
Python entry point |
Returns |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
Users
Command |
Python entry point |
Returns |
|---|---|---|
|
||
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Seasons / top / schedule / random
Command |
Python entry point |
Returns |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
||
|
||
|
||
|
Recommendations / reviews / watch
Command |
Python entry point |
Returns |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Pagination
Jikan paginates with ?page=N&limit=M and returns a
pagination envelope (has_next_page, last_visible_page,
items). Iterate explicitly:
animedex jikan search "Frieren" --page 1 --limit 10 --jq '.[].title'
animedex jikan search "Frieren" --page 2 --limit 10 --jq '.[].title'
Gotchas
MAL flakiness propagates: Jikan is a scraper. When MAL itself is unreachable, you get a 5xx that surfaces as
ApiError(reason="upstream-error")— not a Jikan bug, just upstream weather.404 is a real “not found”:
animedex jikan show 999999999returns 404 →ApiError(reason="not-found"). The fixture corpus pins this.Score divergence: Jikan’s
scoreis on a 0–10 scale, AniList’saverageScoreis 0–100. Both are upstream-canonical;animedexdoes not reconcile them.
The Python library page covers the same surface from inside Python.