santifer/career-ops · error · Error
apify: entry missing 'actor' (e.g. misceres/indeed-scraper)
Error message
apify: entry ${entry.name} missing 'actor' (e.g. misceres/indeed-scraper) What it means
Config validation in the Apify keyed provider's fetch hook: a job_boards/portals entry is routed to the apify provider but lacks the `actor` field that names which Apify actor to run (e.g. misceres/indeed-scraper). The interpolated name identifies the offending entry. The token check has already passed, so this is purely a missing config key, not a credentials problem.
Solutions
- Add the actor identifier to the entry: actor: misceres/indeed-scraper.
- Copy the actor path exactly from its Apify store page (org/name format).
- Validate the whole config with the plugin's example entry as a reference.
Example fix
// config before
- name: indeed
field_map: { title: positionName, url: url }
// after
- name: indeed
actor: misceres/indeed-scraper
field_map: { title: positionName, url: url } Defensive patterns
Strategy: validation
Validate before calling
for (const entry of apifyEntries) {
if (!entry.actor) throw new Error(`entry ${entry.name} missing actor`);
} Type guard
const hasActor = (e) => typeof e?.actor === 'string' && e.actor.includes('/'); Try / catch
try {
await scanner.run(config);
} catch (e) {
if (String(e.message).includes("missing 'actor'")) {
console.error('Fix config: each apify entry needs actor: org/name');
}
throw e;
} Prevention
- Copy the full example entry from plugin docs when adding new entries.
- Validate config at startup with a schema validator (e.g. zod).
- Use the actor path copied verbatim from the Apify store page.
- Lint YAML config for required keys before committing.
When it happens
Trigger: A config entry in the apify plugin config that lacks the 'actor' key, or has it as an empty string/null — e.g. { name: 'indeed', field_map: {...} } with no actor.
Common situations: Hand-editing config/plugins.yml and forgetting the actor field; copying an entry template that lists other fields first; renaming 'actor' to something like 'actorId' by mistake.
Understand the failure class
Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.
Related errors
- apify: entry has invalid field_map. Each of title, url…
- jibeapply: careers_url required
- local-parser: parser.command is required
- apify: invalid actorId
- apify: invalid timeoutMs
AI-assisted analysis of santifer/career-ops@aac998c7ed (2026-09-16).
Data as JSON: /api/errors/f0aaf1bde4024ede.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/apify/index.mjs:185
if (!out[k]) out[k] = String(v);
}
return out;
}
/** The keyed provider hook. Reads APIFY_TOKEN from the plugin's scoped ctx.env. */
export default {
provider: {
id: 'apify',
// Keyed providers never auto-detect (the engine also forces this to null).
detect() { return null; },
async fetch(entry, ctx) {
const token = ctx?.env?.APIFY_TOKEN || process.env.APIFY_TOKEN;
if (!hasToken(token)) {
throw new Error('APIFY_TOKEN not set — enable apify in config/plugins.yml and add the token to .env');
}
if (!entry.actor) {
throw new Error(`apify: entry ${entry.name} missing 'actor' (e.g. misceres/indeed-scraper)`);
}
if (
!entry.field_map ||
!isFieldSpec(entry.field_map.title) ||
!isFieldSpec(entry.field_map.url) ||
(entry.field_map.company != null && !isFieldSpec(entry.field_map.company)) ||
(entry.field_map.location != null && !isFieldSpec(entry.field_map.location)) ||
(entry.field_map.description != null && !isFieldSpec(entry.field_map.description))
) {
throw new Error(
`apify: entry ${entry.name} has invalid field_map. Each of title, url, company, ` +
`location, description must be a string or a non-empty array of strings. title and url are required.`
);
}
const opts = { token };
if (entry.timeout_ms != null) opts.timeoutMs = entry.timeout_ms;
const items = await runActor(entry.actor, entry.input || {}, opts);View on GitHub (pinned to aac998c7ed)