MyAnimeList API (Official)
MyAnimeList API (Official)
MyAnimeList’s official API v2 (https://api.myanimelist.net/v2). Reading public data requires registering an app for a Client ID and sending an X-MAL-CLIENT-ID header; anything involving a specific user (reading/writing their anime/manga list, status, scores) requires the full OAuth2 authorization-code flow. It is the only MyAnimeList API that can authenticate as a user and write to a user’s list — exactly where it is irreplaceable versus the unofficial Jikan. Rate limits are unpublished; ~1 req/sec is the safe assumption in practice. Free.
The only one that can write to a user’s list: read/write status, scores, and list entries as the logged-in user — something Jikan can never do
Heavy OAuth2 friction: register an app, implement the authorization-code flow, handle redirect URIs, store and refresh tokens — all wasted work if you only display public data
Register an application at https://myanimelist.net/apiconfig to get a Client ID. For public reads, send the header X-MAL-CLIENT-ID: YOUR_CLIENT_ID, e.g. GET https://api.myanimelist.net/v2/anime?q=frieren&limit=5. To read or write a user’s own list, implement the OAuth2 authorization-code flow: after the user logs in and grants permission you receive an access token, then call endpoints like /users/@me/animelist with Authorization: Bearer USER_ACCESS_TOKEN. Rate limits are undocumented, so assume ~1 req/sec. If your feature only displays public data and never touches a user account, consider the key-less Jikan to skip OAuth2 entirely.
Uptime · 30-day window
About this API
The official MyAnimeList API v2 is the interface MyAnimeList ships itself, at https://api.myanimelist.net/v2. It differs from the unofficial Jikan in two key ways. First, even reading public data requires identifying your app: you register an application at https://myanimelist.net/apiconfig, receive a Client ID, and send it as an X-MAL-CLIENT-ID header; without it, public reads fail with an unauthorized error. Second, anything involving a specific user — reading their list (including private entries), updating watch status (watching/completed/on-hold/dropped/plan-to-watch), setting or changing scores, adding or removing list entries — requires the full OAuth2 authorization-code flow, where the user logs in and grants your app permission and you receive an access token scoped to that user. That OAuth2 path is the entire reason the official API exists for most developers, and it is where it is irreplaceable versus Jikan: only it can authenticate as a user and write to a user’s list. The trade-off is real friction — you go from "send a GET" to registering an app, implementing OAuth2, handling redirect URIs, storing and refreshing tokens, and managing per-user scopes. If your feature never touches a user account, that is wasted work. On rate limiting the official side publishes no clear numbers; the community consensus is to stay around 1 request/second to avoid throttling. In practice many MyAnimeList integrations use both APIs: the public catalog (search, detail, seasons, rankings) on the key-less, broad-coverage Jikan, and only the thin per-user slice on the official API’s OAuth2 — the public majority gets Jikan’s zero friction, and you pay the OAuth2 cost only for the part that genuinely needs it.
What you can build
- 1The write path of an anime tracker: let users sign in with their MyAnimeList account and read/write their watch status, scores, and list entries — only the official API can do this
- 2Account sync and backup: use OAuth2 to read a user’s full anime/manga list (including private entries) for export or cross-device sync
- 3Displays needing real-time accuracy: hit the official API directly for the freshest public data, avoiding Jikan’s cache lag
Strengths & limitations
Strengths
- The only one that can write to a user’s list: read/write status, scores, and list entries as the logged-in user — something Jikan can never do
- Real-time data: straight from the official source, no cache lag
- Official and free: maintained by MyAnimeList itself, with no paid tier
Limitations
- Heavy OAuth2 friction: register an app, implement the authorization-code flow, handle redirect URIs, store and refresh tokens — all wasted work if you only display public data
- Even public reads need a Client ID: without the X-MAL-CLIENT-ID header, public reads fail as unauthorized, unlike Jikan’s fully key-less access
- Unpublished rate limits: there is no clear rate documentation, so you conservatively assume ~1 req/sec
Official quickstart
Read the official quickstart at myanimelist.net.
Getting started
Register an application at https://myanimelist.net/apiconfig to get a Client ID. For public reads, send the header X-MAL-CLIENT-ID: YOUR_CLIENT_ID, e.g. GET https://api.myanimelist.net/v2/anime?q=frieren&limit=5. To read or write a user’s own list, implement the OAuth2 authorization-code flow: after the user logs in and grants permission you receive an access token, then call endpoints like /users/@me/animelist with Authorization: Bearer USER_ACCESS_TOKEN. Rate limits are undocumented, so assume ~1 req/sec. If your feature only displays public data and never touches a user account, consider the key-less Jikan to skip OAuth2 entirely.
FAQ
Official MyAnimeList API or Jikan — how do I choose?+
By whether your feature touches a specific user’s account. For public data only (search, detail, seasons, rankings) use the key-less Jikan; to read or write a logged-in user’s own list, status, and scores you must use the official API v2’s OAuth2. Many apps use both.
Does the official MyAnimeList API need auth even for public data?+
Yes. Even reading public data requires registering an app at https://myanimelist.net/apiconfig for a Client ID and sending the X-MAL-CLIENT-ID header; without it public reads fail. Full OAuth2 is only needed for actions involving a user’s own list.
What is the official MyAnimeList API rate limit?+
The official side publishes no explicit rate cap. The community consensus is to stay around 1 request/second to avoid being throttled.
Does the official MyAnimeList API cost money?+
No. There is no paid tier; the real "cost" is the OAuth2 integration effort, not money.
Technical details
- Auth type
- oauth
- Pricing
- free
- Rate limit
- Rate limits are not officially published. The community consensus is to stay at roughly 1 request/second to avoid throttling. Public reads require the X-MAL-CLIENT-ID header (your registered Client ID); user-scoped reads/writes require an OAuth2 access token.
- Free tier quota
- Free to use. You must register an application at https://myanimelist.net/apiconfig to obtain a Client ID. No paid tiers; the cost is the OAuth2 integration work, not money.
- Protocols
- REST
- SDKs
- JavaScript, Python, Go