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

  1. Open https://api.mangadex.org/list/<id> to confirm the list exists and whether it is private.
  2. If private, configure MANGADEX_* credentials so an access token is sent.
  3. Clear cache key mangadex:mdlist-info-<id> if a transient error was cached.
  4. 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

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


AI-assisted analysis of DIYgod/RSSHub@bed535e087 (2026-08-12). Data as JSON: /api/errors/83b563730234accd. Report an issue: GitHub.