Career Site Jobs Feed: New Job Postings Monitor
Pricing
$2.00 / 1,000 job postings
Career Site Jobs Feed: New Job Postings Monitor
A feed of new job postings straight from company career sites: search a built-in directory of 692 boards or your own list, filter by time range, title, location, salary and visa sponsorship, and get only new jobs on each scheduled run. Expired-job tracking. $2 per 1,000 jobs.
Pricing
$2.00 / 1,000 job postings
Rating
0.0
(0)
Developer
Scott Williams
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
Career Site Jobs Feed: new job postings from company career sites, daily or hourly
Career Site Jobs Feed is a jobs feed and new-job-postings monitor: schedule it daily or hourly with Only new jobs on, and each run returns only the new job postings from company career sites on Greenhouse, Lever, Ashby, Workable, Recruitee and Teamtailor that you have not had before. It outputs every job in one JSON schema with title, company name, locations, workplace type, salary when published, visa sponsorship, status and a dedupe key, and Report expired jobs adds a free record when a posting disappears from its board. It costs $0.002 per job posting ($2 per 1,000), with no start fee.
Sample output: the first item from a local run of the prefilled example input ({"maxItems": 4}) on 2 November 2026, shortened to 15 of its 48 fields (descriptionText and the rest are in the full item):
{"id": "bf2754d3-e29f-40a9-93b3-33589ff69e9e","ats": "ashby","companySlug": "legora","companyName": "Legora","title": "Legal Engineer - In-House","department": "Legal Engineering","location": "London","country": "United Kingdom","workplaceType": "onsite","employmentType": "FULL_TIME","postedAt": "2026-10-28T17:34:16.128000+00:00","status": "active","keySkills": ["Generative AI"],"dedupeKey": "e94f9cd1ce161db1be20","firstSeenAt": "2026-11-02T14:19:58.478858+00:00"}
Career Site Jobs Feed reads the official public job-board APIs and feeds of Greenhouse, Lever, Ashby, Workable, Recruitee and Teamtailor, filters them by title, location, company, posting date, remote/hybrid, salary and visa sponsorship, and returns every job in the same schema, whichever ATS the company uses. It is an independent tool and is not affiliated with or endorsed by any of these ATS vendors.
No login, no third-party job board, no LinkedIn: every job comes from the employer's own board, is read at run time, and links to the employer's own application page.
What can this career site scraper do?
- Search a built-in directory of 692 verified public Greenhouse, Ashby and Lever boards (mostly startups and tech companies). By default it reads the 100 largest; set
maxDirectoryCompaniesto0for all of them. - Watch your own list of companies on any of the six supported platforms: paste a board URL,
ats:slug, a bare company slug or name, or a careers page that embeds one of these boards. - Filter before you pay: posted within the last hour, 24 hours, 7 days or 30 days; job title, location, description, department and company search with include and exclude lists; work arrangement; employment type; seniority; salary; visa sponsorship; maximum years of experience; staffing-agency exclusion.
- Run it as a jobs feed: on a schedule, Only new jobs returns only jobs you have not had before, and Report expired jobs adds a free record when a posting disappears from its board.
- Normalise and enrich every job: remote/hybrid/onsite, schema.org employment type, seniority from the title, annualised salary (plus a rough USD band), visa-sponsorship and years-of-experience hints, key skills, a cross-board
dedupeKey, and anisAgencyflag.
Supported career sites (ATS platforms)
| ATS | Source the Actor reads | Example company entry |
|---|---|---|
| Greenhouse | Greenhouse Job Board API | https://boards.greenhouse.io/airbnb or greenhouse:airbnb |
| Lever | Lever Postings API | https://jobs.lever.co/palantir or lever:palantir |
| Ashby | Ashby public job posting API | https://jobs.ashbyhq.com/ramp or ashby:ramp |
| Workable | Workable widget API | https://apply.workable.com/huggingface |
| Recruitee | Recruitee Careers Site API (public XML offer feed as fallback) | bunq.recruitee.com |
| Teamtailor | Teamtailor jobs RSS | proxima.teamtailor.com |
Workable boards are supported but are not in the built-in directory, and Workable's API rate-limits hard: the Actor reads Workable at most once every 5 seconds. If Workable answers HTTP 429 (Cloudflare error 1015), the Actor stops requesting Workable for the rest of the run instead of retrying board after board, and writes one free status: "warning" record that lists the Workable boards it did not read.
Workday, SmartRecruiters and Personio entries are refused with a free unresolved record and no request to that site. iCIMS and SuccessFactors are not supported either. For Workday career sites, see the Workday Jobs Scraper.
Who uses a career-site jobs feed?
- Job boards and aggregators that want direct-from-employer postings every hour or every day.
- Recruiters, sales and market-intelligence teams tracking which companies are hiring for which roles.
- Job seekers who want an alert for new matching roles at the companies they care about.
How it works
- Picks the boards: your Companies list, the built-in directory, or both. Company-name and ATS filters are applied to the directory before any request, so a narrow search reads only a few boards.
- Reads each board once from its public API or feed. robots.txt is checked for every host first, and requests to each host are spaced out (Lever's
Crawl-delay: 1is honoured; Workable boards are read at most once every 5 seconds). - Filters and enriches each job: time range, title, location, description, department, work arrangement, employment type, seniority, salary, visa sponsorship and years of experience.
- Saves matching jobs to the dataset and a per-board
RUN_SUMMARYto the key-value store.
How much does it cost to scrape career sites?
Pay per event, no start fee: $0.002 per job posting saved ($2 per 1,000 jobs). Expired and unresolved records are free. Jobs dropped by a filter, by Exclude recruiting agencies or by Remove duplicate jobs are never saved, so they are never charged.
Examples (job counts from test runs on 2026-10-28; cost = jobs x $0.002):
- The whole directory for the last 24 hours: 186 jobs, $0.37.
- One large board read in full, Palantir on Lever (225 open jobs): $0.45.
- Empty input
{}(the demo, see below): 4 jobs, $0.008.
maxItems (100 when left empty) and Apify's Maximum cost per run both stop a run.
Input example
Engineering and data-science jobs posted in the last 24 hours, in the US or remote, paying at least $120,000:
{"timeRange": "24h","titleSearch": ["engineer*", "\"data scientist\""],"titleExclusionSearch": ["intern"],"locationSearch": ["\"united states\"", "remote"],"workArrangement": ["remote", "hybrid"],"minAnnualSalary": 120000,"salaryCurrency": "USD","visaSponsorship": "not_no","maxItems": 500}
Search syntax (all *Search inputs): each list item is one alternative (OR); words inside an item must all appear as whole words; engineer* matches a prefix; "product manager" keeps a phrase together. c++, .net and node.js work as written.
A daily feed of new and closed jobs at particular companies:
{"companies": ["https://boards.greenhouse.io/airbnb", "lever:palantir", "ashby:legora","https://apply.workable.com/huggingface", "bunq.recruitee.com", "proxima.teamtailor.com"],"timeRange": "all","onlyNewJobs": true,"includeExpired": true}
Output example
One record per job (trimmed; the full record has about 48 fields):
{"status": "active","uid": "lever:palantir:6ed76ce8-4156-4b60-b120-403538bd66cd","ats": "lever","companySlug": "palantir","companyName": "Palantir Technologies","title": "Administrative Business Partner","team": "Administrative","location": "Singapore, Singapore","locations": ["Singapore, Singapore"],"country": "SG","workArrangement": "hybrid","workplaceTypeRaw": "hybrid","employmentType": "FULL_TIME","employmentTypeRaw": "Full-time","seniority": null,"postedAt": "2026-08-11T17:38:11.368000+00:00","url": "https://jobs.lever.co/palantir/6ed76ce8-4156-4b60-b120-403538bd66cd","applyUrl": "https://jobs.lever.co/palantir/6ed76ce8-4156-4b60-b120-403538bd66cd/apply","salaryAnnualMin": null,"salaryAnnualUsdMin": null,"visaSponsorship": null,"yearsExperienceMin": 3,"keySkills": ["Excel"],"isAgency": false,"dedupeKey": "4e08e342be634ffd5fca","firstSeenAt": "2026-10-31T15:28:09.119138+00:00","descriptionText": "A World-Changing Company\n\nPalantir builds the world's leading software for data-driven decisions ..."}
A Greenhouse job with a published pay range also fills the salary fields, for example "salaryMin": 212000, "salaryMax": 265000, "salaryCurrency": "USD", "salaryPeriod": "YEAR", "salarySource": "description", "salaryAnnualUsdMin": 212000, "salaryAnnualUsdMax": 265000, "requisitionId": "REQ52463".
Field notes
status:activefor a listed job. With Report expired jobs on, you also getexpiredrecords (uid, title, url, lastSeenAt, expiredDetectedAt) for jobs an earlier run returned that the board no longer lists.unresolvedrecords explain an entry that didn't resolve to a board. Expired and unresolved records are free.workArrangement(remote/hybrid/onsite),seniorityandemploymentType(schema.org values) are normalised across ATSs; the ATS's own text stays inworkplaceTypeRawandemploymentTypeRaw. Greenhouse has no standard field for these; they come from the company's own custom fields when it publishes one (e.g.Workplace Type,Employment Type,Time Type) and are null otherwise.workArrangementusually equals the normalisedworkplaceType; when the ATS gives no workplace type it is inferred from the title, location and remote flag, so the two can differ, and both are kept.departmentandteamare what the ATS publishes: Lever often fills onlyteam, sodepartmentcan be null whileteamis set. The Department or team filter matches either field.salaryAnnualMin/salaryAnnualMaxare annualised from the ATS's pay fields or from a pay range in the description (salarySourcesays which). Hourly pay is multiplied by 2,080, daily by 260, weekly by 52 and monthly by 12.salaryAnnualUsdMin/salaryAnnualUsdMaxuse a fixed table of rough exchange rates bundled with the Actor (set in October 2026, not live rates). Treat them as salary bands, not exact amounts. They are null when there is no salary, no pay period or an unlisted currency.visaSponsorship(yes/no/ null) withvisaSponsorshipEvidence,yearsExperienceMin/yearsExperienceMax,keySkillsandisAgencyare read from the description and company name with fixed patterns. They are hints, not statements by the employer, and can be wrong in both directions.dedupeKeymatches the same role posted on several boards or locations. Remove duplicate jobs (dedupeBy) can drop such duplicates (job) or merge a company's same-title jobs into one record with all theirlocations(companyTitle) before they are saved.- Contact details in descriptions (personal e-mail addresses, phone numbers, "Your recruiter: name" lines) are replaced with placeholders by default; company role mailboxes such as
jobs@stay. Recruiter and hiring-manager fields are never output. - Invalid input fails at the start: a negative number, a minimum salary above the maximum, an unknown
salaryCurrencycode or an unknown option value stops the run before any request, with a status message that lists every problem. Nothing is fetched or charged. - Every board failed or was blocked: if no entry can be read (network or HTTP errors, boards not found, robots.txt, rate-limited hosts, or, on the Apify platform, private addresses), the run still succeeds and saves one free status row (
recordType: "status",statusRow: true,status: "error",reason: "allBoardsFailed"). Itsmessagestarts with "Not charged: every board failed or was blocked" and gives the reasons;boardsBlocked,boardsNetworkError,boardsNotFoundandboardsSkippedcount them, andfailedBoardslists the first 50 entries with their errors. Nothing is charged.
Scheduling a jobs feed
Schedule the Actor hourly or daily with timeRange set a little wider than the interval and Only new jobs on. Each run then returns only jobs you haven't had yet, so you pay once per job. Add Report expired jobs to learn when postings close. State is kept in the named key-value store career-site-jobs-feed-state; use a different State store name for each independent feed. Track first-seen dates keeps firstSeenAt across runs without dropping jobs you already got.
FAQ
Can it read pages on private or internal addresses? No. On the Apify platform a careers-page URL whose host resolves to a private, loopback or link-local address (also after a redirect) is not fetched and costs nothing. The entry gets a free unresolved row with reason "not fetched: private, loopback and link-local addresses are not allowed".
Which companies are covered? The built-in directory holds 692 verified public boards (147 Greenhouse, 487 Ashby, 58 Lever), mostly startups and tech companies; about 11,600 jobs were live on them on 2026-10-28. Any public board on the six supported platforms can be added through Companies (up to 2,000 entries).
What does an empty input do? {}, the prefilled Console form and the example input ({"maxItems": 4}) run the same demo: it searches the 100 largest directory boards, jobs from the last 7 days, and stops at 4 jobs ($0.008), with a warning in the log and demoMode: true in RUN_SUMMARY. Leaving the other switches at their defaults does not change that. Demo jobs are real live jobs and are charged like any other. Any other maxItems (100 included), a timeRange, a maxDirectoryCompanies value or any search filter makes it a real run; with maxItems left empty, a real run stops at 100 jobs ($0.20).
Is the posted date the original date? It is the publish date the ATS reports (Greenhouse first_published, Lever createdAt, Ashby publishedAt, Workable published_on, Recruitee published_at, Teamtailor RSS pubDate). A company that re-posts a role gets a new date; firstSeenAt (with a state store) tells you when this Actor first saw it.
Why are some jobs missing? Jobs without a publish date are left out of time-range searches unless Include undated jobs is on. Unlisted Ashby jobs (shared by direct link only) are skipped. A host whose robots.txt disallows access or cannot be read is skipped and reported in RUN_SUMMARY.
What happens when a site rate-limits the Actor? If a site answers HTTP 429 (for example Workable's Cloudflare error 1015), or answers its robots.txt with 429, that host is skipped for the rest of the run instead of being retried board after board. You get one free status: "warning" record per skipped host (recordType: "status", message starting "Not charged") listing the boards that were not read, and RUN_SUMMARY lists the host under hostsSkipped.
How fast is it? In a test on 2026-10-28, reading the whole directory took about 160 seconds with the default concurrency and about 150 MB of memory. Searches over fewer boards finish faster.
Related job scrapers and free tools
- ATS Jobs Scraper: jobs from the boards you list on nine ATSs, including Workday, in one schema.
- Workday Jobs Scraper: jobs from Workday career sites, which this Actor does not read.
- Free, self-hosted scripts on GitHub: ats-new-jobs-feed (a daily Greenhouse, Lever and Ashby feed with GitHub Actions) and workday-jobs-feed (the same for Workday).
Data source and attribution
Job data belongs to the employers who publish it through their ATS vendors' public job-board APIs and feeds (Greenhouse, Lever, Ashby, Workable, Recruitee, Teamtailor). This Actor is not affiliated with or endorsed by any of these companies. Use the data in line with each employer's and vendor's terms; several vendors' robots.txt files signal ai-train=no.