Web and domains

Greenhouse, Lever and Ashby Jobs API and Hiring Signals

Most company career pages are built on one of a few applicant tracking systems, and each has a public job-board API. This Actor reads Greenhouse, Lever, Ashby, SmartRecruiters and Workable boards, normalizes every open role, and in signals mode reports what changed at each company since the last run.

Open the Actor on Apify Store

Hiring Signals & ATS Jobs Scraper — Greenhouse, Lever, Ashby. Pay per result; see the Store page for current pricing.

The source and its limits

Only the providers' public, unauthenticated job-board APIs are used: boards-api.greenhouse.io, api.lever.co (and api.eu.lever.co), api.ashbyhq.com/posting-api, api.smartrecruiters.com/v1/companies and apply.workable.com/api. Private or password-protected boards are not supported.

Boards are given as provider:boardId (greenhouse:stripe), as a public board URL, or as a company's own careers page URL. For a careers page, the Actor fetches it once and looks for a supported board in the final URL or the HTML. Three curated presets (ai-labs, developer-tools, fintech) add 50 to 59 boards each.

In signals mode each board is compared with the snapshot from the previous run, producing new-role, removed-role, title-changed and location-changed events plus one board-summary per company with open roles, net change, top departments and locations, remote share and a 0 to 100 hiring velocity score.

Limits worth knowing

  • Requests to each provider are limited to about two per second. Descriptions on SmartRecruiters and Workable need one extra request per job.
  • Workable's API sits behind a firewall. When both of its endpoints refuse, the board returns a WORKABLE_BLOCKED error item; no residential proxies are used.
  • city and country are best-effort parses of free-text locations. Salary data appears only where the provider exposes it (Ashby and Lever) and the company publishes it.
  • Careers pages that render their job list only in the browser, with no link to the job board in the HTML, return ATS_NOT_DETECTED.
  • Only currently listed jobs are returned. Boards over maxJobsPerBoard are marked truncated and removals are not reported for them.

Fields you get

FieldWhat it holds
typejob, a signal type, board-summary or error
provider, boardId, companyName, jobIdWhich board and job
title, department, teamThe role
location, city, country, remoteRaw location, best-effort city and country, and a remote flag
employmentType, postedAt, updatedAtWhere the provider exposes them
applyUrl, jobUrlLinks to the posting
descriptionText, compensationWith includeDescription; compensation on Ashby and Lever where published
openRoles, netChange, topDepartments, remoteShare, hiringVelocityScoreOn board-summary records in signals mode

Example output

A board-summary record from a signals run (from the Actor's README):

{
  "type": "board-summary",
  "provider": "lever",
  "boardId": "spotify",
  "baseline": false,
  "openRoles": 312,
  "previousOpenRoles": 298,
  "newSinceLastRun": 21,
  "removedSinceLastRun": 7,
  "changedSinceLastRun": 3,
  "netChange": 14,
  "topDepartments": [
    {
      "name": "Engineering",
      "count": 140
    },
    {
      "name": "Sales",
      "count": 45
    }
  ],
  "topLocations": [
    {
      "name": "Stockholm, Sweden",
      "count": 120
    },
    {
      "name": "New York, NY",
      "count": 80
    }
  ],
  "remoteShare": 0.18,
  "hiringVelocityScore": 58,
  "truncated": false,
  "previousSnapshotAt": "2026-10-09T12:00:00.000Z",
  "detectedAt": "2026-10-16T12:00:00.000Z"
}

Use cases

Weekly hiring signals for target accounts

Run signals mode weekly on a list of company boards to see which companies are adding roles, removing them or shifting focus, with a velocity score per company.

Job export across providers

Pull open roles from Greenhouse, Lever and Ashby boards in one run, all in the same record shape.

Start from a careers page

Paste a company's careers URL instead of hunting for its board id; the Actor detects the board behind it.

How to run it

You need an Apify account and its API token (Console → Settings → API & Integrations). Each run is billed per result to your account; set a maximum total charge for the run to cap spend.

With curl

The sync endpoint starts a run, waits up to 300 seconds and returns the dataset items. Signals mode on one Greenhouse board (the first run stores a baseline):

export APIFY_TOKEN=<your Apify API token>

curl -sS -X POST \
  "https://api.apify.com/v2/acts/owlabee~job-postings-api/run-sync-get-dataset-items" \
  -H "Authorization: Bearer ${APIFY_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
  "boards": [
    "greenhouse:stripe"
  ],
  "mode": "signals",
  "includeDescription": false,
  "maxJobsPerBoard": 80,
  "stateStoreName": "hiring-signals-stripe-weekly",
  "maxConcurrency": 5
}'

From an AI agent (MCP)

Apify hosts an MCP server. This config exposes only this Actor to the agent:

{
  "mcpServers": {
    "owlabee-job-postings-api": {
      "url": "https://mcp.apify.com/?tools=owlabee/job-postings-api",
      "headers": {
        "Authorization": "Bearer ${APIFY_TOKEN}"
      }
    }
  }
}

Then ask, for example: Which roles did Stripe add or remove on its Greenhouse job board since last week?

Python, Node.js and more examples

Runnable curl.sh, python.py, node.mjs and mcp.json files for this Actor are in examples/job-postings-api on GitHub.

FAQ

Does it need an API key or proxies?

No. Greenhouse, Lever, Ashby and SmartRecruiters publish job-board APIs that need no credentials. Workable sometimes blocks datacenter traffic.

How do I find a company's board id?

Open a job on the company's careers page and paste its URL (for example boards.greenhouse.io/<token> or jobs.lever.co/<company>), or paste the careers page itself.

What happens on the first signals run?

There is no snapshot yet, so every current job is written as a job record with a baseline summary. Change events start with the second run.

Why are some fields null?

Providers expose different fields: some Greenhouse boards have no posted date, Lever has no update date, SmartRecruiters departments are optional. The Actor does not guess them.

Does it read LinkedIn or job aggregators?

No. Only the five providers' public job-board APIs and, when you give one, the company's own careers page.