# BambooHR Jobs Monitor & Scraper (`cliqtomedia/bamboohr-jobs-monitor-scraper`) Actor

Collect public BambooHR vacancies with job text, pay, location and apply links. Compare complete snapshots to find new, changed and removed roles. Export job data.

- **URL**: https://apify.com/cliqtomedia/bamboohr-jobs-monitor-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 83.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 job or change saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

Read public BambooHR vacancies from company career boards. Get job text, pay, locations and application links. Use a previous complete snapshot to see new, changed and removed jobs.

For recruiters, job data teams and hiring analysts. Start with one board such as `nycballet`. Price: $0.06 per run plus $0.0016 per saved job or change. A valid empty run still costs $0.06. Check the scan status when results are empty or partial.

![BambooHR job data and change monitoring](https://api.apify.com/v2/key-value-stores/xo0ZNTdfoRrELg6xA/records/HERO.png)

### Table of contents

- [What it does](#what-it-does)
- [Job data](#job-data)
- [Quick start](#quick-start)
- [Input](#input)
- [Input examples](#input-examples)
- [Output example](#output-example)
- [Output fields](#output-fields)
- [Price and examples](#price-and-examples)
- [Use cases](#use-cases)
- [Scheduling and monitoring](#scheduling-and-monitoring)
- [API, MCP and exports](#api-mcp-and-exports)
- [Limits and partial results](#limits-and-partial-results)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

The Actor reads the public job list and each job's details. It saves one row per job. It works with BambooHR company slugs and HTTPS URLs on `company.bamboohr.com`. You need the BambooHR board name. A company's main website URL is not enough.

It can scan up to 3 boards and read details for up to 44 jobs per run. Duplicate board inputs are read once. Each job has an ID that includes its board name.

With `previousSnapshot`, the Actor compares matching jobs with the last complete scan. It saves `NEW`, `CHANGED` and `REMOVED` rows. It skips unchanged jobs. It reports removals only after a complete scan of the same scope.

### Job data

Get the title, department, city, region, country, employment label, posted date, pay text, experience label, job text, clean HTML and application link when the public source provides them. Missing values are `null`. Pay text is kept as written; numeric pay ranges are not guessed.

No login, BambooHR API key, proxy or browser is needed. This Actor reads public vacancies. It does not read applicants or staff records.

### Quick start

1. Open **Input**.
2. Add `nycballet` to **BambooHR boards** (`boards`).
3. Keep `maxResults: 44` and `includeDescription: true`.
4. Use 256 MB memory and a 150-second timeout. Click **Start**.
5. Open the Dataset. Check `title`, `compensation`, `location.country` and `url`.
6. Open `RUN_SUMMARY` in the Key-value store. Check `status: complete`.

```json
{"boards":["nycballet"]}
```

The checked example returned two jobs: Chief Technology Officer (CTO) and Manager, Digital Platforms. Live vacancies can change.

### Input

| Key | Type | Required | Default / prefill | Allowed values | Effect | Example | Recommendation |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `boards` | array of strings | Yes | No runtime default; UI prefill `nycballet` | 1–3 entries; bare slug or HTTPS BambooHR URL | Selects boards; duplicates are removed | `["nycballet"]` | Begin with one board |
| `keywords` | array of strings | No | `[]` | Up to 10 entries, 1–80 characters each | Title contains any entry, ignoring case | `["engineer"]` | Use short title text |
| `locations` | array of strings | No | `[]` | Same string limits | Matches city, region, country or work arrangement | `["US", "remote"]` | Use the output country code or city |
| `departments` | array of strings | No | `[]` | Same string limits | Matches the department label | `["technology"]` | Check the actual department first |
| `maxResults` | integer | No | `44` | 1–44 | Caps saved rows after scanning | `10` | Keep 44 for a monitor; truncation makes the run partial |
| `includeDescription` | boolean | No | `true` | `true` / `false` | Includes text and clean HTML; off returns null | `false` | Turn off for smaller exports; requests stay the same |
| `previousSnapshot` | object | No | Omitted | Complete `SNAPSHOT` from this Actor; schemaVersion 1, same scopeHash, jobs ≤44 | Enables change output | Copy the full record | Use only the last complete snapshot |

Empty filter arrays mean all jobs. A filter matches any entry in its own array. All active filter groups must match. Blank filter strings, null input values and unknown input keys are rejected. The Actor reads details before filtering. A filter with no matches still reads the full supported source scope.

The snapshot contains `schemaVersion`, `scopeHash` and `jobs`. Keep it as exported. The scope hash includes the sorted boards, filter groups and `includeDescription`. A different scope is rejected before source requests. `maxResults` controls saved rows; it does not change the monitor scope.

### Input examples

#### Read three boards

```json
{"boards":["estella","nycballet","switch2"],"maxResults":44}
```

The checked run returned 44 jobs. Jobs may be added or removed later. If the source has more than 44 jobs, the run is partial.

#### Find one job by title

```json
{"boards":["nycballet"],"keywords":["Chief Technology Officer"]}
```

The checked scan returned one matching row. It still read the board and both job details.

#### Check a valid empty board

```json
{"boards":["openai"]}
```

The checked board returned zero public jobs and `complete`. This is a source-empty example, not a claim that all OpenAI jobs are on BambooHR.

#### Monitor a complete snapshot

Run the quick-start example. Copy its `SNAPSHOT` record into `previousSnapshot`, then run with the same boards and filters. The runnable example below uses the checked empty `openai` board snapshot.

```json
{"boards":["openai"],"previousSnapshot":{"schemaVersion":1,"scopeHash":"a822fa1dbdacc0918f243e62185e4553437c57d06e4a310f3ca3f790373d520f","jobs":[]}}
```

For boards with jobs, the full snapshot job array is required. If nothing changes, the Dataset is empty and `CHANGES.unchangedCount` shows how many jobs stayed the same. The run costs $0.06.

### Output example

This is one full saved row from the `nycballet` example. Time fields show when it was read. HTML is clean and contact text is redacted.

```json
{
  "schemaVersion": "bamboohr.job.v1",
  "id": "bamboohr:nycballet:160",
  "source": "bamboohr",
  "market": "global",
  "sourceJobId": "160",
  "url": "https://nycballet.bamboohr.com/careers/160",
  "title": "Chief Technology Officer (CTO)",
  "company": {
    "name": "nycballet",
    "sourceCompanyId": "nycballet",
    "url": "https://nycballet.bamboohr.com/careers"
  },
  "advertiser": {
    "name": "nycballet",
    "sourceAdvertiserId": "nycballet"
  },
  "location": {
    "raw": "New York, New York",
    "suburb": null,
    "city": "New York",
    "region": "New York",
    "postcode": "10023",
    "country": "US"
  },
  "workArrangement": "hybrid",
  "employmentTypes": [
    "full_time"
  ],
  "salary": {
    "raw": "$220K - $240K",
    "min": null,
    "max": null,
    "currency": null,
    "period": null,
    "includesSuper": null
  },
  "classifications": [
    {
      "category": "Information Technology",
      "subcategory": null
    }
  ],
  "teaser": null,
  "bulletPoints": [],
  "postedAt": "2026-03-30T00:00:00.000Z",
  "updatedAt": null,
  "expiresAt": null,
  "isPromoted": false,
  "description": {
    "text": "New York City Ballet is one of the foremost dance companies in the world, with a roster of spectacular dancers and an unparalleled repertory. Founded in 1948 by George Balanchine and Lincoln Kirstein, New York City Ballet quickly became world-renowned for its athletic and contemporary style. Widely acknowledged for its enduring contributions to dance, New York City Ballet is committed to promoting creative excellence and nurturing a new generation of dancers and choreographers. The School of American Ballet is the official training academy of the New York City Ballet.\n\n \n\nPosition Summary\n\nReporting to the Chief Financial Officer (CFO), the Chief Technology Officer (CTO) provides strategic leadership, vision, and management of all technology initiatives across the organization. The CTO ensures that technology systems, data practices, and digital infrastructure advance the institution’s mission, organizational efficiency, and long‑term sustainability. This role partners closely with all divisions of the organization to support key operational functions, including database management for fundraising, donor engagement, and ticket sales, in addition to audit and compliance reporting. The CTO leads a seven-person technology department, including supervision of the Director of Technology Infrastructure.\n\n\n\n\n\nKey Responsibilities:\n\nStrategic Leadership & Planning\n\n * Provide thought leadership on digital transformation, data governance, cybersecurity, and emerging technologies relevant to nonprofits and cultural institutions.\n * Work with the executive team to ensure technology supports growth and innovation.\n\nTechnology Operations & Infrastructure\n\n * Oversee the maintenance, security, and performance of all IT systems, networks, and hardware to ensure reliability across the entire organization.\n * Lead enterprise-wide upgrades, cloud migrations, and modernization efforts to improve efficiency and reduce technical debt.\n * Establish and enforce cybersecurity protocols, data protection policies, disaster recovery planning, and compliance with relevant regulations (e.g., PCI‑DSS for ticketing and donations, NY privacy laws).\n\nTeam Leadership & Project Management\n\n * Manage, mentor, and develop the IT department, building a strong service-oriented culture with clear priorities and accountability.\n * Create project management structures to ensure timely and successful delivery of technology initiatives.\n * Foster cross-departmental collaboration and build strong working relationships with internal stakeholders.\n\nFundraising & Ticketing Systems\n\n * Oversee technology platforms that support fundraising, ticket sales, membership, and donor stewardship (e.g., CRM, ticketing platforms, payment processing).\n * Ensure seamless integration and data flow between systems used by Development, Finance, and Marketing.\n * Partner with leadership to optimize donor data practices, reporting, segmentation, and digital fundraising capabilities.\n\nDigital Engagement & Innovation\n\n * Support digital initiatives such as online ticketing, web platforms, mobile experiences, virtual programming, and digital accessibility tools.\n * Identify opportunities to enhance patron engagement and improve the customer journey through technology.\n * Stay current with trends in digital user experience, cultural institution technology, and nonprofit enterprise tools.\n\nVendor & Budget Management\n\n * Manage relationships with external vendors, consultants, and managed service providers.\n * Develop and oversee the IT budget, ensuring cost‑effective decision‑making and transparency.\n * Negotiate contracts, service-level agreements, and technology purchases.\n\n\n\n\n\nQualifications:\n\n * Ten (10) years of progressive leadership experience in IT, including at least 8 years managing diverse teams.\n * Bachelor’s degree required, advanced degree in computer science, information systems, cybersecurity, or a related field preferred.\n * Strategic thinker with the ability to simplify complexity and make informed decisions.\n * Comfortable navigating change and leading teams through growth and transformation.\n * Excellent communication skills and a collaborative approach to leadership; with the ability to balance strategic vision with hands-on operational management.\n * Experience in nonprofit, cultural, or mission-driven organizations strongly preferred.\n * Demonstrated success overseeing enterprise systems in multi-department organizations of similar size.\n * Expertise in CRM and ticketing systems (e.g., Tessitura, Salesforce, Blackbaud, or equivalent).\n * Strong background in IT operations, cloud environments, data governance, cybersecurity, and digital transformation.\n * Deep understanding of cybersecurity frameworks, standards, and best practices; Demonstrated ability to design and implement cybersecurity policies, training programs, and risk‑mitigation strategies.\n * Experience with threat detection, vulnerability management, and incident response planning.\n * Knowledge of identity and access management (IAM), multi-factor authentication, and endpoint security.\n * Hands-on experience with security monitoring tools, SIEM solutions, encryption, and network security architecture.\n * Familiarity with compliance requirements including PCI‑DSS, data privacy laws, and safeguarding payment and donor information.\n * Empathetic leader who builds trust and fosters inclusivity.\n\n \n\nOther Duties:\n\nPlease note that this job description is not designed to cover or contain a comprehensive list of activities, duties or responsibilities that are required of the employee for this job. Duties, responsibilities and activities may change at any time with or without notice.\n\n \n\nEEO Statement\n\nNew York City Ballet is proud to be an equal opportunity employer committed to diversity and inclusion in all aspects of recruiting and employment. All qualified individuals are encouraged to apply and will receive consideration without regard to race, color, religion, age, national origin, sex, sexual orientation, gender identity or expression, marital status, citizenship status, disability, pregnancy, creed, genetic predisposition or carrier status, military status or veteran status, status as a victim of domestic violence, unemployment status, familial status, sexual violence or stalking victim status, caregiver status, arrest or conviction record to the extent required by applicable law, credit history or any other characteristic protected by law.\n\n \n\nOur Commitment to Diversity, Equity, and Inclusion\n\nNew York City Ballet, one of the foremost ballet companies in the world, pursues the highest levels of artistic excellence and innovation. Therefore, we seek to attract, retain, and cultivate the most talented dancers, musicians, designers, stage technicians, and arts administrators. To this end, we are deeply committed to creating and sustaining an organizational culture that values and reflects inclusion, equity and access for all.  We are inspired by our founders, George Balanchine and Lincoln Kirstein, who envisioned an authentically American expression of ballet with a company that reflects the rich cultural diversity of this nation. In pursuit of their vision, we are committed to all by educating, developing, and supporting an organization that welcomes and amplifies the voices and lived experiences of everyone.      ",
    "html": "<p>New York City Ballet is one of the foremost dance companies in the world, with a roster of spectacular dancers and an unparalleled repertory. Founded in 1948 by George Balanchine and Lincoln Kirstein, New York City Ballet quickly became world-renowned for its athletic and contemporary style. Widely acknowledged for its enduring contributions to dance, New York City Ballet is committed to promoting creative excellence and nurturing a new generation of dancers and choreographers. The School of American Ballet is the official training academy of the New York City Ballet.</p>\n<p> </p>\n<p>Position Summary</p>\n<p>Reporting to the Chief Financial Officer (CFO), the Chief Technology Officer (CTO) provides strategic leadership, vision, and management of all technology initiatives across the organization. The CTO ensures that technology systems, data practices, and digital infrastructure advance the institution’s mission, organizational efficiency, and long‑term sustainability. This role partners closely with all divisions of the organization to support key operational functions, including database management for fundraising, donor engagement, and ticket sales, in addition to audit and compliance reporting. The CTO leads a seven-person technology department, including supervision of the Director of Technology Infrastructure.<br /></p>\n<p><br /></p>\n<p>Key Responsibilities:</p>\n<p><em>Strategic Leadership &amp; Planning</em></p>\n<ul>\n<li>Provide thought leadership on digital transformation, data governance, cybersecurity, and emerging technologies relevant to nonprofits and cultural institutions.</li>\n<li>Work with the executive team to ensure technology supports growth and innovation.</li>\n</ul>\n<p><em>Technology Operations &amp; Infrastructure</em></p>\n<ul>\n<li>Oversee the maintenance, security, and performance of all IT systems, networks, and hardware to ensure reliability across the entire organization.</li>\n<li>Lead enterprise-wide upgrades, cloud migrations, and modernization efforts to improve efficiency and reduce technical debt.</li>\n<li>Establish and enforce cybersecurity protocols, data protection policies, disaster recovery planning, and compliance with relevant regulations (e.g., PCI‑DSS for ticketing and donations, NY privacy laws).</li>\n</ul>\n<p><em>Team Leadership &amp; Project Management</em></p>\n<ul>\n<li>Manage, mentor, and develop the IT department, building a strong service-oriented culture with clear priorities and accountability.</li>\n<li>Create project management structures to ensure timely and successful delivery of technology initiatives.</li>\n<li>Foster cross-departmental collaboration and build strong working relationships with internal stakeholders.</li>\n</ul>\n<p><em>Fundraising &amp; Ticketing Systems</em></p>\n<ul>\n<li>Oversee technology platforms that support fundraising, ticket sales, membership, and donor stewardship (e.g., CRM, ticketing platforms, payment processing).</li>\n<li>Ensure seamless integration and data flow between systems used by Development, Finance, and Marketing.</li>\n<li>Partner with leadership to optimize donor data practices, reporting, segmentation, and digital fundraising capabilities.</li>\n</ul>\n<p><em>Digital Engagement &amp; Innovation</em></p>\n<ul>\n<li>Support digital initiatives such as online ticketing, web platforms, mobile experiences, virtual programming, and digital accessibility tools.</li>\n<li>Identify opportunities to enhance patron engagement and improve the customer journey through technology.</li>\n<li>Stay current with trends in digital user experience, cultural institution technology, and nonprofit enterprise tools.</li>\n</ul>\n<p><em>Vendor &amp; Budget Management</em></p>\n<ul>\n<li>Manage relationships with external vendors, consultants, and managed service providers.</li>\n<li>Develop and oversee the IT budget, ensuring cost‑effective decision‑making and transparency.</li>\n<li>Negotiate contracts, service-level agreements, and technology purchases.</li>\n</ul>\n<p><br /><br /></p>\n<p>Qualifications:</p>\n<ul>\n<li>Ten (10) years of progressive leadership experience in IT, including at least 8 years managing diverse teams.</li>\n<li>Bachelor’s degree required, advanced degree in computer science, information systems, cybersecurity, or a related field preferred.</li>\n<li>Strategic thinker with the ability to simplify complexity and make informed decisions.</li>\n<li>Comfortable navigating change and leading teams through growth and transformation.</li>\n<li>Excellent communication skills and a collaborative approach to leadership; with the ability to balance strategic vision with hands-on operational management.</li>\n<li>Experience in nonprofit, cultural, or mission-driven organizations strongly preferred.</li>\n<li>Demonstrated success overseeing enterprise systems in multi-department organizations of similar size.</li>\n<li>Expertise in CRM and ticketing systems (e.g., Tessitura, Salesforce, Blackbaud, or equivalent).</li>\n<li>Strong background in IT operations, cloud environments, data governance, cybersecurity, and digital transformation.</li>\n<li>Deep understanding of cybersecurity frameworks, standards, and best practices; Demonstrated ability to design and implement cybersecurity policies, training programs, and risk‑mitigation strategies.</li>\n<li>Experience with threat detection, vulnerability management, and incident response planning.</li>\n<li>Knowledge of identity and access management (IAM), multi-factor authentication, and endpoint security.</li>\n<li>Hands-on experience with security monitoring tools, SIEM solutions, encryption, and network security architecture.</li>\n<li>Familiarity with compliance requirements including PCI‑DSS, data privacy laws, and safeguarding payment and donor information.</li>\n<li>Empathetic leader who builds trust and fosters inclusivity.</li>\n</ul>\n<p> </p>\n<p>Other Duties:</p>\n<p>Please note that this job description is not designed to cover or contain a comprehensive list of activities, duties or responsibilities that are required of the employee for this job. Duties, responsibilities and activities may change at any time with or without notice.</p>\n<p> </p>\n<p>EEO Statement</p>\n<p>New York City Ballet is proud to be an equal opportunity employer committed to diversity and inclusion in all aspects of recruiting and employment. All qualified individuals are encouraged to apply and will receive consideration without regard to race, color, religion, age, national origin, sex, sexual orientation, gender identity or expression, marital status, citizenship status, disability, pregnancy, creed, genetic predisposition or carrier status, military status or veteran status, status as a victim of domestic violence, unemployment status, familial status, sexual violence or stalking victim status, caregiver status, arrest or conviction record to the extent required by applicable law, credit history or any other characteristic protected by law.</p>\n<p> </p>\n<p>Our Commitment to Diversity, Equity, and Inclusion</p>\n<p>New York City Ballet, one of the foremost ballet companies in the world, pursues the highest levels of artistic excellence and innovation. Therefore, we seek to attract, retain, and cultivate the most talented dancers, musicians, designers, stage technicians, and arts administrators. To this end, we are deeply committed to creating and sustaining an organizational culture that values and reflects inclusion, equity and access for all.  We are inspired by our founders, George Balanchine and Lincoln Kirstein, who envisioned an authentically American expression of ballet with a company that reflects the rich cultural diversity of this nation. In pursuit of their vision, we are committed to all by educating, developing, and supporting an organization that welcomes and amplifies the voices and lived experiences of everyone.      </p>",
    "contactsRedacted": true
  },
  "changeType": null,
  "firstSeenAt": "2026-10-03T16:40:54.050Z",
  "board": "nycballet",
  "department": "Information Technology",
  "employmentStatus": "Full-Time",
  "compensation": "$220K - $240K",
  "datePosted": "2026-03-30",
  "minimumExperience": "Executive",
  "status": "complete",
  "detailStatus": "complete",
  "contentHash": "62f2df38721aa871a1164f0640b4e25653d9e762ef9316ce1151df2f154d10f4",
  "scrapedAt": "2026-10-03T16:40:54.050Z"
}
```

### Output fields

| Field | Type | Null? | Example | Meaning |
| --- | --- | --- | --- | --- |
| `schemaVersion` | string | No | `bamboohr.job.v1` | Output contract version |
| `id` | string | No | `bamboohr:nycballet:160` | Unique key: board plus source job ID |
| `source` | string | No | `bamboohr` | ATS name |
| `market` | string | No | `global` | Source scope label |
| `sourceJobId` | string | No | `160` | Job ID inside one board |
| `url` | string | No | `https://nycballet.bamboohr.com/careers/160` | Public job and application page |
| `title` | string | No | `Chief Technology Officer (CTO)` | Public job title |
| `company` | object | No | `see below` | Board identity; no inferred legal company name |
| `advertiser` | object | No | `see below` | Same public board identity |
| `location` | object | No | `see below` | Public location values |
| `workArrangement` | string | Yes | `on_site` | remote / hybrid / on_site from source location type; null if unknown |
| `employmentTypes` | array of strings | No | `["full_time"]` | full_time / part_time when recognized; otherwise \[] |
| `salary` | object | No | `see below` | Source pay text; numeric fields stay null |
| `classifications` | array of objects | No | `[{"category":"Information Technology","subcategory":null}]` | Department category; \[] when missing |
| `teaser` | string | Always | `null` | No teaser is supplied |
| `bulletPoints` | array | No | `[]` | No inferred summary bullet points |
| `postedAt` | string, ISO UTC | Yes | `2026-08-28T00:00:00.000Z` | Source date as UTC midnight; no inferred posting time |
| `updatedAt` | string | Always | `null` | Update time is not provided |
| `expiresAt` | string | Always | `null` | Expiry time is not provided |
| `isPromoted` | boolean | No | `false` | Source promoted flag |
| `description` | object | No | `see below` | Clean text and HTML, or nulls when off/failed |
| `changeType` | string | Yes | `NEW` | null for ordinary scrape; NEW / CHANGED / REMOVED for monitor rows |
| `firstSeenAt` | string, ISO UTC | No | `2026-10-03T16:17:00.000Z` | First seen in this supplied snapshot chain |
| `board` | string | No | `nycballet` | Normalized board slug |
| `department` | string | Yes | `Information Technology` | Public department label |
| `employmentStatus` | string | Yes | `Full-Time` | Original employment label |
| `compensation` | string | Yes | `$220K - $240K` | Original pay text, also salary.raw |
| `datePosted` | string | Yes | `2026-08-28` | Original source date |
| `minimumExperience` | string | Yes | `Experienced` | Public experience label |
| `status` | string | No | `complete` | Row complete / partial; partial means detail request failed |
| `detailStatus` | string | No | `complete` | Detail complete / error |
| `contentHash` | string | No | `64 hex characters` | Hash of normalized content; excludes fetch times |
| `scrapedAt` | string, ISO UTC | No | `2026-10-03T16:17:00.000Z` | Time of the scan |

#### Nested fields

| Field | Type | Null? | Example | Meaning |
| --- | --- | --- | --- | --- |
| `company.name`, `company.sourceCompanyId` | string | No | nycballet | Board slug |
| `company.url` | string | No | https://nycballet.bamboohr.com/careers | Board link |
| `advertiser.name`, `advertiser.sourceAdvertiserId` | string | No | nycballet | Board identity |
| `location.raw` | string | Yes | New York, New York | City and region joined |
| `location.suburb` | string | Always | null | Not supplied |
| `location.city` | string | Yes | New York | Source city |
| `location.region` | string | Yes | New York | Source state or region |
| `location.postcode` | string | Yes | 10023 | Source postal code |
| `location.country` | string | Yes | US | GB/US/CA/AU for known names; other source country names kept |
| `salary.raw` | string | Yes | $220K - $240K | Source compensation text |
| `salary.min`, `salary.max` | number | Always | null | Not guessed from free text |
| `salary.currency`, `salary.period` | string | Always | null | Not guessed from free text |
| `salary.includesSuper` | boolean | Always | null | Not supplied |
| `classifications[].category` | string | No | Information Technology | Department label |
| `classifications[].subcategory` | string | Always | null | Not supplied |
| `description.text` | string | Yes | Job text | Plain text; null when off or detail failed |
| `description.html` | string | Yes | `<p>Job text</p>` | HTML without links, scripts or attributes |
| `description.contactsRedacted` | boolean | No | true | Email and common phone patterns are removed; not a guarantee for every contact format |

#### Output records

| Surface | What it contains | What to check |
| --- | --- | --- |
| Dataset | Saved current jobs or monitor changes | IDs and useful fields; export the rows |
| `OUTPUT` | status, savedCount, boards, snapshotAvailable, summaryKey, snapshotKey, changesKey | Scan result and record names |
| `RUN_SUMMARY` | status, sourceCommit, savedCount, matchedCount, unchangedCount, boards, errors, scopeHash, counters, limits, snapshotAvailable | Full scan status, requests, retries, bytes and runtime |
| `SNAPSHOT` | schemaVersion, scopeHash, jobs after a complete scan; otherwise status unavailable and reason | Use only a complete snapshot as the next baseline |
| `CHANGES` | monitoring boolean, unchangedCount, savedCount, NEW, CHANGED, REMOVED counts | Number of saved changes and skipped unchanged jobs |

`boards` in OUTPUT and RUN_SUMMARY is an array with board, status, listed, details and errors. The counters object contains requests, retries, bytes and elapsedMs. Counts and limits are integers. Status and error codes are strings. Record links appear in the Actor's Output tab. A partial/error/not_found scan does not produce a usable next snapshot.

### Price and examples

The price is **$0.06 per run + $0.0016 per saved Dataset row**. A monitor row for a removed job is also one saved result. The start fee is one event at the supported 256–512 MB memory. Platform usage is included in this PPE price and paid by the developer. Your account's Apify plan terms still apply. [Post-run Dataset reads and other storage actions](https://docs.apify.com/actors/running/actors-in-store) have normal account usage charges after the Actor finishes.

| Saved rows | Calculation | Total event price |
| ---: | --- | ---: |
| 0 | start only | $0.0600 |
| 1 | $0.06 + $0.0016 | $0.0616 |
| 10 | $0.06 + 10 × $0.0016 | $0.0760 |
| 44 | $0.06 + 44 × $0.0016 | $0.1304 |
| 100 | Beyond the 44-row run limit | Not supported in one run |
| 1000 | Beyond the 44-row run limit | Not supported in one run |

A valid empty board, a filter with no matches, and an unchanged monitor run each cost $0.06. They still need source work. Filters, `maxResults` and `includeDescription: false` do not make the full scan free.

The start event also applies to invalid, partial, failed or cancelled runs once the platform starts them. Saved rows are charged automatically once. Rows that were not saved are not result events. A hard abort may leave only the rows already saved; terminal records may be missing. Set **Maximum cost per run** to at least $0.06. A cap of $0.0616 permits one result and can make the run partial. Use $0.14 for the full supported maximum.

### Use cases

| Goal | Input | Useful fields |
| --- | --- | --- |
| Keep a company job feed | boards | id, title, department, url |
| Review hiring by location | boards, locations | location, employmentStatus, compensation |
| Track hiring changes | boards, previousSnapshot | changeType, id, contentHash, firstSeenAt |

### Scheduling and monitoring

Run once and keep the complete SNAPSHOT. On the next run, pass that whole record as `previousSnapshot` with the same boards, filters and description setting. Store the new snapshot only when `RUN_SUMMARY.status` is `complete`.

The Actor does not share a hidden global monitor state. Your workflow supplies the baseline on every run. For automatic monitoring, use your workflow to read the last complete snapshot and update the next input. An Apify schedule with a fixed old snapshot will compare against that old snapshot each time. Create schedules in your own Console; this Actor does not create schedules or integrations for you.

A changed description, location, pay text or other normalized field can produce CHANGED. The source is read again on every run. When descriptions are off, changes to description text alone are not tracked. Removed means absent from the same filtered scope; it does not prove the employer closed the role. Jobs that stop matching a filter can be REMOVED in that scope.

### API, MCP and exports

Start with the same JSON input through the [Apify API](https://docs.apify.com/api/v2/act-runs-post). Read Dataset items and the output records after the run ends. Export the Dataset as JSON, CSV or Excel from Console.

```text
POST https://api.apify.com/v2/acts/cliqtomedia~bamboohr-jobs-monitor-scraper/runs?build=latest&memory=256&timeout=150&maxTotalChargeUsd=0.14
```

Use your Apify token in the authorization header. Do not paste it into the input or output. See the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) to call Actors from an agent. Your client must have access to this Actor. Downstream tools can use `id` to join rows and `url` to open a vacancy. No MCP or no-code connector is built into the scraper itself.

### Limits and partial results

- Public BambooHR company boards only. Custom domains and private jobs are not supported.
- Up to 3 board inputs, 44 jobs with details, and 44 saved rows per run. The checked maximum was 44 current jobs from 3 boards. This is not a claim of 1000-row capacity.
- Use 256 or 512 MB and a finite positive timeout. A 300-second Store test or larger outer timeout is supported without extending the internal source deadline. Defaults are 256 MB and 150 seconds. Restarts and resurrected runs are rejected.
- Source work has a 120-second deadline, 150 request attempts, a 2 MiB response limit and a 16 MiB total response-body limit. Requests are sequential, at least one second apart. Temporary failures have up to two retries.
- The source is a public web endpoint, not a guaranteed official API. Source changes, access blocks and temporary errors can stop a scan.
- `complete`: full valid scan, including a valid zero-job board. `partial`: some data exists but a board, detail, output cap or source limit prevented completeness. `not_found`: all requested boards were confirmed missing. `error`: invalid input or technical failure without a successful board.
- A detail failure keeps the list fields in a partial row; country, pay, date and text may be missing. A source error never means a successful zero-job scan.
- Check RUN_SUMMARY even when the platform reports SUCCEEDED. Partial runs may finish with that platform status. An error outcome exits with a failure code.

### Troubleshooting

| Symptom | Likely reason | Check | Action |
| --- | --- | --- | --- |
| 0 rows and complete | No current jobs, no filter matches, or no monitor changes | boards and CHANGES.unchangedCount | Review filters or keep the next snapshot |
| not_found | Wrong or closed BambooHR board | Exact company subdomain | Confirm the public careers URL |
| partial | Detail error, scan/output/charge cap or mixed boards | boards.errors and RUN_SUMMARY.errors | Keep the old baseline; retry the failed scope |
| INVALID_SNAPSHOT_SCOPE | Changed boards, filters or description option | previousSnapshot.scopeHash | Create a fresh complete baseline |
| FAILED with INVALID_INPUT or INVALID_BOARD | Unsupported input | Field names and HTTPS host | Use the quick-start JSON |
| HTTP_403 / TEMPORARY_HTTP / NETWORK_ERROR | Source block or connection failure | Board status and retries | Retry later; do not treat it as zero jobs |

### FAQ

#### Do I need a BambooHR login?

No. The Actor reads public career boards and public vacancy details.

#### Why is there a charge for zero jobs?

The Actor still starts and reads the source. The $0.06 start fee covers this work. There is no per-row fee when no row is saved.

#### Can I get numeric salary ranges?

This version preserves the compensation text. Numeric salary fields are null because the source returns free text.

#### Can I paste a full job URL?

Yes, a supported HTTPS BambooHR URL selects that whole board. It is not a single-job input. Add a title filter if needed.

#### Can I use a snapshot from another scraper?

No. Use a complete SNAPSHOT from this Actor and the same scope. The ID contains the board to avoid job ID collisions across employers.

### Related Actors

- [Greenhouse Jobs Monitor & Scraper](https://apify.com/cliqtomedia/greenhouse-jobs-monitor-scraper) — for employers that use Greenhouse.
- [Lever Job Scraper](https://apify.com/cliqtomedia/lever-jobs-scraper) — for employers that use Lever.

### Support

Use the Actor's Issues tab in Apify Console. Include the run ID, input mode and safe error code. Do not send tokens, cookies, private applicant data or payment information. This product is maintained by Cliqto Media and is not affiliated with BambooHR.

# Actor input Schema

## `boards` (type: `array`):

Add 1–3 company slugs or public HTTPS BambooHR URLs. Duplicate boards are read once. Start with nycballet.

## `maxResults` (type: `integer`):

Save 1–44 rows. Default 44. A smaller value limits output after scanning and makes a truncated run partial. Keep 44 for a complete monitor snapshot.

## `includeDescription` (type: `boolean`):

Default on. Details are always read for country, pay and posted date. Off returns null description text and HTML; it does not reduce requests.

## `previousSnapshot` (type: `object`):

Optional: paste the full SNAPSHOT object from the last complete run with the same boards and filters. Then only NEW, CHANGED and REMOVED jobs are saved. No default. Do not use a partial snapshot.

## `keywords` (type: `array`):

Optional text contained in title, ignoring case. Any entry can match. All filter groups must match. Default empty, max 10 entries of 1–80 characters. Filters do not reduce full scan cost.

## `locations` (type: `array`):

Optional text contained in city, region, country or remote/hybrid/on_site, ignoring case. Any entry can match. All filter groups must match. Default empty, max 10 entries of 1–80 characters. Filters do not reduce full scan cost.

## `departments` (type: `array`):

Optional text contained in department, ignoring case. Any entry can match. All filter groups must match. Default empty, max 10 entries of 1–80 characters. Filters do not reduce full scan cost.

## Actor input object example

```json
{
  "boards": [
    "nycballet"
  ],
  "maxResults": 44,
  "includeDescription": true,
  "keywords": [],
  "locations": [],
  "departments": []
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `output` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `snapshot` (type: `string`):

No description

## `changes` (type: `string`):

No description

# 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 = {
    "boards": [
        "nycballet"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/bamboohr-jobs-monitor-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 = { "boards": ["nycballet"] }

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/bamboohr-jobs-monitor-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 '{
  "boards": [
    "nycballet"
  ]
}' |
apify call cliqtomedia/bamboohr-jobs-monitor-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cliqtomedia/bamboohr-jobs-monitor-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/ueu94lA8dbDeXsvzL/builds/t6feJErKwtpmmlZ6w/openapi.json
