BambooHR Jobs Scraper & API — Any Company
Pricing
from $0.90 / 1,000 results
BambooHR Jobs Scraper & API — Any Company
Scrape every open job from any company on BambooHR. Give a company subdomain and get each role with full description, compensation, location, department and apply URL — via the public careers API. Filter by title, location, remote. No proxy needed. JSON or CSV output.
Pricing
from $0.90 / 1,000 results
Rating
0.0
(0)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Share
BambooHR Jobs Scraper 🧭
Scrape every open job from any company hosted on BambooHR (bamboohr.com) — title, full description, compensation, location, department, and apply URL — straight from BambooHR's public careers API. List + per-job detail gives the complete role, including compensation when shown. No login, no anti-bot, no browser.

Why use this scraper
- Compensation included. BambooHR job detail often carries a published pay range — captured in
salaryTextwhen present. - Full job detail, not just titles. Each row carries the entire job:
descriptionHtml+ plain text, compensation (when shown), location(s), employment type, workplace type, and the apply URL. - Fast and cheap. No proxies required (the API has no anti-bot), so runs are quick and your cost stays low.
- Normalized schema. Output uses a consistent ATS schema shared with our other ATS scrapers (Ashby, Lever, SmartRecruiters, Personio, BambooHR) — write one parser, reuse it across every ATS.
- Built-in filters. Narrow by title, location, department, employment type, remote, or posted date — applied before a row is emitted, so you only pay for matches.
Overview
BambooHR is a widely-used recruiting platform. Many SMBs host their careers on BambooHR at https://{company}.bamboohr.com/careers. This actor reads each company's jobs through BambooHR's public careers API and emits one clean, normalized row per open job.
Supported inputs
| Input type | Example | Notes |
|---|---|---|
| Careers URL | https://soundstripe.bamboohr.com | The company subdomain |
| Bare subdomain | soundstripe, beehiiv | The part before .bamboohr.com |
Provide them in Start URLs and/or Organization slugs. Mix as many companies as you like in one run.
Where's the subdomain? It's the part before
.bamboohr.comin the careers URL.
Use cases
- Job boards & aggregators — ingest fresh, structured roles from many companies.
- Recruiting & sourcing tools — track who's hiring for what, with compensation where disclosed.
- Market & talent intelligence — hiring velocity, remote-vs-onsite mix, and salary where shown.
- Lead generation — companies actively hiring are buying signals for many B2B products.
- Personal job search — pull every role across your target companies into one sheet.
How it works
- Resolve each input to a BambooHR company subdomain.
- Fetch
https://{company}.bamboohr.com/careers/list(JSON). - Fetch each job's detail (
/careers/{id}/detail) for the full description + compensation — capped tomaxItems, skipped whenincludeDescriptionis off. - Normalize to a common ATS schema and push one row per job.
Companies are processed in parallel with a sliding-window concurrency cap. No proxy is needed; you can supply one for IP rotation at very large scale.
Input configuration
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | – | BambooHR careers URLs or company subdomains (strings or {url} objects). |
organizations | array | – | Bare BambooHR company subdomains, e.g. ["soundstripe","beehiiv"]. Merged with startUrls. |
maxItems | integer | 5000 | Max job rows emitted across the whole run. |
maxConcurrency | integer | 10 | How many companies to fetch in parallel. |
titleKeyword | string | – | Keep only jobs whose title contains this. |
location | string | – | Keep only jobs whose location contains this. |
department | string | – | Keep only jobs whose department contains this. |
employmentType | string | – | Keep only this employment type. |
remoteOnly | boolean | false | Keep only remote jobs. |
postedAfter | string | – | Keep only jobs published on/after this date (YYYY-MM-DD). |
includeDescription | boolean | true | Include descriptionHtml + descriptionText. Off skips the per-job detail call (faster/cheaper). |
includeRawJson | boolean | false | Attach the original BambooHR payload under raw. |
proxy | object | – | Optional. Not required (no anti-bot); use only for IP rotation at scale. |
Example input
{"organizations": ["soundstripe", "beehiiv"],"maxItems": 300,"remoteOnly": true}
Output
One row per open job. Example (trimmed):
{"ats": "bamboohr","org": "401auto","company": "401Auto","jobId": "366","globalId": "bamboohr:401auto:366","title": "RV Parts & Service Advisor","department": "Hamilton","team": null,"employmentType": "Full-Time","workplaceType": "OnSite","isRemote": false,"location": "Hamilton, Ontario","locations": ["Hamilton, Ontario"],"compensation": " $55,000-$65,000 per year","salaryText": " $55,000-$65,000 per year","descriptionHtml": "<p>We are looking for…</p>","descriptionText": "We are looking for…","publishedAt": "2023-03-09","jobUrl": "https://401auto.bamboohr.com/careers/366","applyUrl": "https://401auto.bamboohr.com/careers/366","scrapedAt": "2026-06-14T18:26:00.000Z"}
Key output fields
| Field | Description |
|---|---|
ats | Always "bamboohr" — the source platform. |
org | Company board identifier. |
company | Company display name. |
globalId | Stable, unique key ats:org:jobId — use it to dedupe across runs. |
title | Job title. |
department / team | Org grouping as set by the company. |
employmentType | Full-time / Part-time / Intern / Contract / Temporary (as the ATS reports it). |
workplaceType / isRemote | Remote / Hybrid / OnSite + a boolean remote flag. |
location / locations | Primary location + every listed location. |
compensation / salaryText | Published pay range when the company shows one. |
descriptionHtml / descriptionText | Full job description as HTML and plain text. |
publishedAt | When the role was published (ISO). |
jobUrl / applyUrl | Public posting URL + application URL. |
FAQ
Do I need a proxy? No. BambooHR's careers API is public with no anti-bot. The proxy field is available only for optional IP rotation at very large scale.
Why two requests per job? The BambooHR list endpoint returns summaries only; description and compensation live on each job's detail endpoint. Detail is fetched only up to maxItems, and not at all when includeDescription is off.
Can it discover every company on BambooHR? No — BambooHR has no public directory of all boards (true for every ATS scraper). You supply the companies you care about.
How many jobs per company? Whatever they have open — use maxItems to cap total output and control cost.
How fresh is the data? Live — every run hits BambooHR in real time.
Support
Found a bug or need a field added? Open an issue on the actor's Issues tab in the Apify Console.
Additional services
Need a different ATS or job board? We also build scrapers for Ashby, Greenhouse, Workday, Indeed, LinkedIn, Glassdoor, and many more. Check our Apify Store profile.
Explore more scrapers
- Ashby / Greenhouse / Lever Jobs Scrapers — open roles from those ATS platforms.
- Workday Jobs Scraper — jobs from any Workday career site.
- Indeed / LinkedIn / Glassdoor — the major job boards, fast and structured.
⚠️ Disclaimer
This actor collects only publicly available job-posting data exposed by BambooHR's own public careers API. It does not access private, authenticated, or personal data, and does not bypass any access control. You are responsible for using the scraped data in compliance with BambooHR's terms, the source companies' terms, and all applicable laws (including GDPR/CCPA). Use the data ethically and lawfully.
SEO Keywords
BambooHR scraper, BambooHR jobs scraper, bamboohr.com scraper, BambooHR careers API, BambooHR ATS scraper, scrape BambooHR jobs, BambooHR careers scraper, ATS job scraper, SMB jobs scraper, job postings API, company careers scraper, compensation data, hiring data, recruiting data.