Most job data tools make you bring a list of companies first. That is fine when you already know who you are watching, but it does not answer the more common question: who is hiring a data engineer right now? Job boards like LinkedIn and Indeed answer it, but they are hard to collect from and full of reposts. The cleanest source is the company career site itself, and a large share of startups and mid sized companies run theirs on Greenhouse, Lever, Ashby, Workable, SmartRecruiters or Recruitee.

The Career Site Jobs Search actor, published by Hay Equipos on the Apify Store, searches those six systems by keyword. It holds an index of 19,883 public company job boards, picks the boards that have matching roles, reads them live, and returns each open job in one schema: title, company, location, remote flag, salary range when published, posted date, job link, apply link and the description as plain text. No login, no browser, no company list.

Where the companies come from

No public list of every company on these systems exists, so the index is built from the Common Crawl URL index, a free public archive of web addresses. Every address on boards.greenhouse.io, jobs.lever.co, jobs.ashbyhq.com, apply.workable.com, jobs.smartrecruiters.com and *.recruitee.com in recent crawls was turned into a board name, and each one was checked against that system's public API. Only boards that exist are kept, together with their job titles and locations at build time.

When you search, the actor scores every board by how many of its titles matched, then reads the best boards live, so the results are always current. It is a large sample, not every company in the world, and it leans toward startups and scaleups, because large enterprises mostly use Workday, iCIMS or Taleo, which this actor does not cover. You can add any board it does not know in Extra boards.

What you get back

One row per job (illustrative values):

{ "source": "ashby", "company": "Example Labs", "title": "Senior Data Engineer", "department": "Engineering", "location": "New York, NY", "isRemote": true, "postedAt": "2026-10-02T15:04:00.000Z", "salaryMin": 180000, "salaryMax": 220000, "salaryCurrency": "USD", "jobUrl": "https://jobs.ashbyhq.com/example-labs/1f2e3d4c", "applyUrl": "https://jobs.ashbyhq.com/example-labs/1f2e3d4c/application", "matchedKeyword": "data engineer", "boardUrl": "https://jobs.ashbyhq.com/example-labs", "descriptionText": "About the role\n\nYou will build..." } 

A RUN_SUMMARY record in the key value store shows the index date and size, how many boards matched, how many were read and how many jobs came from each system.

How keyword matching works

A title matches when it contains your phrase at the start of a word, with any ending on the last word. data engineer finds "Senior Data Engineer" and "Data Engineering Lead" but not "Data Center Engineer". To require words anywhere in the title, join them with +, for example engineer + kubernetes. Excluded words work the same way, so senior and intern in Exclude titles with remove those roles.

Step by step in the Apify Console

  1. Open the actor on the Apify Store and start it in the Console.
  2. In Job title keywords, add one phrase per line, for example data engineer and analytics engineer.
  3. Add Location contains any of (for example United States, London, Germany), Remote jobs only, or Posted within the last N days if you need them.
  4. Keep Maximum jobs per company at 10 so one big employer does not fill the list, and set Maximum jobs in total.
  5. Click Start and export as CSV, Excel, JSON or HTML.

Calling it from code

curl:

curl -X POST \ "https://api.apify.com/v2/acts/pistachio_implementation~career-site-jobs-search/run-sync-get-dataset-items" \ -H "Authorization: Bearer $APIFY_TOKEN" \ -H "Content-Type: application/json" \ -d '{"keywords": ["data engineer"], "locations": ["United States"], "postedWithinDays": 14, "maxJobs": 100}' 

Python with apify-client:

import os from apify_client import ApifyClient client = ApifyClient(os.environ["APIFY_TOKEN"]) run = client.actor("pistachio_implementation/career-site-jobs-search").call( run_input={ "keywords": ["product manager", "product owner"], "excludeKeywords": ["senior", "intern"], "locations": ["London"], "postedWithinDays": 30, "includeDescription": False, "maxJobs": 200, } ) for job in client.dataset(run["defaultDatasetId"]).iterate_items(): print(job["company"], "|", job["title"], "|", job["location"], "|", job["jobUrl"]) 

To watch for new roles, schedule the actor daily with Posted within the last N days set to 1 or 2.

Pricing

Pay per event: $0.002 per job saved on the free tier, which is $2 per 1,000 jobs, falling to $1.25 per 1,000 on Apify's Gold tier. Jobs removed by your filters and searches with no results cost nothing. The optional full scan mode, which also reads boards that had no matching title at index time, adds $0.10 per 1,000 boards checked. You can set a maximum charge per run and the actor stops early when it is reached.

Limits and what it does not do

  • Six systems only. Workday, iCIMS, Taleo, SuccessFactors, LinkedIn and Indeed are not covered.
  • The index is a sample. Companies that never appeared in Common Crawl are missing unless you add them in Extra boards.
  • Location matching is plain text. United States will not match a job listed only as "Austin, TX"; add the cities or states you care about.
  • Salary appears only when the company publishes it, which is common on Ashby and Greenhouse and rare on Workable and SmartRecruiters.
  • It does not collect personal data about candidates or recruiters.

Please use the job data in line with each job board's terms.

Try it on the Apify Store: https://apify.com/pistachio_implementation/career-site-jobs-search