BambooHR Jobs Scraper avatar

BambooHR Jobs Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
BambooHR Jobs Scraper

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

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 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 rotationcurl-cffi rotates 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-After honoured — 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 fetchFullDescription on 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

  1. Click Try for free at the top of the Store listing.
  2. Add one or more entries to Companies — a bare subdomain like adobe, or a full https://adobe.bamboohr.com/careers URL.
  3. Optionally set Max jobs per company and toggle Fetch full description.
  4. Click Start. Rows stream into the dataset as each company's board is fetched.
  5. Export from Storage → Dataset as JSON, CSV, or Excel — or pull via the Apify API.

📥 Input

FieldTypeRequiredDefaultNotes
companiesarray1–1000 entries: bare BambooHR subdomain ("adobe") or full https://{subdomain}.bamboohr.com URL. A custom-domain URL is rejected — use the bare subdomain instead.
maxJobsPerCompanyintegerno100Cap rows emitted per company, applied after parsing (1–5000).
fetchFullDescriptionbooleannotrueFetches /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.
proxyConfigurationobjectno{"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.

FieldTypeNotes
companystringNormalized input subdomain (not any display name) — stays stable across repeated runs.
job_idintegerBambooHR's numeric posting ID.
job_titlestringPosting title.
job_urlstringPublic posting URL — always populated, even with descriptions off.
departmentstring | nullDepartment label, when set.
employment_typestring | nulle.g. Full-Time, when set.
job_statusstring | nulle.g. Open (detail).
location_citystring | nullPrimary listed city.
location_statestring | nullPrimary listed state/region.
location_countrystring | nullFull country name (detail).
is_remoteboolean | nullTri-state — null means the employer left it unspecified, not "on-site."
date_posteddate | nullISO YYYY-MM-DD (detail).
description_htmlstring | nullFull posting body, verbatim HTML (detail).
description_textstring | nullSame body with HTML tags stripped (detail).
scraped_atdatetimeUTC 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:

EventUSDWhat it covers
actor-start$0.005One-off warm-up per run
result$0.0015Per 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.com subdomains — a company that fronts its BambooHR careers page with a custom domain isn't resolvable; point this Actor at the underlying {subdomain}.bamboohr.com address 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 fetchfetchFullDescription adds 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.


Hiring intel across the whole ATS landscape? These siblings cover the other major job-board platforms — same keyless, pay-per-result approach:

Browse the full fleet at apify.com/DevilScrapes.