IT Hiring Signals: Tech Stack from Job Postings
Pricing
Pay per event
IT Hiring Signals: Tech Stack from Job Postings
Technographics from public Greenhouse, Lever and Ashby job postings: each job tagged with the technologies it mentions (Intune, Okta, AWS, ServiceNow, Kubernetes and 320+ more). Filter by title, location, date or tech category, get only new jobs, add per-company tech summaries as hiring signals.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Scott Williams
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 hours ago
Last modified
Categories
Share
Technographics and hiring signals from public job postings. This Actor reads public Greenhouse, Lever and Ashby job boards and tags each job posting with the technologies it mentions, such as Microsoft Intune, Okta, AWS, ServiceNow, Kubernetes and 320+ more (328 in the built-in dictionary). You can filter by title, location, date or tech category, return only jobs that are new since the last run, and add a summary row per company with its top technologies.
At a glance: $1.50 per 1,000 tagged jobs, with company summaries $3.00 per 1,000 (optional). Pay per result, with no subscription. You can set a maximum cost per run, export to JSON, CSV or Excel, or call it from the Apify API, Make, Zapier or n8n.
Who it is for
- MSPs and IT-services sales teams: find companies hiring a "Microsoft Intune administrator" or an "Okta engineer". These are hiring-intent signals that a team runs, or is moving to, that stack.
- SaaS sales and partnerships: build account lists of companies whose job postings mention your product, a competitor or an integration partner.
- Recruiters and staffing firms: track which companies are hiring for a skill, and get only new postings each day.
- Market research: count how often technologies appear across a set of companies' job postings over time.
Input example
{"companies": ["ashby:ashby", "greenhouse:gitlab", "lever:palantir", "https://jobs.lever.co/somecompany"],"titleFilter": "engineer|admin|it support|sysadmin","techCategories": ["endpoint-mgmt", "identity", "security"],"onlyTaggedJobs": true,"postedSinceDays": 30,"onlyNew": false,"includeCompanySummaries": true,"maxTotalJobs": 1000}
- companies: board slugs (
gitlab),ats:slug(greenhouse:gitlab) or board URLs. A bare slug is tried on Greenhouse, then Lever, then Ashby. You can also give a careers-page URL, and the Actor looks for an embedded Greenhouse, Lever or Ashby board on it. Entries that cannot be resolved produce a freeunresolvedrow, and the run continues. - Empty input (no companies, searchDirectory off) runs a small demo on 3 public example boards (
ashby:ashby,greenhouse:gitlab,lever:palantir), at most 4 jobs, with a warning in the log anddemoMode: trueinRUN_SUMMARY. Demo jobs are real live jobs and are charged like any other job: 4 x $0.0015 = $0.006 at most. The Console form is prefilled with the same demo (those 3 boards,maxTotalJobs4); raisemaxTotalJobsfor real runs. - searchDirectory / maxDirectoryCompanies: adds up to 200 boards from the built-in directory of known Greenhouse, Lever and Ashby companies (default 50; 0 adds none).
- techKeywords: your own terms, as
TagorTag=alias1|alias2(up to 200). useDefaultDictionary turns the built-in dictionary of 328 technologies on or off. - techCategories, requiredTechTags, onlyTaggedJobs: keep only jobs that mention a category or specific tags, or any tag at all.
- titleFilter (a case-insensitive regular expression; use
\bit\brather thanitso it does not match "Benefits"), keywords, excludeKeywords, locations, departments, remoteOnly, postedSinceDays: the usual job filters. - onlyNew: return only jobs that earlier runs have not seen. The "first seen" state is kept in a named key-value store (default
it-hiring-signals-state). - includeDescription (default off): adds the plain-text description. Personal e-mail addresses, phone numbers, "your recruiter" lines and LinkedIn profile links are masked.
- Limits: maxJobsPerCompany (0 means no limit, max 5,000), maxTotalJobs (default 1,000, max 20,000; the form is prefilled with 4 for the demo), maxConcurrency (default 4, max 10). When
maxTotalJobsis 100 or less, 2 or more boards are read andmaxJobsPerCompanyis not set, the cap is shared round-robin: a board takes its next job only when no other board still being read has fewer, so one fast board cannot fill the whole cap (the 4-job demo returns jobs from all 3 boards).capSharedRoundRobininRUN_SUMMARYsays whether this applied. Larger caps keep first-come order.
Categories: ai-ml, backup-storage, business-apps, cloud, collaboration, compliance, data, database, devops, endpoint-mgmt, frameworks, identity, itsm, languages, networking, observability, os, rmm-msp, security, virtualization.
Output example
A job row (from a live test run on 2026-10-28; description omitted):
{"id": "8771512002","ats": "greenhouse","companySlug": "gitlab","companyName": "GitLab","title": "Backend Engineer, Knowledge Graph","department": "Data Engineering","team": null,"location": "Remote, Canada; Remote, United States","locations": ["Remote, Canada; Remote, United States","North America"],"country": null,"isRemote": true,"workplaceType": null,"employmentType": null,"workplaceTypeRaw": null,"employmentTypeRaw": null,"postedAt": "2026-10-23T22:47:07+00:00","updatedAt": "2026-10-28T16:23:39+00:00","url": "https://job-boards.greenhouse.io/gitlab/jobs/8771512002","applyUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8771512002","salaryMin": 115200,"salaryMax": 162000,"salaryCurrency": "USD","salaryPeriod": "YEAR","salaryText": "$115,200-$162,000 USD","salarySource": "description","hiringEntity": null,"requisitionId": "6918","uid": "greenhouse:gitlab:8771512002","expiresAt": null,"postedAtPrecision": "exact","salaryAnnualMin": 115200,"salaryAnnualMax": 162000,"workArrangement": "remote","seniority": null,"dedupeKey": "7b15d4aedcb0c49b81df","firstSeenAt": "2026-10-29T02:05:28.496152+00:00","lastSeenAt": "2026-10-29T02:05:28.496152+00:00","scrapedAt": "2026-10-29T02:05:28.496152+00:00","techTags": ["Rust","Ruby","ClickHouse","Apache Kafka","TypeScript","Vue.js"],"techCategories": ["data","database","frameworks","languages"],"isNew": true,"recordType": "job"}
A company summary row (includeCompanySummaries), shortened to the top 5 tags:
{"recordType": "companySummary","ats": "ashby","companySlug": "ashby","companyName": "Ashby","jobsRead": 15,"jobsMatched": 10,"jobsReturned": 10,"taggedJobsCount": 10,"topTechTags": [{"tag": "GraphQL","count": 10},{"tag": "Node.js","count": 10},{"tag": "PostgreSQL","count": 10},{"tag": "React","count": 10},{"tag": "Redis","count": 10}],"boardFullyRead": false,"scrapedAt": "2026-10-29T02:05:44.062121+00:00"}
techTagsare sorted by how often each one is mentioned. Turn onincludeTechMentionsto get the counts intechMentions, plustechContext, which marks each tagrequirement(named in the title, a requirements, qualifications or tech-stack section, or next to a phrase such as "experience with") ormention(named elsewhere in the post).isNewis true the first time a job is seen (it is null whentrackFirstSeenis off).jobsReadis the number of postings read from the board. Reading stops early oncemaxJobsPerCompanyormaxTotalJobsis reached;boardFullyReadis false when that happened.taggedJobsCountis the number of returned jobs with at least one tag.- Field names follow the shared ATS engine (
id,companyName,isRemote), notjobId/company/remote. The company domain is not included, because job boards do not reliably publish it.
Price per 1,000 jobs
Pay per event, with no start fee:
| Event | Price | Per 1,000 |
|---|---|---|
Tagged job (job) | $0.0015 | $1.50 |
Company summary (company-summary, optional) | $0.003 | $3.00 |
| Unresolved-entry row | free | free |
| Status row (only when a run returns no jobs) | free | free |
Platform usage is included: you pay only for the events above. The run stops cleanly when your maximum cost per run is reached.
A run never ends with an empty dataset. If no board can be read (network errors, 404s, robots.txt, private addresses), the run still succeeds and saves one free status row (recordType: "status", statusRow: true, status: "error", reason: "allBoardsFailed") with the number of failed boards (boardsFailed, split into boardsBlocked, boardsNetworkError, boardsNotFound, boardsSkippedRobots) and the first errors in failedBoards. If boards were read but no job matched (filters, onlyNew), the row has status: "warning" and reason: "noJobs". Its message starts with "Not charged:".
FAQ and limits
- Can it read pages on private or internal addresses? No. On the Apify platform a careers-page URL whose host resolves to a private, loopback or link-local address (also after a redirect) is not fetched and costs nothing. The entry gets a free
unresolvedrow withreason"not fetched: private, loopback and link-local addresses are not allowed". - Which sources? Only the public, keyless job-board APIs of Greenhouse (
boards-api.greenhouse.io), Lever (api.lever.co,api.eu.lever.co) and Ashby (api.ashbyhq.com/posting-api). No logins, no proxies and no anti-bot workarounds. robots.txt is checked (RFC 9309) before each host is fetched, and its Crawl-delay is honoured. If a host's robots.txt cannot be read (a server error, a page that is not a robots file, or a network failure), that host is skipped and the run log says so. A missing robots.txt (4xx) means no rules. - How is tagging done? By whole-word matching against a curated dictionary. Ambiguous words only match in safe forms: "Palo Alto" only as "Palo Alto Networks", "Autopilot" only as "Windows Autopilot", and short acronyms such as ZIA or JSM only in capitals. Mentions of the employer's own products are dropped. So are sentences that list the employer's customers or investors ("customers like Notion and Snowflake").
- What about comparisons and chat tools? Text that names a product only to compare with it, to say people switched away from it, or to describe a competitor is skipped: "engineers switched from languages like Swift and Kotlin" and "the playbook Workday used to win the HCM market" add no tags, while "experience with Swift" still does. Slack, Zoom, Microsoft Teams, Webex and Google Meet count only in a requirements, qualifications or tech-stack section, or next to a phrase such as "experience with", "administer", "manage" or "support", so "our company Slack" and "coffee over Zoom" are not tagged.
- Is it perfect? No. A tag means the posting mentions the technology, not that the company runs it, and the context rules are wording-based, so some odd phrasings will slip through or be dropped. Check the description (
includeDescription) before you act on a single tag. - Personal data? Only job-posting fields are returned. Descriptions are off by default; when they are on, contact details and profile links are masked.
- What about other ATSs? Workday, Workable, SmartRecruiters and others are not supported in this Actor. Such entries return a free
unresolvedrow. - Speed? About one request per board for Greenhouse and Ashby, and one per 100 jobs for Lever (with a 1-second crawl delay). In tests, 3 boards took about 17 seconds, and 1,000 jobs used under 110 MB of memory.