{"record":{"id":"99ef0f2dc07cbbe5","repo":"jackwener/OpenCLI","slug":"substack-publication-search-failed-http-resp-st","errorCode":null,"errorMessage":"Substack publication search failed: HTTP ${resp.status}","messagePattern":"Substack publication search failed: HTTP (.+?)","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/substack/search.js","lineNumber":44,"sourceCode":"        throw new CommandExecutionError(`Substack post search failed: HTTP ${resp.status}`);\n    const data = await resp.json();\n    const results = Array.isArray(data?.results) ? data.results : [];\n    return results.slice(0, limit).map((item, index) => ({\n        rank: index + 1,\n        title: trim(item?.title),\n        author: trim(item?.publishedBylines?.[0]?.name),\n        date: trim(item?.post_date).split('T')[0] || trim(item?.post_date),\n        description: trim(item?.description || item?.subtitle || item?.truncated_body_text).slice(0, 150),\n        url: trim(item?.canonical_url),\n    }));\n}\nasync function searchPublications(keyword, limit) {\n    const url = new URL('https://substack.com/api/v1/profile/search');\n    url.searchParams.set('query', keyword);\n    url.searchParams.set('page', '0');\n    const resp = await fetch(url, { headers: headers() });\n    if (!resp.ok)\n        throw new CommandExecutionError(`Substack publication search failed: HTTP ${resp.status}`);\n    const data = await resp.json();\n    const results = Array.isArray(data?.results) ? data.results : [];\n    return results.slice(0, limit).map((item, index) => {\n        const publication = item?.primaryPublication || item?.publicationUsers?.[0]?.publication || {};\n        return {\n            rank: index + 1,\n            title: trim(publication?.name || item?.name),\n            author: trim(item?.name),\n            date: '',\n            description: trim(publication?.hero_text || item?.bio).slice(0, 150),\n            url: publicationBaseUrl(publication),\n        };\n    });\n}\ncli({\n    site: 'substack',\n    name: 'search',\n    access: 'read',","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/substack/search.js#L26-L62","documentation":"searchPublications calls the Substack profile/publication search API (substack.com/api/v1/profile/search). Any non-ok HTTP response throws a CommandExecutionError carrying the status code.","triggerScenarios":"Any searchPublications call where the profile search endpoint returns non-2xx: rate limiting, missing session cookies, 403 from bot protection, or 5xx during Substack incidents.","commonSituations":"Bulk publication lookups in a loop, unauthenticated calls from datacenter IPs, Substack API surface changes, transient 502/503 during platform deploys.","solutions":["Retry with backoff for transient 429/5xx statuses","Run within a browser session so request headers include valid cookies","Reduce lookup frequency or batch size","Confirm the endpoint path is still valid after Substack API updates"],"exampleFix":"// before\nconst pubs = await searchPublications('tech', 10); // throws on 403\n// after\nlet pubs;\ntry { pubs = await searchPublications('tech', 10); }\ncatch (e) { console.error('publication search:', e.message); pubs = []; }","handlingStrategy":"retry","validationCode":"// ensure a browser session exists so headers() carries valid cookies\nif (!session || !session.cookies) throw new Error('run within a browser session for substack publication search');","typeGuard":"null","tryCatchPattern":"try { pubs = await searchPublications(q, 10); } catch (e) {\n  const m = /HTTP (\\d+)/.exec(e.message);\n  if (m && ['429','502','503'].includes(m[1])) { await sleep(5000); pubs = await searchPublications(q, 10); } else throw e;\n}","preventionTips":["Throttle bulk publication lookups","Run inside a browser session for valid cookies","Retry transient 5xx with backoff","Verify endpoint paths after Substack updates"],"tags":["http","search","substack"],"backgroundTag":"http-request-failed","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}