# HigherEdJobs Scraper: Academic Job Monitor (`getascraper/higheredjobs-com-scraper`) Actor

HigherEdJobs scraper for source-backed academic job listings, salary fields, departments, institutions, filters, deduplication, and NEW, UPDATED, EXPIRED, or REAPPEARED monitoring events. Failed requests stay visible.

- **URL**: https://apify.com/getascraper/higheredjobs-com-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 13 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.12 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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: Academic Jobs, Salaries and New-Job Monitoring

Get source-backed academic job listings, published salary fields, department and institution context, and optional change-only monitoring for scheduled workflows.

HigherEdJobs (higheredjobs.com) publishes academic and administrative vacancies. This Actor reads public search and detail pages, preserves source URLs and retrieval timestamps, and omits fields that are not published by the source.

### 🔍 What does HigherEdJobs Scraper do?

The Actor crawls vacancy feeds on HigherEdJobs, converting academic postings and structural data scripts into clean, machine-readable datasets. It is optimized to use Apify's advanced platform capabilities:

- **API-First Search**: Automatically queries the server's backend ColdFusion search index directly. This retrieves the entire matching vacancy index in seconds with zero browser overhead and zero pagination requests.
- **Academic Discipline Mapping**: Captures structured categories and disciplines (e.g. computer science, nursing, faculty) to easily filter and segment records.
- **Robust JSON-LD Cleaning**: HigherEdJobs embeds custom Schema.org `JobPosting` JSON-LD blocks containing trailing syntax bugs. This Actor cleans and decodes the description HTML, ensuring extremely high data stability.
- **Deduplicated Academic Feeds**: Delivers clean, unique vacancy records complete with institution website profiles and application deadlines.
- **Change feed**: With `onlyNewSinceLastRun`, successful scheduled runs emit `NEW`, `UPDATED`, `REAPPEARED`, and cautious `EXPIRED` events. Unchanged records are omitted.

### 👥 Who is this for

- **I am an academic recruiter** looking to source postdoctoral fellows, tenure-track faculty, and administrative candidates. I need to filter institutional listings by category, region, or public/private school status.
- **I am a compensation consultant** benchmarking faculty salaries and tenure requirements in the US. I need structured, normalized salary ranges across disciplines.
- **I am a career dashboard founder** backfilling my university job board. I need a stable JSON feed with direct application links, remote options, and deduplicated listing records.
- **I am a database administrator** syncing higher education career profiles. I need plain-text job descriptions and application deadlines ready for my databases.

### 🚀 How to use

1. **Configure Search**: Enter optional keywords (e.g. "chemistry") and select a category, institution type, or position type.
2. **Limit Results**: Define `maxItems` to restrict dataset records and manage budgets.
3. **Execute Run**: Click the **Start** button. Once finished, download your structured job records as JSON, CSV, Excel, or HTML.

### ⚙️ Input

| Field | Type | Description | Default |
|---|---|---|---|
| `startUrls` | Array | Optional list of direct search, category, or job detailed URLs to crawl. | `[]` |
| `keyword` | String | Search term for titles or disciplines (e.g. "dean", "physics"). Used when Start URLs is empty. | - |
| `category` | String | Filter by role category (Faculty, Administrative, or Executive). | `"all"` |
| `institutionType` | String | Filter by school type (Public, Private, Community College). | `"all"` |
| `positionType` | String | Filter by Full-Time or Part-Time status. | `"all"` |
| `remoteOnly` | Boolean | If enabled, only listings offering remote work options are included. | `false` |
| `department` | String | Optional source-published department filter. | - |
| `employer` | String | Optional institution name filter. | - |
| `location` | String | Optional city, state, or country filter. | - |
| `onlyNewSinceLastRun` | Boolean | Persist successful scope state and emit change events. | `false` |
| `monitorStateKey` | String | Optional stable key for a recurring monitoring scope. | - |
| `maxItems` | Integer | Maximum number of job records to collect in total. | `100` |
| `includeDescription` | Boolean | Whether to fetch detailed pages for full descriptions and deadlines. | `true` |
| `dateWithinDays` | Integer | Only include vacancies posted within the last N days (0 = any time). | `0` |
| `maxConcurrency` | Integer | Maximum parallel page requests. | `8` |
| `proxyConfiguration` | Object | Proxy routing. Imperva WAF requires keeping proxies enabled. | `{"useApifyProxy": true}` |

### 📦 Output

Every record outputs with the canonical listing URL and company metadata.

**Example row**

```json
{
  "job_id": "179424622",
  "title": "Post Doctoral Fellow 2026 Pool",
  "organization": "Auburn University",
  "url": "https://www.higheredjobs.com/search/details.cfm?JobCode=179424622",
  "city": "Auburn University",
  "state": "AL",
  "country": "US",
  "employment_type": "FULL_TIME",
  "salary_raw": "$45,000 - $70,000 per year",
  "description_text": "Salary Range: USD $45,000.00/Yr. - USD $70,000.00/Yr. Locations: Auburn University, Alabama Job Type: Faculty Position Type: Full-Time Department: AG Administration...",
  "description_html": "<strong>Salary Range:</strong> USD $45,000.00/Yr. - USD $70,000.00/Yr.<br><br><strong>Locations:</strong> Auburn University, Alabama...",
  "post_date": "2026-04-23T09:03:15.547Z",
  "expiry_date": "2027-10-15T23:59:59.900Z",
  "logo_url": "https://images.higheredjobs.com/images/AccountImages/3170_5.jpg",
  "industries": [
    "Academic/Education",
    "Education"
  ],
  "scraped_at": "2026-06-07T07:35:56.989Z"
}
```

You can download the dataset in JSON, HTML, CSV, or Excel from the Apify Console dataset tab.

### Store examples

#### Simple academic search

```json
{ "keyword": "computer science", "maxItems": 25 }
```

#### Batch URL review

```json
{ "startUrls": [{ "url": "https://www.higheredjobs.com/search/details.cfm?JobCode=179424622" }], "includeDescription": true }
```

#### Recurring new-job feed

```json
{ "keyword": "postdoctoral fellow", "onlyNewSinceLastRun": true, "monitorStateKey": "postdoc-fellow-search" }
```

### 📊 Data table

| Field | Type | Description |
|---|---|---|
| `job_id` | String | Unique HigherEdJobs JobCode identifier. |
| `title` | String | Job position title. |
| `organization` | String | Hiring university or institution name. |
| `url` | String | Direct link to the original posting. |
| `city` | String | City where the job is located. |
| `state` | String | State or region code. |
| `country` | String | Country name. |
| `employment_type` | String | Full-Time, Part-Time, or other employment status. |
| `salary_raw` | String | Unstructured listed salary text. |
| `description_html` | String | Sanitized description HTML. |
| `description_text` | String | Plain-text job description content. |
| `post_date` | String | ISO formatted publication date. |
| `expiry_date` | String | ISO formatted application closing date. |
| `logo_url` | String | Hiring organization logo URL. |
| `industries` | Array | List of disciplines and categories tags. |
| `scraped_at` | String | Scraping execution timestamp. |

### 💰 Pricing

The saved-row PPE event uses these current Store tiers: Free $1.49, Bronze $1.37, Silver $1.24, and Gold or above $1.12 per 1,000 rows. Unchanged monitoring runs emit no rows. Failed requests are reported with an error code.

### ⭐ Enjoying HigherEdJobs Scraper?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#F2F6FE;border:1px solid #F2F6FE;border-left:5px solid #2563EB;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">Fill your pipeline with fresh faculty and staff openings from every US college and university in one search.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating takes 10 seconds and helps other academic recruiters find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#2563EB;border:1px solid #F2F6FE;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/higheredjobs-com-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

##### Does it get blocked?

HigherEdJobs is protected by Imperva / Incapsula WAF. This Actor uses Crawlee's normal request handling and Apify Proxy by default; blocked or failed requests are reported instead of silently dropped.

##### Does it extract private university contact details?

No. The scraper only extracts publicly visible academic vacancy data posted by universities, including city and state locations. It does not bypass login walls or click-walls for private recruiter personal contact information.

##### How fresh is the data?

Each run reads the public source at run time. Rows include `retrievedAt` and `scraped_at`; monitoring state is only committed after a healthy run.

### ⚖️ Legal compliance

This Actor only extracts data that is publicly visible on higheredjobs.com. Users must comply with local privacy regulations and the platform's terms of service. HigherEdJobs is a trademark of HigherEdJobs Inc. This is an independent scraping tool and is not affiliated with, endorsed by, or sponsored by HigherEdJobs Inc.

### 🛠️ Support

Open an issue on the Issues tab for bugs, feature requests, or layout additions. We respond within 48 hours.

### 🔗 Other actors

- [EdJoin Scraper](https://apify.com/getascraper/edjoin-scraper) ↗ - collects K-12 teaching, certificated, and classified job listings across California.
- [Job Bank Canada Scraper](https://apify.com/getascraper/jobbank-scraper) ↗ - pulls Canadian federal job postings with salary and LMIA status.
- [HN Who is Hiring Scraper](https://apify.com/getascraper/hn-hiring-scraper) ↗ - extracts structured job postings from Hacker News hiring threads.
- [Goodmoves Jobs Scraper](https://apify.com/getascraper/goodmoves-jobs-scraper) ↗ - gathers purpose-driven and nonprofit job listings.
- [WTTJ Jobs Scraper](https://apify.com/getascraper/welcome-to-the-jungle-jobs-scraper) ↗ - extracts job listings from Welcome to the Jungle as raw JSON or RAG-ready chunks.

# Actor input Schema

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

Optional direct category, search, or detailed job page URLs to scrape. If provided, it overrides custom search filters.

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

Search keyword for position titles, departments, or disciplines (e.g. 'computer science', 'dean', 'physics').

## `category` (type: `string`):

Filter by broad job category (Faculty, Administrative, or Executive positions).

## `institutionType` (type: `string`):

Filter by university or college type (Public, Private, or 2-Year Community Colleges).

## `positionType` (type: `string`):

Filter by Full-Time or Part-Time status.

## `remoteOnly` (type: `boolean`):

If enabled, only listings offering remote work options are included.

## `department` (type: `string`):

Optional source-published department text filter.

## `employer` (type: `string`):

Optional institution name filter.

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

Optional city, state, or country filter.

## `includeDescription` (type: `boolean`):

Whether to include full job descriptions (HTML & plain-text). Slower but richer data.

## `dateWithinDays` (type: `integer`):

Only include academic jobs posted within the last N days (0 = any time).

## `onlyNewSinceLastRun` (type: `boolean`):

Persist source-backed job IDs between successful runs and emit NEW, UPDATED, REAPPEARED, and cautious EXPIRED events. Unchanged jobs are omitted.

## `monitorStateKey` (type: `string`):

Optional stable key for sharing a monitoring scope across scheduled runs. Leave empty to derive it from the search inputs.

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

Maximum number of job postings to scrape in total.

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

Maximum number of parallel requests.

## `maxRequestRetries` (type: `integer`):

Number of times a request will be retried if it fails.

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

Proxy settings. Detail pages are protected by Imperva WAF and require Apify Proxy.

## Actor input object example

```json
{
  "startUrls": [],
  "category": "all",
  "institutionType": "all",
  "positionType": "all",
  "remoteOnly": false,
  "includeDescription": true,
  "dateWithinDays": 0,
  "onlyNewSinceLastRun": false,
  "maxItems": 100,
  "maxConcurrency": 8,
  "maxRequestRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "startUrls": [],
    "keyword": "",
    "category": "all",
    "institutionType": "all",
    "positionType": "all",
    "remoteOnly": false,
    "includeDescription": true,
    "dateWithinDays": 0,
    "onlyNewSinceLastRun": false,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/higheredjobs-com-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 = {
    "startUrls": [],
    "keyword": "",
    "category": "all",
    "institutionType": "all",
    "positionType": "all",
    "remoteOnly": False,
    "includeDescription": True,
    "dateWithinDays": 0,
    "onlyNewSinceLastRun": False,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/higheredjobs-com-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 '{
  "startUrls": [],
  "keyword": "",
  "category": "all",
  "institutionType": "all",
  "positionType": "all",
  "remoteOnly": false,
  "includeDescription": true,
  "dateWithinDays": 0,
  "onlyNewSinceLastRun": false,
  "maxItems": 100
}' |
apify call getascraper/higheredjobs-com-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/9yQdC0vf4jyI7aOjp/builds/R4CAUeImSPZWzycnJ/openapi.json
