Greenhouse Lever Ashby Job Scraper: GTM Hiring Signals avatar

Greenhouse Lever Ashby Job Scraper: GTM Hiring Signals

Pricing

from $42.50 / 1,000 results

Go to Apify Store
Greenhouse Lever Ashby Job Scraper: GTM Hiring Signals

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

Mamba Labs

Maintained by Community

Actor stats

1

Bookmarked

19

Total users

6

Monthly active users

5 hours ago

Last modified

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

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.

ExampleWhat it does
Find Companies Hiring SDRs and BDRsDetect open SDR and BDR roles at a company from its career page across Greenhouse, Lever, and Ashby.
Track Weekly GTM Hiring Velocity ChangesRe-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 ExecutivesFind open Account Executive and sales-leadership roles, a mid-funnel capacity signal.
Bulk Scan a Company List for GTM Hiring SignalsScore a whole list of domains for open GTM roles in one batch run.
Spot Companies Hiring RevOps and Sales OpsFind 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_signals array (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:

FieldTypeRequiredExample
domainstringyesstripe.com

Pass a bare domain. No https://, no www., no trailing slash.

Optional: ATS Slug Override

FieldTypeRequiredExample
ats_slugstringnoclaylabs

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:

  1. Override map lookup (no network call)
  2. Domain root probe across all three ATS platforms
  3. Common slug variants: {root}labs, {root}-labs
  4. If ats_slug is 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_roles
  • removed_gtm_roles
  • role_count_delta
  • days_between_runs
  • velocity_signal returns first_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

FieldTypeDescription
domainstringThe input domain
company_namestringDerived from domain (first segment)
ats_detectedstringgreenhouse, lever, ashby, or null
slug_sourcestringDetection method used: override_map or probe layer name
gtm_role_countintegerNumber of GTM roles detected
gtm_rolesarrayList of role objects. Each carries title, department, location, url, seniority, and posted_date.
gtm_roles[].senioritystringInferred 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_datestringISO date the role was posted or last updated, from the ATS listing. Null when the ATS does not expose it.
gtm_signalsarrayDeduplicated signal tags, e.g. ["AE", "SDR", "RevOps"]
scraped_atstringISO timestamp of the run
errorstringError message if scraping failed, otherwise null
role_count_deltaintegerDifference between current and previous gtm_role_count. Null on first run.
velocity_signalstringgrowing, stable, shrinking, or first_run.
days_between_runsintegerDays elapsed since previous_run_date. Null on first run.
change_detectedbooleanTrue if any roles are new or removed since the previous run.
change_typestringnew_roles, roles_removed, both, no_change, or first_run.
new_gtm_rolesstringComma-separated roles present in this run but not the previous run. Null if none.
removed_gtm_rolesstringComma-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

PlatformEndpoint UsedNotes
Greenhouseapi.greenhouse.io/v1/boards/{slug}/jobsPublic API, no auth required
Leverapi.lever.co/v0/postings/{slug}Public API, no auth required
Ashbyapi.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:

TagTriggered by
AEAccount Executive roles
SDRSales Development Representative
BDRBusiness Development Representative
BizDevBusiness Development (non-SDR)
RevOpsRevenue Operations
SESales Engineer
CSCustomer Success
AMAccount Manager
DemandGenDemand Generation
GrowthGrowth roles
PartnershipsPartnerships and Channel
ChannelSalesChannel Sales
FieldSalesField Sales
InsideSalesInside Sales
VPSalesVP of Sales
HeadOfSalesHead of Sales
CROChief Revenue Officer
SalesManagerSales Manager
SalesDirectorSales Director
SalesOpsSales 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.

Open the Clay template

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:

  1. In your Clay table, add a new column
  2. Select Apify from the integrations panel
  3. Choose GTM Hiring Signal Scraper (mambalabs/gtm-hiring-signal-scraper)
  4. Map your domain column to the domain input field
  5. Set mode to single
  6. Run the enrichment

Constructing the Input Data field in Clay:

The Input Data field in Clay must be constructed in this exact order:

  1. Type the opening brace, key, colon, space, opening quote: {"domain": "
  2. Press / and insert your domain column as a pill
  3. 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 uses
  • gtm_role_count: number of open GTM roles (filter: greater than 0)
  • gtm_signals: use Clay's contains formula to filter for specific signals
  • gtm_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.

TierDiscountPer resultPer 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:

VolumeCost
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

PlanLimit
Free Apify plan25 results per calendar month (resets on the 1st)
Any paid Apify planUnlimited 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:

ConditionBehaviorOutput
ATS page times out, is blocked, or returns a network errorThat ATS probe is caught and skipped; the cascade continues to the next platformRun 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 slugTreated as not-found; eligible for the {base}labs / {base}-labs variant probeRow returned. If no variant matches, ats_platform is null
Company is on an ATS outside Greenhouse, Lever, and AshbyNo supported probe matchesRow 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 filterValid result; the company simply is not hiring GTM right nowRow returned with gtm_role_count: 0, gtm_hiring_signal: false, empty gtm_signals, error: null
Missing or empty domain in inputThat target is skipped with a logged errorAn empty record is pushed with error: "Missing or empty domain in input."; no charge for an error row
Unexpected exception while processing a domainCaught by the per-domain try/catchAn 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}labs and {base}-labs when the base slug returns 404. Companies with more unusual slugs (e.g. Clay uses claylabs on Ashby, caught by the variant probe) work automatically. For unusual patterns not covered by the variants, pass ats_slug as 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: null with gtm_role_count: 0 and 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.

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" question
  • gtm_hiring_signal: boolean shortcut for filter logic
  • gtm_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, or null)
  • top_gtm_role: highest-priority role title to quote back to the user
  • signal_strength: high, medium, or low for quick triage language
  • velocity_signal: growing, stable, shrinking, or first_run for trend questions
  • career_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

ActorWhat it doesPrice/result
GTM Hiring Signal ScraperDetects GTM hiring from career pages (Greenhouse, Lever, Ashby)$0.05
GTM Tech Stack Signal EnrichmentDetects CRM, sequencer, and marketing automation from a public site$0.015
GTM Signals AggregatorCombines hiring and tech signals into one composite GTM score$0.09
Job Board Keyword Signal ScannerScans 5 ATS platforms for roles in any category$0.05
Domain to LinkedIn URL ResolverResolves a domain or name to its LinkedIn URL with firmographics$0.006
ICP Fit ScorerScores a company against your ideal customer profile$0.05
Domain Deliverability CheckerAudits email deliverability: SPF, DKIM, DMARC, MX, health score$0.005
Company Firmographic EnricherEnriches a domain into employee band, industry, HQ, revenue$0.004
Company Social Presence MapperMaps a domain to social URLs and follower counts$0.015
Company Identity ResolverResolves name, domain, or LinkedIn into one canonical identity$0.007
Company Change-Event FeedMonitors a domain and returns only what changed since last run$0.06
Funding & Press Signal ScannerScans 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.