Job Board Keyword Signal Scanner
Pricing
from $42.50 / 1,000 results
Job Board Keyword Signal Scanner
Scan one company domain or a list of them for open roles in 12 role categories or your own keywords, across Greenhouse, Lever, Ashby, Workday, and Rippling. Returns one flat Clay-ready row per domain with matched role counts, plus the full job description of each matched role when you ask for it.
Pricing
from $42.50 / 1,000 results
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
๐ What can Job Board Keyword Signal Scanner do?
Give it a company domain and a role category and it tells you whether that company is hiring for those roles right now, across five ATS platforms. One flat row per domain.
Pick from twelve role categories, combine several at once, or pass your own keyword list.
| ๐ฆ What you get | โ๏ธ Features and integrations |
|---|---|
๐ฏ hiring_signal, one boolean to gate on๐๏ธ Twelve role categories, or your own keywords ๐ roles_by_category and a signal_strength๐งพ 34 flat fields, snake_case, one row per domain๐ A list of domains in one run, plus full job descriptions on request | ๐ Five ATS platforms: Greenhouse, Lever, Ashby, Workday, Rippling ๐๏ธ Pre-indexed fallback when the live cascade misses ๐ Change detection across runs โฌ๏ธ Export to JSON, CSV, Excel, HTML or XML |
Bought by teams whose buying signal is a specific kind of hire: an engineering scale-up, a first CFO, an ops buildout, or a GTM ramp.
๐ซ If you only need GTM roles, use GTM Hiring Signal Scraper instead. It is purpose-built for that one category and costs the same per row. This actor exists for everything else, and for combining categories in one call.
๐ก Why use Job Board Keyword Signal Scanner?
| If you want | Read these fields |
|---|---|
| A hiring gate for any function | hiring_signal, signal_strength |
| How much they are hiring | matched_role_count, total_open_roles |
| Which function is growing | roles_by_category, department_with_most_openings, top_matched_role |
| Recency | most_recent_posting_date |
| What changed since last run | new_roles_detected, removed_roles_detected, roles_added_count, change_detected |
| Whether the data is live or indexed | fallback_used, fallback_source |
| Where to look | career_page_url, ats_platform |
๐๏ธ The twelve categories
Pass one or more in role_categories:
| Category | Covers |
|---|---|
GTM | VP Sales, AE, SDR, RevOps, Head of Growth, CMO, CRO |
Engineering | VP Engineering, CTO, Software Engineer, Staff Engineer, Engineering Manager |
Finance | CFO, VP Finance, Controller, FP&A, Financial Analyst |
Operations | COO, VP Operations, Chief of Staff, Business Operations, Strategy and Operations |
Executive | CEO, President, Co-Founder, MD, General Manager, VP and above |
Marketing | CMO, VP Marketing, Demand Gen, Product Marketing, Brand, Content, SEO |
HR | CHRO, Chief People Officer, People Ops, Talent Acquisition, HRBP, Recruiter |
CustomerSuccess | Chief Customer Officer, VP CS, CSM, Account Manager, Renewals, Support |
Data | Chief Data Officer, VP Data, Data Engineer, ML Engineer, Data Scientist, BI Analyst |
Product | CPO, VP Product, Product Manager, Product Owner, Product Ops |
Legal | General Counsel, Chief Legal Officer, Corporate Counsel, Compliance, Paralegal |
Design | VP Design, Head of UX, Product Designer, UX Researcher, Brand Designer |
Custom | Your own list, via custom_keywords |
Category names are matched case insensitively and separators are ignored, so customer_success,
Customer Success and customerSuccess all reach the same category. sales resolves to GTM,
people to HR, analytics to Data.
That is a fix, not a convenience. Until 2026-08-22 the lookup was an exact, case sensitive property
read and anything that missed was skipped in silence, so a run asking for marketing matched no
roles at all and reported no hiring signal for every company. Seven of the twelve categories above
are also new on that date. categories_unresolved on every row now names anything you sent that
still matches nothing, so a typo is visible rather than silent.
๐๏ธ The pre-indexed fallback
When the live cascade finds no ATS match, the actor falls back to a pre-indexed database covering
over 175,000 companies and 54 ATS platforms. enable_fallback defaults to true.
fallback_used and fallback_source tell you which path produced the row, which matters because
indexed data can be a few days behind live scraping. Set enable_fallback to false for faster runs
on large lists where you are confident about ATS coverage.
๐ A list of domains in one run
Put many domains in domains instead of one in company_domain. Each domain returns its own row,
in the order you sent them, and each row is one result at the same price as a single domain run.
Duplicates are removed, and https://, www. and paths are stripped. company_domain still works
on its own, and when you set both it is read first. max_domains (default 100, maximum 1,000) caps
one run so it cannot run past the timeout.
previous_roles_detected describes one domain, so it applies only to a single domain run. On a list
run it is ignored.
On a list run, the pre-indexed fallback runs for every domain the live cascade misses. That
fallback is another Apify actor, and it bills your own Apify account per job item it returns, about
$0.012 per item at Bronze, up to 10 items per domain, on top of this actor's price. Set
enable_fallback to false on a large list to avoid that cost.
๐ Full job descriptions
Set include_job_descriptions to true and each row gets matched_postings: one object per
matched role with posting_key, job_title, job_location, job_url, source_board,
department, posted_at, and job_description as plain text. The row count and the price do not
change.
| Board | Where the description comes from |
|---|---|
| Greenhouse, Lever, Ashby | One extra read of the board per domain |
| Workday | One extra read per matched role, up to max_postings_per_domain |
| Rippling | No description read; job_description is null |
| Pre-indexed fallback | No description read; job_description is null |
Each description is capped at 20,000 characters. job_description_chars holds the length before the
cap, and job_description_truncated says whether it was cut. A description that could not be read
is null, never an empty string. max_postings_per_domain (default 25, maximum 100) caps the array;
matched_postings_truncated is true when more roles matched, and matched_role_count still counts
all of them. posting_key is a stable key for the posting, the same key Mamba Labs' other hiring
actors compute for the same job.
โถ๏ธ Ready-to-run examples
| Example | What it does |
|---|---|
| Find Companies Hiring Software Engineers | Engineering scale-up signal |
| New CFO Hire Detector | Finance leadership signal |
| Partnerships and Channel Role Scanner | Channel buildout signal |
| GTM and Engineering Combined Scan | Two categories in one call |
| Weekly Hiring Change Tracker | Momentum over time |
๐ What data can Job Board Keyword Signal Scanner extract?
34 fields per domain.
| Field | What it holds |
|---|---|
hiring_signal | The boolean gate |
matched_role_count, total_open_roles | Matches, and the whole board |
matched_roles_detected, top_matched_role | Which roles matched |
roles_by_category | Breakdown across the categories you searched |
department_with_most_openings | Where the hiring is concentrated |
signal_strength | Triage band |
most_recent_posting_date | Freshness |
categories_searched | What you asked for, echoed back |
ats_platform, career_page_url | Which board answered, and where |
company_name | Company identity |
new_roles_detected, removed_roles_detected, roles_added_count, change_detected | Delta since your last run |
fallback_used, fallback_source | Whether the row came from live scraping or the index |
previous_run_date, run_date | Run bookkeeping |
โ ๏ธ Custom keywords are all treated as Tier 2 signals.
signal_strengthweights the built-in category keywords more heavily than anything you supply yourself, so a custom-keyword run will read lower on strength than an equivalent GTM run. Usematched_role_countrather thansignal_strengthwhen you are running your own keyword list.
โ ๏ธ
falseandnullmean different things on every row.falseis a measurement: the actor looked and the answer was no.nullis the absence of one: the actor could not look. When something it needed fails, the row comes back withdegraded: true, a plain-languagedegradation_reason, and every field it could not measure set tonullrather than to a confidentfalseor0. Filter ondegradedbefore you trust a negative.
๐ ๏ธ How to find companies hiring for a role category
- Open the Input tab and put a bare domain in
company_domain, or a list indomains. - Set
role_categories, one or several. - For anything the categories do not cover, add
custom_keywords. - Click Start.
- Filter on
hiring_signal, then readroles_by_categoryto see where the hiring sits.
๐งช Using it in Clay
Add an Apify enrichment column and map your domain column to company_domain. Every field is a
top-level key.
Combine categories in one call rather than running the actor twice. roles_by_category keeps them
separable in the output.
โฑ๏ธ Tracking change over time
Pass previous_roles_detected and previous_run_date from your stored prior-run columns, and the
actor returns new_roles_detected, removed_roles_detected and change_detected. Filter on
roles_added_count to find companies that just opened positions.
๐ต How much does it cost to scan a job board?
You are charged once per domain scanned.
| Plan | Per domain | Per 1,000 domains |
|---|---|---|
| Free | $0.05 | $50.00 |
| Bronze | $0.0475 | $47.50 |
| Silver | $0.045 | $45.00 |
| Gold | $0.0425 | $42.50 |
There is also an Actor start event at $0.00005, charged once per run per GB of memory.
Free Apify plans get 60 results per calendar month, resetting on the 1st. Paid plans have no monthly cap.
๐ Your spending limit is respected. Set a maximum cost per run in Apify, or max_charge_usd on the Input tab, and the run stops before it would go over, keeping every result already charged. Each row's billable_events_json lists the events that row was charged for.
๐ณ A domain that matches no ATS is still billed. The actor probed five platforms and, if enabled, the pre-indexed fallback as well, and a row saying so is a real answer. When the free-tier monthly cap is reached the run exits before any scraping or paid fallback call, with an upgrade message and no result row, so it never charges you for a run it did not do.
โจ๏ธ Input
Everything is on the Input tab.
| Field | Type | Default | What it does |
|---|---|---|---|
company_domain | string | none | Bare company domain. Optional when domains is set. |
domains | array | none | A list of bare domains, one row each. |
max_domains | integer | 100 | The most domains one run reads, up to 1,000. |
role_categories | array | ["GTM"] | One or more of the twelve categories above, plus Custom. Case insensitive. |
custom_keywords | array | none | Your own role keywords. |
previous_roles_detected | string | none | Prior run's roles, unlocks change detection. |
previous_run_date | string | none | Prior run's date. |
enable_fallback | boolean | true | Use the pre-indexed database when the live cascade misses. |
include_job_descriptions | boolean | false | Add matched_postings with each matched role's full job description. |
max_postings_per_domain | integer | 25 | The most matched roles in matched_postings per domain, up to 100. |
max_charge_usd | number | none | Optional. The run stops before the next result that would take this run's charges over this amount, and keeps every result already charged. Leave empty to rely only on the maximum cost per run you set in Apify. |
๐ค Output
One flat row per domain, exportable as JSON, CSV, Excel, HTML or XML.
{"company_domain": "example.com","company_name": "Example Inc","hiring_signal": true,"ats_platform": "greenhouse","matched_role_count": 5,"matched_roles_detected": ["Staff Engineer", "Engineering Manager"],"top_matched_role": "VP Engineering","most_recent_posting_date": "2026-08-04","department_with_most_openings": "Engineering","total_open_roles": 18,"signal_strength": "high","categories_searched": ["Engineering"],"roles_by_category": {"Engineering": 5},"career_page_url": "https://boards.greenhouse.io/example","new_roles_detected": ["Staff Engineer"],"roles_added_count": 1,"change_detected": true,"fallback_used": false,"fallback_source": null,"run_date": "2026-06-18T16:18:12.670Z"}
๐งพ More fields on every row
| Field | Type | What it holds |
|---|---|---|
fallback_item_count | integer | How many job items the pre-indexed fallback returned for this domain before the domain assertion, or 0 when the fallback did not run. |
fallback_items_dropped | integer | How many fallback items were discarded because they did not belong to the requested domain. Should be 0. |
matched_postings | array | Null unless include_job_descriptions is on. One object per matched role: posting_key, job_title, job_location, job_url, source_board, department, posted_at, job_description, job_description_chars, job_description_truncated. |
matched_postings_count | integer | Number of objects in matched_postings. Null unless include_job_descriptions is on. |
matched_postings_truncated | boolean | True when more roles matched than max_postings_per_domain allowed. Null unless include_job_descriptions is on. |
total_open_roles_is_floor | boolean | True when total_open_roles is a floor rather than a count, because the source returned a prefix of the board. |
row_status | string | ok, degraded, error, or notice (a notice row carries a message, not a result). Present on every row. |
error_reason | string | Why the row is degraded or an error, in plain words. Null on an ok row. Present on every row. |
billable_events_json | string | JSON list of the pricing events this row was charged for, for example [{"event":"apify-default-dataset-item","count":1}]. Lets you reconcile a run from the dataset alone. The once per run start event is not repeated on rows. |
๐ก Tips
- Combine categories in one call. It costs one row either way and
roles_by_categorykeeps them apart in the output. - Check
fallback_usedbefore treating a posting date as live. Indexed rows can lag by a few days. - Set
enable_fallbacktofalseon large lists where you already know your targets use a supported ATS. It is measurably faster. - Store
matched_roles_detectedandrun_dateeach time. Change detection is free once you do.
โ ๏ธ Known limits
Workday and Rippling detection relies on career page scraping, not a clean public API, so slug mismatches can cause false negatives on some Workday domains. Greenhouse, Lever and Ashby use public APIs and are more reliable.
Roles behind authenticated career portals are not visible.
The pre-indexed fallback can be a few days stale compared with live scraping. fallback_used
tells you when a row came from it.
Custom keywords are all treated as Tier 2 signals, which lowers signal_strength relative to the
built-in categories.
No proxy layer by default. Heavy batch runs against the same ATS domain may get rate limited. Say so on the Issues tab if it becomes a pattern.
A fallback failure is not a run failure. If the fallback sub-call errors or times out it is caught
and logged, the run continues, and the row comes back with ats_platform: "none" and
fallback_used: false.
๐ Changelog
- 2026-10-16: removed
linkedin_company_urlfrom the output. It was always null; this actor never reads LinkedIn. To get a company's LinkedIn page, use Domain to LinkedIn URL Resolver.
โ FAQ
How is this different from GTM Hiring Signal Scraper?
That one is scoped to GTM roles only and is purpose-built for it. This one lets you pick the category, covers five ATS platforms instead of three, and can combine categories in one call.
What happens when no ATS matches?
The pre-indexed fallback is tried when enable_fallback is true. If that also finds nothing, the row
comes back with ats_platform: "none".
Can I use my own keywords?
Yes, via custom_keywords. Note they are weighted as Tier 2 in signal_strength.
Do I need to run it twice for two categories?
No. Pass both in role_categories and read roles_by_category in the output.
Does it need a proxy or an API key?
Neither.
๐งฉ Want other GTM data?
Mamba Labs builds custom actors for B2B go-to-market teams. The public versions of that work live here on the Store, so our users get the same tooling we build under contract.
Every actor in the suite takes a domain or a company and returns one flat row, so they stack in the same Clay table without reshaping anything.
๐ ๏ธ Need something custom built for you or your team? Tell us what you are trying to find and we will build it. Talk to Mamba Labs.
๐ Support
Found a bug or want a category extended? Open an issue on the Issues tab. Response time is typically within 48 hours.
โน๏ธ Sourcing and legal. Roles come from the public job board APIs of Greenhouse, Lever and Ashby and from public career pages on Workday and Rippling, plus a pre-indexed job database when the live cascade finds nothing. No authenticated portal is accessed. The actor returns companies, role counts and role titles, not people. You are responsible for how you use the output.
Built by Mamba Labs.