User profiles
Retrieve a public username, profile URL and anime-list URL.
MyAnimeList Public Data API
Access public MyAnimeList user profiles, anime lists and statistics through a clean and lightweight JSON API.
https://api.elvarora.com/v2/users/:username/1{
"data": {
"user": {
"username": "example"
},
"statistics": {
"anime": {
"completed": 120,
"episodes_watched": 1432,
"mean_score": 8.42
}
}
}
}Structured data.
Ready for your next integration.
01 / API OVERVIEW
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/1One upstream page of up to 300 anime, public-profile statistics and ETag revalidation. No full-list download; scored_entries is null.
Retrieve a public username, profile URL and anime-list URL.
Watching, completed, plan-to-watch, episode counts and mean scores.
Access public entries with titles, scores, progress, genres and update timestamps.
Consume large lists one page at a time with V2 limit and page parameters.
Normalized fields that fit into web apps, dashboards, bots and developer tools.
Retrieve publicly available information without modifying a MyAnimeList account.
| Capability | V1 · Legacy | V2 · Recommended |
|---|---|---|
| Public user data | Yes | Yes |
| Anime statistics | Yes | Yes |
| Anime list | Yes | Yes |
| JSON response | Yes | Yes |
| Authentication required | No | No |
| 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
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.
https://api.elvarora.com/v2/users//1Your response will appear here.
Send a request to inspect live JSON.https://api.elvarora.com/v1/users/Legacy endpoint. Returns the complete supported list in a single response and may be slow for large accounts.
Your response will appear here.
Send a request to inspect live JSON.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
Returns public user information, anime statistics and supported list data.
/v2/users/:username/:page RECOMMENDEDFetches 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/v1/users/:username LEGACYLegacy 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| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
username | string | Yes | — | 2–32 letters, numbers, underscores or hyphens. |
limit | integer | No | 300 | Fixed V2 page size. Do not add a limit query parameter. |
page | integer | Yes | — | 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.
200 OK304 Not Modified400 Bad Request404 Not Found429 Too Many Requests500 Internal Server Error502 Bad Gateway503 Service Unavailable04 / INTEGRATION
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
The shape of a successful response, directly from the API contract.
dataobject Required · Both versionsRoot payload containing public user information, statistics and anime entries.
data.userobject Required · Both versionsusername, profile_url and anime_list_url.
data.statistics.animeobject Required · Both versionsdays_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 versionsNormalized 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 versionssource, fetched_at (ISO timestamp) and cache_seconds. Read cache duration from the actual response.
paginationobject Required · V2 onlyPage navigation and totals for data.anime_list. Not present in V1.
pagination V2 field reference| Field | Type | Description |
|---|---|---|
page | integer | Current page. |
limit | integer | Maximum number of entries on this page. |
total_items | integer | Total number of available list entries. |
total_pages | integer | Number of available pages; at least 1, even for an empty list. |
has_previous | boolean | Whether a previous page exists. |
has_next | boolean | Whether another page exists. |
previous | string | null | Previous-page API path, or null. |
next | string | null | Next-page API path, or null. |
{
"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
From a public profile to a response your application can use.
Cached requests can return directly from the API. V2 paginates the returned list; it does not change the underlying data collection.
Small surface area. Familiar web standards.
Successful data and API error responses use JSON.
Only publicly available MyAnimeList information is processed.
Call the public user endpoints without an API key.
Public GET requests support cross-origin access with CORS.
The API does not modify MyAnimeList accounts.
Versioned user responses currently use a 600-second cache. Check meta.cache_seconds and Cache-Control on your response.
Retrieve data, inspect headers, or check cross-origin request options.
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
Current availability and 30 days of monitoring history.
Last checked: unavailable
Last checked: unavailable
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.