santifer/career-ops · error · Error
softgarden: cannot resolve widget URL for ${entry.name}
Error message
softgarden: cannot resolve widget URL for ${entry.name} What it means
resolveWidgetUrl requires an http(s) URL whose host is exactly 'softgarden.io' or ends with '.softgarden.io'; it then derives the server-rendered widget page at {origin}/{lang}/widgets/jobs. If neither entry.api nor entry.careers_url satisfies the host check it returns null and fetch throws. The provider does not call an API — it scrapes that widget HTML directly.
Source
Thrown at providers/softgarden.mjs:146
postedAt: parseSoftgardenDate(dateM ? clean(dateM[1]) : undefined),
});
}
return out;
}
/** @type {Provider} */
export default {
id: 'softgarden',
detect(entry) {
const url = entry.api || entry.careers_url || '';
if (typeof url !== 'string') return null;
return resolveWidgetUrl({ api: url }) ? { url } : null;
},
async fetch(entry, ctx) {
const widgetUrl = resolveWidgetUrl(entry);
if (!widgetUrl) throw new Error(`softgarden: cannot resolve widget URL for ${entry.name}`);
const html = await ctx.fetchText(widgetUrl, { headers: { accept: 'text/html' } });
const rows = parseWidget(html, widgetUrl);
const jobs = [];
for (const row of rows) {
const job = { title: row.title, url: row.url, company: entry.name, location: row.location };
if (typeof row.postedAt === 'number') job.postedAt = row.postedAt;
jobs.push(job);
if (jobs.length >= MAX_JOBS) break;
}
return jobs;
},
};
View on GitHub (pinned to 9b17a8ac97)
Solutions
- Set careers_url (or api) to the softgarden tenant host, e.g. https://renk-group.softgarden.io
- If only the branded site is known, open it, find the iframe src pointing at *.softgarden.io, and use that host
- Ensure the host ends in .softgarden.io (the bare apex softgarden.io is also accepted)
- If the company is not on softgarden, switch the entry to the correct provider
Example fix
# before - name: RENK Group provider: softgarden careers_url: https://karriere.renk.group # after - name: RENK Group provider: softgarden careers_url: https://renk-group.softgarden.io
Defensive patterns
Strategy: validation
Validate before calling
// Pre-check that an entry can resolve a softgarden widget URL.
import { resolveWidgetUrl } from './providers/softgarden.mjs';
if (!resolveWidgetUrl(entry)) {
console.warn(`${entry.name}: not a *.softgarden.io host — fix careers_url or switch provider`);
} Prevention
- Run resolveWidgetUrl(entry) during a config-lint step before scanning.
- Store the {tenant}.softgarden.io host (from the iframe src) rather than the branded parent URL.
- Validate that every provider: softgarden entry has a host ending in .softgarden.io.
When it happens
Trigger: entry.careers_url points at the company's branded site rather than the {tenant}.softgarden.io host; the URL is malformed (new URL throws); or the protocol is neither http: nor https:.
Common situations: A company embeds the softgarden widget in an iframe on its own domain, and the entry stores the iframe parent URL instead of the softgarden tenant host. Also when an entry is force-tagged provider: softgarden without a softgarden host.
Related errors
- successfactors: cannot resolve origin for ${entry.name}
- tkms: cannot resolve jobs host for ${entry.name}
- glints: invalid URL: ${url}
- glints: URL must use HTTPS: ${url}
- greenhouse: invalid URL: ${url}
AI-assisted analysis of santifer/career-ops@9b17a8ac97 (2026-08-13).
Data as JSON: /api/errors/e8971aaae5887763.
Report an issue: GitHub.