animedex anilist
The AniList backend wraps the public GraphQL endpoint at
https://graphql.anilist.co. animedex ships 28 anonymous
commands (full coverage of AniList’s anonymous read surface) plus
4 auth-required stubs that surface a clean
ApiError(reason="auth-required") until token storage lands.
References
Site |
|
GraphQL endpoint |
|
API documentation |
|
GitBook mirror |
|
Live schema browser |
|
Python module |
|
Rich models |
Backend: AniList GraphQL.
Rate limit: 30 req/min anonymous (degraded from baseline 90/min; the
Retry-Afterheader is honoured by the transport).Auth: not required for anonymous endpoints; OAuth PIN flow lands with token storage.
The full subcommand list is visible via animedex anilist --help.
This page walks the ten most common ones in detail and tabulates
the rest.
Core lookups
Lookup a Media by AniList ID — show()
animedex anilist show 154587 --jq '{romaji: .title.romaji, year: .seasonYear, score: .averageScore}'
# => {
# "romaji": "Sousou no Frieren",
# "year": 2023,
# "score": 90
# }
animedex anilist show 154587 --jq '.format, .episodes, .duration'
# => "TV"
# => 28
# => 24
Search Media by free-text query — search()
animedex anilist search "Frieren" --per-page 5 --jq '.[] | {id, romaji: .title.romaji}'
# => {"id": 154587, "romaji": "Sousou no Frieren"}
# => {"id": 159831, "romaji": "Frieren ..."}
# ...
Character lookup — character()
animedex anilist character 11 --jq '.name.full'
# => "Edward Elric"
animedex anilist character 11 --jq '{name: .name.full, age: .age, gender}'
Staff lookup — staff()
animedex anilist staff 101572 --jq '{name: .name.full, primary_occupations: .primaryOccupations}'
# => {
# "name": "Hiromu Arakawa",
# "primary_occupations": ["Mangaka"]
# }
Studio lookup — studio()
animedex anilist studio 11 --jq '{name, animation: .isAnimationStudio, favourites}'
# => {
# "name": "Madhouse",
# "animation": true,
# "favourites": 12345
# }
Search auxiliary entities
Character search — character_search()
animedex anilist character-search "Frieren" --per-page 3 --jq '.[].name.full'
# => "Frieren"
# => "Frieren ..."
# => "..."
Staff search — staff_search()
animedex anilist staff-search "Miyazaki" --per-page 3 --jq '.[].name.full'
Listings
Trending rail — trending()
The AniList “Trending” rail, evaluated server-side:
animedex anilist trending --per-page 5 --jq '.[] | {romaji: .title.romaji, score: .averageScore}'
Seasonal grid — schedule()
animedex anilist schedule 2024 SPRING --jq '.[].title.romaji'
# => "Series A"
# => "Series B"
# ...
Public profile lookup — user()
The user’s anime list, manga list, and stats are anonymous-readable:
animedex anilist user "Josh" --jq '{name, anime_count: .statistics.anime.count}'
Endpoint summary
The 28 anonymous endpoints are grouped here. Every command on this
table accepts the same standard kwargs (--no-cache /
--cache N / --rate slow / --json / --jq <expr>) and
returns a typed rich dataclass losslessly preserving the upstream
GraphQL payload.
Core entities (typed returns)
Command |
Python entry point |
Returns |
|---|---|---|
|
||
|
|
|
|
||
|
|
|
|
||
|
|
|
|
||
|
|
|
|
||
|
|
Discovery rails
Command |
Python entry point |
Notes |
|---|---|---|
|
the front-page trending rail |
|
|
the seasonal grid (defaults to current season) |
|
|
episode-level airing schedule (timestamps) |
|
|
every AniList genre name |
|
|
full tag taxonomy with descriptions |
|
|
AniList-wide aggregate stats |
|
|
registered streaming/mention sources |
|
|
per-Media trending data points |
Reviews / threads / activity
Command |
Python entry point |
Notes |
|---|---|---|
|
reviews for one Media |
|
|
site-wide recommendation pairs |
|
|
forum thread search |
|
|
comments on a thread |
|
|
public activity feed |
|
|
replies on one activity |
Auth-required stubs (deferred)
The four endpoints that need a viewer token are wired as stubs that
raise ApiError(reason="auth-required"). They let library callers
and agents discover the surface today and code against it; the
underlying GraphQL queries already work end-to-end via
animedex api anilist '<query>' once you have a token.
Command |
Python entry point |
Status |
|---|---|---|
|
raises |
|
|
same |
|
|
same |
|
|
same |
Gotchas
Rate ceiling is real: 30 req/min is the AniList-degraded ceiling, not a soft hint. Repeated polling without
--no-cacheis the right pattern; the local SQLite cache absorbs duplicates.The “average” in averageScore is upstream-computed, not a consensus across backends. If you want both AniList’s and Jikan’s takes on the same show, run both and compare;
[src: …]attribution makes that auditable.GraphQL errors come back as 200 with an ``errors`` array. animedex translates them into
ApiError(reason="graphql-error").
The Python library page covers the same surface from inside Python.
Social graph (public reads)
Command
Python entry point
Notes
following <user_id>animedex.backends.anilist.following()who a user follows
follower <user_id>animedex.backends.anilist.follower()who follows a user
media-list-publicanimedex.backends.anilist.media_list_public()a user’s anime/manga list
media-list-collection-publicanimedex.backends.anilist.media_list_collection_public()a user’s full list collection