Greenhouse Lever Ashby Job Scraper: GTM Hiring Signals
Pricing
from $42.50 / 1,000 results
Greenhouse Lever Ashby Job Scraper: GTM Hiring Signals
Detect companies actively hiring GTM teams. Scrapes Greenhouse, Lever, Ashby, Workday, and Rippling for Sales, RevOps, and Growth roles. Flat JSON with role counts and velocity signals. Built for Clay enrichment columns. MCP-ready for Claude Desktop, Cursor, and AI agents.
Pricing
from $42.50 / 1,000 results
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
1
Bookmarked
19
Total users
6
Monthly active users
5 hours 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.
What's Inside
- Ready-to-Run Examples
- What's New
- Why Hiring Signals Matter
- Features
- Input
- Output
- How ATS Detection Works
- GTM Signal Tags
- Velocity and Change Detection
- Clay Table Template
- Pricing
- Error Handling
- Known Limitations
- Issues and Feature Requests
- Use with MCP (AI Agents)
- Mamba Labs GTM Actor Fleet
Ready-to-Run Examples
Each example is a pre-configured version of this actor for a specific use case. Click any link to open it in the Apify Console and run it immediately.
| Example | What it does |
|---|---|
| Find Companies Hiring SDRs and BDRs | Detect open SDR and BDR roles at a company from its career page across Greenhouse, Lever, and Ashby. |
| Track Weekly GTM Hiring Velocity Changes | Re-run weekly to catch newly opened or closed GTM roles versus a prior run. Returns role count delta and velocity signal. |
| Detect Companies Hiring Account Executives | Find open Account Executive and sales-leadership roles, a mid-funnel capacity signal. |
| Bulk Scan a Company List for GTM Hiring Signals | Score a whole list of domains for open GTM roles in one batch run. |
| Spot Companies Hiring RevOps and Sales Ops | Find companies adding RevOps and Sales Ops headcount, a stack-breaking buying trigger. |
Looking for a different configuration? Open the Input tab to build your own.
What's New
- Free tier. Free Apify-plan users get 25 results per calendar month (resets monthly); upgrade for unlimited: https://apify.com/pricing
- Pricing reduced. $0.05 per result, down from $0.07. No subscription, no contract.
- Clay table template available. Pre-built table with enrichment column, formula columns, and a reusable Clay Function. Open the template
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
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.
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","seniority": "unknown","posted_date": "2026-05-21T18:04:00Z"},{"title": "Revenue Operations Manager","department": "Revenue Operations","location": "Remote","url": "https://boards.greenhouse.io/stripe/jobs/10002","seniority": "mid","posted_date": "2026-05-18T09:11:00Z"}],"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. Each carries title, department, location, url, seniority, and posted_date. |
gtm_roles[].seniority | string | Inferred from the title: executive (VP, C-suite, Head of), senior (Senior, Lead, Principal, Director), mid (Manager, Specialist), junior (Associate, Coordinator, Entry, Intern), or unknown. |
gtm_roles[].posted_date | string | ISO date the role was posted or last updated, from the ATS listing. Null when the ATS does not expose it. |
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.
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.
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 |
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.
Clay Table Template
A pre-built Clay table template is available with the enrichment column, formula columns, and views ready to use.
The template includes:
- A Run Apify Actor enrichment column wired to mambalabs/gtm-hiring-signal-scraper
- Formula columns for signal_strength, gtm_hiring_signal, gtm_role_count, and top_gtm_role
- A ready_to_send view filtered on gtm_hiring_signal = true and signal_strength = high or medium
A reusable Clay Function (fn_gtm_hiring_signal) is also available: Open the function. It takes nine inputs and returns a single structured output column. Use the function when you want the signal logic to update automatically across tables. Use the template when you want a static copy to modify.
Manual setup
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
Constructing the Input Data field in Clay:
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.
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.
Pricing
$0.05 per result. Pay per event, billed per domain processed. No subscription, no seat license, no contract.
| Tier | Discount | Per result | Per 1K results |
|---|---|---|---|
| Free (no plan) | 0% | $0.05 | $50.00 |
| Starter (Bronze) | ~5% | $0.0475 | $47.50 |
| Scale (Silver) | ~10% | $0.045 | $45.00 |
| Business (Gold) | ~15% | $0.0425 | $42.50 |
Volume pricing at the base tier:
| Volume | Cost |
|---|---|
| 100 domains | $5.00 |
| 1,000 domains | $50.00 |
| 10,000 domains | $500.00 |
We recently reduced pricing across the Mamba Labs actor suite to bring more value to GTM teams running enrichment at scale.
Free tier vs paid usage
| Plan | Limit |
|---|---|
| Free Apify plan | 25 results per calendar month (resets on the 1st) |
| Any paid Apify plan | Unlimited results, no cap |
Free-plan usage is counted cumulatively across all of your runs in a month, not per run, so single-domain Clay runs and larger batches both draw from the same monthly allowance. Only successfully processed domains count toward the limit; error or empty rows do not. How it behaves when you hit the limit:
- Within the monthly allowance: every submitted domain is processed normally.
- A run that crosses the limit: the remaining allowance is delivered, then one final notice row explains the cap and how to upgrade. The run still finishes successfully.
- Already at the limit: the run exits immediately with no results and an upgrade message in the run status.
Upgrade to any paid Apify plan for unlimited processing: https://apify.com/pricing. Paid-plan runs are never capped and incur no usage tracking.
Error Handling
The actor is built so a single bad source or domain never stops the run. Each ATS fetch is wrapped in try/catch with a 10-second timeout, and each domain is wrapped in its own try/catch. Behavior by condition:
| Condition | Behavior | Output |
|---|---|---|
| ATS page times out, is blocked, or returns a network error | That ATS probe is caught and skipped; the cascade continues to the next platform | Run continues. That source contributes no roles; if no other source matches, ats_platform is null and gtm_role_count is 0, error stays null |
| ATS returns 404 on the base slug | Treated as not-found; eligible for the {base}labs / {base}-labs variant probe | Row returned. If no variant matches, ats_platform is null |
| Company is on an ATS outside Greenhouse, Lever, and Ashby | No supported probe matches | Row returned with ats_platform: null, gtm_role_count: 0, gtm_hiring_signal: false, error: null (out of scope, not an error) |
| ATS detected but no GTM roles match the keyword filter | Valid result; the company simply is not hiring GTM right now | Row returned with gtm_role_count: 0, gtm_hiring_signal: false, empty gtm_signals, error: null |
| Missing or empty domain in input | That target is skipped with a logged error | An empty record is pushed with error: "Missing or empty domain in input."; no charge for an error row |
| Unexpected exception while processing a domain | Caught by the per-domain try/catch | An empty record is pushed with error set to the exception message; the run continues to the next domain |
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 feature? Open an issue in the Issues tab above. Response time: typically within 48 hours.
Use with MCP (AI Agents)
This actor is callable as a tool over MCP (Model Context Protocol) by AI clients like Claude Desktop, Cursor, VS Code (GitHub Copilot), Windsurf, and any other MCP-compatible client. Apify hosts the MCP server at mcp.apify.com, so no custom server code is needed.
What this actor does in an MCP context
When an AI agent calls this tool, it returns a flat snapshot of a company's current GTM hiring activity: how many Sales, RevOps, Customer Success, and Growth roles are open right now, which ATS the company uses, and which signal tags (AE, SDR, RevOps, etc.) those roles map to. The agent gets a single JSON row per domain it can reason over without scraping career pages or stitching together Greenhouse, Lever, and Ashby APIs itself.
Example prompts a user might type into Claude Desktop:
- How many GTM roles is stripe.com hiring for right now, and which categories?
- Is notion.so actively building a sales team, or only customer success?
- Show me the hiring velocity signals for clay.com and tell me whether to prioritize outreach this week.
Supported MCP clients
Claude Desktop, Cursor, VS Code (GitHub Copilot), Windsurf, and any MCP-compatible client.
Setup: Hosted server (recommended)
Add this entry to your MCP client config. The OAuth variant prompts you to authorize on first connect, so no token sits in your config file.
OAuth (recommended):
{"mcpServers": {"mamba-labs-hiring-signals": {"url": "https://mcp.apify.com?tools=mambalabs/gtm-hiring-signal-scraper"}}}
Bearer token:
{"mcpServers": {"mamba-labs-hiring-signals": {"url": "https://mcp.apify.com?tools=mambalabs/gtm-hiring-signal-scraper","headers": {"Authorization": "Bearer YOUR_APIFY_TOKEN"}}}}
Setup: Full Mamba Labs GTM Suite
Load all 6 Mamba Labs GTM actors as tools in a single MCP server entry.
OAuth:
{"mcpServers": {"mamba-labs-gtm-suite": {"url": "https://mcp.apify.com?tools=mambalabs/gtm-hiring-signal-scraper,mambalabs/gtm-tech-stack-signal-scraper,mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay,mambalabs/job-board-keyword-signal-scanner,mambalabs/domain-to-linkedin-url-resolver,mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay"}}}
Bearer token:
{"mcpServers": {"mamba-labs-gtm-suite": {"url": "https://mcp.apify.com?tools=mambalabs/gtm-hiring-signal-scraper,mambalabs/gtm-tech-stack-signal-scraper,mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay,mambalabs/job-board-keyword-signal-scanner,mambalabs/domain-to-linkedin-url-resolver,mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay","headers": {"Authorization": "Bearer YOUR_APIFY_TOKEN"}}}}
Setup: Local server (for development and testing)
Run the Apify MCP server locally via npx. Single actor:
npx @apify/actors-mcp-server --tools mambalabs/gtm-hiring-signal-scraper
Full suite:
npx @apify/actors-mcp-server --tools mambalabs/gtm-hiring-signal-scraper,mambalabs/gtm-tech-stack-signal-scraper,mambalabs/b2b-buying-signals-hiring-tech-stack-intent-for-clay,mambalabs/job-board-keyword-signal-scanner,mambalabs/domain-to-linkedin-url-resolver,mambalabs/icp-account-lead-scoring-fit-scorer-0-100-for-clay
Mamba Labs MCP wrapper
Mamba Labs publishes a dedicated MCP wrapper for this actor on npm. Install it globally:
npm install -g @mambalabsdev/mcp-gtm-hiring-signal-scraper
Then point your MCP client at it:
{"mcpServers": {"mamba-gtm-hiring": {"command": "npx","args": ["-y", "@mambalabsdev/mcp-gtm-hiring-signal-scraper"],"env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }}}}
Prefer one install for the whole fleet? The Mamba Labs GTM Suite (https://www.npmjs.com/package/@mambalabsdev/mcp-gtm-suite) exposes eleven of these actors as tools in a single MCP server.
What the output looks like
The LLM receives a flat JSON object, one row per domain, well under 2KB. Every field is a top-level key, so the agent can reason over it without unwrapping nested objects or running post-processing. The most important fields for AI-agent use:
gtm_role_count: integer count of open GTM roles, the headline number for any "is this company hiring" questiongtm_hiring_signal: boolean shortcut for filter logicgtm_signals: deduplicated tags like["AE", "SDR", "RevOps"]so the agent can answer "what kind of GTM team are they building"ats_platform: which ATS was detected (greenhouse,lever,ashby, ornull)top_gtm_role: highest-priority role title to quote back to the usersignal_strength:high,medium, orlowfor quick triage languagevelocity_signal:growing,stable,shrinking, orfirst_runfor trend questionscareer_page_url: clickable link the agent can hand back to the user
Billing
MCP runs use the same pay-per-event pricing as direct API or Console runs. Each successful result costs $0.05.
Mamba Labs GTM Actor Fleet
| Actor | What it does | Price/result |
|---|---|---|
| GTM Hiring Signal Scraper | Detects GTM hiring from career pages (Greenhouse, Lever, Ashby) | $0.05 |
| GTM Tech Stack Signal Enrichment | Detects CRM, sequencer, and marketing automation from a public site | $0.015 |
| GTM Signals Aggregator | Combines hiring and tech signals into one composite GTM score | $0.09 |
| Job Board Keyword Signal Scanner | Scans 5 ATS platforms for roles in any category | $0.05 |
| Domain to LinkedIn URL Resolver | Resolves a domain or name to its LinkedIn URL with firmographics | $0.006 |
| ICP Fit Scorer | Scores a company against your ideal customer profile | $0.05 |
| Domain Deliverability Checker | Audits email deliverability: SPF, DKIM, DMARC, MX, health score | $0.005 |
| Company Firmographic Enricher | Enriches a domain into employee band, industry, HQ, revenue | $0.004 |
| Company Social Presence Mapper | Maps a domain to social URLs and follower counts | $0.015 |
| Company Identity Resolver | Resolves name, domain, or LinkedIn into one canonical identity | $0.007 |
| Company Change-Event Feed | Monitors a domain and returns only what changed since last run | $0.06 |
| Funding & Press Signal Scanner | Scans news and press for funding, exec moves, launches, M&A | $0.03 |
One-install option: the Mamba Labs GTM Suite MCP server exposes eleven of these actors as tools in a single package. Each actor also has its own MCP wrapper.
All actors: apify.com/mambalabs | Website: mambabuilt.com
Built by Mamba Labs.