# Apify Job Source

Scans a job source through an Apify actor as a keyed provider.

- Repository: https://github.com/career-ops-hq/career-ops (79256 stars)
- Category: Business
- License: MIT
- Last updated: 2026-11-01
- Runs scripts: yes, review before use

## Install

Claude Code: `npx skills add career-ops-hq/career-ops --skill career-ops-plugin-apify -g -a claude-code -y`
Codex: `npx skills add career-ops-hq/career-ops --skill career-ops-plugin-apify -g -a codex -y`
Cursor: `npx skills add career-ops-hq/career-ops --skill career-ops-plugin-apify -g -a cursor -y`
Gemini CLI: `npx skills add career-ops-hq/career-ops --skill career-ops-plugin-apify -g -a gemini-cli -y`
Claude Code plugin marketplace: `/plugin marketplace add career-ops-hq/career-ops`

## Description

How to scan a job source through an Apify actor as a keyed provider.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# apify plugin

A keyed provider: runs an Apify actor and maps its dataset items into the
scanner. It fires ONLY on a `portals.yml` entry that sets `provider: apify`, never via auto-detection. Put `APIFY_TOKEN` in `.env`.

## portals.yml entry

```yaml
tracked_companies:
  - name: "Indeed, VP Engineering (Chicago)"
    provider: apify
    actor: misceres/indeed-scraper
    input: { position: "VP of Engineering", location: "Chicago, IL", maxItems: 25 }
    field_map:
      title:    [positionName, title]    # array = first non-empty wins
      url:      url
      company:  [company, companyName]
      location: [location, formattedLocation]
```

## Then

`node scan.mjs` runs the provider for that entry and writes the results to the
pipeline like any other source. An optional `field_map.description` caches the
JD locally under `jds/`.

