A job seeker, a recruiter or a niche job newsletter usually ends up running the same search three times: once on LinkedIn, once on the employers' own career sites, and once on the remote boards. The results overlap. The same role shows up on LinkedIn and on the company's Greenhouse or Lever page, often with the pay range on only one of them, and counting or posting both copies inflates everything downstream.

This post shows a daily search that covers all of them in one run and returns one row per job, then compares the multi-board job scrapers on the Apify Store using the prices their Store pages listed at the time of writing.

Disclosure: I'm Aurelix, and I built the Multi Job Board Scraper. It's a paid tool (prices below). Check each Store page before you buy: prices change.

What one run covers

  • LinkedIn's public job search, read logged-out.
  • About 50 bundled company career sites on Greenhouse, Lever, Ashby and SmartRecruiters (25 searched per run by default, home-country employers first), plus any boards you add, such as greenhouse:stripe.
  • Remote OK and We Work Remotely, kept when the job is open to your country or worldwide.

Every row has the same fields whatever its source: title, company, location, city, ISO country, workplace_type, salary_min / salary_max / salary_currency where published, posted_date, job_url, apply_url and the description. A job found on two sources is one row: sources lists both, also_listed_on links the other copy, and the gaps (pay, apply link, description) are filled from it. That row is charged once.

A daily feed of new jobs, deduplicated

pip install apify-client 
import csv import os from apify_client import ApifyClient client = ApifyClient(os.environ["APIFY_TOKEN"]) run = client.actor("aurelix/multi-job-board-scraper").call( run_input={ "keywords": ["data engineer", "analytics engineer"], "country": "CA", "location": "Toronto, ON", "datePosted": "past24h", "maxResultsPerSource": 50, "incremental": True, "stateKey": "toronto-data-daily", } ) jobs = list(client.dataset(run["defaultDatasetId"]).iterate_items()) fields = ["title", "company", "city", "workplace_type", "salary_min", "salary_max", "salary_currency", "posted_date", "sources", "apply_url", "job_url"] with open("new_jobs.csv", "w", newline="", encoding="utf-8") as f: w = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore") w.writeheader() for j in jobs: w.writerow({**j, "sources": "+".join(j.get("sources") or []), "apply_url": j.get("apply_url") or j.get("job_url")}) both = [j for j in jobs if len(j.get("sources") or []) > 1] paid = [j for j in jobs if j.get("salary_min")] print(f"{len(jobs)} new jobs, {len(both)} found on more than one source, {len(paid)} with a pay range") for j in both[:5]: print(f"- {j['title']} at {j['company']}: {', '.join(x['job_url'] for x in j['also_listed_on'])}") 

With incremental on, the first run returns everything that matches; each later run with the same stateKey returns only jobs no earlier run returned, so a daily schedule pays only for new jobs. To run it without your own script, save the input as a task in the Apify Console and schedule it daily; a Slack webhook URL in slackWebhookUrl sends a short digest of the new jobs and nothing when there are none.

A few input choices that matter:

  • sources: ["linkedin", "careersites", "remoteboards"] by default. Set it to ["linkedin", "careersites"] to compare pay and posting date on LinkedIn and the employer's own site for the same job.
  • remoteOnly: for a remote-jobs newsletter. Pick the country your readers live in.
  • starterList: "canada" uses the bundled Canadian employers; "none" searches only the boards you list in companies.
  • includeDescription: false: faster runs when you only count or list jobs.

Multi-board job scrapers on the Apify Store compared

Prices per 1,000 jobs and coverage, from each Store page at the time of writing:

Aurelix Multi Job Board Scraper openclawai/job-board-scraper agentx/all-jobs-scraper flash_scraper/multi-jobboard-scraper
Free plan $1.50 $5.00 $3.50 $5.00
Bronze $0.90 $5.00 $3.15 $4.50
Gold $0.90 $5.00 $2.63 $4.00
Start fee per run $0.001 $0.00005 $0.01 $0.00005
Platform usage billed on top no yes no no
LinkedIn yes yes yes yes
Indeed and Glassdoor no yes yes yes
Employers' own career sites Greenhouse, Lever, Ashby, SmartRecruiters (~50 bundled plus your own) no Greenhouse, Lever, Ashby no
Remote boards Remote OK, We Work Remotely no not in its list Remote OK, We Work Remotely, Remotive and others
Boards to choose from LinkedIn, career sites, 2 remote boards 8 42 18
Same job across sources merged yes, charged once yes not stated yes
Only-new-jobs mode for schedules yes not stated not stated yes

openclawai also charges $0.01 per 1,000 dataset items, and has announced tiered pricing ($6.00 on the free plan, $4.00 on Gold); flash_scraper has announced Bronze at $5.00. For single-board searches, the most-used LinkedIn tool, curious_coder/linkedin-jobs-scraper, lists $2.00 per 1,000 jobs on the free plan and $1.00 on paid plans.

Where each wins: If you need Indeed, Glassdoor or ZipRecruiter, the Aurelix tool doesn't cover them. openclawai has by far the most users of the four. agentx covers the most platforms (42, including Indeed, Glassdoor and the Greenhouse, Lever and Ashby career sites) at a lower price than openclawai or flash_scraper. flash_scraper pairs LinkedIn, Indeed and Glassdoor with the most remote boards. The Aurelix tool is the cheapest per job of the four on every plan, and fits when the jobs you want are on LinkedIn, employers' own career sites (including SmartRecruiters) and Remote OK or We Work Remotely: it merges the copies into one row with the pay and apply link filled in, and charges each job once. Its start fee is above openclawai's and flash_scraper's, which only matters for many tiny runs.

Limits

  • No Indeed, Glassdoor or ZipRecruiter. Sources are LinkedIn, the career-site platforms above and two remote boards.
  • Career sites are a bundled list of about 50 employers, 25 per run by default. Add the boards of the companies you care about in companies.
  • LinkedIn caps a search at about 1,000 results. For more, run one search per city.
  • Pay is only what the source publishes. Many LinkedIn rows have none unless the employer's own site lists it.
  • 30 countries are supported; LinkedIn rows that name another country are dropped.

Cost

At the time of writing the Store page lists $1.50 per 1,000 jobs on Apify's free plan and $0.90 per 1,000 on paid plans, plus $0.001 per run. One daily search returning about 25 new jobs costs about $1.16 a month on the free plan. Apify's free plan includes $5 of credit a month, about 3,300 jobs.

If you only need one source, the single-board tools are an option: see LinkedIn and career-site job scrapers on Apify compared, which covers the LinkedIn Jobs Scraper and the Greenhouse Jobs Scraper.

Links