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

  1. Set careers_url (or api) to the softgarden tenant host, e.g. https://renk-group.softgarden.io
  2. If only the branded site is known, open it, find the iframe src pointing at *.softgarden.io, and use that host
  3. Ensure the host ends in .softgarden.io (the bare apex softgarden.io is also accepted)
  4. 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

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


AI-assisted analysis of santifer/career-ops@9b17a8ac97 (2026-08-13). Data as JSON: /api/errors/e8971aaae5887763. Report an issue: GitHub.