# Edjoin Jobs Search Scraper (`alexist/edjoin-jobs-search-scraper`) Actor

Scrape comprehensive education job listings from EdJoin.org with 40+ data fields per posting. Capture salary ranges, district details, application deadlines, and job summaries — perfect for recruiters, HR analysts, and education workforce researchers.

- **URL**: https://apify.com/alexist/edjoin-jobs-search-scraper.md
- **Developed by:** [Alex](https://apify.com/alexist) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## 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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## EdJoin Jobs Scraper: Extract Education Job Listings at Scale
---

### What Is EdJoin.org?

EdJoin.org is the leading online job board for K-12 education careers in the United States. School districts, charter schools, and educational organizations post thousands of teaching, administrative, and support staff positions across all 50 states. Finding and organizing this data manually is inefficient — the **EdJoin Jobs Scraper** automates the extraction, transforming search results into structured, analysis-ready datasets.

---

### Overview

The **EdJoin Jobs Search Scraper** harvests job postings from EdJoin's search results pages, extracting 40+ fields per listing. It is purpose-built for:

- **Education recruiters** tracking district hiring trends and talent availability
- **Job aggregators** building education-focused job boards
- **Researchers** studying K-12 labor markets and compensation patterns
- **Workforce analysts** benchmarking salaries across regions and roles
- **Career advisors** gathering market data for counseling

The scraper handles search result pagination, tolerates network failures gracefully, and delivers clean, structured data ready for databases, spreadsheets, or analytics platforms.

---

### Input Format

Configure the scraper using JSON with three parameters:

```json
{
  "urls": [
    "https://www.edjoin.org/Home/Jobs?rows=10&page=2&sort=postingDate&sortVal=0&order=desc&keywords=&location=&searchType=all&regions=&jobTypes=&days=0&empType=&catID=0&onlineApps=&recruitmentCenterID=0&stateID=0&regionID=0&districtID=0&searchID=0"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
````

| Parameter | Description |
|---|---|
| `urls` | Array of EdJoin job search results pages. Construct URLs using EdJoin's filter parameters: `keywords`, `location`, `jobTypes`, `sort`, `order`, `page`, `rows`, etc. |
| `ignore_url_failures` | Boolean. If `true`, the scraper continues if some URLs fail. If `false`, stops on first error. Recommended: `true` for bulk runs. |
| `max_items_per_url` | Integer. Maximum number of job postings to extract per URL (e.g., `20`, `50`, `100`). Adjust based on search result volume. |

**Example URL construction tips:**

- Use `page=1&rows=50` to fetch 50 results per page
- Add `keywords=teacher` to filter by job title
- Use `stateID=5` to filter by state
- Add `sort=postingDate&order=desc` to sort by newest first

***

### Output Format

**Sample output**

```json
{
  "posting_id": null,
  "position_title": "7TH/8TH GRADE SCIENCE TEACHER - BELLEVUE #200007",
  "salary_info": "CERTIFICATED SALARY SCHEDULE",
  "beginning_salary": null,
  "ending_salary": null,
  "display_flag": "By Date",
  "posting_date": "/Date(1783987200000)/",
  "display_until": "/Date(1784588400000)/",
  "county_name": "Merced",
  "district_name": "Atwater Elementary School District",
  "city": "Atwater",
  "is_recruitment_center": false,
  "zip": null,
  "job_classification": null,
  "number_openings": 0,
  "recruitment_center_id": null,
  "is_admin_job": false,
  "category_name": null,
  "category_id": null,
  "job_type_id": null,
  "county_id": null,
  "account_id": null,
  "posting_information": null,
  "online_app": true,
  "state": 24,
  "state_name": "California",
  "full_county_name": "Merced County, CA   ",
  "job_type": "Teacher - Middle Grades",
  "is_summer_school": false,
  "limit_posting": false,
  "account_type": 0,
  "job_summary": null,
  "portal_url": null,
  "district_logo": null,
  "bookmark": 0,
  "applied": 0,
  "date_start_application": "/Date(-62135568000000)/",
  "app_status": null,
  "full_time_part_time": "Full Time",
  "salary_info_select": "Dependent",
  "pay_range_from": "",
  "pay_range_to": "",
  "pay_range_dropdown": "",
  "single_rate": "",
  "single_rate_dropdown": "",
  "creation_date": "/Date(1784024509517)/",
  "from_url": "https://www.edjoin.org/Home/Jobs?rows=10&page=2&sort=postingDate&sortVal=0&order=desc&keywords=&location=&searchType=all&regions=&jobTypes=&days=0&empType=&catID=0&onlineApps=&recruitmentCenterID=0&stateID=0&regionID=0&districtID=0&searchID=0"
}
```

Each scraped job listing returns a rich record with 42+ fields:

#### Identification & Posting Info

| Field | Description |
|---|---|
| `Posting ID` | Unique identifier for the job posting in EdJoin |
| `Position Title` | Official job title as listed (e.g., "Elementary Teacher") |
| `Job Summary` | Brief text summary of the role and responsibilities |
| `Portal URL` | Direct hyperlink to the full job posting on EdJoin |
| `Posting Information` | Additional posting details or notes |

#### Dates & Application Timeline

| Field | Description |
|---|---|
| `Posting Date` | Date the job was first published on EdJoin |
| `Display Until` | Deadline after which the posting expires from public view |
| `Date Start Application` | Date applications officially open for candidates |
| `Creation Date` | System timestamp when the record was created |

#### Compensation

| Field | Description |
|---|---|
| `Salary Info` | Text description of compensation (e.g., "Based on Experience") |
| `Salary Info Select` | Category type for salary display |
| `Beginning Salary` | Minimum annual salary offered |
| `Ending Salary` | Maximum annual salary offered |
| `Pay Range From` | Lower bound of negotiable salary range |
| `Pay Range To` | Upper bound of negotiable salary range |
| `Pay Range Dropdown` | Classification of salary range type |
| `Single Rate` | Fixed salary if position has no range |
| `Single Rate Dropdown` | Descriptor for fixed-rate compensation |

#### Location & Organization

| Field | Description |
|---|---|
| `City` | City where position is based |
| `County Name` | County of employment |
| `Full County Name` | Complete county name with state |
| `State` | State code (e.g., "CA") |
| `State Name` | Full state name (e.g., "California") |
| `ZIP` | Postal code for the job location |
| `District Name` | School district or organization name |
| `Full Time Part Time` | Employment classification (full-time, part-time, etc.) |

#### Job Classification & Openings

| Field | Description |
|---|---|
| `Job Type` | Position category (teaching, administrative, support) |
| `Job Type ID` | Numeric ID for job type |
| `Job Classification` | Detailed job category or level |
| `Category Name` | Primary subject area or department |
| `Category ID` | Numeric ID for category |
| `Number Openings` | Count of available positions |

#### Application & Eligibility

| Field | Description |
|---|---|
| `Online App` | Whether online applications are accepted (yes/no) |
| `App Status` | Current application status (open, closed, pending) |
| `Applied` | User-specific flag: whether candidate applied to this position |
| `Bookmark` | User-specific flag: whether candidate bookmarked this position |

#### Organization Details

| Field | Description |
|---|---|
| `District Logo` | URL to district or organization logo image |
| `Is Recruitment Center` | Boolean: whether posting is from a recruitment center |
| `Recruitment Center ID` | ID if applicable |
| `Is Admin Job` | Boolean: whether position is administrative |
| `Is Summer School` | Boolean: whether position is for summer session |
| `Account Type` | Type of account that posted the job |
| `Account ID` | Unique ID of posting account |

***

### How to Use

1. **Construct search URLs** — Visit EdJoin.org, filter jobs by keyword, location, salary, or job type, then copy the URL from your browser's address bar.

2. **Add multiple URLs** — Paste one or more URLs into the `urls` array. Each URL should be a complete search results page URL.

3. **Set limits** — Adjust `max_items_per_url` based on result volume. Start with `20` for testing; increase for production runs.

4. **Enable failover** — Set `ignore_url_failures: true` to skip broken links without halting the run.

5. **Execute** — Start the scraper and monitor progress. Download results as JSON, CSV, or Excel.

**Best practices:**

- Use narrow search filters in the URL to reduce volume and improve quality
- Start with a small test run (1–2 URLs) to validate output
- For large-scale scrapes, split across multiple actor runs to minimize timeouts
- Monitor for rate-limiting; add delays between requests if needed

***

### Benefits & Applications

- **Market intelligence:** Track hiring demand across districts, regions, and job categories
- **Salary benchmarking:** Compare compensation by location, experience, and district size
- **Talent pipeline:** Identify emerging skills and qualifications in demand
- **Job board aggregation:** Feed curated education jobs into custom platforms
- **Academic research:** Analyze K-12 labor market trends and workforce composition

The EdJoin Jobs Scraper eliminates weeks of manual data collection, enabling data-driven decisions for hiring, career planning, and workforce strategy.

***

### Conclusion

The **EdJoin Jobs Scraper** is an essential tool for anyone working with education sector hiring data. Whether you're a recruiter tracking district openings, a researcher analyzing K-12 labor markets, or a developer building education platforms, this scraper delivers clean, comprehensive job data at scale. Start scraping today and unlock insights from America's largest education job board.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.edjoin.org/Home/Jobs?rows=10&page=2&sort=postingDate&sortVal=0&order=desc&keywords=&location=&searchType=all&regions=&jobTypes=&days=0&empType=&catID=0&onlineApps=&recruitmentCenterID=0&stateID=0&regionID=0&districtID=0&searchID=0"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.edjoin.org/Home/Jobs?rows=10&page=2&sort=postingDate&sortVal=0&order=desc&keywords=&location=&searchType=all&regions=&jobTypes=&days=0&empType=&catID=0&onlineApps=&recruitmentCenterID=0&stateID=0&regionID=0&districtID=0&searchID=0"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexist/edjoin-jobs-search-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 = {
    "urls": ["https://www.edjoin.org/Home/Jobs?rows=10&page=2&sort=postingDate&sortVal=0&order=desc&keywords=&location=&searchType=all&regions=&jobTypes=&days=0&empType=&catID=0&onlineApps=&recruitmentCenterID=0&stateID=0&regionID=0&districtID=0&searchID=0"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("alexist/edjoin-jobs-search-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 '{
  "urls": [
    "https://www.edjoin.org/Home/Jobs?rows=10&page=2&sort=postingDate&sortVal=0&order=desc&keywords=&location=&searchType=all&regions=&jobTypes=&days=0&empType=&catID=0&onlineApps=&recruitmentCenterID=0&stateID=0&regionID=0&districtID=0&searchID=0"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call alexist/edjoin-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Edjoin Jobs Search Scraper",
        "description": "Scrape comprehensive education job listings from EdJoin.org with 40+ data fields per posting. Capture salary ranges, district details, application deadlines, and job summaries — perfect for recruiters, HR analysts, and education workforce researchers.",
        "version": "0.0",
        "x-build-id": "VN0WF2LPzgPrdMWPg"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/alexist~edjoin-jobs-search-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-alexist-edjoin-jobs-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/alexist~edjoin-jobs-search-scraper/runs": {
            "post": {
                "operationId": "runs-sync-alexist-edjoin-jobs-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/alexist~edjoin-jobs-search-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-alexist-edjoin-jobs-search-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "urls": {
                        "title": "URLs of the Jobs list urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
