# HealtheCareers Scraper: US Healthcare Jobs (`santamaria-automations/healthecareers-scraper`) Actor

Extract US healthcare job listings from HealtheCareers.com. Returns title, employer, location, specialty, subspecialty, credentials (MD/RN/NP/PA), salary min/max, employer type, shift type, apply URL. Physicians, nurses, allied health, pharmacy. Pay per result.

- **URL**: https://apify.com/santamaria-automations/healthecareers-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 job serp 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/actors/running/actors-in-store.md#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

## HealtheCareers Scraper: US Healthcare Jobs

Pull job listings from HealtheCareers.com, a US-only healthcare career board covering physicians, nurses, allied health, pharmacy, and dentistry across the full clinical taxonomy (roughly tens of thousands of live openings from major health systems, hospitals, and private practices). Every record ships with credentials required (MD, RN, NP, PA and more), specialty + subspecialty, employer type, shift type, salary bounds when disclosed, and the apply URL. Optional deep-employer mode pulls the employer's phone, mailing address, and website out of the schema.org data on each PDP, plus (best-effort) the count of their other open roles. No API key needed.

### Sample output

```json
[
  {
    "id": "13617612",
    "guid": "6f162a0d-be8a-47c6-894f-ff22cd950a7c",
    "title": "Care Partner - Medical Surgical Unit - FT Days",
    "company": "Wellstar Health System",
    "company_logo_url": "https://media.healthecareers.com/wp-content/uploads/2022/02/11232310/whs_logo_updated_2.png",
    "location": "Austell, Georgia",
    "country": "US",
    "city": "Austell",
    "region": "Georgia",
    "employment_type": "full-time",
    "remote_option": null,
    "salary_min": null,
    "salary_max": null,
    "salary_currency": null,
    "salary_period": null,
    "description_snippet": "How would you like to work in a place where your contributions and ideas are valued? A place where you can serve with compassion, pursue excellence...",
    "source_url": "https://www.healthecareers.com/job/care-partner-medical-surgical-unit-ft-days/13617612",
    "source_platform": "healthecareers.com",
    "apply_url": "https://www.healthecareers.com/job/care-partner-medical-surgical-unit-ft-days/13617612",
    "apply_type": "Resume",
    "specialty": "nurse",
    "subspecialty": "Medical / Surgical",
    "profession": "Nursing",
    "credentials_required": "RN",
    "employer_type": "health-system",
    "shift_type": "day",
    "experience_level": "mid",
    "tags": ["Health System"],
    "search_query": "nurse",
    "scraped_at": "2026-08-18T19:00:00Z",
    "company_phone": "(585) 922-9348",
    "company_address_street": "1425 Portland Avenue",
    "company_address_city": "Rochester",
    "company_address_country": "US",
    "company_website": "https://healthecareers.com/healthcare-employers/wellstar-health-system/60011"
  },
  {
    "id": "13579248",
    "title": "Registered Nurse - Behavioral Health, Swedish Hospital, Night Shift",
    "company": "Swedish Hospital",
    "location": "Chicago, Illinois",
    "country": "US",
    "specialty": "nurse",
    "subspecialty": "Behavioral Health",
    "credentials_required": "RN",
    "employer_type": "hospital",
    "shift_type": "night",
    "experience_level": "mid",
    "apply_type": "Resume",
    "source_url": "https://www.healthecareers.com/job/registered-nurse-behavioral-health-swedish-hospital-night-shift/13579248"
  },
  {
    "id": "13568756",
    "title": "Registered Nurse (RN) - Intermediate Care, Cardiology - Augusta - FT",
    "company": "Wellstar MCG Health",
    "location": "Augusta, Georgia",
    "country": "US",
    "specialty": "nurse",
    "subspecialty": "Cardiology",
    "credentials_required": "RN",
    "employer_type": "health-system",
    "shift_type": "day",
    "experience_level": "mid"
  }
]
```

### Pricing

| Event | Price |
|-------|-------|
| Actor start | $0.001 |
| SERP result (per job) | $0.003 |
| Detail enrichment (per job, when `includeJobDetails: true`) | $0.005 |
| Company detail (per unique employer, when `includeCompanyDetails: true`) | $0.005 |

Around $3 per 1,000 jobs in the default SERP-only mode. Detail enrichment is off by default because the SERP already carries 20+ fields per job (title, employer, location, specialty, subspecialty, credentials, employer type, shift, salary when disclosed, apply URL). Turn it on when you also need the full description body and the closing date.

**New to Apify?** Every account gets a $5 free monthly platform credit, enough for around 1,600 results on this actor before you commit to paying anything. Test extensively first.

### Input

| Field | Type | Required | Description | Example |
|-------|------|----------|-------------|---------|
| `searchQueries` | array | No | Healthcare job titles or skills. Each runs as a separate search. Results are deduplicated across queries. | `["nurse practitioner", "cardiologist"]` |
| `specialty` | string | No | Broad specialty filter. Uses the site's own taxonomy paths, which are always cache-warm. Combine with a keyword to narrow further. | `nurse` |
| `state` | string | No | US state name filter applied to the SERP location text. | `California` |
| `experienceLevel` | string | No | One of `entry`, `mid`, `senior`, `executive`. Overrides the title-derived inference on every row. | `senior` |
| `maxResults` | integer | No | Total cap across all queries. Default 20. | `200` |
| `maxResultsPerQuery` | integer | No | Cap per keyword or taxonomy task. Default 200. | `100` |
| `includeJobDetails` | boolean | No | When on, each job's detail page is fetched for the full description, benefits, and closing date. Best-effort (some detail pages are challenge-protected). Default false. | `true` |
| `includeCompanyDetails` | boolean | No | Also fetch the employer's `/v2/healthcare-employers/{slug}/{id}` page for the About-us text and a list of the employer's other open roles. Dedup by employer id within a run. Implies `includeJobDetails=true` (the employer link only lives on the PDP). Best-effort - the employer page is often challenge-gated; the schema.org hiringOrganization fields (phone, address, website) still land on every enriched row regardless. Default false. | `true` |
| `maxConcurrency` | integer | No | Concurrent detail-page requests (1 to 20). Default 5. | `5` |
| `proxyConfiguration` | object | No | Default is Apify datacenter proxies. | `{ "useApifyProxy": true, "apifyProxyGroups": [] }` |

### Output fields

**Core**

- `id`: HealtheCareers numeric job ID (stable dedup key).
- `guid`: Internal job GUID (secondary identifier).
- `title`: Job title as posted.
- `location`: Full location string ("City, State").
- `country`: Always "US".
- `city`, `region`: Split components.
- `source_url`: Public HealtheCareers listing URL.
- `apply_url`: Direct link to apply.
- `apply_type`: Application mechanism (Resume, Direct, ATS).
- `source_platform`: Always "healthecareers.com".

**Company**

- `company`: Hiring organisation name.
- `company_logo_url`: Employer logo image.
- `employer_type`: hospital, health-system, private-practice, academic, government, or correctional. Inferred from tags plus company name.
- `company_phone`: Employer phone from the PDP's schema.org hiringOrganization.telephone.
- `company_website`: External employer site from schema.org hiringOrganization.sameAs.
- `company_address_street`, `company_address_city`, `company_address_postcode`, `company_address_country`: Structured mailing address from schema.org hiringOrganization.address.
- `company_email`: Rarely present on healthecareers.com; usually null.
- `company_about`: About-us text from the /v2/healthcare-employers page (best-effort - only when `includeCompanyDetails: true` and the page cleared the WAF challenge).
- `company_active_jobs_count`, `company_active_jobs`: Count + title/URL list of the employer's other open roles (same best-effort condition).

**Role classification (healthcare-native)**

- `specialty`: Broad bucket (physician, nurse, nurse-practitioner, physician-assistant, allied-health, pharmacy, dentistry, mental-health, admin, academics, other).
- `subspecialty`: Site's tier-3 taxonomy label (Cardiology, Oncology, Medical / Surgical, Behavioral Health, and more).
- `profession`: Site's canonical profession label.
- `credentials_required`: MD, DO, RN, BSN, MSN, NP, PA, DNP, DDS, PharmD, CRNA, LCSW and more. Comma-joined when multiple are present.
- `board_certification`: required, required-or-eligible, or preferred. Detected from "board certified" or "board eligible" phrasing.
- `shift_type`: day, night, evening, swing, rotating, on-call, per-diem.
- `experience_level`: entry, mid, senior, executive.
- `employment_type`: full-time, part-time, contract, per-diem, temporary, internship.
- `remote_option`: remote, hybrid, or null (HealtheCareers surfaces telehealth roles here).

**Salary**

- `salary_min`, `salary_max`: Numeric bounds when disclosed.
- `salary_currency`: Usually USD.
- `salary_period`: year, month, week, day, or hour.
- `salary_text`: Display string.

**Description**

- `description_snippet`: SERP-level preview (roughly 200 chars).
- `description_full`: Full body as plain text. Populated when `includeJobDetails: true`.
- `description_html`: Original HTML body. Same enrichment condition.
- `benefits_summary`: Employer benefits copy when disclosed on the detail page.

**Dates and metadata**

- `posted_at`: ISO date the listing was posted.
- `closing_date`: ISO date the listing expires (from detail-page structured data).
- `tags`: Site-side chips (Health System, Featured, New).
- `search_query`: The keyword or taxonomy label that produced the hit.
- `scraped_at`: ISO timestamp when the row was written.

### Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.

**Apify MCP server URL:**

`https://mcp.apify.com?tools=santamaria-automations/healthecareers-scraper`

**Example prompt once connected:**

> "Use `healthecareers-scraper` to find every cardiology nurse practitioner opening at a health system in Texas. Return company, city, subspecialty, and shift type as a table."

Clients that support dynamic tool discovery (Claude.ai, VS Code) receive the full input schema automatically via `add-actor`.

### Why this actor

- Healthcare-native taxonomy that generalist scrapers do not carry: `specialty`, `subspecialty`, `credentials_required`, `board_certification`, `employer_type`, `shift_type`.
- Credentials extraction is the field recruiters actually filter on. Every row surfaces MD, RN, NP, PA, DNP, DDS and more, pulled from the title and the site's tier-3 taxonomy so no LLM guessing is needed.
- Employer-type bucketing (health-system vs hospital vs private-practice vs academic) turns raw listings into segmented outreach lists in one query.
- Shift type is derived from the title on every row. Recruiters filling night-shift ICU roles or per-diem hospitalist slots do not need to re-parse titles by hand.
- SERP-only mode is the default because HealtheCareers cards are unusually rich (20+ fields on the card itself). You pay $3 per 1,000 jobs for data most healthcare boards make you fetch detail pages for.

### Common use cases

- Build a state-by-state cardiology fellowship prospect list for a physician recruiter. Filter `subspecialty` contains "Cardiology" plus `specialty` equals "physician".
- Refresh a night-shift RN pipeline for a hospital staffing agency weekly. Set `specialty: nurse`, then filter `shift_type` equals "night" in downstream tooling.
- Monitor academic-medicine hiring across the top-20 US health systems. Set `specialty: physician`, then filter `employer_type` equals "academic" or "health-system".
- Track locum-tenens openings by state. Filter `employment_type` contains "contract" and slice by `state`.

### Notes and limits

- HealtheCareers detail pages are behind an invisible bot-check challenge. Detail enrichment (full description body, benefits, closing date) is best-effort. Rows that cannot be enriched still land in the dataset with the SERP-level fields, so no row is dropped.
- The optional `includeCompanyDetails` deep-employer mode also fights the same challenge; the `/v2/healthcare-employers` page is more aggressively gated than PDPs. When the page is blocked, only the PDP-level `company_phone` / `company_website` / `company_address_*` fields (from schema.org hiringOrganization) are populated. `company_email` is almost always null on healthecareers - the site does not expose recruiter mailboxes on the employer profile.
- The site's own URL-level state filter is unreliable for uncommon combinations. This actor uses the taxonomy path (`/jobs/nursing`) for reliable pagination and then filters on the SERP location text after fetch. That gives clean results for common combos and best-effort results for rare ones.
- Some listings do not disclose salary. That is the employer's choice, not a scraping issue.
- `board_certification` and `employer_type` are inferred from text signals. Treat as strong hints, not authoritative tags.
- Location strings sometimes cover multiple sites ("Multi-Location", "Various"). Those land in `location` verbatim with `city` and `region` left null.

### Related Actors

- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper): general US job aggregator, useful for comparing hospital openings to the broader market.
- [BioSpace Scraper](https://apify.com/santamaria-automations/biospace-scraper): US biotech and pharma sister site for R\&D and manufacturing roles.
- [NHS Jobs Scraper](https://apify.com/santamaria-automations/nhs-jobs-scraper): UK healthcare parallel, if you also cover the NHS.
- [Website Email Scraper](https://apify.com/santamaria-automations/website-email-scraper): pair with HealtheCareers rows to find the hiring manager's direct email.

### Support

Something broken, or a field you wish this actor returned? Email contact@nanoscrape.com or open a ticket on the [Issues tab](https://apify.com/santamaria-automations/healthecareers-scraper/issues). We usually respond within one working day.

# Actor input Schema

## `searchQueries` (type: `array`):

One or more healthcare job titles or skills (e.g. 'nurse practitioner', 'cardiologist', 'medical assistant'). Each runs as a separate search. Results are deduplicated across queries. Leave blank to browse the full board by specialty.

## `startUrls` (type: `array`):

Direct SERP URLs to crawl instead of building from keywords. Mutually exclusive with searchQueries — provide one or the other.

## `specialty` (type: `string`):

Broad specialty filter. Uses HealtheCareers' own taxonomy paths, which are always cache-warm. Combine with a keyword to narrow further, or leave 'other' to search the whole board.

## `state` (type: `string`):

Filter by US state name (e.g. 'California', 'Texas', 'New York'). Applied to the SERP location text after fetch. Leave blank for all states.

## `includeJobDetails` (type: `boolean`):

When ON, each job's detail page is fetched to extract the full description, structured salary, and benefits. Detail pages are protected by an AWS WAF invisible-token challenge, so enrichment is best-effort. Rows that cannot be enriched still land in the dataset with SERP-level data.

## `includeCompanyDetails` (type: `boolean`):

Also fetch each unique employer's company profile page for the About-us text, phone, address, website, and a list of the employer's other currently-open roles. Deduplicated per employer within a run. Adds $0.005 per unique employer. Implies includeJobDetails=true (employer link only lives on the PDP).

## `experienceLevel` (type: `string`):

Hint for how to label the experience\_level field. HealtheCareers does not expose a URL-level seniority filter, so this is applied at the row level and overrides the title-derived inference.

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

Total cap across all queries. Default 20.

## `maxResultsPerQuery` (type: `integer`):

Maximum results per keyword or taxonomy task. Default 200.

## `maxConcurrency` (type: `integer`):

Maximum number of concurrent detail page requests (only used when Include Full Job Details is on).

## Actor input object example

```json
{
  "searchQueries": [
    "registered nurse"
  ],
  "specialty": "nurse",
  "state": "California",
  "includeJobDetails": false,
  "includeCompanyDetails": false,
  "experienceLevel": "",
  "maxResults": 20,
  "maxResultsPerQuery": 200,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset of scraped healthcare job listings. Each record includes: job ID + GUID, title, company, location, salary, specialty, subspecialty, credentials required, employer type (hospital/health-system/private-practice/academic/government), shift type, experience level, description snippet, apply URL, and (when enrichment is on) full description + closing date.

# 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 = {
    "searchQueries": [
        "registered nurse"
    ],
    "specialty": "nurse",
    "includeJobDetails": false,
    "maxResults": 20,
    "maxResultsPerQuery": 200,
    "maxConcurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/healthecareers-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 = {
    "searchQueries": ["registered nurse"],
    "specialty": "nurse",
    "includeJobDetails": False,
    "maxResults": 20,
    "maxResultsPerQuery": 200,
    "maxConcurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/healthecareers-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 '{
  "searchQueries": [
    "registered nurse"
  ],
  "specialty": "nurse",
  "includeJobDetails": false,
  "maxResults": 20,
  "maxResultsPerQuery": 200,
  "maxConcurrency": 5
}' |
apify call santamaria-automations/healthecareers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/healthecareers-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/18u1Ep5gqYOHEp1LK/builds/VpuRjQZSNZPD8Taap/openapi.json
