# BambooHR Job Scraper | $1.50/1K — Salary Data, No Login (`bovi/bamboohr-job-scraper`) Actor

Scrape job postings from any BambooHR-powered company careers page via the public JSON API. Get title, department, location, seniority, remote-type, compensation, descriptions and parse\_confidence. Multi-company batch, keyword filters, zero auth, zero proxy.

- **URL**: https://apify.com/bovi/bamboohr-job-scraper.md
- **Developed by:** [Vitalii Bondarev](https://apify.com/bovi) (community)
- **Categories:** Jobs, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.85 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### BambooHR Job Scraper | $1.50/1K — Salary Data, No Login

For recruiters, market researchers, and HR tools builders who need bulk job data from mid-market companies — BambooHR is your source.

**Pricing: $1.50/1,000 jobs** — with descriptions: ~$2.00/1K

BambooHR powers HR for 30,000+ mid-size companies. This actor gives you structured job data — including compensation text when disclosed — without any API key, proxy, or login.

Scrape job postings from any BambooHR-powered company careers page using the public careers JSON API — **zero authentication, zero proxy required**.

### What it does

Fetches open job listings from BambooHR company career pages (e.g. `https://flyio.bamboohr.com/careers`), normalizes them into a consistent 18-field schema, and optionally fetches per-job details (description, compensation, exact posting date).

BambooHR powers HR for thousands of mid-size companies. This actor gives you structured, enriched job data at scale.

### Output schema

| Field | Type | Source | Notes |
|---|---|---|---|
| `title` | string | list | Job title |
| `company` | string | input | BambooHR slug |
| `location` | string | list/detail | City, state, country |
| `remote_type` | string | detail+list | remote/hybrid/onsite/null |
| `seniority` | string | title+exp | 11 levels: intern→executive |
| `salary` | string | detail | Compensation text when provided |
| `department` | string | list | Department label |
| `employment_type` | string | list | Full-Time/Contractor/etc. |
| `posted_at` | string | detail | ISO date (YYYY-MM-DD) |
| `url` | string | detail | Job posting URL |
| `apply_url` | string | detail | Same as URL (apply on page) |
| `job_id` | string | list | BambooHR job opening ID |
| `global_id` | string | derived | `bamboohr:{slug}:{id}` |
| `description_text` | string | detail | Plain text (HTML stripped) |
| `description_html` | string | detail | Raw HTML |
| `parse_confidence` | float | derived | 0.0–1.0 data quality score |
| `warnings` | list | derived | List of any quality issues |
| `scraped_at` | string | runtime | ISO timestamp |

### Input

| Parameter | Type | Default | Description |
|---|---|---|---|
| `companies` | string\[] | `["flyio", "posthog", "sendbird"]` | BambooHR slugs |
| `titleKeyword` | string | — | Filter by title substring |
| `locationKeyword` | string | — | Filter by location substring |
| `remoteOnly` | boolean | false | Only remote jobs |
| `maxJobsPerCompany` | integer | 50 | Cap per slug (0=unlimited) |
| `includeDescriptions` | boolean | true | Fetch description+compensation+datePosted |

**Finding the slug:** The slug is the subdomain in the careers URL. For `https://flyio.bamboohr.com/careers`, the slug is `flyio`.

### Why this scraper?

- **parse\_confidence** — data quality score per row, not available in any competitor
- **Compensation field** — BambooHR exposes salary text in detail API; we surface it
- **authoritative remote\_type** — uses BambooHR's structured `locationType` field (not text guessing)
- **seniority enrichment** — 11-level classification from title + BambooHR's `minimumExperience` fallback
- **Zero proxy, zero auth** — uses the same public JSON endpoints BambooHR's own careers pages use
- **Redirect detection** — cleanly reports companies not on BambooHR (instead of silent failures)

### Pricing example

| Run | Jobs returned | Cost |
|---|---|---|
| Trial (3 companies, 50-cap default) | ~150 | ~$0.23 |
| 1,000 jobs (20 companies) | 1,000 | $1.50 |
| 10,000 jobs (bulk list-only) | 10,000 | $15.00 |

With `includeDescriptions=true`, one extra API call is made per job (still zero-auth — BambooHR's public API). $0.0015 per result.

### Output sample

```json
{
  "title": "Senior Backend Engineer",
  "company": "flyio",
  "location": "San Francisco, CA, US",
  "remote_type": "remote",
  "seniority": "senior",
  "salary": "$160,000 - $195,000 / year",
  "department": "Engineering",
  "employment_type": "Full-Time",
  "posted_at": "2026-05-20",
  "url": "https://flyio.bamboohr.com/careers/142",
  "parse_confidence": 1.0,
  "warnings": [],
  "scraped_at": "2026-06-05T10:00:00+00:00"
}
```

### FAQ

**Do I need an API key or proxy?**
No. This actor uses the same public JSON endpoints that BambooHR's own career pages use. Zero credentials needed.

**What formats can I export?**
JSON, CSV, Excel, or JSONL — from the Apify dataset UI or via REST API.

**Can I schedule daily monitoring?**
Yes. Use Apify Schedules to run daily and detect new openings by comparing `job_id` sets.

**What if a company slug is wrong or not on BambooHR?**
The actor detects redirects and 404s cleanly, logs the failure, and continues — no crash, no charge for that slug.

### Integrations

Built for recruiters and HR-tech builders pulling bulk job listings from mid-market company career pages — the JSON/dataset output drops into the tools you already run, no glue code:

- **n8n / Make / Zapier** — trigger a run or pipe every new dataset item into 500+ apps (Google Sheets, Airtable, Slack, HubSpot, your database) with no code: [n8n](https://docs.apify.com/platform/integrations/n8n), [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier).
- **Webhooks** — fire your own endpoint the moment a run finishes, to push results straight into your pipeline ([docs](https://docs.apify.com/platform/integrations/webhooks)).
- **MCP server** — expose this actor as a tool to Claude, Cursor, or any [MCP client](https://mcp.apify.com) so an AI agent can pull this data mid-conversation ([guide](https://blog.apify.com/how-to-use-mcp/)).
- **API & SDKs** — fetch the dataset as JSON, CSV, or Excel through the Apify REST API or the Python / JS SDKs.

See all [Apify integrations](https://apify.com/integrations).

### Legal

Scrapes publicly accessible job listing endpoints that BambooHR intentionally exposes to the web (the same endpoints used by their own careers pages). No login, no credentials, no personal data. For informational purposes only.

### Use with AI agents (MCP)

This actor is available via Apify's MCP server. Connect it to any MCP-compatible agent (Claude, n8n, Make) to pull live BambooHR job data on demand — no code required.

```
https://mcp.apify.com/?tools=bovi/bamboohr-job-scraper
```

### Vs. competitors

| Feature | This actor | Generic job scrapers |
|---|---|---|
| Compensation/salary field | Yes (detail API) | Rarely |
| `parse_confidence` score | Yes | No |
| Redirect detection | Yes (clean failure) | Silent failures |
| Seniority enrichment | Yes (11 levels + minimumExperience) | No |
| Zero proxy / zero auth | Yes | Often needs proxy |
| Price | $1.50/1K | $2–5/1K |

Each row has `parse_confidence` (0.0–1.0). A score below 0.8 signals BambooHR API drift — catch it before it breaks your pipeline. No competitor provides this.

*Not affiliated with BambooHR.*

# Actor input Schema

## `companies` (type: `array`):

BambooHR company slugs to scrape. The slug is the subdomain in the careers URL: for https://flyio.bamboohr.com/careers the slug is "flyio". Each item can be a plain string ("flyio") or an object ({"slug": "flyio"}). Use lowercase — slugs are case-insensitive.

## `titleKeyword` (type: `string`):

Keep only jobs whose title contains this text (case-insensitive). Example: "engineer". Leave blank to return all jobs.

## `locationKeyword` (type: `string`):

Keep only jobs whose location contains this text (case-insensitive). Example: "New York". Leave blank for all locations.

## `remoteOnly` (type: `boolean`):

When enabled, only jobs detected as fully remote are returned.

## `maxJobsPerCompany` (type: `integer`):

Cap on jobs pushed per company slug after filtering. Default 50 keeps trial runs cheap. Set to 0 for unlimited.

## `includeDescriptions` (type: `boolean`):

Fetch full job description HTML and plain text, plus compensation and exact posting date. Requires one extra API call per job (still zero auth, zero proxy). Disable for fast job-list-only runs.

## Actor input object example

```json
{
  "companies": [
    "flyio",
    "posthog",
    "sendbird"
  ],
  "remoteOnly": false,
  "maxJobsPerCompany": 50,
  "includeDescriptions": true
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset containing Bamboohr Job Scraper records (title, company, location, remote\_type, seniority, salary, department, employment\_type, posted\_at, url, parse\_confidence).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "flyio",
        "posthog",
        "sendbird"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bovi/bamboohr-job-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "companies": [
        "flyio",
        "posthog",
        "sendbird",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("bovi/bamboohr-job-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "flyio",
    "posthog",
    "sendbird"
  ]
}' |
apify call bovi/bamboohr-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,bovi/bamboohr-job-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ChGD0eF0NshzzEmfZ/builds/dnGSuKO5fgK6Caisw/openapi.json
