BambooHR Jobs Scraper
Pricing
from $1.50 / 1,000 results
BambooHR Jobs Scraper
Scrape every open job posting from any BambooHR-powered company career site via BambooHR's own public JSON endpoints, no login or browser required. Get titles, locations, departments, and full descriptions, ready for recruiter pipelines or as a hiring-intent signal.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
🎯 What this scrapes
BambooHR is one of the most widely deployed SMB HR platforms, and every company running a public careers page on it shares the same JSON contract: a /careers/list endpoint that returns the current open-postings feed, and a /careers/{id}/detail endpoint that returns the full posting body. This Actor talks to both directly: point it at one or more BambooHR subdomains — bare (adobe) or a full https://adobe.bamboohr.com/careers URL — and it pulls every open job, optionally fetches each posting's full description, and normalizes everything into one row schema across every tenant you throw at it.
🔥 Features
- 🛡️ Browser fingerprint rotation —
curl-cffirotates real Chrome / Firefox TLS and HTTP/2 handshakes across requests, so every call looks like a browser, never a bare Python client. - 🔁 Retries with exponential backoff on
408 / 429 / 5xx, up to 5 attempts,Retry-Afterhonoured — a company that hiccups mid-run doesn't take the whole job down with it. - 🌐 Proxy session rotation via Apify Proxy — a fresh session and exit IP whenever a request needs one, at no extra step for you.
- 🏢 Per-company failure isolation — an unclaimed subdomain or a company with zero current openings just returns zero rows; one bad entry in a batch never sinks the others.
- 📝 Optional full descriptions — flip
fetchFullDescriptionon for the complete HTML body plus status, country, and posting date; leave it off for a fast titles-and-locations pull. - 🧊 Clean, typed rows — Pydantic-validated, ISO-8601 timestamps, stable job IDs. Export JSON / CSV / Excel straight from the Apify Console.
- 💰 Pay only for results that land — a job that a company genuinely has zero of costs nothing beyond the flat per-run warm-up fee.
💡 Use cases
- Recruiting & sourcing — build a pipeline against every employer running BambooHR, in one normalized schema.
- Hiring-intent signal for sales & BD — open reqs surface headcount growth, new-market entry, and tech-stack shifts before they hit the news.
- Job-board aggregation — add BambooHR coverage alongside Workday, SmartRecruiters, Greenhouse, Lever, Ashby, Workable, and Teamtailor in one pipeline.
- Labor-market & HR-tech research — sample hiring demand across an industry, region, or company size band.
- Competitive-intel tracking — watch a competitor's live openings to infer team growth and roadmap direction.
⚙️ How to use it
- Click Try for free at the top of the Store listing.
- Add one or more entries to Companies — a bare subdomain like
adobe, or a fullhttps://adobe.bamboohr.com/careersURL. - Optionally set Max jobs per company and toggle Fetch full description.
- Click Start. Rows stream into the dataset as each company's board is fetched.
- Export from Storage → Dataset as JSON, CSV, or Excel — or pull via the Apify API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
companies | array | ✅ | — | 1–1000 entries: bare BambooHR subdomain ("adobe") or full https://{subdomain}.bamboohr.com URL. A custom-domain URL is rejected — use the bare subdomain instead. |
maxJobsPerCompany | integer | no | 100 | Cap rows emitted per company, applied after parsing (1–5000). |
fetchFullDescription | boolean | no | true | Fetches /careers/{id}/detail per job to populate job_status, location_country, date_posted, description_html, and description_text. Off = faster, cheaper runs; those five fields stay null. |
proxyConfiguration | object | no | {"useApifyProxy": true} | Apify Proxy configuration. |
Example input
{"companies": ["adobe", "nycballet"],"maxJobsPerCompany": 10,"fetchFullDescription": true,"proxyConfiguration": { "useApifyProxy": true }}
📤 Output
One dataset item per job posting. Fields marked (detail) are populated only when fetchFullDescription is on.
| Field | Type | Notes |
|---|---|---|
company | string | Normalized input subdomain (not any display name) — stays stable across repeated runs. |
job_id | integer | BambooHR's numeric posting ID. |
job_title | string | Posting title. |
job_url | string | Public posting URL — always populated, even with descriptions off. |
department | string | null | Department label, when set. |
employment_type | string | null | e.g. Full-Time, when set. |
job_status | string | null | e.g. Open (detail). |
location_city | string | null | Primary listed city. |
location_state | string | null | Primary listed state/region. |
location_country | string | null | Full country name (detail). |
is_remote | boolean | null | Tri-state — null means the employer left it unspecified, not "on-site." |
date_posted | date | null | ISO YYYY-MM-DD (detail). |
description_html | string | null | Full posting body, verbatim HTML (detail). |
description_text | string | null | Same body with HTML tags stripped (detail). |
scraped_at | datetime | UTC ISO-8601 fetch timestamp. |
Example output
{"company": "adobe","job_id": 15,"job_title": "IT Security Engineer","job_url": "https://adobe.bamboohr.com/careers/15","department": "IT","employment_type": "Full-Time","job_status": "Open","location_city": "Mayfair","location_state": "London, City of","location_country": "United Kingdom","is_remote": null,"date_posted": "2025-11-29","description_html": "<p><strong>About Us</strong></p>...","description_text": "About Us Our mission is simple...","scraped_at": "2026-07-26T12:00:00Z"}
💰 Pricing
Pay-Per-Event — you're charged only when these fire:
| Event | USD | What it covers |
|---|---|---|
actor-start | $0.005 | One-off warm-up per run |
result | $0.0015 | Per job posting written to the dataset |
Example: 1 000 postings ≈ $1.51. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- Only
bamboohr.comsubdomains — a company that fronts its BambooHR careers page with a custom domain isn't resolvable; point this Actor at the underlying{subdomain}.bamboohr.comaddress instead. - No compensation field — BambooHR's public feed doesn't expose structured salary data on any company we've checked, so we don't invent it.
- Descriptions cost an extra fetch —
fetchFullDescriptionadds one detail request per posting (it changes runtime, not the per-result price). Leave it off for the fastest pull. - No discovery mode — you supply the subdomains; this Actor doesn't crawl a directory of BambooHR customers.
- Point-in-time snapshot — returns each company's board as it stands right now; schedule recurring runs to track changes over time.
❓ FAQ
Do I need a BambooHR account or API key? No — every field comes from BambooHR's own careers-page JSON feed, the same one the public career site itself loads.
Does one run handle several companies? Yes. List every subdomain in companies (up to 1 000) and every row comes back identically shaped, tagged with company.
What happens if a subdomain doesn't exist or has zero open jobs? Both are normal outcomes, not errors — you get zero rows for that company and the run keeps going, with a status message summarizing how many companies had openings.
Why doesn't maxJobsPerCompany change the price? You're charged per row written, not per HTTP call — capping results just controls dataset size, not the per-result rate.
Is this legal? We fetch public, unauthenticated job-posting data that employers publish for candidates to browse. No login, no private endpoints.
💬 Your feedback
Spotted a bug, hit a company that behaves differently, or need an extra field? Open an issue on the Actor's Issues tab in Apify Console — we ship fixes weekly and read every report.
🔗 Related Devil Scrapes Actors
Hiring intel across the whole ATS landscape? These siblings cover the other major job-board platforms — same keyless, pay-per-result approach:
- Teamtailor Jobs Scraper — postings from any Teamtailor-hosted employer board
- Workable Jobs Scraper — postings from any Workable-hosted employer board
- SmartRecruiters Jobs Scraper — postings from any SmartRecruiters-hosted employer
- Workday Jobs Scraper — postings from any Workday-powered career site
- Multi-ATS Jobs Scraper — one normalized feed across Greenhouse, Lever & Ashby
Browse the full fleet at apify.com/DevilScrapes.