Hiring Signals Job Feed (multi-ATS)
Pricing
from $1.50 / 1,000 job saveds
Hiring Signals Job Feed (multi-ATS)
Paste company domains, get every open job from Greenhouse, Lever, Ashby, Workable and SmartRecruiters in one normalized feed, with new-since-last-run flags. Public feeds only: no login, no proxies.
Pricing
from $1.50 / 1,000 job saveds
Rating
0.0
(0)
Developer
Adam Small
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Hiring Signals Job Feed: Greenhouse, Lever, Ashby, Workable and SmartRecruiters
By SignalRoute: data feeds that route buying signals to your team.
Turn a list of company domains into one clean, normalized job feed, and see which roles are new since your last run.
Paste stripe.com, linear.app or huggingface.co. The Actor finds which applicant tracking system (ATS) each company uses and pulls every open role from that ATS's public JSON job feed. Each job comes back in one consistent schema. Use it for sales triggers ("they just opened 5 RevOps roles"), investor or competitor monitoring, recruiting research, or job alerts.
- ✅ Auto-detects the ATS: Greenhouse, Lever, Ashby, Workable and SmartRecruiters
- ✅ Public feeds only: no login, no cookies, no residential proxies, and a low memory footprint (256–512 MB)
- ✅ New-since-last-run: jobs are flagged
is_new, and you can output only new jobs on a schedule - ✅ Fails soft: a company that can't be resolved becomes an error row with a reason code, and the rest of the run continues
- ✅ Run summary: success rate, per-platform counts and error counts are saved to
RUN_SUMMARY
⚡ Start in one click: ready-made example tasks
| Example task | What it does |
|---|---|
| AI startups hiring: daily new roles | OpenAI, Anthropic, Hugging Face, Linear, Ramp, Mistral, Perplexity and Cursor. Set to onlyNew, so after the first run you see only roles that were just opened. |
| Fintech sales & GTM hiring | Stripe, Ramp, Brex, Plaid, Affirm, Chime and SoFi. Use it to spot new sales, RevOps and GTM roles as buying signals. |
| Competitor hiring tracker (5 domains) | A 5-company template. Swap in your competitors, add a daily schedule, and get a feed of their new roles. |
Open a task, press Try for free, and change the domains to your own list.
Who uses it, and for what
- Sales and RevOps teams: "Acme just opened 4 SDR roles and a Head of RevOps" is a strong outbound trigger. Push new jobs to a CRM, Slack or Clay with an Apify integration or webhook.
- Investors and analysts: track headcount growth by department across a portfolio or a watchlist of startups, every day.
- Competitive intelligence: see which teams your competitors are building (AI, enterprise sales, new regions) before they announce anything.
- Recruiters and agencies: get one clean feed of new roles at your target accounts, instead of checking dozens of career pages by hand.
- Job seekers and job boards: build alerts or a niche job board from companies' own ATS feeds.
💰 Pricing: pay only for results
This Actor uses pay per event. You pay for companies found and jobs delivered, not for compute time.
| Event | Price | When it's charged |
|---|---|---|
| Actor start | $0.001 | Once per run (per GB of memory; the default 512 MB counts as one) |
| Company resolved | $0.01 | Once per company whose job board was found and fetched |
| Job saved | $0.0015 | Per job row in the dataset (that's $1.50 per 1,000 jobs) |
- Error rows are free. If a company can't be resolved, you get an error row with a reason code and you pay nothing for it.
- Examples: 10 companies × 30 jobs ≈ $0.55. 50 companies × 40 jobs ≈ $3.50 for a full run. A daily
onlyNewwatch of 20 companies costs about $0.20 a day plus $0.0015 per new job. - Set a spending cap: use Max cost per run in the run options. The Actor stops cleanly when the cap is reached and marks skipped companies
BUDGET_REACHED. - Apify's free plan credit covers your first test runs.
Input
| Field | Type | Default | Description |
|---|---|---|---|
domains | array of strings | (required) | Company domains or URLs. Optional per-line override: domain|platform:boardToken |
platforms | array | all | Limit detection to greenhouse, lever, ashby, workable or smartrecruiters |
maxJobsPerCompany | integer | 200 | Cap per company. Newest first for Greenhouse, Ashby and Workable. 0 means no cap |
onlyNew | boolean | false | Output only jobs not seen in earlier runs |
stateStoreName | string | hiring-signals-state | Named key-value store that remembers seen jobs. Use one name per watchlist |
includeDescription | boolean | true | Add a plain-text description_snippet |
snippetLength | integer | 300 | Snippet length in characters |
scanCareersPage | boolean | true | Read the homepage and /careers to find the exact board link. When off, the Actor only guesses from the domain |
maxConcurrency | integer | 5 | Companies processed in parallel |
requestTimeoutSecs | integer | 20 | Timeout for each HTTP request |
{"domains": ["stripe.com", "linear.app", "huggingface.co", "ubisoft.com|smartrecruiters:Ubisoft2"],"maxJobsPerCompany": 100,"onlyNew": false}
Overrides. When a company's board token differs from its domain, or it uses a career page the Actor can't detect, pin it like this: doordash.com|greenhouse:doordashusa or bosch.com|smartrecruiters:BoschGroup.
Output (dataset)
One row per job (illustrative values):
{"company": "Stripe","domain": "stripe.com","platform": "greenhouse","job_id": "7212345","title": "Account Executive, Enterprise","location": "San Francisco, CA","department": "Sales","url": "https://stripe.com/jobs/search?gh_jid=7212345","posted_at": "2026-10-28T17:02:11Z","description_snippet": "Stripe is a financial infrastructure platform...","is_new": true}
When a company fails, it produces one error row with domain, error_code, error and scraped_at. Error rows are never charged.
| error_code | Meaning |
|---|---|
INVALID_INPUT | The line couldn't be parsed as a domain or override |
ATS_NOT_FOUND | No supported ATS board was found. The company may self-host or use Workday or iCIMS |
BOARD_NOT_FOUND | The board token from an override or a careers link returned 404 |
FETCH_FAILED | Network errors or timeouts while fetching. Retry the run |
BUDGET_REACHED | The run's maximum charge was reached, so this company was skipped |
INTERNAL_ERROR | An unexpected parsing error. Please report it |
The RUN_SUMMARY record in the default key-value store holds the input count, resolved count, success rate, jobs found, saved and new, per-platform and per-error counts, and a status for each company.
Scheduled monitoring (new jobs only)
- Set
onlyNew: trueand choose astateStoreName, for examplemy-watchlist. - Create a daily Apify Schedule.
- Each run outputs only roles that weren't there last time. Jobs that disappear are dropped from the state, so a role that gets reposted shows up as new again.
The state is saved only for companies that were fully fetched. If a company was cut short by maxJobsPerCompany or the budget, its earlier state is merged in rather than replaced.
How detection works
- If you give an override, the Actor uses it.
- Otherwise it scans the homepage,
/careersand/jobsfor embedded board links (boards.greenhouse.io/x,jobs.lever.co/x,jobs.ashbyhq.com/x,apply.workable.com/x,jobs.smartrecruiters.com/x). - If no link is found, it guesses the slug from the domain (
stripe, thenstripeai,stripehqand so on) on each ATS's public API. Guessed boards with 0 open jobs are ignored, because placeholder accounts are common.
Memory and speed
| Workload | Peak memory (measured) | Time |
|---|---|---|
| Small watchlist (baseline: runtime + SDK) | ~130 MB | under 1 min on a normal network |
| 16 companies, up to 1,000 jobs each, concurrency 10 (5,034 jobs) | 198 MB | ~2 min |
The 512 MB default leaves plenty of headroom. 256 MB works for small watchlists with maxConcurrency ≤ 5. The Actor uses plain HTTP only, with no browser, so it costs very little to run.
Limits and roadmap
- Supported: Greenhouse, Lever, Ashby, Workable and SmartRecruiters.
- Not yet supported: Workday, iCIMS, Taleo, Teamtailor and self-hosted careers pages. These companies return
ATS_NOT_FOUND. Workday support is next on the roadmap. Many large enterprises use it, and its public/wday/cxs/job-search endpoint needs per-tenant discovery. - SmartRecruiters descriptions come from one extra public request per job, which makes these runs slower. Turn off
includeDescriptionfor the fastest runs. - Caps: Lever and SmartRecruiters caps follow the API's order instead of strict newest-first.
- Accuracy: auto-detection resolved 83% of a 30-company benchmark with no overrides. Add
domain|platform:tokenoverrides to fix the rest.
Support
Found a company that should resolve but doesn't? Open an issue on the Actor's Issues tab and include the domain. SignalRoute usually adds the fix or an override hint within a few days.
Legal
This Actor reads only public, unauthenticated job-board APIs that the ATS vendors publish for embedding job listings. It does not collect personal data.