Job Posting Monitor Clay-Ready Hiring Signal Discovery
Pricing
from $17.00 / 1,000 results
Job Posting Monitor Clay-Ready Hiring Signal Discovery
Keyword-driven job posting monitor that finds companies hiring for any role across job boards. Returns flat, Clay-ready, firmographic-enriched rows with company LinkedIn URL per posting.
Pricing
from $17.00 / 1,000 results
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
13 days ago
Last modified
Categories
Share
๐ What can Job Posting Monitor do?
Give it role keywords and it returns the companies hiring for that role right now, one clean row per posting, with each company enriched with its domain, LinkedIn URL, employee count and industry.
This is the reverse of a domain-level ATS checker. You do not give it a company and ask "are they hiring?" You give it a role and ask "who is hiring for this?"
| ๐ฆ What you get | โ๏ธ Features and integrations |
|---|---|
| ๐ข Hiring companies, deduplicated to one row per posting ๐ Domain and LinkedIn URL resolved per company ๐งน Staffing agencies and freelance marketplaces filtered out ๐งพ 16 flat fields, snake_case, Clay-native | ๐ Google Jobs discovery via your own SerpAPI key ๐ท๏ธ Company type classification on every row ๐ Cross-run delta detection, only new postings โฌ๏ธ Export to JSON, CSV, Excel, HTML or XML |
Bought by anyone running role-triggered outbound: recruiters, staffing-adjacent vendors, and sellers whose buying signal is a specific role opening.
๐ซ The keyword list is fully generic, and the editorial default is just a preset. It ships with
proofreader,copy editorandcontent editorbecause that was the first use case, but the same actor tracks engineering, sales, marketing, operations or finance by changing the keywords.
๐ก Why use Job Posting Monitor?
| If you want | Read these fields |
|---|---|
| The hiring company | company_name, company_domain |
| An outreach target | company_linkedin_url |
| To size the account | employee_count, industry |
| To drop the wrong kind of company | company_type |
| The role and where to apply | job_title, job_url, location, is_remote |
| Recency and novelty | posting_date, is_new_posting |
| Why this row matched | matched_keyword, job_description_snippet |
๐งน Filtering out the noise is most of the value
Raw job search results are dominated by staffing agencies and freelance marketplaces reposting the same roles. This actor filters both.
Staffing and recruitment agencies are filtered on both the company name and the job description text, because plenty of agencies do not have "recruitment" in their name. Freelance marketplaces (Upwork, Fiverr, Freelancer, Toptal and similar) are excluded by name, and the list is yours to extend.
Everything that survives is classified: direct_employer, staffing_agency, government or
unknown. If you disagree with the filter, turn it off and filter on company_type yourself.
๐ Re-runs only return what is new
is_new_posting and the built-in delta cache mean a scheduled run does not re-emit everything it
already showed you. Pass previous_run_date if you would rather control the window yourself.
๐ What data can Job Posting Monitor extract?
16 fields per posting.
| Field | What it holds |
|---|---|
company_name | The hiring company |
company_domain | Resolved canonical domain, or null |
company_linkedin_url | Company LinkedIn page, the primary outreach field |
employee_count, industry | Firmographics, where the company exposes them |
company_type | direct_employer, staffing_agency, government or unknown |
job_title | The role title |
job_url | Direct apply or posting URL |
posting_date | Normalized to ISO, best effort |
source_board | google_jobs, greenhouse, lever or ashby |
location, is_remote | Where the role is |
job_description_snippet | First 500 characters of the description |
matched_keyword | Which of your keywords this posting matched |
is_new_posting | true when not seen in a prior run |
run_date | When the run happened |
โ ๏ธ
employee_countandindustryare frequently null, because the firmographic source only reports them when a company exposes them. Thecompany_size_minandcompany_size_maxfilters therefore apply only when a size is known, and will silently keep companies of unknown size.company_linkedin_url, the field most people actually act on, resolves for the large majority.
๐ ๏ธ How to find companies hiring for a role
- Open the Input tab and put your role titles in
keywords. - Paste a SerpAPI key into
serpapi_key, or set aSERPAPI_KEYenvironment variable on the actor. - Set
countryandlookback_daysto scope the search. - Leave the staffing and freelance filters on.
- Click Start, then work the rows where
company_typeisdirect_employer.
๐งช Using it in Clay
Point a Clay table at this actor's dataset, one Clay row per output row. The key columns are
company_name, company_domain, company_linkedin_url, job_title and posting_date.
Use company_linkedin_url as the input to a LinkedIn step, and posting_date plus is_new_posting
to prioritize fresh signals.
Schedule the actor and rely on the built-in delta cache, or pass previous_run_date, so each refresh
only ingests new postings.
๐ Choosing your job board sources
sources selects which boards a run searches. The default is google_jobs, which is what every
earlier version did, so an existing saved input behaves exactly as it did before.
Sources run as an ordered chain, cheapest first, not all at once:
| Tier | Source | Key needed | Billed per | What it covers |
|---|---|---|---|---|
| 0 | jobicy | none | nothing | Remote roles, marketing, writing, design and support heavy. |
| 0 | remotive | none | nothing | Remote roles, keyword searchable at the source. |
| 0 | arbeitnow | none | nothing | Europe heavy, strong on Germany and the Netherlands. |
| 0 | themuse | none | nothing | Mid market and enterprise employers in the United States. |
| 0 | remoteok | none | nothing | The newest 100 remote postings on Remote OK. |
| 0 | weworkremotely | none | nothing | The We Work Remotely feed, remote only. |
| 0 | himalayas | none | nothing | The newest pages of Himalayas, remote only. |
| 1 | adzuna | Adzuna app id and key | call | Indeed style aggregate coverage per country, dated at the source. |
| 2 | jobspipe | JobsPipe key | job returned | 30 plus boards normalized, with the employer domain on the row. |
| 2 | google_jobs | SerpAPI key | search | The widest corpus: Indeed, LinkedIn, Glassdoor, ZipRecruiter and career pages. |
| 2 | theirstack | TheirStack key | job returned | Career sites and boards, with employer domain, LinkedIn URL and headcount on the row. |
Tier 0 runs every keyword. Tier 1 runs only on keywords Tier 0 left short, and Tier 2 only on
keywords still short after that, JobsPipe first and TheirStack last because its allowance is the
smallest. A keyword is satisfied once the run has found enough_new_companies_per_keyword distinct
new companies for it (default 3); when every keyword is satisfied the chain ends whatever budget is
left. Between tiers every posting is checked against the cross-run delta cache, so a metered source
is never asked for a posting the run already has.
Metered queries are narrowed to metered_window_days (default 2, today and yesterday). JobsPipe
and TheirStack bill per job returned whether or not you have seen it before, and the delta cache
dedupes after the bill, so the date window is what keeps those credits.
A posting that shows up on two boards is deduplicated on company plus normalized job title. The run
log reports the raw count, the new count and the calls and credits spent per source and per country,
and the same table is written to the run's key value store as RUN_SUMMARY.
countries loops several countries inside one run. Metered sources query each country separately;
the Tier 0 boards are global remote boards and run once. Use the names Google Jobs accepts: United
States, United Kingdom, Canada.
The seven Tier 0 boards need no credentials of any kind, so a run with sources: ["jobicy"] works on
a fresh account with nothing configured.
๐ The keys
Every metered source takes its key from the input first (serpapi_key, adzuna_app_id,
adzuna_app_key, jobspipe_key, theirstack_key) and falls back to the matching environment
variable on the actor. With neither, that source is skipped and the run says so. The Tier 0 boards
still run.
Keys set in the actor's environment belong to the operator and are honored only for runs owned by the accounts the operator lists; any other account brings its own keys through the input.
โจ๏ธ Input
Everything is on the Input tab. The options worth explaining:
| Field | Type | Default | What it does |
|---|---|---|---|
keywords | array | editorial preset | Role titles to search for. Any role works. |
sources | array | ["google_jobs"] | Which job boards to search, run as the chain above. |
serpapi_key | string | none | Your SerpAPI key for google_jobs, unless SERPAPI_KEY is set on the actor. |
adzuna_app_id, adzuna_app_key | string | none | Your Adzuna credentials for adzuna. |
jobspipe_key, theirstack_key | string | none | Your JobsPipe and TheirStack keys. |
country | string | United States | Geographic filter for one country. |
countries | array | none | Several countries in one run; overrides country. |
metered_window_days | integer | 2 | Date window for metered queries, 1 to 7. |
enough_new_companies_per_keyword | integer | 3 | New companies that satisfy a keyword and stop its chain. |
metered_run_cap | integer | 50 | Ceiling per metered source per country per run. |
lookback_days | integer | 30 | Only return postings newer than this. |
company_size_min, company_size_max | integer | none | Drop companies outside the range, when size is known. |
exclude_staffing_agencies | boolean | true | Filter staffing and recruitment postings. |
exclude_freelance_marketplaces | boolean | true | Filter Upwork, Fiverr and similar. |
freelance_marketplaces | array | 7 defaults | Override or extend the marketplace list. |
remote_only | boolean | false | Only return remote postings. |
previous_run_date | string | none | ISO date; only emit postings newer than this. |
max_results | integer | 100 | Raw postings scanned before filtering. |
max_companies | integer | 40 | Cap on unique companies enriched per run. Bounds sub-actor cost. |
๐ค Output
One flat row per posting, exportable as JSON, CSV, Excel, HTML or XML.
{"company_name": "Stripe","company_domain": "stripe.com","company_linkedin_url": "https://www.linkedin.com/company/stripe","employee_count": 8000,"industry": "Financial Services","company_type": "direct_employer","job_title": "Senior Software Engineer","job_url": "https://boards.greenhouse.io/example/jobs/123","posting_date": "2026-06-25","source_board": "google_jobs","location": "San Francisco, CA","is_remote": true,"job_description_snippet": "We are seeking a backend engineer to...","matched_keyword": "software engineer","is_new_posting": true,"posted_via": "LinkedIn","search_country": "US","degraded": false,"degradation_reason": null,"run_date": "2026-07-01T14:06:22.297Z"}
search_country is the country a metered query ran for, null for a global remote board. degraded
is true, with a plain reason, on a row whose enrichment did not finish inside its time budget: a null
company_domain on such a row means unresolved, not absent. Identity, firmographics and LinkedIn
each have their own budget, and LinkedIn runs last, so a slow LinkedIn lookup can cost a LinkedIn URL
and nothing else.
source_board is the source you selected. posted_via is the board the posting was actually
published through, as reported by that source, so you can see the board distribution behind a
google_jobs run without reconstructing it from the URLs.
๐ก Tips
- Work
company_type: "direct_employer"first. It is the reason the filtering exists. - Tighten
lookback_daysbefore raisingmax_results. Fresh postings convert better than deep ones. max_companiesis your cost control. It bounds how much enrichment a run can trigger.- Schedule it and filter on
is_new_postingto turn this into a standing feed rather than a one-time list. - Extend
freelance_marketplaceswith whatever else clutters your vertical. - No SerpAPI key yet? Start with
sources: ["jobicy", "remotive"]. No credentials needed. - Group
posted_viain your export to see which boards actually carry your role.
โ ๏ธ Known limits
Discovery depth is bounded by max_results. Very high-volume keywords may need multiple runs or a
tighter lookback_days.
Company enrichment is capped per run by max_companies, deliberately, to bound sub-actor cost.
Enrichment depends on name-to-domain resolution. Ambiguous or very small companies may not resolve, and those rows come back with a null domain and null firmographics rather than being dropped.
employee_count and industry coverage varies and is frequently null. The size filters apply
only when a size is known.
Google Jobs coverage excludes some regions where the widget is disabled, including the EU.
Posting dates from aggregated boards are often relative, for example "25 days ago", and are normalized to a best-effort ISO date.
A SerpAPI key is required. Without one, discovery returns nothing.
โ FAQ
Do I need a SerpAPI key?
Yes. Discovery runs on the SerpAPI google_jobs engine. The free tier covers 250 searches per month.
Why did a run return nothing?
Usually no key, or a keyword and country combination the selected source does not serve. The run sets a status message saying which, emits zero rows and exits cleanly rather than erroring.
A run that finds nothing costs nothing. Earlier versions pushed a single explanatory row when there were no new postings, and because a result is a dataset row, that row was billed as a result. It is not any more: those notices are status messages and log lines. If you have automation that reads a "no new postings" row, read the run status message instead.
Are staffing agencies really filtered out?
They are filtered on both company name and job description text, and anything that survives is
labeled in company_type. If you would rather judge for yourself, turn the filter off and filter on
that field.
Will a scheduled run keep showing me the same postings?
No. Cross-run delta detection means re-runs only emit postings you have not seen. is_new_posting
carries the flag.
What happens if the enrichment sub-actors fail?
The row is still emitted with null enrichment fields and a structured error is logged. Discovery is never lost to an enrichment failure.
๐งฉ 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
Something wrong, or a company misclassified? Open an issue on the Issues tab with the keyword and the row, and we will look at it.
โน๏ธ Sourcing and legal. Job postings come from the SerpAPI
google_jobsengine against your own key, and from public job board APIs. Company enrichment comes from Mamba Labs fleet actors reading public company data. The actor stores no personal data: it returns companies, roles and postings, not people. You are responsible for how you use the output.
Built by Mamba Labs.