DIYgod/RSSHub · error · ConfigNotFoundError

Tumblr RSS is disabled due to the lack of <a href="https://d

Error message

Tumblr RSS is disabled due to the lack of <a href="https://docs.rsshub.app/deploy/config#route-specific-configurations">relevant config</a>

What it means

ConfigNotFoundError from the Tumblr Posts route: it requires `config.tumblr.clientId` (and the broader `config.tumblr` object) to call the Tumblr v2 API. If either is missing the handler aborts before requesting `api.tumblr.com/v2/blog/{blog}/posts`.

Source

Thrown at lib/routes/tumblr/posts.ts:50

            },
        ],
        requirePuppeteer: false,
        antiCrawler: false,
        supportBT: false,
        supportPodcast: false,
        supportScihub: false,
    },
    name: 'Posts',
    maintainers: ['Rakambda', 'PolarisStarnor'],
    description: `::: tip
Tumblr provides official RSS feeds for non "dashboard only" blogs, for instance [https://biketouring-nearby.tumblr.com](https://biketouring-nearby.tumblr.com/rss).
:::`,
    handler,
};

async function handler(ctx: Context): Promise<Data> {
    if (!config.tumblr || !config.tumblr.clientId) {
        throw new ConfigNotFoundError('Tumblr RSS is disabled due to the lack of <a href="https://docs.rsshub.app/deploy/config#route-specific-configurations">relevant config</a>');
    }

    const blogIdentifier = ctx.req.param('blog');
    const limit = fallback(undefined, queryToInteger(ctx.req.query('limit')), 20);

    const response = await got.get(`https://api.tumblr.com/v2/blog/${blogIdentifier}/posts`, {
        searchParams: {
            api_key: utils.generateAuthParams(),
            limit,
        },
        headers: await utils.generateAuthHeaders(),
    });

    const blog = response.data.response.blog;
    const posts = response.data.response.posts.map((post: any) => utils.processPost(post));

    return {
        title: `Tumblr - ${blogIdentifier} - Posts`,

View on GitHub (pinned to bed535e087)

Solutions

  1. Register an application at https://www.tumblr.com/oauth/apps to obtain a consumer key.
  2. Set `TUMBLR_CLIENT_ID` and `TUMBLR_CLIENT_SECRET` in your RSSHub environment and restart.
  3. Confirm `config.tumblr.clientId` resolves after restart by logging the value's presence (not the value).
Defensive patterns

Strategy: validation

Validate before calling

if (!config.tumblr?.clientId) { throw new ConfigNotFoundError('Set TUMBLR_CLIENT_ID/TUMBLR_CLIENT_SECRET before enabling Tumblr routes'); }

Type guard

const hasTumblrConfig = (c: unknown): c is { clientId: string } => typeof c === 'object' && c !== null && typeof (c as any).clientId === 'string';

Prevention

When it happens

Trigger: `config.tumblr` is undefined or `config.tumblr.clientId` is falsy on line 51, so line 52 throws. The route depends on a registered Tumblr OAuth client id/secret.

Common situations: Self-hosted RSSHub without `TUMBLR_CLIENT_ID`/`TUMBLR_CLIENT_SECRET` env vars; the consumer key was revoked by Tumblr; the config object key was misspelled.

Related errors


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