# Breezy HR Jobs Scraper (`devilscrapes/breezy-hr-jobs-scraper`) Actor

Scrape every open job posting from any Breezy HR-powered company career board via Breezy's own public JSON feed, no login or browser required. Get job titles, locations, salaries, and publish dates instantly for recruiter pipelines or as a hiring-intent signal for BD teams.

- **URL**: https://apify.com/devilscrapes/breezy-hr-jobs-scraper.md
- **Developed by:** [DevilScrapes](https://apify.com/devilscrapes) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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/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

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## Breezy HR Jobs Scraper

**💰 $1.50 / 1 000 results**  ·  pay only for results  ·  no credit card to try

*We do the dirty work so your dataset stays clean.* 😈

Scrape every open job posting from any Breezy HR-powered company career board via Breezy's own public JSON feed — no login, no browser, no API key. Give it a list of company subdomains and get titles, locations, salaries, and apply URLs as clean typed rows.

</div>

***

### 🎯 What this scrapes

Any employer running its careers page on Breezy HR serves the entire board from one endpoint: `https://{company}.breezy.hr/json`. This Actor hits it directly — hand it one or more company subdomains (the `{company}` in `https://{company}.breezy.hr`, e.g. `rhynocare`) and it pulls every currently-open posting for that employer in a single response, no pagination to chase, and normalizes it into one row schema. We've verified it end to end against real boards ranging from a 3-posting equipment dealer to a 600+ posting healthcare network, so the same code path holds whether a company has three reqs open or three hundred.

### 🔥 Features

- 🔑 **Keyless public feed** — no OAuth, no token, no per-company setup; the same JSON endpoint the careers page itself renders from.
- 🏢 **Multi-company in one run** — pass many subdomains; rows come back identically shaped, tagged with `company_slug` / `company_name`.
- 🧭 **Slug or full URL, either works** — paste a bare subdomain or the full `https://{company}.breezy.hr` link and we extract the right identifier.
- 🚫 **Reliable bad-slug detection** — Breezy signals an invalid or unused subdomain with a redirect to its marketing site rather than a clean error; we catch that signal precisely and skip the company instead of choking on it or the run silently producing nothing.
- 🔁 **Retries with backoff + fingerprint rotation** — `curl-cffi` presents a real browser handshake (rotated across Chrome / Firefox / Safari profiles) and retries transient `429`/`5xx` responses with exponential backoff up to 5 attempts, so a large multi-company batch finishes instead of dying on the first hiccup.
- 🌐 **Proxy-routed through Apify Proxy** — every request runs through a rotating session, with a fresh exit IP requested the moment anything looks off — the same infrastructure we lean on harder the day a target tightens up.
- 🧱 **Rate-limit pacing built in** — we back off rather than hammer a board, and partial success is always reported honestly via the run's status message instead of a silent, half-empty dataset.
- 🧊 **Clean, typed rows** — Pydantic-validated, ISO-8601 timestamps, stable posting IDs. Export JSON / CSV / Excel straight from the Apify Console.
- 💰 **Pay only for postings that land** — a company with an invalid slug or zero open reqs never gets billed for rows it didn't produce.

### 💡 Use cases

- **Recruiting & talent intelligence** — track what a Breezy-hosted employer is hiring for, where, and at what pay band.
- **Job-board aggregation** — add Breezy coverage alongside SmartRecruiters / Workday / Workable / Teamtailor in one pipeline.
- **Labor-market research** — sample hiring demand across an industry or region by role and location.
- **Hiring-intent signals for BD/SDR teams** — a sudden spike in open reqs at a target account is a lead qualifier.
- **HR-tech data pipelines** — wire structured job rows into your CRM, dashboard, or n8n / Make workflow on a schedule.

### ⚙️ How to use it

1. Click **Try for free** at the top of the Store listing.
2. Add one or more **Company slugs** — the `{company}` from a `https://{company}.breezy.hr` careers URL (e.g. `rhynocare`), or paste the full URL.
3. Optionally adjust **Max results per company** (default 200) if a board has more open reqs than you need.
4. Click **Start**. Each company's full board comes back in one fetch and rows stream into the dataset.
5. Export from **Storage → Dataset** as JSON, CSV, or Excel — or pull via the Apify API.

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `companySlugs` | `array` | ✅ | — | Breezy HR company subdomains (the `{company}` in `https://{company}.breezy.hr`, e.g. `rhynocare`), or full `https://{company}.breezy.hr` URLs — either form works. |
| `maxResultsPerCompany` | `integer` | no | `200` | Cap on rows emitted per company, applied client-side after the full board is fetched (no server-side limit param exists on this vendor). |
| `proxyConfiguration` | `object` | no | `{"useApifyProxy": true}` | Apify Proxy configuration. |

#### Example input

```json
{
  "companySlugs": ["rhynocare", "barloworldequipment"],
  "maxResultsPerCompany": 200,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### 📤 Output

One dataset item per open job posting.

| Field | Type | Notes |
|---|---|---|
| `posting_id` | `string` | Stable Breezy posting ID. |
| `company_slug` | `string` | Normalized subdomain you supplied — kept stable across repeat runs. |
| `company_name` | `string` | Employer display name. |
| `title` | `string` | Job title. |
| `apply_url` | `string` | The real, working posting page — used verbatim, never reconstructed. |
| `published_date` | `string` | ISO-8601 date the posting went live. |
| `job_type` | `string` | Human-readable employment type, e.g. `"Full-Time"`. |
| `department` | `string \| null` | Department label; `null` when the employer didn't set one. |
| `salary` | `string \| null` | Freeform pay text as published (e.g. `"$25 – $27 / hour"`); `null` when undisclosed. Never parsed into numeric fields. |
| `location_city` | `string \| null` | Posting city. |
| `location_state` | `string \| null` | State/region abbreviation (e.g. `"ON"`); `null` when not applicable. |
| `location_country` | `string \| null` | ISO 3166-1 alpha-2 country code. |
| `is_remote` | `boolean` | Whether the posting is flagged remote; defaults `false` when the source doesn't say. |
| `scraped_at` | `string` | UTC ISO-8601 fetch timestamp. |

#### Example output

```json
{
  "posting_id": "5a3b663b95ce",
  "company_slug": "rhynocare",
  "company_name": "RhynoCare",
  "title": "Cook",
  "apply_url": "https://rhynocare.breezy.hr/p/5a3b663b95ce-cook",
  "published_date": "2026-07-25T00:00:00.673Z",
  "job_type": "Full-Time",
  "department": null,
  "salary": "$25 – $27 / hour",
  "location_city": "St. Catharines",
  "location_state": "ON",
  "location_country": "CA",
  "is_remote": false,
  "scraped_at": "2026-07-26T15:00:00Z"
}
```

### 💰 Pricing

Pay-Per-Event — you're charged only when these fire:

| Event | USD | What it covers |
|---|---:|---|
| `actor-start` | $0.005 | One-off warm-up per run |
| `result` | $0.0015 | Per 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

- **Public postings only** — the openly published careers board, not authenticated internal/employee views.
- **No full description text** — Breezy's list endpoint doesn't publish the job-description body; only the posting `apply_url` links to the full text on the HTML page, which this Actor never fetches.
- **Company slugs, not company names** — you supply the Breezy subdomain from the careers URL; a display name like "RhynoCare" may not match its actual slug.
- **Point-in-time snapshot** — returns the board as it stands right now; schedule recurring runs to track changes.
- **No anti-bot wall observed on this vendor today** — Breezy's feed hasn't shown rate-limiting or blocking in our testing, but the retry, backoff, and fingerprint-rotation stack ships anyway and takes over the moment that changes, so a future tightening doesn't turn into a broken run.

### ❓ FAQ

**Do I need a Breezy HR account or API key?**

No — every field comes from Breezy's own public JSON feed, the same one the careers page itself renders from.

**How do I find a company's slug?**

It's in the careers URL: `https://{slug}.breezy.hr`. Paste that `{slug}` (e.g. `rhynocare`), or just paste the full URL — we extract it either way.

**Can one run cover several employers?**

Yes — put multiple slugs in `companySlugs` and every row comes back identically shaped, tagged with `company_slug` / `company_name`.

**What happens if I typo a slug or it doesn't exist?**

Breezy redirects unknown subdomains to its marketing site instead of returning a clean error. We detect that redirect, skip the company, and report it plainly in the run's status message — the rest of your batch still completes.

**Is this legal?**

We fetch public, unauthenticated job-posting data that employers publish for candidates. 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.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

### 🔗 Related Devil Scrapes Actors

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

- [SmartRecruiters Jobs Scraper](https://apify.com/DevilScrapes/smartrecruiters-jobs-scraper) — postings from any SmartRecruiters-hosted employer
- [Teamtailor Jobs Scraper](https://apify.com/DevilScrapes/teamtailor-jobs-scraper) — postings from any Teamtailor-powered career site
- [Workday Jobs Scraper](https://apify.com/DevilScrapes/workday-jobs-scraper) — postings from any Workday-powered career site
- [Workable Jobs Scraper](https://apify.com/DevilScrapes/workable-jobs-scraper) — postings from any Workable-hosted employer board
- [BambooHR Jobs Scraper](https://apify.com/DevilScrapes/bamboohr-jobs-scraper) — postings from any BambooHR-hosted careers page
- [Recruitee Jobs Scraper](https://apify.com/DevilScrapes/recruitee-jobs-scraper) — postings from any Recruitee-powered career site
- [Multi-ATS Jobs Scraper](https://apify.com/DevilScrapes/multi-ats-jobs-scraper) — one normalized feed across Greenhouse, Lever & Ashby

Browse the full fleet at [apify.com/DevilScrapes](https://apify.com/DevilScrapes).

# Actor input Schema

## `companySlugs` (type: `array`):

Breezy HR company subdomain, e.g. "rhynocare" (the employer identifier in https://{company}.breezy.hr/), or a full https://{company}.breezy.hr URL — the slug is regex-extracted. A plain string with no "breezy.hr" substring is used as the literal slug, case preserved; a custom-domain URL is rejected — use the bare {company}.breezy.hr subdomain instead.

## `maxResultsPerCompany` (type: `integer`):

Cap postings emitted per company, applied client-side after fetching (no server-side limit/offset param exists on this vendor).

## `proxyConfiguration` (type: `object`):

Apify Proxy configuration. Breezy HR blocks datacenter IPs, so residential proxy is required for reliable access.

## Actor input object example

```json
{
  "companySlugs": [
    "rhynocare",
    "barloworldequipment"
  ],
  "maxResultsPerCompany": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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 = {
    "companySlugs": [
        "rhynocare",
        "barloworldequipment"
    ],
    "maxResultsPerCompany": 200,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/breezy-hr-jobs-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 = {
    "companySlugs": [
        "rhynocare",
        "barloworldequipment",
    ],
    "maxResultsPerCompany": 200,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/breezy-hr-jobs-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "companySlugs": [
    "rhynocare",
    "barloworldequipment"
  ],
  "maxResultsPerCompany": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call devilscrapes/breezy-hr-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=devilscrapes/breezy-hr-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/euQPPAqbVo2wJ05Cf/builds/rnwliUpPohokx1KGv/openapi.json
