BambooHR Jobs: Career Pages & Salaries
Pricing
from $0.39 / 1,000 jobs
BambooHR Jobs: Career Pages & Salaries
BambooHR jobs scraper: every open job from any company's BambooHR careers page (acme.bamboohr.com) with the pay as published and as numbers, experience level, job type, address, company logo, full description as text or Markdown and the apply link. Subdomains or URLs. No login.
Paste BambooHR careers pages (https://acme.bamboohr.com/careers) or just their subdomains (acme), and get every open job as one clean row each: title, location and full address, remote or hybrid, department, job type and the company's own employment status, minimum experience level, posting date, the pay as the company wrote it and as numbers (min, max, currency, period), the company logo, the full description as text and Markdown, and the job link.
| ๐ผ Title | ๐ข Company | ๐ Location | ๐ฐ Salary | ๐ Experience | ๐ Job Type | ๐ Posted |
|---|---|---|---|---|---|---|
| Estimator | Tri-M Group | Kennett Square, Pennsylvania, United States | $85K-$88K dependent upon experience | Experienced | Full-time | 2026-10-23 |
| Lineperson 1st Class (LH) | Tri-M Group | Lock Haven, Pennsylvania, United States | $46-$61 per hour dependent upon experience | Experienced | Full-time | 2026-10-20 |
| Civil Project Superintendent | Fraser Valley | Emil Anderson Group | Abbotsford, British Columbia, Canada | $120,000-$160,000 | Manager/Supervisor | Full-time | 2026-09-22 |
$0.49 per 1,000 jobs on the Starter plan ($0.59 Free, $0.44 Scale, $0.39 Business). The prefilled run (50 jobs: 25 from each of 2 companies) costs about $0.02.
It reads BambooHR's public careers API, the one each company's careers page uses, live on every run. No browser and no login. Descriptions, Markdown and every pay field are included at the same price.
What you can do with it
- Pay you can sort and chart: BambooHR's pay field is free text ("$46-$61 per hour dependent upon experience", "Up to ยฃ71,800 FTE", "$40 per hour + $2,000 signing bonus", "JPY 5M-9M").
salarykeeps the company's words;salaryMin,salaryMax,salaryCurrencyandsalaryPeriodread it: "up to" is the top of the range, a bonus after a+is not,$on a Canadian job is CAD unless the line saysUS$. When the pay field is empty but the description states a range, the salary comes from there andsalarySourcesaysdescription. - Filter by pay and seniority before you pay: a minimum yearly pay (hourly pay counts 2,080 hours), only jobs with published pay, BambooHR's experience levels (Entry-level to Executive), plus title words, department, job type, location (whole words or country codes), remote only, posted in the last N days or on or after a date. Jobs your filters drop cost nothing.
- Feed LLMs and AI agents:
descriptionMarkdownkeeps headings, lists, bold and links;descriptionis plain text. - Monitor hiring at target accounts: schedule a daily run with ๐ Posted within 1.
- Build lead lists of companies hiring on BambooHR: each row carries the company name and logo as its careers page shows them, and the job's full address.
What to paste
- A careers page URL, e.g.
https://trimgroup.bamboohr.com/careers, or a job URL from it (https://trimgroup.bamboohr.com/careers/507). - The subdomain alone, e.g.
trimgroup: the part before.bamboohr.com. - Greenhouse, Lever, Ashby and Workday board URLs work in the same run (
greenhouse:airbnbfor a board name on another job board), with the same columns.
Input
{"companies": ["https://trimgroup.bamboohr.com/careers", "emilanderson"],"titleKeywords": ["technician", "estimator"],"experienceLevels": ["Mid-level", "Experienced"],"minSalary": 50000,"locations": ["US"],"postedWithinDays": 30,"maxJobsPerCompany": 100,"maxResults": 1000,"includeMarkdown": true,"includeAllFields": true}
| Field | What it does |
|---|---|
companies | BambooHR careers page URLs or subdomains, one per line. Other job board URLs work too. |
maxJobsPerCompany | Each company's newest jobs, up to this many (default 100), so one big company can't take all of maxResults. 0 = every job. You pay per job, so this caps the cost per company. |
maxResults | Stop after this many jobs in total, which caps the run's cost. |
includeDescription | Reads each job's own page (on by default): the description, pay, posting date and experience level. BambooHR's job list shows none of these, so with it off the rows are shorter and the run faster. |
titleKeywords | Keep jobs whose title contains any of these (not case-sensitive). |
departments | Keep jobs whose department contains any of these (not case-sensitive). |
employmentTypes | Keep only these job types: Full-time, Part-time, Contract, Internship, Temporary. |
experienceLevels | Keep only these minimum experience levels: Entry-level, Mid-level, Experienced, Manager/Supervisor, Senior Manager/Supervisor, Executive. |
locations | Keep jobs whose location contains any of these as whole words (India doesn't match Indiana). Two letters are a country code and match only the job's countries: US, GB (or UK), DE, CA (Canada, not California). |
remoteOnly | Keep only jobs marked remote. |
postedWithinDays | Keep only jobs posted in the last N days (0 = any date). |
postedAfter | Keep only jobs posted on or after this day, e.g. 2026-10-01 (empty = any date). |
minSalary | Keep jobs whose published pay reaches this much a year, in the job's own currency (an hourly rate times 2,080; a monthly one times 12). Jobs without pay are left out. |
onlyWithSalary | Keep only jobs whose pay field or description states an amount. |
includeMarkdown | Adds descriptionMarkdown (on by default). |
includeHtml | Adds descriptionHtml, the company's own formatting. |
includeAllFields | Reads the pay line as numbers with the rules above and takes the description's range when the pay field has none; adds salarySource, experienceLevel, employmentStatus, isRemote, address, postalCode, globalId, inputOrder and the company logo (on by default). |
includeRawJson | Adds raw: BambooHR's own records for the job, verbatim, for your own parsing. Needs includeAllFields. |
Output
One row per job. Rows come in the order of your companies list, each company's jobs newest first.
Two datasets, both with the same rows:
- ๐ผ All Jobs (default dataset). Views: ๐ Overview (๐ผ๏ธ Logo, ๐ผ Title, ๐ข Company, ๐ Location, ๐ Workplace, ๐ Job Type, ๐๏ธ Department, ๐ฐ Salary, ๐ Experience, ๐ Posted, ๐ Job Page) and ๐ Details (๐ผ Title, ๐ข Company, ๐ท๏ธ Employment Status, ๐ Experience, ๐๏ธ Department, ๐บ๏ธ All Locations, ๐ Country, ๐ฎ Address, ๐ Job Board, ๐ Job ID, ๐ Job Page).
- ๐ฐ With Salary: the delivered jobs with a pay amount, in the same order, at no extra charge. View: ๐ผ๏ธ Logo, ๐ผ Title, ๐ข Company, ๐ Location, ๐ฐ Salary, ๐ฐ Salary Min, ๐ฐ Salary Max, ๐ฑ Currency, โฑ๏ธ Pay Period, ๐ Pay Source, ๐ Posted, ๐ Job Page.
Output fields
In row order:
companyLogo: the company logo from its BambooHR careers page. A stable image link.title: job title.company: company name as its careers page shows it.location: city, state or province and country.workplaceType:Remote,HybridorOn-sitefrom the company's own setting.employmentType:Full-time,Part-time,Contract,Internship,TemporaryorOther, read from the company's employment status.department: the department the company files the job under.salary: the pay as the company wrote it, e.g.$46-$61 per hour dependent upon experience, or the range the description states.salaryMin: the lowest pay, as a number.salaryMax: the highest pay, as a number.salaryCurrency: ISO currency code, e.g.USD,CAD,GBP.salaryPeriod:year,month,week,dayorhour.postedAt: the date BambooHR shows for the job (2026-10-23).jobUrl: the job's page on the careers site, where you apply too.applyUrl: where to apply. On BambooHR that is the job page itself, so it equalsjobUrl.locations: every place the job is offered, as a list.countryCode: ISO code of the job's country.salarySource: where the salary comes from:compensation(the pay field) ordescription(a range written in the job description, when the pay field has none).experienceLevel: the minimum experience the company asks for:Entry-level,Mid-level,Experienced,Manager/Supervisor,Senior Manager/SupervisororExecutive.employmentStatus: the company's own employment status label, e.g.Regular Full-TimeorCraft.isRemote:truefor a remote job,falsefor an on-site or hybrid one, empty when the company doesn't say.address: the job's address on one line, e.g.Abbotsford, British Columbia V2T 1N3, Canada(each part only where the company publishes it).postalCode: the postal code, where the company publishes one.globalId: a key unique across companies and runs,bamboohr:<subdomain>:<job id>: use it to find jobs new since your last run.inputOrder: the company's place in yourcompanieslist (0 = first).description: the full job description as plain text. Only withincludeDescription(on by default).descriptionHtml: the description with the company's formatting. Only withincludeHtml.descriptionMarkdown: the description as Markdown. Only withincludeMarkdown(on by default).raw: BambooHR's own records for the job, verbatim (listanddetail). Only withincludeRawJson.ats:BambooHR(or the other job board's name).boardUrl: the careers page the job was read from.jobId: the job's id on BambooHR.companyInput: the entry of yourcompanieslist that led to this job.scrapedAt: when this run read the job (UTC).
Example row (description shortened):
{"companyLogo": "https://images3.bamboohr.com/478787/logos/cropped.jpg?v=42","title": "Civil Project Superintendent | Fraser Valley","company": "Emil Anderson Group","location": "Abbotsford, British Columbia, Canada","workplaceType": "On-site","employmentType": "Full-time","department": "EAC","salary": "$120,000-$160,000","salaryMin": 120000,"salaryMax": 160000,"salaryCurrency": "CAD","salaryPeriod": "year","postedAt": "2026-09-22","jobUrl": "https://emilanderson.bamboohr.com/careers/319","applyUrl": "https://emilanderson.bamboohr.com/careers/319","locations": ["Abbotsford, British Columbia, Canada"],"countryCode": "CA","salarySource": "compensation","experienceLevel": "Manager/Supervisor","employmentStatus": "Full Time Staff","isRemote": false,"address": "Abbotsford, British Columbia V2T 1N3, Canada","postalCode": "V2T 1N3","globalId": "bamboohr:emilanderson:319","inputOrder": 1,"description": "Division: Emil Anderson Construction\n\nDepartment: EAC\n\nAbout Emil Anderson Construction...","descriptionMarkdown": "Division: Emil Anderson Construction\n\nDepartment: EAC\n\nAbout Emil Anderson Construction...","ats": "BambooHR","boardUrl": "https://emilanderson.bamboohr.com/careers","jobId": "319","companyInput": "https://emilanderson.bamboohr.com/careers","scrapedAt": "2026-10-23T21:58:12Z"}
The run's ๐งพ Run summary (the OUTPUT record in the key-value store) shows, per company, which careers page was read, how many jobs it lists, how many matched your filters and how many were delivered, plus any error.
When something goes wrong
- A subdomain that isn't a BambooHR careers page (BambooHR sends unknown ones to its own website) is listed in the run summary and the status message as not found. The run still delivers everything else.
- A job taken down between the list and its own page is skipped and counted in the run summary; it isn't charged.
- If a careers page can't be read after several retries on fresh IPs, the run ends as failed with the reason, so you notice. The jobs that were read are still in the dataset.
- When
maxResultsis reached, the companies after that point get nothing; the run summary marks them as skipped.
Pricing
You pay per job delivered: $0.59 per 1,000 jobs on the Free plan, $0.49 on Starter, $0.44 on Scale and $0.39 on Business. Descriptions, Markdown and every pay field are included at the same price. Companies that aren't found, jobs removed by your filters, jobs taken down and the ๐ฐ With Salary list cost nothing.
Examples on Starter: the prefilled run (50 jobs) about $0.02; the default maxResults of 1,000 jobs $0.49.
FAQ
Why do some jobs have no salary? The company decides whether to fill in BambooHR's pay field. When it is empty, the row takes the range the description states, if it states one (salarySource: description). A job with neither has no salary.
Why isn't every job newest first by the minute? BambooHR shows a posting date, not a time, so jobs posted the same day keep the company's order.
Can it find every company on BambooHR? No: BambooHR has no public list of its customers. Paste the companies you care about; a careers page URL or the subdomain is enough.
Do I need a proxy? The default Apify datacenter proxy is all BambooHR's careers API needs.
How fresh is the data? Each run reads the careers pages live; nothing comes from a cache or a database.
Feedback
Missing a field or a company it can't read? Open an issue on the Issues tab and we'll look at it. If the data helped you, a short review on this page helps other people find it.