Company Job Postings & Hiring Signals Scraper avatar

Company Job Postings & Hiring Signals Scraper

Pricing

from $0.80 / 1,000 job scrapes

Go to Apify Store
Company Job Postings & Hiring Signals Scraper

Company Job Postings & Hiring Signals Scraper

Pull every open role from any company's job board via official ATS APIs — Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Personio, Breezy. Enriched with seniority, function, salary, remote flag and the tech named in each posting. From $2 / 1,000 companies.

Pricing

from $0.80 / 1,000 job scrapes

Rating

0.0

(0)

Developer

Eimantas V

Eimantas V

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

3

Monthly active users

3 days ago

Last modified

Share

Give it a list of company domains. Get back every open role, enriched with seniority, function, location, salary and the technologies named in each posting.

It reads companies' official applicant-tracking system APIs — Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Personio and Breezy — not LinkedIn or Indeed. Those endpoints exist so companies can embed their own vacancies on their own sites: they return clean JSON, they are public and unauthenticated, and they are not defended by bot management. That makes this fast, cheap and stable in a way that job-board scraping is not.

Input: gitlab.com
Output: 190 open roles · 31 posted in the last 30 days · 52 remote
Tooling in postings: Salesforce, Ruby, Kubernetes, PostgreSQL
Hiring in United States, United Kingdom, India · velocity 90/100

What you get

Per job posting

FieldDetail
IdentityStable uid (<ats>:<token>:<jobId>), company name and domain, ATS and board token
RoleTitle, normalised title (seniority and location noise stripped, so the same role groups across companies), department, team
ClassificationSeniority (intern → executive) and function (engineering, data, sales, marketing, product, design, security, finance, people, …)
LocationLocation string, all secondary locations, parsed country and city, isRemote, isHybrid
CompensationParsed min / max / currency / period, including salaries stated only in the body text
TimingpostedAt, updatedAt, daysOpen
Tech keywordsTechnologies and vendors named in the posting — see below
LinksDirect apply URL, description snippet, optional full text

Per company (optional rollup record)

Open roles by function and seniority, top locations, top tooling, remote count, roles posted in the last 30 days, newest and oldest posting, and a 0–100 hiring velocity score.


Why the tech keywords matter

Every posting is scanned for ~90 technologies and vendors. That turns a job board into a buying-intent feed:

  • A company hiring for Snowflake + dbt + Airflow is standing up a data warehouse now.
  • A company hiring Salesforce administrators is expanding its CRM.
  • A company hiring Kubernetes + Terraform engineers is re-platforming.

Real output from a single run:

gitlab.com Salesforce(18), Ruby(8), Kubernetes(7), PostgreSQL(6), Vue.js(4)
ramp.com Python(16), NetSuite(12), Salesforce(10), React(9), AWS(8)
figma.com Python, Salesforce, Snowflake, NetSuite, dbt

Keywords that appear in nearly every posting on a large board are dropped as boilerplate — a company naming its own product in all 60 ads is not a signal.


Who this is for

  • Outbound sales — "companies that posted a Data Engineer role in the last 30 days" is a far better trigger than firmographics. Filter on postedWithinDays, jobFunction and techKeywords.
  • Recruiters and staffing — live, structured vacancy data straight from the source, with direct apply links.
  • Competitive and market intelligence — track where competitors are investing headcount, by function and country, week over week.
  • Investors — headcount growth by function is one of the earliest public signals of a company's direction.
  • Data teams — a fixed, documented schema with a stable primary key, so consecutive runs diff cleanly.

Input

{
"companies": ["gitlab.com", "figma.com", "linear.app"],
"titleKeywords": ["engineer", "data"],
"postedWithinDays": 30,
"maxJobsPerCompany": 200
}

Domains, careers URLs and direct board URLs all work. If you already know the board, skip discovery entirely:

{ "boards": [{ "ats": "greenhouse", "token": "gitlab" }] }

Chains off the Website Tech Stack & Lead Enrichment Scraper. Point sourceDatasetId at its output and the careersPageUrl field is picked up automatically — enrich a lead list, then find who on it is hiring.

Key options

OptionDefaultNotes
titleKeywords / locationKeywordsApplied before billing, so you only pay for postings you keep
postedWithinDaysallUndated postings are excluded, since they can't be shown to be recent
remoteOnlyfalse
maxJobsPerCompany200Large employers can exceed 4,000 roles — this is your billing guard
includeDescriptionstrueNeeded for techKeywords and body-text salaries; ~10× the bandwidth
includeFullDescriptionTextfalseOff keeps the dataset small; a 300-char snippet is always included
includeCompanySummarytrueRollup rows are not billed as jobs
guessBoardTokentrueTries the domain name on the three biggest ATSs, verified against the live API

Supported systems

ATSCoverage
GreenhouseFull board in one request, meta.total for board size
LeverFull board, descriptions always included
AshbyFull board, compensation included where published
SmartRecruitersPaginated — handles boards of thousands of roles
WorkableFull board
Recruitee, Personio (XML), Breezy HRFull board

A company on an unsupported ATS, or with a bespoke careers page, returns NO_BOARD_FOUNDand is not charged.


Output

One record per posting, recordType: "job":

{
"uid": "greenhouse:gitlab:8503792002",
"companyName": "GitLab", "companyDomain": "gitlab.com",
"ats": "greenhouse", "atsToken": "gitlab",
"title": "Senior Backend Engineer, Remote", "normalisedTitle": "Backend Engineer",
"department": "Engineering",
"location": "Remote, Italy", "country": "Italy", "isRemote": true,
"seniority": "senior", "jobFunction": "engineering",
"salary": { "min": 211400, "max": 290600, "currency": "USD", "period": "year" },
"postedAt": "2026-05-16T00:00:00.000Z", "daysOpen": 86,
"techKeywords": ["Ruby", "Ruby on Rails", "Kubernetes", "PostgreSQL"],
"applyUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8503792002",
"recordType": "job"
}

Plus one recordType: "company-summary" per company. The dataset ships with three ready-made views — Job postings, Tech & salary signals and Company hiring signals — so you can export just the columns you need.

Set flattenOutput: true for CSV.


Performance and honest limits

Measured on six real companies, descriptions on, 60-role cap:

Wall clock3.2 s for 6 companies (271 jobs)
Requests per company4.2
CPU per company~290 ms
Boards resolved5 of 6

Limits worth knowing:

  • Coverage is ATS coverage. Companies on Workday, Taleo, SAP SuccessFactors, Teamtailor or a hand-built careers page are not supported and return NO_BOARD_FOUND. Expect misses on large enterprises and on companies with no public board.
  • postedAt is whatever the ATS reports. Some providers keep the original creation date across republication, so a role can show a large daysOpen while being actively advertised.
  • Descriptions drive bandwidth. Greenhouse goes from 343 KB to 4.1 MB on a 561-role board when descriptions are on. Turn them off for a fast titles-only pass.
  • Salary is only reported when a currency is attached to the numbers. A bare "120000 - 160000" is left null rather than guessed, because a wrong salary is worse than a missing one.

Pricing

Pay per event. Companies with no discoverable board are never charged, and filters run before billing.

EventPriceWhen
Actor start$0.005Once per run
Company resolved$0.004Per company whose board is found and read, including companies with no open roles
Job scraped$0.0008Per posting returned, after your filters

Worked example: 500 companies averaging 15 kept roles = $2.00 + $6.00 = $8.00, under two cents per company. That is roughly $0.80 per 1,000 job records — well under what job-data APIs charge.

Filters run before billing, so a tight query costs less. The per-company fee still applies, because an entire board is downloaded whether you keep every posting or three of them.


Tips

  • Schedule it weekly and diff on uid. New UIDs are new roles; disappeared UIDs are filled or pulled. That diff is the actual sales trigger.
  • Filter hard. titleKeywords: ["data engineer"] plus postedWithinDays: 14 turns 50,000 postings into a short, timely call list — and cuts the bill proportionally.
  • Segment on hiringVelocityScore. High score plus a small team means a company scaling fast.
  • Use techKeywords as intent. Cross-reference against what you sell.