# Vivian Health Scraper \[$3.5/1k💰] | Travel Nurse Jobs & Pay (`ahmed_jasarevic/vivian-scraper`) Actor

Scrape Vivian Health travel nurse and allied-health jobs with normalized weekly pay, housing and meal stipends, benefits, facility, staffing agency and recruiter data — for pay benchmarking, staffing research and healthcare market intelligence.

- **URL**: https://apify.com/ahmed\_jasarevic/vivian-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.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/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

## Vivian Health Jobs Scraper

Scrape **travel nurse jobs and allied-health job data from Vivian Health (vivian.com)** with normalized weekly pay, housing and meal stipends, benefits, shift details, facility, staffing agency and recruiter info — for **travel nurse pay benchmarking and healthcare staffing market intelligence**.

### Main Use Cases

- **Travel nurse pay comparison** — benchmark normalized weekly pay across roles, states and cities using `weeklyNormalizedPay` and `hourlyNormalizedPay`.
- **Healthcare staffing market intelligence** — sample the full Vivian job index (340,000+ jobs) for supply/demand and pay analysis.
- **Recruiter & agency research** — export `recruiterEmail`, staffing agency names and `agencyOffers` (competing agency bids per role).
- **Pay transparency datasets** — housing stipends, meal stipends, taxable/non-taxable splits for compensation research.
- **Job-board API alternative** — structured job JSON for products, dashboards, AI agents and models without an official Vivian API.

### How It Works

Vivian's website is a Next.js app protected by Cloudflare. Instead of rendering pages, this actor calls the **same Algolia search backend Vivian's own frontend uses** (app ID + search key are public constants in Vivian's JS bundle): the `searchable-jobs-prod` browse index (340k+ jobs with pay, benefits, shift, competing offers) and the `jobs-prod-deduped` detail index (stipends, hospital, agency, recruiter email). Two modes:

- **Browse** — filter by discipline, employment type, specialty (fuzzy input auto-resolved), location (state or city), minimum weekly pay, benefits and verified status, then paginate the whole result set. Direct Vivian search URLs (`/browse-jobs/...`) are replayed against the API exactly as searched.
- **Job details** — scrape full detail pages for specific `jobUrl`s, including the agency comparison table and employer info.

No browser, no cookies, no proxy required — the same data the website renders, as clean JSON.

### Track Travel Nurse Pay Data Across States & Specialties

Filter by `employmentType: "Travel"`, `discipline` (RN, Therapy, LPN/LVN, Nurse Practitioner, ...) and `location` (state or city), set `minWeeklyPay` to cut low-paying roles, and export `weeklyNormalizedPay` per job. For VMS-posted roles the `agencyOffers[]` array lists every agency bidding on the same shift with their own pay rates — the cleanest way to benchmark what the market actually pays for a given contract.

### Input

| Field | Type | Required | Default | Notes |
|-------|------|----------|---------|-------|
| `mode` | select | No | `browse` | `browse` = search + filters over the full index; `jobDetails` = specific job URLs. |
| `query` | string | No | — | Free-text keywords (e.g. `ICU nurse`, `Social Work`) or a city (`Sacramento`). A full `/browse-jobs/` URL is auto-detected and replayed against the API. |
| `discipline` | select | No | `any` | `RN`, `Allied Health Professional`, `Therapy`, `LPN / LVN`, `Nurse Practitioner`, `Physician Assistant`, `Social Work`, `School Services`, `CNA`, `CMA`, `CRNA`. |
| `employmentType` | select | No | `any` | `Travel`, `Local Contract`, `Per Diem / PRN`, `Permanent`, `Locum Tenens`. |
| `specialty` | string | No | — | e.g. `Med Surg / Telemetry`, `ICU - Intensive Care Unit`, `Physical Therapist`. Fuzzy input like `med surg` or `ICU` is auto-resolved. |
| `location` | string | No | — | State (`CA`, `California`, `TX`) filters strictly; a city (`Sacramento`, `Sacramento, CA`) is auto-resolved to the exact location key. `Compact States` also supported. |
| `minWeeklyPay` | integer | No | — | Only return jobs with weekly normalized pay ≥ this amount. |
| `verifiedOnly` | boolean | No | `false` | Only return jobs verified by Vivian. |
| `benefits` | string | No | — | Require a benefit, e.g. `Medical benefits`, `Housing stipend`, `401k retirement plan`. |
| `maxItems` | integer | No | `50` | Max jobs to scrape (1–1000). Free accounts preview up to 10. |
| `includeFullDetails` | boolean | No | `true` | Enrich each job with stipends, hospital, agency and recruiter email from the detail index (one API call per 100 jobs). |
| `jobUrls` | array | No | — | Vivian job URLs (`https://www.vivian.com/job/v/...`) for `jobDetails` mode; browse URLs are also accepted here. |
| `searchUrls` | array | No | — | Direct `/browse-jobs/` search URLs, parsed into fast Algolia API requests. |
| `proxy` | object | No | off | Standard Apify proxy picker — only needed if you hit rate limits (Algolia API normally requires none). |

### Example Input — Browse Mode

```json
{
  "mode": "browse",
  "discipline": "RN",
  "employmentType": "Travel",
  "location": "CA",
  "minWeeklyPay": 2500,
  "verifiedOnly": true,
  "maxItems": 100
}
```

### Example Input — Direct Vivian Search URL

```json
{
  "mode": "browse",
  "searchUrls": ["https://www.vivian.com/browse-jobs/?query=Social%20Work&configure%5Bfilters%5D=(origin%3A%22platform%22)"],
  "maxItems": 50
}
```

### Output

One dataset item per job. Key columns in the `overview` view: `title`, `jobUrl`, `employerName`, `facilityName`, `locationDisplay`, `payDisplay`, `weeklyNormalizedPay`, `employmentType`, `discipline`, `shiftDetails`, `startDateDisplay`, `contractLengthWeeks`, `verified`, `agencyOffers`, `housingStipend`, `mealStipend`, `hospitalName`, `recruiterEmail`.

| Field group | Fields |
|-------------|--------|
| Identity | `objectID`, `recordType`, `title`, `titleVerbose`, `titleSeo`, `jobUrl`, `scrapedAt` |
| Discipline | `discipline`, `specialties` |
| Type | `employmentType` (Travel, Local Contract, Per Diem/PRN, Permanent, Locum Tenens) |
| Pay | `payDisplay`, `payMinRate`, `payMaxRate`, `payPeriod`, `weeklyNormalizedPay`, `hourlyNormalizedPay`, `normalizedPay`, `weeklyTaxablePay`, `weeklyNonTaxablePay`, `housingStipend`, `mealStipend` |
| Shift | `shift`, `shiftDetails`, `shiftBreakdown`, `startDateDisplay`, `startMonth`, `contractLengthWeeks` |
| Benefits | `benefits`, `bonusesAndBenefits`, `employerBenefits` |
| Verification | `verified`, `verifiedAt` |
| Employer | `employerName`, `facilityName`, `hospitalName` |
| Location | `locationDisplay`, `city`, `state`, `latitude`, `longitude` |
| Agency | `agency`, `agencyId`, `recruiterEmail`, `agencyOffers[]` (agencyName, payDisplay, normalizedPay) |

### Example Output — Browse Mode (VMS role)

```json
{
  "objectID": "vms::1Ogy5vgdeXh1KEroQ32",
  "recordType": "vms",
  "jobUrl": "https://www.vivian.com/job/v/1Ogy5vgdeXh1KEroQ32/",
  "title": "Pediatric SLP",
  "discipline": "Therapy",
  "employmentType": "Travel",
  "employerName": "Aequor Allied",
  "facilityName": "Valley Children's Healthcare",
  "locationDisplay": "Madera, CA",
  "payDisplay": "$3,859/week",
  "weeklyNormalizedPay": 3859,
  "shiftDetails": "8 hours, days",
  "contractLengthWeeks": "13 weeks",
  "verified": true,
  "agencyOffers": [
    { "agencyName": "Aequor Allied", "payDisplay": "$3,561/week", "normalizedPay": 3561.4 },
    { "agencyName": "TotalMed Allied", "payDisplay": "$3,646/week", "normalizedPay": 3645.63 }
  ],
  "scrapedAt": "2026-09-21T09:00:00.000Z"
}
```

Download results as **JSON, HTML, CSV or Excel** from the Storage tab, or via the Apify API.

### Extract Nursing Salaries & Recruiter Contacts for Staffing Research

`includeFullDetails: true` enriches every job with stipends, hospital info, agency info and **recruiter email** from Vivian's detail index — one extra API call per 100 jobs. Combined with `agencyOffers[]` on VMS roles, you get both a pay-benchmarking dataset and a recruiter-contact export for staffing research.

### Integrations & Automation

- **Apify API** — query the Vivian job market from your own tools or dashboards.
- **Webhooks** — get notified when a market-scan run finishes.
- **Scheduling** — run weekly to track pay-rate changes over time.
- **Export** — JSON, CSV, HTML, Excel.

*Recommended schedule:* **weekly** for pay-trend monitoring, **on-demand** for recruiter research.

### Related Actors

- [kaix/indeed-scraper](https://apify.com/kaix/indeed-scraper) — the largest job-board scraper on the Store (jobs cluster authority, 6,600+ users).
- [Monster Job Scraper](https://apify.com/blackfalcondata/monster-scraper) — 1M+ US listings, jobs cluster peer.
- [Crawlerbros Vivian Health Jobs Scraper](https://apify.com/crawlerbros/vivian-health-scraper) — direct Vivian competitor with similar input fields.
- [Nurse Jobs in the US API](https://apify.com/aspen-technology-labs-inc/nurse-jobs-us-api) — US nursing job postings by role and location.
- [Cutshort Jobs Scraper](https://apify.com/cutshort-scraper) — India tech & startup jobs (same author, jobs cluster).

### FAQ

#### Why use this actor instead of the official Vivian API?

Vivian does not offer a public API for job search or pay data. This actor calls the same Algolia search backend Vivian's website uses (public app ID + search key embedded in Vivian's own JS bundle) — no API key, no OAuth, no browser, no Cloudflare workarounds, and access to the **entire** 340k+ job index rather than just what the UI shows.

#### What are alternatives to this actor / Vivian job data?

- [crawlerbros/vivian-health-scraper](https://apify.com/crawlerbros/vivian-health-scraper) — another Vivian scraper with mode/discipline filters.
- [aspen-technology-labs-inc/nurse-jobs-us-api](https://apify.com/aspen-technology-labs-inc/nurse-jobs-us-api) — US nurse job postings from a different source.
- General job-board scrapers: [kaix/indeed-scraper](https://apify.com/kaix/indeed-scraper), [blackfalcondata/monster-scraper](https://apify.com/blackfalcondata/monster-scraper).

#### How can I compare travel nurse pay across states?

Set `employmentType: "Travel"` and scrape per state (`location: "CA"`, `location: "TX"`, ...) with a `minWeeklyPay` floor, then group by `locationDisplay` and `specialty` using `weeklyNormalizedPay`. Schedule weekly to see pay movement.

#### What is the best way to build a travel nurse salary dataset?

Run browse mode with no filters and `maxItems: 1000` (the max per run) to pull a large sample of the full index, keep `includeFullDetails: true` for stipends and recruiter contacts, and join across daily/weekly runs for a growing pay dataset.

### For AI Agents & LLM Apps

- **Purpose:** returns one structured job record per Vivian Health listing (title, discipline, employment type, pay package + normalized weekly/hourly pay, stipends, shift, contract length, facility, agency, recruiter email, competing agency offers).
- **Minimal input — browse a discipline:**

```json
{ "mode": "browse", "discipline": "RN", "employmentType": "Travel", "maxItems": 50 }
```

- **Variant input — pay-benchmarked search:**

```json
{
  "mode": "browse",
  "location": "CA",
  "minWeeklyPay": 2500,
  "verifiedOnly": true,
  "maxItems": 100
}
```

- **Variant input — specific jobs:**

```json
{ "mode": "jobDetails", "jobUrls": ["https://www.vivian.com/job/v/9ZgJ7DgV1mfNpknkbqZ/"] }
```

Behaviors an agent should know:

- `mode` is required; `browse` (default) searches the index, `jobDetails` scrapes specifics URLs (browse URLs are also accepted in `jobUrls` and resolved via the fast API).
- `specialty` and city `location` inputs are fuzzy — auto-resolved to exact keys, so free text is safe.
- `platform::` records (direct agency postings) return `jobUrl: null` and no competing offers via the browse API — use `jobDetails` mode for those.
- `agencyOffers[]` only appears on VMS-posted roles.
- Some jobs report `housingStipend`/`mealStipend` of `0` when the agency doesn't publish a split.
- `includeFullDetails` adds one API call per 100 jobs — keep `true` for recruiter email + stipends, `false` for speed.
- **Billing:** pay-per-result — `$0.0035` per job record in the default dataset.

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Vivian Health. It reads the same public search API and public job pages that Vivian's website uses — it does not bypass login walls, solve CAPTCHAs, or access non-public data. Users are responsible for complying with Vivian's Terms of Use and applicable law. Output may include publicly displayed recruiter contact emails and agency names; do not use them for unsolicited commercial outreach in violation of applicable law (e.g. CAN-SPAM, TCPA, GDPR); handle personal data responsibly and in line with applicable data-protection rules.

### SEO Keywords

vivian health scraper, travel nurse jobs data, nursing salary data, travel nurse pay comparison, travel nursing salary, healthcare staffing data, nurse pay rates, travel nurse jobs api alternative, nursing job listings, healthcare market intelligence, allied health jobs, nursing stipend data, recruiter email data, nurse job board scraping, pay transparency data, travel nurse contracts, nursing workforce research, healthcare recruitment data

# Actor input Schema

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

browse = search and filter Vivian's full job index (fast, API-based, includes competing agency offers). jobDetails = scrape full detail pages for specific job URLs (includes the agency comparison table and employer info). Browse/job URLs can be combined in either mode.

## `query` (type: `string`):

Free-text keywords, e.g. "Social Work", "ICU nurse", or a city like "Sacramento". Applied in browse mode (combined with the filters below). You can also paste a full Vivian browse URL (https://www.vivian.com/browse-jobs/?...) here - it is detected and replayed directly against the API.

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

Healthcare discipline to filter by.

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

Type of assignment.

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

Specialty filter, e.g. "Med Surg / Telemetry", "ICU - Intensive Care Unit", "Physical Therapist". Fuzzy input like "med surg" or "ICU" is auto-resolved to the exact specialty. Leave empty for all.

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

State abbreviation, full state name or "Compact States" (e.g. "CA", "California", "TX") filters strictly. A city works too - "Sacramento" or "Sacramento, CA" is auto-resolved to the exact "City, State" location key and filtered precisely.

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

Only return jobs with weekly normalized pay greater than or equal to this amount.

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

Only return jobs verified by Vivian.

## `benefits` (type: `string`):

Require a specific benefit, e.g. "Medical benefits", "Housing stipend", "401k retirement plan".

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

Maximum number of jobs to scrape.

## `includeFullDetails` (type: `boolean`):

Enrich each job with stipends, hospital info, agency info and recruiter email from Vivian's detail index. Adds one extra API call per 100 jobs.

## `jobUrls` (type: `array`):

List of Vivian job URLs (https://www.vivian.com/job/v/...) to scrape in jobDetails mode. /browse-jobs/ search URLs are also accepted here - they are resolved via the fast search API instead of scraping.

## `searchUrls` (type: `array`):

Vivian /browse-jobs/ search URLs (e.g. the address bar link after searching Vivian). Parsed directly into fast Algolia API requests - same results as browsing, including all filters you set in the Vivian UI.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "mode": "browse",
  "query": "Social Work",
  "discipline": "any",
  "employmentType": "any",
  "specialty": "Med Surg / Telemetry",
  "location": "CA",
  "minWeeklyPay": 2500,
  "verifiedOnly": false,
  "benefits": "Medical benefits",
  "maxItems": 50,
  "includeFullDetails": true,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/vivian-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 = { "proxy": { "useApifyProxy": False } }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/vivian-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 '{
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/vivian-scraper --silent --output-dataset

```

## MCP server setup

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