# HigherEdJobs Scraper (`crawlerbros/higheredjobs-scraper`) Actor

Scrape HigherEdJobs.com - the largest US job board for faculty, administrative, and executive positions in higher education. Search by keyword, category, region, position type, and institution type, or fetch full job details by job ID.

- **URL**: https://apify.com/crawlerbros/higheredjobs-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Jobs, Automation, 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 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/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

## HigherEdJobs Scraper

Scrape [HigherEdJobs.com](https://www.higheredjobs.com) — one of the largest US job boards dedicated to careers in higher education. Search live faculty, administrative, and executive job postings by keyword, category, region/state, position type, and institution type, or fetch full job details (description, salary, application deadline) by job ID. No login, no API key required; a free datacenter proxy is used by default as an anti-bot fallback.

### What this actor does

- **Two modes:** `search` (browse/filter job listings) and `byJobId` (full detail lookup for specific jobs)
- **237 job categories** across Admin, Executive, and Faculty tracks — from "Admin - Human Resources" to "Faculty - Technical and Career - Welding"
- **Geographic filters** — 13 broad regions (US regions, Canada, international) plus 75 individual states/provinces
- **Position type** — Full-Time / Adjunct-Part-Time
- **Institution type** — Four-Year, Two-Year/Community College, Outside Higher Education
- **Location type** — Location-bound vs. Online/Remote
- **6 sort orders** — priority, date posted, institution, location, job title, category
- **Empty fields are always omitted** from output

### Output per job

#### Search mode

- `jobId`, `title`, `sourceUrl`
- `institutionName`
- `location`, `city`, `state`
- `category`
- `salaryText` (when the employer discloses a range)
- `postedText` (e.g. "Posted 5 days ago")
- `isPriority`, `isMilitaryFriendly` — employer-purchased listing badges
- `recordType: "job"`, `scrapedAt`

#### Detail mode (`byJobId`) — everything above, plus

- `description` — full job description, HTML stripped to plain text
- `datePosted`, `validThrough`
- `institutionUrl`
- `country`
- `positionType` — e.g. `Full-Time`, `Part-Time`
- `categoryId`
- `applicationDue` — a date, or `"Open Until Filled"`
- `industries[]`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `byJobId` |
| `keyword` | string | – | Free-text search (title + institution + location); leave blank to browse by filters only |
| `onlyTitle` | bool | `false` | Restrict keyword search to job titles only |
| `jobCategories` | array (select) | – | One or more of 237 job categories |
| `region` | select | – | Broad geographic region |
| `subRegions` | array (select) | – | Specific states/provinces |
| `positionTypes` | array (select) | – | Full-Time / Adjunct-Part-Time (empty = both) |
| `institutionTypes` | array (select) | – | Four-Year / Two-Year / Outside Higher Ed (empty = all) |
| `remoteTypes` | array (select) | – | Location Bound / Online-Remote (empty = both) |
| `sortBy` | select | `Date Posted` | Sort order for results |
| `priorityOnly` | bool | `false` | Only emit priority-upgrade listings |
| `jobIds` | array | – | Job codes for `mode=byJobId`, e.g. `179509399` |
| `maxItems` | int | `50` | Hard cap on emitted records (1–2000) |

> **Note:** `search` mode needs at least one filter set — a keyword, category, region, or similar. HigherEdJobs' own search endpoint returns zero listings for a completely blank query (no keyword and no filters), so leave `keyword` set or add another filter to browse broadly.

#### Example: search

```json
{
  "mode": "search",
  "keyword": "professor",
  "jobCategories": ["122"],
  "region": "3",
  "positionTypes": ["1"],
  "maxItems": 50
}
```

#### Example: lookup by job ID

```json
{
  "mode": "byJobId",
  "jobIds": ["179509399", "179514018"]
}
```

### Use cases

- **Higher-ed recruiting intelligence** — track new faculty/admin openings by category or region
- **Career sites / aggregators** — mirror live academic job listings
- **Labor-market research** — analyze hiring trends by institution type or discipline
- **Job alerts** — poll a keyword/category combination on a schedule
- **Salary benchmarking** — collect disclosed salary ranges by category and region

### FAQ

**Do I need an account or cookies?**  No. All search and detail pages used by this actor are publicly accessible without login.

**Why are some jobs missing `salaryText`?**  Many employers don't disclose a salary range; the field is only included when present.

**What's the difference between `region` and `subRegions`?**  `region` is a broad multi-state area (e.g. "US - Southeast"); `subRegions` lets you pick individual states/provinces. Combine them for a state within a specific region, or use `subRegions` alone for state-only filtering.

**What does `isPriority` mean?**  HigherEdJobs lets employers pay to feature a listing; `isPriority` mirrors that on-site badge. It does not affect data completeness.

**How current is the data?**  Real-time — every request hits the live HigherEdJobs search/detail pages, the same ones a job seeker sees in their browser.

**Can `applicationDue` be a date instead of "Open Until Filled"?**  Yes — many listings have a hard deadline; when present it's returned as-is from the listing.

**Why did my run return 0 results even though the filters look fine?**  HigherEdJobs sits behind Incapsula/Imperva bot protection, which occasionally rate-limits or challenges *all* of Apify's shared cloud IP ranges (both the free `AUTO` datacenter proxy group and direct platform egress) at once, not just this actor's traffic — and the search endpoint in particular can stay in an enforcement window for extended periods. The actor already retries up to 6 times with a fresh session (new proxy IP + rotated browser TLS/JA fingerprint) per attempt and backs off aggressively (capped exponential backoff, up to ~25s between attempts) between tries, which recovers most of the time — but during a heavy Incapsula enforcement window every attempt can still fail. If this happens, the actor's status message explicitly says the search endpoint was blocked (as opposed to the generic "try widening filters" message you'd see for a genuinely empty result set), so the failure is never silent or mistaken for a filter problem. Wait a while and re-run `search`, or switch to `mode=byJobId` if you already have job IDs — the detail-page endpoint it hits is far less aggressively guarded and has proven far more reliable.

# Actor input Schema

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

What to fetch.

## `keyword` (type: `string`):

Free-text search across job title, institution, and location (mode=search). Supports "quoted phrases".

## `onlyTitle` (type: `boolean`):

Restrict the keyword search to job titles only, instead of title + institution + location.

## `jobCategories` (type: `array`):

Filter to one or more HigherEdJobs job categories.

## `region` (type: `string`):

Filter to a broad geographic region.

## `subRegions` (type: `array`):

Filter to one or more specific states/provinces (works best combined with a matching Region).

## `positionTypes` (type: `array`):

Full-time and/or adjunct/part-time positions. Leave empty for both.

## `institutionTypes` (type: `array`):

Type of hiring institution. Leave empty for all types.

## `remoteTypes` (type: `array`):

On-location and/or online/remote positions. Leave empty for both.

## `sortBy` (type: `string`):

Sort order for search results.

## `priorityOnly` (type: `boolean`):

Only emit jobs the employer marked as a priority upgrade (mode=search).

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

HigherEdJobs numeric job codes, e.g. `179509399`. Found in the search results or in a job's URL as `JobCode=...`.

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

Datacenter proxy used only as a fallback if higheredjobs.com's anti-bot briefly rate-limits this Actor's IP. Free AUTO group; no residential proxy is used or needed.

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

Hard cap on emitted records (mode=search).

## Actor input object example

```json
{
  "mode": "search",
  "keyword": "professor",
  "onlyTitle": false,
  "jobCategories": [],
  "region": "",
  "subRegions": [],
  "positionTypes": [],
  "institutionTypes": [],
  "remoteTypes": [],
  "sortBy": "1",
  "priorityOnly": false,
  "jobIds": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxItems": 50
}
```

# Actor output Schema

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

Dataset containing all scraped HigherEdJobs 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": "search",
    "keyword": "professor",
    "onlyTitle": false,
    "jobCategories": [],
    "region": "",
    "subRegions": [],
    "positionTypes": [],
    "institutionTypes": [],
    "remoteTypes": [],
    "sortBy": "1",
    "priorityOnly": false,
    "jobIds": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/higheredjobs-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": "search",
    "keyword": "professor",
    "onlyTitle": False,
    "jobCategories": [],
    "region": "",
    "subRegions": [],
    "positionTypes": [],
    "institutionTypes": [],
    "remoteTypes": [],
    "sortBy": "1",
    "priorityOnly": False,
    "jobIds": [],
    "proxyConfiguration": { "useApifyProxy": True },
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/higheredjobs-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": "search",
  "keyword": "professor",
  "onlyTitle": false,
  "jobCategories": [],
  "region": "",
  "subRegions": [],
  "positionTypes": [],
  "institutionTypes": [],
  "remoteTypes": [],
  "sortBy": "1",
  "priorityOnly": false,
  "jobIds": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxItems": 50
}' |
apify call crawlerbros/higheredjobs-scraper --silent --output-dataset

```

## MCP server setup

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