MyAnimeList Public Data API

MyAnimeList data,
made simple.

Access public MyAnimeList user profiles, anime lists and statistics through a clean and lightweight JSON API.

GEThttps://api.elvarora.com/v2/users/:username/1
No API key requiredRead-only public dataSystem status ↗
user.jsonV2 / RECOMMENDED
{
  "data": {
    "user": {
      "username": "example"
    },
    "statistics": {
      "anime": {
        "completed": 120,
        "episodes_watched": 1432,
        "mean_score": 8.42
      }
    }
  }
}

Structured data.
Ready for your next integration.

SERVICE STATUSChecking services...
System status

01 / API OVERVIEW

Public data.
Built for developers.

Elvarora API provides structured JSON access to public MyAnimeList user data.

The API is designed to make public MAL profile and anime-list data easier to consume in web applications, dashboards, bots and other developer tools.

Elvarora API is an independent service and is not affiliated with or endorsed by MyAnimeList.

GET /v2/users/:username/1

One upstream page of up to 300 anime, public-profile statistics and ETag revalidation. No full-list download; scored_entries is null.

API capabilities

01

User profiles

Retrieve a public username, profile URL and anime-list URL.

02

Anime statistics

Watching, completed, plan-to-watch, episode counts and mean scores.

03

Anime lists

Access public entries with titles, scores, progress, genres and update timestamps.

04

Pagination

Consume large lists one page at a time with V2 limit and page parameters.

05

Structured JSON

Normalized fields that fit into web apps, dashboards, bots and developer tools.

06

Read-only by design

Retrieve publicly available information without modifying a MyAnimeList account.

V1 & V2 at a glance Capability comparison
CapabilityV1 · LegacyV2 · Recommended
Public user dataYesYes
Anime statisticsYesYes
Anime listYesYes
JSON responseYesYes
Authentication requiredNoNo
Pagination—Yes
Up to 300 entries per page—Yes
Page number in the URL—Yes
Pagination metadata—Yes
ETag conditional requests—Yes
304 Not Modified—Yes

V2 is recommended for new integrations and fetches only the requested 300-entry page. V1 is retained as a legacy full-response endpoint. V2 statistics come from the MAL profile; scored_entries is null and episode totals may differ from V1.

02 / DEVELOPER CONSOLE

Try the API.

Start with V2, the recommended API for new integrations. It loads one responsive 300-entry page at a time. V1 is the legacy full-response endpoint and can be slow for large lists.

Live requests · No API key

V2 Paginated response

Recommended
GEThttps://api.elvarora.com/v2/users//1
V2 Response

Your response will appear here.

Send a request to inspect live JSON.

V1 Full response

Legacy
GEThttps://api.elvarora.com/v1/users/

Legacy endpoint. Returns the complete supported list in a single response and may be slow for large accounts.

V1 Response

Your response will appear here.

Send a request to inspect live JSON.

Which version should I use?

V2 · Recommended Use V2 for new integrations and large lists. It keeps requests and browser rendering responsive.

V1 · Legacy Use V1 only when an existing integration requires the complete supported list in one response.

03 / DOCUMENTATION

Two endpoints. One clear contract.

Returns public user information, anime statistics and supported list data.

GET /v2/users/:username/:page RECOMMENDED

Fetches only the requested page of up to 300 anime without loading the complete list. Includes public-profile statistics and next/previous links. Recommended for new integrations and large lists.

https://api.elvarora.com/v2/users/example/1

GET /v1/users/:username LEGACY

Legacy full response with the complete supported anime list. Use only when an existing integration requires one large response.

https://api.elvarora.com/v1/users/example
URL path parameters and fixed V2 page size
ParameterTypeRequiredDefaultDescription
usernamestringYes—2–32 letters, numbers, underscores or hyphens.
limitintegerNo300Fixed V2 page size. Do not add a limit query parameter.
pageintegerYes—V2 path segment: /v2/users/aa/2 opens page 2. Range: 1–10000.

The new page route accepts no query parameters. Pages beyond the list return an empty list. The legacy /v2/users/:username?limit=50&page=1 route remains compatible, but still loads the full list and retains the old large-list limits. V1 is unchanged.

HTTP responses and errors
200 OK
The requested public data is available.
304 Not Modified
V2 only: the supplied ETag matches. No response body.
400 Bad Request
Invalid username or V2 pagination parameters.
404 Not Found
MyAnimeList account not found.
429 Too Many Requests
A request limit was reached. Respect Retry-After when available.
500 Internal Server Error
Internal API error.
502 Bad Gateway
Public MyAnimeList data could not be retrieved.
503 Service Unavailable
The API is temporarily unavailable.

04 / INTEGRATION

A request away.

Use the tools you already know. Replace example with a public MAL username.

const response = await fetch(
  "https://api.elvarora.com/v2/users/example/1"
);

if (!response.ok) {
  throw new Error(`Request failed: ${response.status}`);
}

const { data, pagination } = await response.json();
console.log(data.anime_list);
console.log(pagination.next);

05 / RESPONSE STRUCTURE

Predictable by design.

The shape of a successful response, directly from the API contract.

application/json
dataobject Required · Both versions

Root payload containing public user information, statistics and anime entries.

data.userobject Required · Both versions

username, profile_url and anime_list_url.

data.statistics.animeobject Required · Both versions

days_watched, mean_score, watching, completed, on_hold, dropped, plan_to_watch, total_entries, rewatched, episodes_watched and scored_entries. V1 derives list totals from all entries. New V2 pages use MAL public-profile totals (including its episode/rewatch accounting); scored_entries is null because the profile does not expose it. Other unavailable profile fields are null. No page-only count is presented as a full-list total.

data.anime_listarray<object> Required · Both versions

Normalized entries: mal_id, titles, URLs, media_type, list_status, score, episode progress, dates, genres, demographics and updated_at. The complete supported list in V1; the requested page in V2.

metaobject Required · Both versions

source, fetched_at (ISO timestamp) and cache_seconds. Read cache duration from the actual response.

paginationobject Required · V2 only

Page navigation and totals for data.anime_list. Not present in V1.

pagination V2 field reference
FieldTypeDescription
pageintegerCurrent page.
limitintegerMaximum number of entries on this page.
total_itemsintegerTotal number of available list entries.
total_pagesintegerNumber of available pages; at least 1, even for an empty list.
has_previousbooleanWhether a previous page exists.
has_nextbooleanWhether another page exists.
previousstring | nullPrevious-page API path, or null.
nextstring | nullNext-page API path, or null.
ILLUSTRATIVE V2 METADATA
{
  "pagination": {
    "page": 1,
    "limit": 300,
    "total_items": 950,
    "total_pages": 4,
    "has_previous": false,
    "has_next": true,
    "previous": null,
    "next": "/v2/users/example/2"
  }
}

Individual list fields such as titles, dates and update timestamps may be null when unavailable. Documentation examples are illustrative; the playground displays actual API responses.

06 / UNDER THE HOOD

A straightforward data flow.

From a public profile to a response your application can use.

  1. 01Client applicationSend an HTTPS request
  2. 02Elvarora APIValidate & check cache
  3. 03Public MAL dataRetrieve on cache miss
  4. 04NormalizationStructure public fields
  5. 05JSON responseReturn full or paginated data

Cached requests can return directly from the API. V2 paginates the returned list; it does not change the underlying data collection.

Technical information.

Small surface area. Familiar web standards.

JSON responses

Successful data and API error responses use JSON.

Public data

Only publicly available MyAnimeList information is processed.

No authentication

Call the public user endpoints without an API key.

Browser access

Public GET requests support cross-origin access with CORS.

Read-only

The API does not modify MyAnimeList accounts.

Response caching

Versioned user responses currently use a 600-second cache. Check meta.cache_seconds and Cache-Control on your response.

Supported methods

GETHEADOPTIONS

Retrieve data, inspect headers, or check cross-origin request options.

V2 ONLY

Efficient revalidation

V2 supports ETag-based conditional requests, allowing clients to avoid downloading unchanged responses. Save the response ETag and send it as If-None-Match; a match returns 304 Not Modified without a body.

Use this from a server or command-line client. The current cross-origin policy does not expose ETag to browser scripts or allow the If-None-Match request header.

curl -i \
  -H 'If-None-Match: "<saved-etag>"' \
  "https://api.elvarora.com/v2/users/example/1"

07 / RELIABILITY

System status.

Current availability and 30 days of monitoring history.

View full status history ↗
Unknown
—uptime · last 30 days
Checking services...
30 days agoToday

Last checked: unavailable

—uptime · last 30 days
Checking services...
30 days agoToday

Last checked: unavailable

OperationalDegraded PerformancePartial OutageMajor Outage

Source: Elvarora monitoring. Refreshes about every 60 seconds while this tab is visible; monitor checks run every 5 minutes. API health is checked at /health.