GTM Hiring Signal Scraper
Pricing
from $70.00 / 1,000 results
GTM Hiring Signal Scraper
Detect companies actively hiring GTM teams. Scrapes Greenhouse, Lever, Ashby, Workday, and Rippling for Sales, RevOps, and Growth roles. Tracks velocity and role changes across runs. Flat output built for Clay enrichment columns. Pay per result.
Pricing
from $70.00 / 1,000 results
Rating
0.0
(0)
Developer
Mamba Labs
Actor stats
0
Bookmarked
7
Total users
5
Monthly active users
8 days ago
Last modified
Categories
Share
Detect which companies are actively building their GTM teams before your competitors do.
This Actor scrapes Greenhouse, Lever, and Ashby ATS job boards to identify companies posting Sales, RevOps, and Growth roles. Built for outbound teams and Clay users who want to turn hiring signals into pipeline.
Pass your previous run's output fields as inputs to unlock velocity tracking (how role counts are trending over time) and change detection (which specific roles are new since your last run). First run works with no prior data -- velocity and change fields return a first_run state and can be used as a filter gate in Clay.
ATS coverage is intentionally scoped to Greenhouse, Lever, and Ashby. These three cover the majority of venture-backed, SaaS, and GTM-heavy companies, and all three expose stable public APIs that return complete job lists without bot blocking. Workday and Rippling were evaluated and removed in v0.0.17: Workday careers pages hide the board URL behind JS-rendered scripts or bot checks on two out of three tested companies, and the myworkdayjobs.com API endpoint shape has shifted enough that the third returned empty postings. Rippling uses undocumented internal endpoints that are not reliable for production. Companies on unsupported ATSes return ats_platform: null with gtm_role_count: 0 and no error.
Why Hiring Signals Matter
When a company posts for an Account Executive, Sales Development Rep, or VP of Sales, they are signaling pipeline investment. That is one of the strongest buying triggers for:
- Sales tools and infrastructure (CRM, sequencing, RevOps tooling)
- GTM agencies and consultants
- Recruiting and staffing firms
- Sales training and coaching platforms
This Actor handles signal detection for you, at scale, across three major ATS platforms. Output is designed to map directly into Clay columns.
Features
- Three ATS platforms in one call. Greenhouse, Lever, and Ashby checked in parallel. Stops at first match to minimize cost.
- GTM-specific filtering. Only returns roles that signal pipeline investment (AE, SDR, BDR, RevOps, CS, Growth, VP Sales, CRO, and more). No noise from engineering or finance postings.
- Signal tags included. Every result includes a
gtm_signalsarray (e.g.["AE", "SDR", "RevOps"]) for easy Clay formula filtering. - Two input modes. Single domain for Clay enrichment row-by-row, or batch mode for bulk list processing.
- Flat JSON output. Every field is a top-level key. No nested objects to unwrap in Clay.
- Error-safe. Each domain is wrapped in try/catch. One failure never stops the run.
Input
The actor takes a single required field:
| Field | Type | Required | Example |
|---|---|---|---|
domain | string | yes | stripe.com |
Pass a bare domain. No https://, no www., no trailing slash.
Optional: ATS Slug Override
| Field | Type | Required | Example |
|---|---|---|---|
ats_slug | string | no | claylabs |
Use this when the company's ATS handle does not match their domain root. The actor normally derives the slug from the domain (e.g. stripe.com to stripe), which works for most companies. Some use a different handle on Greenhouse, Lever, or Ashby.
Leave blank for automatic detection. If automatic detection fails and you know the correct slug, enter it here.
Slug detection order:
- Override map lookup (no network call)
- Domain root probe across all three ATS platforms
- Common slug variants:
{root}labs,{root}-labs - If
ats_slugis provided, skips steps 2-3 and uses it directly
Using inside Clay (Run Apify Actor enrichment column)
The Input Data field in Clay must be constructed in this exact order:
- Type the opening brace, key, colon, space, opening quote:
{"domain": " - Press
/and insert your domain column as a pill - Type the closing quote and closing brace:
"}
The final expression looks like: {"domain": " + [pill] + "}
At runtime Clay substitutes the pill value, producing valid JSON: {"domain": "stripe.com"}.
Common mistakes:
{{company_domain}}placeholders typed as text are not substituted. The actor receives the literal string.- Inserting the pill alone (no braces, no quotes) sends a bare string, not JSON.
- Inserting the pill without wrapping quotes sends unquoted JSON, which fails validation.
Scope
This actor detects GTM hiring on three ATS platforms: Greenhouse, Lever, Ashby. Companies using proprietary careers systems (HubSpot, Workday-hosted, custom pages) will return zero results. This is not an error, it is out of scope for this actor.
First-run fields
The following fields return null on the first scrape for a given domain and populate on subsequent runs via change detection:
new_gtm_rolesremoved_gtm_rolesrole_count_deltadays_between_runsvelocity_signalreturnsfirst_run
This is by design.
Clay Table Template
A pre-built Clay table template is available for running this actor at scale. The template includes:
- A Run Apify Actor enrichment column wired to this actor
- Formula columns for signal_strength, gtm_hiring_signal, gtm_role_count, and top_gtm_role
- A fn_gtm_hiring_signal Clay Function that consolidates the signal logic into a single callable function
- A ready_to_send view filtered on gtm_hiring_signal = true and signal_strength = high or medium
Template: https://app.clay.com/shared-table/share_0tdt1tiWFxVa8mheFdS
Clay Function (fn_gtm_hiring_signal): https://app.clay.com/shared-table/share_0tdt1nibJ3GAC848kXX
The function takes nine inputs and returns a single structured output column. Use it instead of rebuilding the formula stack from scratch.
Output
One result object per domain, pushed to the Apify dataset.
{"domain": "stripe.com","company_name": "Stripe","ats_detected": "greenhouse","gtm_role_count": 12,"gtm_roles": [{"title": "Enterprise Account Executive","department": "Sales","location": "San Francisco, CA","url": "https://boards.greenhouse.io/stripe/jobs/10001"},{"title": "Revenue Operations Manager","department": "Revenue Operations","location": "Remote","url": "https://boards.greenhouse.io/stripe/jobs/10002"}],"gtm_signals": ["AE", "RevOps", "CS"],"scraped_at": "2026-04-03T12:00:00Z","error": null}
If no GTM roles are found:
{"domain": "example.com","company_name": null,"ats_detected": null,"gtm_role_count": 0,"gtm_roles": [],"gtm_signals": [],"scraped_at": "2026-04-03T12:00:00Z","error": null}
Output Fields
| Field | Type | Description |
|---|---|---|
domain | string | The input domain |
company_name | string | Derived from domain (first segment) |
ats_detected | string | greenhouse, lever, ashby, or null |
slug_source | string | Detection method used — override_map or probe layer name |
gtm_role_count | integer | Number of GTM roles detected |
gtm_roles | array | List of role objects (title, department, location, url) |
gtm_signals | array | Deduplicated signal tags, e.g. ["AE", "SDR", "RevOps"] |
scraped_at | string | ISO timestamp of the run |
error | string | Error message if scraping failed, otherwise null |
role_count_delta | integer | Difference between current and previous gtm_role_count. Null on first run. |
velocity_signal | string | growing, stable, shrinking, or first_run. |
days_between_runs | integer | Days elapsed since previous_run_date. Null on first run. |
change_detected | boolean | True if any roles are new or removed since the previous run. |
change_type | string | new_roles, roles_removed, both, no_change, or first_run. |
new_gtm_roles | string | Comma-separated roles present in this run but not the previous run. Null if none. |
removed_gtm_roles | string | Comma-separated roles present in the previous run but not this run. Null if none. |
How ATS Detection Works
The actor uses a two-layer detection approach:
Layer 1 — Override map lookup Before making any network requests, the actor checks an internal map of pre-validated ATS slug assignments. When a match is found, the actor returns the result immediately with no external calls. This reduces latency and API load for known companies.
Layer 2 — Live ATS probe If the domain is not in the override map, the actor runs a live probe cascade against Greenhouse, Lever, and Ashby career page endpoints. Results from successful live probes are candidates for future override map updates.
GTM Signal Tags
The gtm_signals array uses these standardized tags:
| Tag | Triggered by |
|---|---|
AE | Account Executive roles |
SDR | Sales Development Representative |
BDR | Business Development Representative |
BizDev | Business Development (non-SDR) |
RevOps | Revenue Operations |
SE | Sales Engineer |
CS | Customer Success |
AM | Account Manager |
DemandGen | Demand Generation |
Growth | Growth roles |
Partnerships | Partnerships and Channel |
ChannelSales | Channel Sales |
FieldSales | Field Sales |
InsideSales | Inside Sales |
VPSales | VP of Sales |
HeadOfSales | Head of Sales |
CRO | Chief Revenue Officer |
SalesManager | Sales Manager |
SalesDirector | Sales Director |
SalesOps | Sales Operations |
Using This Actor in Clay
This Actor is built to work natively as a Clay enrichment column.
Setup:
- In your Clay table, add a new column
- Select Apify from the integrations panel
- Choose GTM Hiring Signal Scraper (
mambalabs/gtm-hiring-signal-scraper) - Map your
domaincolumn to thedomaininput field - Set
modetosingle - Run the enrichment
Output mapping in Clay:
After the run, map these output fields to named Clay columns:
ats_detected→ which ATS the company usesgtm_role_count→ number of open GTM roles (filter: greater than 0)gtm_signals→ use Clay's contains formula to filter for specific signalsgtm_roles[0].title→ top GTM role title
Example Clay filter: gtm_role_count > 2 AND gtm_signals contains "AE" — identifies companies aggressively building an AE team.
Supported ATS Platforms
| Platform | Endpoint Used | Notes |
|---|---|---|
| Greenhouse | api.greenhouse.io/v1/boards/{slug}/jobs | Public API, no auth required |
| Lever | api.lever.co/v0/postings/{slug} | Public API, no auth required |
| Ashby | api.ashbyhq.com/posting-api/job-board/{slug} | Public API, draft jobs excluded |
The Actor probes all three platforms in parallel on the base slug. The first one to return GTM roles wins, with Greenhouse taking priority on ties, then Lever, then Ashby. If none return, slug variants ({base}labs, {base}-labs) are tried only on ATSes that returned 404 on the base. Companies on other ATS platforms (Workday, Rippling, Teamtailor, SmartRecruiters, BambooHR, custom) return ats_platform: null.
Velocity and Change Detection
Run this actor on a schedule (weekly or monthly) and pass the previous run's output back as inputs to track GTM hiring momentum over time. In Clay, add a second enrichment column that maps previous_gtm_role_count, previous_run_date, and previous_gtm_roles_detected from your stored prior-run columns to the new input fields.
Use velocity_signal = growing as a trigger for high-priority outreach timing. Use change_detected = true to identify companies that have recently shifted their GTM hiring posture. Filter on change_type = new_roles to surface companies that just opened new GTM positions since your last refresh.
Pricing
Pay per result. Each domain processed = 1 billable event.
Typical run costs:
- 100 domains: ~$0.12
- 1,000 domains: ~$1.20
- 10,000 domains: ~$12.00
Known Limitations
- ATS slug derivation is based on the first segment of the domain (e.g.
stripe.com->stripe), with automatic probing of{base}labsand{base}-labswhen the base slug returns 404. Companies with more unusual slugs (e.g. Clay usesclaylabson Ashby, caught by the variant probe) work automatically. For unusual patterns not covered by the variants, passats_slugas input to override. - Role detection is keyword-based. Unusual job title formats may not be classified.
- No proxy required -- all sources are public APIs.
- Companies on ATSes outside Greenhouse, Lever, and Ashby return
ats_platform: nullwithgtm_role_count: 0and no error. Scope was narrowed in v0.0.17 after Workday and Rippling detection failed verification testing. See the overview for the full rationale.
Issues and Feature Requests
Found a bug or want to request a new ATS platform or signal type? Open an issue in the Issues tab above. Response time: typically within 48 hours.
Related Actors
- GTM Tech Stack Signal Scraper - Detect which GTM tools a company uses. CRM, sequencer, revenue intelligence. $0.07/result.
- GTM Signals Aggregator - Run both hiring signals and tech stack detection in one call. $0.12/result vs $0.14 if run separately. Saves 14% and adds a composite signal score.
Built by Mamba Labs.