BambooHR Jobs & Careers Scraper
Pricing
from $6.80 / 1,000 results
BambooHR Jobs & Careers Scraper
Scrape open jobs from any company career board hosted on BambooHR. Get job title, department, location, employment type, status, posting date, apply link and the full description for each role. Export to JSON, CSV or Excel.
Pricing
from $6.80 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
20 days ago
Last modified
Categories
Share
BambooHR Jobs & Careers Scraper
Here is one real result, with every field the actor returns (the description is truncated here for readability):
{"id": "21","title": "Paid Marketing Specialist","company": "lendio","department": "Marketing","departmentId": "18256","category": null,"employmentType": "Full-Time","jobOpeningStatus": "Open","city": "Vancouver","state": "British Columbia","postalCode": "V6Z 1E4","country": "Canada","isRemote": null,"locationType": "0","minimumExperience": "Manager/Supervisor","compensation": "$130,000","salaryMin": 130000,"salaryMax": 130000,"salaryCurrency": "USD","salaryPeriod": "yearly","postedDate": "2026-04-07","description": "About Us\n\nOur mission is simple: we want to set people free to do meaningful work...","applyUrl": "https://lendio.bamboohr.com/careers/21","careerBoardUrl": "https://lendio.bamboohr.com/careers","source": "BambooHR","observedAt": "2026-08-10T14:28:40.330Z"}
The most complete BambooHR careers scraper available. It returns every field a BambooHR job posting exposes, including department, employment type, full location, published salary, and the complete job description, plus optional AI summary, skills, and salary-estimate add-ons and a contact-email finder, and gives you eight filters to target exactly the jobs you need.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor reads the public BambooHR careers board of any company hosted at company.bamboohr.com/careers and writes one normalized record per job opening. Give it one or more company subdomains (just the subdomain, for example lendio, or the full URL). With withDetails on (the default) each job is opened to add the full description, posting date, published salary and compensation, location type, and country. Post-filters narrow by keyword, remote-only, employment type, department, location, posted-after date, and salary band. Missing source values are returned as null.
Optional paid add-ons enrich each record: an AI job-description summary, structured skills, technologies and seniority tags, a market salary estimate for jobs without a published salary, and a contact-email finder. Each add-on is billed only for the work it does.
Quickstart
Open the actor, paste this into the input, and press Run. It returns up to 10 jobs from the Lendio careers board with full details.
{"companies": ["lendio"],"maxJobs": 10,"withDetails": true}
Add more subdomains to scrape several boards in one run. Use searchQuery, remoteOnly, department, or the salary filters to narrow the results. Turn withDetails off for a faster listing-only run.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
companies | string[] | no | (empty) | BambooHR company subdomains. For company.bamboohr.com/careers enter company. Full URLs are accepted too. |
maxJobs | integer | no | 10 | Maximum jobs to collect across all boards (1 to 1000000). |
withDetails | boolean | no | true | Also fetch each job's full description, posting date, salary, and country. Turn off for a faster listing-only run. |
searchQuery | string | no | (empty) | Keep only jobs whose title, department, or description contains this text, for example engineer, remote, sales. |
remoteOnly | boolean | no | false | Keep only jobs flagged as remote. |
employmentType | string | no | (any) | Keep only jobs whose employment type contains this text (case-insensitive), for example full, part, contract, intern. |
department | string | no | (any) | Keep only jobs whose department contains this text (case-insensitive). |
location | string | no | (any) | Keep only jobs whose city, state, or country contains this text (case-insensitive). |
postedAfter | string | no | (any) | Keep only jobs posted on or after this ISO date, for example 2026-01-31. |
minSalary | integer | no | (none) | Keep only jobs whose published salary maximum is at least this amount. Jobs without a published salary are kept. |
maxSalary | integer | no | (none) | Keep only jobs whose published salary minimum is at most this amount. Jobs without a published salary are kept. |
withJdSummary | boolean | no | false | Paid add-on. Concise 2 to 3 sentence summary of each job description. Requires a paid Apify plan. Billed only when a summary is produced. |
withSkills | boolean | no | false | Paid add-on. Structured required skills, technologies/tools, and a seniority level from each description. Requires a paid Apify plan. Billed only when tags are produced. |
withSalaryEstimate | boolean | no | false | Paid add-on. Market salary range for jobs without a published salary, from title, location, and description. Requires a paid Apify plan. Billed only when an estimate is produced. |
enrichContacts | boolean | no | false | Paid add-on. For each result without an email, attempt to find a public business email and contact name. Billed per attempt, plus extra only when an email is found. |
enrichContactsMax | integer | no | 50 | Cap how many results the contact add-on tries to enrich. Free Apify accounts are capped at 3. |
Filters combine with logical AND.
Output reference
One dataset item per job. Types: string, integer, boolean, string[], or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
id | string | Job opening ID within the board. |
title | string | Job title. |
company | string | Company subdomain the job came from. |
department | string | Department name. |
departmentId | string | Department ID. |
category | string | Job category when present, else null. |
employmentType | string | Employment type, for example Full-Time. |
jobOpeningStatus | string | Opening status, for example Open. |
city | string | City of the job. |
state | string | State/province of the job. |
postalCode | string | Postal code of the job. |
country | string | Country of the job (detail only). |
isRemote | boolean | Whether the job is flagged remote, or null when not stated. |
locationType | string | BambooHR location-type code. |
minimumExperience | string | Minimum experience level as posted. |
compensation | string | Compensation text as published (detail only). |
salaryMin | integer | Parsed minimum salary (detail only), or null. |
salaryMax | integer | Parsed maximum salary (detail only), or null. |
salaryCurrency | string | Salary currency code (detail only), or null. |
salaryPeriod | string | Salary period, for example yearly (detail only). |
postedDate | string | Posting date YYYY-MM-DD (detail only). |
description | string | Full job description text (detail only). |
applyUrl | string | Direct URL to apply to the job. |
careerBoardUrl | string | URL of the company's BambooHR careers board. |
source | string | Data source label. Always BambooHR. |
observedAt | string | ISO 8601 timestamp of collection. |
aiJdSummary | string | Job-description summary. Populated only when the AI summary add-on is on, else absent. |
aiSkills | string[] | Required skills from the AI skills add-on, else absent. |
aiTechnologies | string[] | Technologies/tools from the AI skills add-on, else absent. |
aiSeniority | string | Seniority level from the AI skills add-on, else absent. |
aiSalaryEstimateMin | integer | Estimated minimum salary from the salary-estimate add-on, else absent. |
aiSalaryEstimateMax | integer | Estimated maximum salary from the salary-estimate add-on, else absent. |
aiSalaryEstimateCurrency | string | Estimated salary currency, else absent. |
aiSalaryEstimateBasis | string | annual or hourly basis of the estimate, else absent. |
aiSalaryEstimateConfidence | string | low, medium, or high confidence of the estimate, else absent. |
enrichedEmail | string | Public business email found by the contact add-on, or null. |
enrichedContactName | string | Contact person name found by the add-on, or null. |
enrichedJobTitle | string | Contact person job title from the add-on, or null. |
enrichedEmailStatus | string | verified, likely, guessed, or not_found from the add-on. |
enrichedSource | string | Where the enriched email was found, or null. |
enrichedConfidence | number | Confidence score for the enriched email, or null. |
AI and contact-enrichment fields are only present when their add-on is on. A failed run writes a single item with an error field and is not charged.
Example output record
Real record from a live run (input {"companies":["lendio"],"maxJobs":10,"withDetails":true}), description truncated:
{"id": "21","title": "Paid Marketing Specialist","company": "lendio","department": "Marketing","departmentId": "18256","category": null,"employmentType": "Full-Time","jobOpeningStatus": "Open","city": "Vancouver","state": "British Columbia","postalCode": "V6Z 1E4","country": "Canada","isRemote": null,"locationType": "0","minimumExperience": "Manager/Supervisor","compensation": "$130,000","salaryMin": 130000,"salaryMax": 130000,"salaryCurrency": "USD","salaryPeriod": "yearly","postedDate": "2026-04-07","description": "About Us\n\nOur mission is simple: we want to set people free to do meaningful work...","applyUrl": "https://lendio.bamboohr.com/careers/21","careerBoardUrl": "https://lendio.bamboohr.com/careers","source": "BambooHR","observedAt": "2026-08-10T14:28:40.330Z"}
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~bamboohr-jobs-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"companies":["lendio"],"searchQuery":"marketing","withDetails":true,"maxJobs":25}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~bamboohr-jobs-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"companies":["lendio","neon"],"remoteOnly":true,"maxJobs":100}'
Apify CLI:
apify call scrapers_lat/bamboohr-jobs-scraper \--input '{"companies":["lendio"],"department":"Engineering"}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per job returned (
resultevent). See the pricing tab for the current per-result price. - Add-ons billed separately. Detail fetching (
details), AI summary (ai_jd_summary), AI skills (ai_skills), AI salary estimate (ai_salary_estimate), and contact enrichment (contact-search-attemptper attempt, pluscontact-email-foundonly when an email is found) are billed only for the work they do. - No charge on failure. If a run errors, the actor writes a single item with an
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 records per run, 3 contact-enrichment attempts, and cannot use the AI add-ons. Upgrade for higher
maxJobsand enrichment.
FAQ and troubleshooting
A run returned 0 records. Why?
The subdomain has no open jobs, or your filters were too strict. Check the subdomain (open company.bamboohr.com/careers in a browser), loosen filters, or remove remoteOnly. Zero-result runs are not charged.
Which company do I enter?
Just the BambooHR subdomain. For a board at lendio.bamboohr.com/careers, enter lendio. You can also paste the full URL.
Why are description, salaryMin, or country missing?
Those come from each job's detail page, which is only fetched when withDetails is on. With it off, only listing-level fields are returned.
Why is salaryMin/salaryMax null?
The employer did not publish a salary. Turn on withSalaryEstimate (paid) to add a market estimate for those jobs.
Why are the AI or enriched fields absent?
Those add-ons are off by default and (for AI) require a paid Apify plan. Turn on withJdSummary, withSkills, withSalaryEstimate, or enrichContacts to populate them.
Is this an official BambooHR tool? No. This actor is independent and has no affiliation with BambooHR. It reads only job data that companies publish on their public BambooHR careers boards. Use it in accordance with the source terms of use.
Related scrapers
- Singapore MyCareersFuture Jobs Scraper: Singapore government job board postings.
- Bark Services Scraper: Bark professional service-provider leads.
- Avvo Lawyers & Attorney Leads Scraper: US attorney profiles and leads.
- ACCA Accountants Scraper: ACCA-registered accountants and firms.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with BambooHR. Accesses only publicly available careers-board data. Use in accordance with the source terms of use.
