DIYgod/RSSHub · error · Error
Failed to retrieve user follows from MangaDex API.
Error message
Failed to retrieve user follows from MangaDex API.
What it means
Thrown when fetching a MangaDex custom-list's info (GET /list/<id> with includes=user) returns no data.data, used to resolve the list name and author. Cached under mangadex:mdlist-info-<id> for the content-expire duration. Requires a Bearer token when the list is private.
Source
Thrown at lib/routes/mangadex/mdlist/feed.ts:95
const { listName, listAuthor } = (await cache.tryGet(
`mangadex:mdlist-info-${id}`,
async () => {
const response = await got.get(
`${constants.API.BASE}/list/${id}${toQueryString({
includes: ['user'],
})}`,
{
headers: {
Authorization: isPrivate ? `Bearer ${accessToken}` : '',
'User-Agent': config.trueUA,
},
}
);
const mdlistInfo = response?.data?.data;
if (!mdlistInfo) {
throw new Error('Failed to retrieve user follows from MangaDex API.');
}
const listName = mdlistInfo.attributes.name;
const listAuthor = mdlistInfo.relationships.find((relationship) => relationship.type === 'user')?.attributes.username;
return { listName, listAuthor };
},
config.cache.contentExpire
)) as Record<string, any>;
const feed = (await cache.tryGet(
`mangadex:mdlist-feed-${id}`,
async () => {
const response = await got.get(
`${constants.API.BASE}/list/${id}/feed${toQueryString({
limit,
translatedLanguage: languagesQuery,
order: {View on GitHub (pinned to bed535e087)
Solutions
- Open https://api.mangadex.org/list/<id> to confirm the list exists and whether it is private.
- If private, configure MANGADEX_* credentials so an access token is sent.
- Clear cache key mangadex:mdlist-info-<id> if a transient error was cached.
- Verify the list id in the route URL matches the one in the MangaDex UI.
Defensive patterns
Strategy: validation
Validate before calling
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
if (!UUID_RE.test(id)) {
throw new Error(`Invalid MangaDex list id: ${id}`);
} Type guard
const isListInfoResponse = (v: unknown): v is { data: { attributes: { name: string }; relationships: unknown[] } } =>
typeof v === 'object' && v !== null && typeof (v as any).data?.attributes?.name === 'string'; Try / catch
try {
info = await getListInfo(id);
} catch (e) {
if (/not found/i.test((e as Error).message)) {
return { title: 'List unavailable' }; // degrade the feed
}
throw e;
} Prevention
- Validate the list id as a UUID at the route boundary.
- Configure MANGADEX auth if you subscribe to private lists.
- Clear mangadex:mdlist-info-<id> when a list is deleted upstream.
When it happens
Trigger: GET https://api.mangadex.org/list/<id>?includes=user where the list id is wrong/deleted, the list is private and no/invalid access token was supplied (Authorization sent only when isPrivate is true), or the API returned an error body.
Common situations: User passed a non-existent list id; list was deleted or made private after subscription; MANGADEX auth not configured so private lists return empty; transient API error cached for contentExpire.
Related errors
- Failed to retrieve user follows from MangaDex API.
- Failed to retrieve user follows from MangaDex API.
- ${tagResponse.msg}
- ${data.errors[0].detail}
- Failed to retrieve manga meta from MangaDex API.
AI-assisted analysis of DIYgod/RSSHub@bed535e087 (2026-08-12).
Data as JSON: /api/errors/83b563730234accd.
Report an issue: GitHub.