# Vivian Health Jobs Scraper (`crawlerbros/vivian-health-scraper`) Actor

Scrape healthcare & nursing job listings from Vivian Health (vivian.com) - travel nursing, allied health, therapy, and social work jobs with pay rates, shifts, benefits, and facility details. No login or API key required.

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

## Pricing

from $3.00 / 1,000 results

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

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

## Vivian Health Jobs Scraper

Scrape healthcare job listings from [Vivian Health](https://www.vivian.com) — travel nursing, allied health, therapy, social work, CNA, LPN/LVN, nurse practitioner, CRNA, CMA, physician assistant, and school services jobs. Get pay rates, shifts, benefits, facility details, and full job descriptions. No login, cookies, or API key required.

### What this actor does

- **Two modes:** `browse` (search job listings) and `jobDetails` (fetch full detail for specific jobs)
- **Browse by discipline, specialty, employment type, and location** — mirrors Vivian Health's own site navigation, including its narrower specialty taxonomy (e.g. ICU Nurse, Med Surg/Telemetry within Nursing)
- **11 healthcare disciplines** — Nursing, Allied Health, Social Work, Therapy, CNA, LPN/LVN, Nurse Practitioner, CRNA, CMA, Physician Assistant, School Services
- **Pay data** — weekly/hourly normalized pay, pay ranges, competing agency offers
- **Filters** — minimum weekly pay, verified-jobs-only
- **Empty fields are omitted**

### Output per job

#### Browse mode

- `jobId`, `jobUrl`
- `title`, `discipline`, `specialties[]`, `employmentType`
- `employerName`, `facilityName`, `facilityLogoUrl`
- `locationDisplay`, `state`, `latitude`, `longitude`
- `payDisplay`, `payPeriod`, `payMinRate`, `payMaxRate`, `normalizedPay`, `weeklyNormalizedPay`, `hourlyNormalizedPay`
- `shift[]`, `shiftDetails`, `shiftBreakdown`
- `startDateDisplay`, `contractLengthWeeks`
- `benefits[]`, `verified`
- `postedAt`, `postedDaysAgo`
- `agencyOffers[]` — competing staffing agency pay offers for the same role
- `recordType: "job"`, `scrapedAt`

#### Job details mode

All of the above (where available) plus:

- `description` — full job description (HTML stripped to plain text)
- `hospitalAddress`, `hospitalCity`, `hospitalState`, `hospitalZipCode`, `hospitalWebsite`
- `agencyName`, `agencyWebsite`
- `hoursPerWeek`, `maxHoursPerWeek`, `hoursPerDay`
- `housingStipend`, `mealStipend`
- `overtimePolicyDisplay`, `contractLength`, `startDate`
- `perks[]`
- `updatedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `browse` | `browse` / `jobDetails` |
| `discipline` | select | `nursing` | Healthcare discipline (mode=browse) |
| `specialty` | string | – | Optional narrower specialty slug within `discipline`, e.g. `med-surg-telemetry`, `icu-nurse` (mode=browse) |
| `employmentType` | select | `travel` | `travel` / `local-contract` / `per-diem` / any (mode=browse) |
| `location` | string | – | City-state slug, e.g. `plano-tx` (mode=browse) |
| `jobIds` | array | – | Job IDs or URLs (mode=jobDetails) |
| `minWeeklyPay` | int | – | Drop jobs below this weekly pay (mode=browse) |
| `verifiedOnly` | bool | `false` | Only verified jobs (mode=browse) |
| `maxItems` | int | `50` | Hard cap (1–1000) |

#### Example: travel nursing jobs in a specific city

```json
{
  "mode": "browse",
  "discipline": "nursing",
  "employmentType": "travel",
  "location": "plano-tx",
  "minWeeklyPay": 1800,
  "maxItems": 50
}
```

#### Example: ICU nursing specialty in a specific city

```json
{
  "mode": "browse",
  "discipline": "nursing",
  "specialty": "icu-nurse",
  "employmentType": "travel",
  "location": "plano-tx",
  "maxItems": 50
}
```

#### Example: nationwide allied health per-diem jobs

```json
{
  "mode": "browse",
  "discipline": "allied-health",
  "employmentType": "per-diem",
  "maxItems": 100
}
```

#### Example: fetch full details for specific jobs

```json
{
  "mode": "jobDetails",
  "jobIds": [
    "35gMQDgAo0U2bEamn8w",
    "https://www.vivian.com/job/v/axqk75qlwmH22PoLgdZ/"
  ]
}
```

### Use cases

- **Nurse & clinician job search** — bulk-export current openings by discipline and location
- **Staffing agency competitive intelligence** — compare agency pay offers for the same job
- **Healthcare labor market research** — track pay rates and benefits across regions
- **Recruiting tools** — feed live job data into a healthcare-focused job board or CRM
- **Salary benchmarking** — aggregate weekly/hourly normalized pay by discipline and city

### FAQ

**What's Vivian Health?** A healthcare job marketplace aggregating travel, local-contract, and per-diem nursing/allied-health jobs from hospitals and staffing agencies. See [vivian.com](https://www.vivian.com).

**What's a "location slug"?** Vivian Health URLs use a `city-state` slug, e.g. `plano-tx` for Plano, Texas or `new-york-ny` for New York, NY. Leave `location` empty to browse nationwide for the chosen discipline/employment type.

**What's a "specialty" slug?** Vivian Health breaks each discipline into hundreds of narrower specialties (e.g. `icu-nurse`, `med-surg-telemetry`, `er-emergency-room-nurse` within Nursing). Because there are too many to list in a dropdown, `specialty` is free text — find the exact slug in a job's Vivian Health URL, e.g. `vivian.com/nursing/med-surg-telemetry/travel/` → `med-surg-telemetry`. Leave it empty to browse the whole discipline.

**What's the difference between `normalizedPay`, `weeklyNormalizedPay`, and `hourlyNormalizedPay`?** Vivian Health normalizes pay packages (base pay + stipends) into comparable weekly and hourly figures so jobs with different pay structures can be compared directly.

**What are `agencyOffers`?** Many jobs are staffed by multiple competing agencies; each offer shows that agency's own pay rate for the same position.

**Why are some fields missing from browse-mode records?** Browse mode returns listing-page summaries. Use `jobDetails` mode with the job's ID or URL to fetch the full job description, hospital details, and stipend breakdown.

**Is a proxy required?** No. The actor works entirely with public, server-rendered pages — no proxy, cookies, or login needed.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

## `discipline` (type: `string`):

Healthcare discipline / profession to browse.

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

Optional narrower specialty slug within `discipline`, e.g. `med-surg-telemetry`, `icu-nurse`, `er-emergency-room-nurse` (nursing); `physical-therapist` (therapy). Vivian Health exposes hundreds of specialty slugs across its disciplines, so this is free text rather than a fixed dropdown -- find the exact slug in a job's Vivian Health URL, e.g. `/nursing/med-surg-telemetry/travel/` -> `med-surg-telemetry`. Leave empty to browse the whole discipline.

## `employmentType` (type: `string`):

Filter by employment/contract type. Leave as "Any" to include all types.

## `location` (type: `string`):

Optional city-state slug to narrow results, e.g. `plano-tx`, `new-york-ny`, `los-angeles-ca`. Leave empty to browse nationwide.

## `jobIds` (type: `array`):

Vivian Health job IDs (e.g. `35gMQDgAo0U2bEamn8w`) or full job URLs (e.g. `https://www.vivian.com/job/v/35gMQDgAo0U2bEamn8w/`).

## `minWeeklyPay` (type: `integer`):

Drop jobs whose normalized weekly pay is below this amount (mode=browse only).

## `verifiedOnly` (type: `boolean`):

Only emit jobs Vivian Health has marked as verified (mode=browse only).

## `maxItems` (type: `integer`):

Hard cap on emitted records.

## Actor input object example

```json
{
  "mode": "browse",
  "discipline": "nursing",
  "specialty": "",
  "employmentType": "travel",
  "location": "plano-tx",
  "jobIds": [],
  "verifiedOnly": false,
  "maxItems": 50
}
```

# Actor output Schema

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

Dataset containing all scraped Vivian Health job listings.

# 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 = {
    "mode": "browse",
    "discipline": "nursing",
    "specialty": "",
    "employmentType": "travel",
    "location": "plano-tx",
    "jobIds": [],
    "verifiedOnly": false,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/vivian-health-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 = {
    "mode": "browse",
    "discipline": "nursing",
    "specialty": "",
    "employmentType": "travel",
    "location": "plano-tx",
    "jobIds": [],
    "verifiedOnly": False,
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/vivian-health-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 '{
  "mode": "browse",
  "discipline": "nursing",
  "specialty": "",
  "employmentType": "travel",
  "location": "plano-tx",
  "jobIds": [],
  "verifiedOnly": false,
  "maxItems": 50
}' |
apify call crawlerbros/vivian-health-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/vivian-health-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/cDxhFx1Ct9Iiom9mC/builds/rzwkxJaRfsFhJy8eQ/openapi.json
