{"record":{"id":"4a0c59ed8b081c57","repo":"DIYgod/RSSHub","slug":"tumblr-rss-is-disabled-due-to-the-lack-of-a-href-4a0c59","errorCode":null,"errorMessage":"Tumblr RSS is disabled due to the lack of <a href=\"https://docs.rsshub.app/deploy/config#route-specific-configurations\">relevant config</a>","messagePattern":"Tumblr RSS is disabled due to the lack of <a href=\"https://docs\\.rsshub\\.app/deploy/config#route-specific-configurations\">relevant config</a>","errorType":"exception","errorClass":"ConfigNotFoundError","httpStatus":503,"severity":"error","filePath":"lib/routes/tumblr/tagged.ts","lineNumber":47,"sourceCode":"            {\n                name: 'TUMBLR_REFRESH_TOKEN',\n                description: 'Please see above for details.',\n            },\n        ],\n        requirePuppeteer: false,\n        antiCrawler: false,\n        supportBT: false,\n        supportPodcast: false,\n        supportScihub: false,\n    },\n    name: 'Tagged Posts',\n    maintainers: ['PolarisStarnor'],\n    handler,\n};\n\nasync function handler(ctx: Context): Promise<Data> {\n    if (!config.tumblr || !config.tumblr.clientId) {\n        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>');\n    }\n\n    const tag = ctx.req.param('tag');\n    const limit = fallback(undefined, queryToInteger(ctx.req.query('limit')), 20);\n\n    const response = await got.get('https://api.tumblr.com/v2/tagged', {\n        searchParams: {\n            tag,\n            api_key: utils.generateAuthParams(),\n            limit,\n        },\n        headers: await utils.generateAuthHeaders(),\n    });\n\n    const posts = response.data.response.map((post: any) => utils.processPost(post));\n\n    return {\n        title: `Tumblr - ${tag}`,","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/DIYgod/RSSHub/blob/bed535e0879dc71c5aff6f1e7bd1ac21ede40115/lib/routes/tumblr/tagged.ts#L29-L65","documentation":"ConfigNotFoundError from the Tumblr Tagged route, identical in cause to the Posts route: the handler requires `config.tumblr.clientId` to call `api.tumblr.com/v2/tagged` and aborts if it is missing.","triggerScenarios":"`config.tumblr` is undefined or `config.tumblr.clientId` is falsy on line 48, throwing on line 49. The tagged endpoint additionally requires a valid consumer key for the search params.","commonSituations":"Same deployment gap as the Posts route: missing `TUMBLR_CLIENT_ID`/`TUMBLR_CLIENT_SECRET`; only one of the two Tumblr routes was being used and the env was never set.","solutions":["Register a Tumblr OAuth application and set `TUMBLR_CLIENT_ID` + `TUMBLR_CLIENT_SECRET`.","Restart RSSHub so the config loads.","If only consumer secret is set but not client id (or vice versa), supply both — the check requires clientId specifically."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (!config.tumblr?.clientId) { throw new ConfigNotFoundError('Set TUMBLR_CLIENT_ID/TUMBLR_CLIENT_SECRET before enabling Tumblr routes'); }","typeGuard":"const hasTumblrConfig = (c: unknown): c is { clientId: string } => typeof c === 'object' && c !== null && typeof (c as any).clientId === 'string';","tryCatchPattern":null,"preventionTips":["Share the Tumblr OAuth app across both Posts and Tagged routes","Validate config presence at boot","Restart RSSHub after adding credentials"],"tags":["config","oauth","tumblr","authentication","config-not-found"],"backgroundTag":null,"analyzedSha":"bed535e0879dc71c5aff6f1e7bd1ac21ede40115","analyzedAt":"2026-08-12T19:29:35.364Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}