# K-12 Public School Directory Scraper (`jungle_synthesizer/k12-school-staff-directory-scraper`) Actor

Scrape the NCES public-school directory for every U.S. K-12 school. Returns NCES IDs, addresses, phones, websites, district linkage, enrollment, teacher FTE, student/teacher ratio, free-lunch counts, and demographics. Filter by state and grade level.

- **URL**: https://apify.com/jungle\_synthesizer/k12-school-staff-directory-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation, Education, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

## NCES K-12 Public School Directory Scraper

Scrapes the [NCES Common Core of Data](https://nces.ed.gov/ccd/schoolsearch/) — the federal directory of every U.S. public K-12 school. Returns NCES IDs, addresses, phone numbers, school websites, district linkage, enrollment counts, FTE teacher counts, student/teacher ratios, free/reduced-lunch eligibility, and demographic breakdowns for ~98,000 schools across 50 states plus DC, BIE, DoDEA, and territories.

---

### NCES K-12 Scraper Features

- Pulls the full structured record per school — 32 fields including NCES School ID, NCES District ID, mailing address, phone, website, enrollment, teacher FTE
- Filters by state (any subset of 57 jurisdictions including BIE and DoDEA) and grade level (elementary, middle, high, or all)
- Filters by school type — regular, special education, vocational/technical, or alternative
- Returns free-lunch eligibility, reduced-price lunch counts, and direct-certification (SNAP-linked) counts where reported
- Includes per-grade enrollment, gender split, and seven-category race/ethnicity breakdowns
- Links each school to its parent district with both NCES LEAID and the district detail URL
- Caps result count with `maxItems` so you can pull a sample without paying for a full national crawl
- No proxy required — federal public data, served straight from NCES

---

### Who Uses K-12 School Directory Data?

- **EdTech sales teams** — build account lists by state, district size, or Title I demographics, then route to the right rep
- **Curriculum vendors** — qualify schools by grade band and enrollment before sending the demo email
- **Education researchers** — assemble study cohorts, compute district-level summaries, or join NCES data to external sources
- **Grant writers** — pull free-lunch eligibility counts to qualify schools for ESSA Title I, II, IV programs (NCES is the citation source)
- **Civic data journalists** — query enrollment trends and school-type distributions without learning the IPEDS download portal
- **State agency analysts** — verify directory data, build comparison sets, or feed public dashboards

---

### How the K-12 Scraper Works

1. You pick states, school types, and a grade band. The defaults cover all U.S. states and territories with no grade filter, capped at 15 records.
2. The scraper queries the NCES School Locator listing endpoint for each state, paginates through results 15 per page, and enqueues each school's detail page.
3. Each detail page is parsed for the labeled directory fields, district linkage, enrollment characteristics, and the demographic tables. Records are saved as flat JSON, one per school.

---

### Input

```json
{
  "states": ["06", "48"],
  "schoolTypes": ["1"],
  "gradeLevel": "all",
  "maxItems": 100
}
````

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `states` | Array of strings | `[]` (all states) | FIPS state codes. e.g. `"06"` California, `"36"` New York, `"48"` Texas. Leave empty for a national crawl. |
| `schoolTypes` | Array of strings | `["1","2","3","4"]` | NCES school types to include. `1` = Regular, `2` = Special Education, `3` = Vocational/Technical, `4` = Other/Alternative. |
| `gradeLevel` | String | `"all"` | Grade band. `"all"`, `"elementary"`, `"middle"`, or `"high"`. Filters using NCES's IncGrade form parameter. |
| `maxItems` | Integer | `15` | Maximum number of school records to return. Default is conservative; raise for production runs. |
| `maxListingPagesPerState` | Integer | `0` (no cap) | Cap on listing pages crawled per state. Each page returns 15 schools. Use to bound crawl size. |

#### One State, Just High Schools

```json
{
  "states": ["36"],
  "schoolTypes": ["1"],
  "gradeLevel": "high",
  "maxItems": 500
}
```

#### National Sample

```json
{
  "states": [],
  "maxItems": 1000
}
```

#### Charter / Alternative Schools in California

```json
{
  "states": ["06"],
  "schoolTypes": ["4"],
  "maxItems": 250
}
```

***

### NCES K-12 Scraper Output Fields

```json
{
  "school_name": "A. E. Arnold Elementary",
  "school_nces_id": "061044001166",
  "state_school_id": "CA-3066480-6027767",
  "school_type": "Regular school",
  "school_status": "Open",
  "charter": "No",
  "district_name": "Cypress Elementary",
  "district_nces_id": "0610440",
  "state_district_id": "CA-3066480",
  "district_url": "https://nces.ed.gov/ccd/districtsearch/district_detail.asp?Search=2&details=1&ID2=0610440&DistrictID=0610440",
  "grade_span": "KG - 6",
  "grade_low": "KG",
  "grade_high": "6",
  "address_mailing": "9281 Denni St.",
  "city": "Cypress",
  "state": "CA",
  "zip": "90630-2724",
  "county": "Orange County",
  "locale": "City, Small (13)",
  "phone": "(714)220-6965",
  "website": "http://ar.cypsd.org/",
  "enrollment_total": 560,
  "teachers_fte": 23,
  "student_teacher_ratio": 24.35,
  "free_lunch_eligible": 225,
  "reduced_lunch_eligible": 72,
  "free_reduced_lunch_total": 297,
  "free_lunch_direct_cert": 164,
  "enrollment_by_grade": "KG=100; 1=69; 2=70; 3=77; 4=75; 5=74; 6=95",
  "enrollment_male": 266,
  "enrollment_female": 294,
  "enrollment_by_race": "American Indian/Alaska Native=1; Asian=162; Black=21; Hispanic=215; White=125; Native Hawaiian/Pacific Islander=2; Two or More Races=34",
  "data_year": "2024-2025",
  "detail_url": "https://nces.ed.gov/ccd/schoolsearch/school_detail.asp?...&ID=061044001166",
  "scraped_at": "2026-04-28T01:24:00.000Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| `school_name` | String | Full school name as published by NCES |
| `school_nces_id` | String | 12-digit NCES School ID (national unique key) |
| `state_school_id` | String | State-assigned school identifier |
| `school_type` | String | Regular, Special Education, Vocational/Technical, or Other/Alternative |
| `school_status` | String | Open, Closed, New, Reopened, Future, or Inactive |
| `charter` | String | `"Yes"` or `"No"` |
| `district_name` | String | Local Education Agency (district) name |
| `district_nces_id` | String | 7-digit NCES District ID (LEAID) |
| `state_district_id` | String | State-assigned district identifier |
| `district_url` | String | URL to the NCES district detail page |
| `grade_span` | String | Grade span as shown on NCES (e.g. `"KG - 5"`, `"6 - 8"`, `"9 - 12"`) |
| `grade_low` | String | Lowest grade served |
| `grade_high` | String | Highest grade served |
| `address_mailing` | String | Street line of the mailing address |
| `city` | String | City |
| `state` | String | Two-letter state postal code |
| `zip` | String | ZIP or ZIP+4 |
| `county` | String | County name |
| `locale` | String | NCES urbanicity code + label (e.g. `"City, Midsize (12)"`) |
| `phone` | String | Main phone number |
| `website` | String | Official school website URL where district publishes one |
| `enrollment_total` | Number | Total enrolled students |
| `teachers_fte` | Number | Full-time-equivalent classroom teachers |
| `student_teacher_ratio` | Number | Student-to-teacher ratio |
| `free_lunch_eligible` | Number | Students eligible for free lunch under NSLP |
| `reduced_lunch_eligible` | Number | Students eligible for reduced-price lunch |
| `free_reduced_lunch_total` | Number | Combined free + reduced-price lunch eligible |
| `free_lunch_direct_cert` | Number | Free-lunch eligible by Direct Certification (SNAP-linked) |
| `enrollment_by_grade` | String | Per-grade counts as `"Grade=Count"` pairs joined with `"; "` |
| `enrollment_male` | Number | Male student count |
| `enrollment_female` | Number | Female student count |
| `enrollment_by_race` | String | Race/ethnicity counts as `"Group=Count"` pairs joined with `"; "` |
| `data_year` | String | School year of the source data (e.g. `"2024-2025"`) |
| `detail_url` | String | URL to the NCES school detail page |
| `scraped_at` | String | ISO 8601 timestamp when the record was extracted |

Numeric fields are `null` when NCES marks the value as missing (`–`) or not applicable (`†`). Title I and Magnet status fields aren't returned because NCES dropped them from CCD starting school year 2022-23.

***

### FAQ

#### How do I scrape NCES school directory data?

The NCES K-12 Scraper handles it for you. Pick the states, school types, and grade level you want, then let it run. The actor walks the public CCD School Locator pages and returns one structured JSON record per school — no scraping logic to write, no NCES bulk download to wrangle.

#### How much does it cost to run?

Each run has a $0.10 start fee plus $0.001 per school record. A full California crawl (~10,000 schools) costs about $10.10. A 1,000-school national sample runs about $1.10. Pricing is the same across states.

#### Can I filter to charter schools or by Title I status?

You can filter by school type (`schoolTypes: ["4"]` for Other/Alternative, which includes most charters) and by grade band. Title I status itself isn't available — NCES removed it from CCD starting school year 2022-23, and the page now points users to the [ED Data Express](https://eddataexpress.ed.gov/) site for that field. The free-lunch counts returned here are usually a better proxy for need-based qualification anyway.

#### Does the scraper need proxies?

The NCES K-12 Scraper does not need proxies. NCES is a public federal site with no anti-bot protection. The actor crawls at a polite concurrency of 8 and respects rate limits.

#### How current is the data?

NCES publishes one school year of CCD data at a time. The current release is school year 2024-2025, included in the `data_year` field on every record. NCES updates annually around late spring.

#### Can I get superintendent or principal emails?

Not from this actor. NCES doesn't publish individual staff contacts — only the school's main phone, address, and website. For superintendent or principal emails you'd need to scrape each district's own site, which uses dozens of different content management systems and is its own project.

***

### Need More Features?

Need additional fields, district-level rollups, or per-district staff scraping? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use the NCES K-12 Scraper?

- **Authoritative source** — pulls from the federal CCD release, the same dataset every state agency and education researcher already cites
- **Real demographics** — returns per-grade enrollment, gender split, race/ethnicity breakdowns, and NSLP eligibility counts in the same record as the directory fields, which is more than most directory scrapers bother with
- **Affordable** — $0.10 per run plus $0.001 per record. A million-school national crawl would cost about $98, if anyone needed that

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

## `states` (type: `array`):

U.S. state(s) to crawl. Leave empty to crawl all states (warning: ~98k schools nationally).

## `schoolTypes` (type: `array`):

Which school types to include. Defaults to all four.

## `gradeLevel` (type: `string`):

Filter by grade band. 'all' returns every grade level.

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

Maximum number of school records to return. Cap kept low so a single run finishes within Apify's 5-minute tester timeout. Increase explicitly for larger crawls.

## `maxListingPagesPerState` (type: `integer`):

Cap on listing pages crawled per state (each page has 15 schools). 0 = no cap. Use this to bound crawl size when running multiple states.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "states": [
    "06",
    "48"
  ],
  "schoolTypes": [
    "1",
    "2",
    "3",
    "4"
  ],
  "gradeLevel": "all",
  "maxItems": 15,
  "maxListingPagesPerState": 0
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "states": [
        "06",
        "48"
    ],
    "schoolTypes": [
        "1",
        "2",
        "3",
        "4"
    ],
    "maxItems": 15,
    "maxListingPagesPerState": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/k12-school-staff-directory-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "states": [
        "06",
        "48",
    ],
    "schoolTypes": [
        "1",
        "2",
        "3",
        "4",
    ],
    "maxItems": 15,
    "maxListingPagesPerState": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/k12-school-staff-directory-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "states": [
    "06",
    "48"
  ],
  "schoolTypes": [
    "1",
    "2",
    "3",
    "4"
  ],
  "maxItems": 15,
  "maxListingPagesPerState": 0
}' |
apify call jungle_synthesizer/k12-school-staff-directory-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "K-12 Public School Directory Scraper",
        "description": "Scrape the NCES public-school directory for every U.S. K-12 school. Returns NCES IDs, addresses, phones, websites, district linkage, enrollment, teacher FTE, student/teacher ratio, free-lunch counts, and demographics. Filter by state and grade level.",
        "version": "1.0",
        "x-build-id": "RoQwFnMeipuw6aetK"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~k12-school-staff-directory-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-k12-school-staff-directory-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/jungle_synthesizer~k12-school-staff-directory-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-k12-school-staff-directory-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/jungle_synthesizer~k12-school-staff-directory-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-k12-school-staff-directory-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": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "states": {
                        "title": "States",
                        "type": "array",
                        "description": "U.S. state(s) to crawl. Leave empty to crawl all states (warning: ~98k schools nationally).",
                        "items": {
                            "type": "string",
                            "enum": [
                                "01",
                                "02",
                                "04",
                                "05",
                                "06",
                                "08",
                                "09",
                                "10",
                                "11",
                                "12",
                                "13",
                                "15",
                                "16",
                                "17",
                                "18",
                                "19",
                                "20",
                                "21",
                                "22",
                                "23",
                                "24",
                                "25",
                                "26",
                                "27",
                                "28",
                                "29",
                                "30",
                                "31",
                                "32",
                                "33",
                                "34",
                                "35",
                                "36",
                                "37",
                                "38",
                                "39",
                                "40",
                                "41",
                                "42",
                                "44",
                                "45",
                                "46",
                                "47",
                                "48",
                                "49",
                                "50",
                                "51",
                                "53",
                                "54",
                                "55",
                                "56",
                                "60",
                                "59",
                                "63",
                                "66",
                                "69",
                                "72",
                                "78"
                            ],
                            "enumTitles": [
                                "Alabama",
                                "Alaska",
                                "Arizona",
                                "Arkansas",
                                "California",
                                "Colorado",
                                "Connecticut",
                                "Delaware",
                                "District of Columbia",
                                "Florida",
                                "Georgia",
                                "Hawaii",
                                "Idaho",
                                "Illinois",
                                "Indiana",
                                "Iowa",
                                "Kansas",
                                "Kentucky",
                                "Louisiana",
                                "Maine",
                                "Maryland",
                                "Massachusetts",
                                "Michigan",
                                "Minnesota",
                                "Mississippi",
                                "Missouri",
                                "Montana",
                                "Nebraska",
                                "Nevada",
                                "New Hampshire",
                                "New Jersey",
                                "New Mexico",
                                "New York",
                                "North Carolina",
                                "North Dakota",
                                "Ohio",
                                "Oklahoma",
                                "Oregon",
                                "Pennsylvania",
                                "Rhode Island",
                                "South Carolina",
                                "South Dakota",
                                "Tennessee",
                                "Texas",
                                "Utah",
                                "Vermont",
                                "Virginia",
                                "Washington",
                                "West Virginia",
                                "Wisconsin",
                                "Wyoming",
                                "American Samoa",
                                "Bureau of Indian Education",
                                "Department of Defense",
                                "Guam",
                                "Northern Mariana Islands",
                                "Puerto Rico",
                                "Virgin Islands"
                            ]
                        },
                        "default": []
                    },
                    "schoolTypes": {
                        "title": "School Types",
                        "type": "array",
                        "description": "Which school types to include. Defaults to all four.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4"
                            ],
                            "enumTitles": [
                                "Regular school",
                                "Special education school",
                                "Vocational/Technical school",
                                "Other / Alternative school"
                            ]
                        },
                        "default": [
                            "1",
                            "2",
                            "3",
                            "4"
                        ]
                    },
                    "gradeLevel": {
                        "title": "Grade Level",
                        "enum": [
                            "all",
                            "elementary",
                            "middle",
                            "high"
                        ],
                        "type": "string",
                        "description": "Filter by grade band. 'all' returns every grade level.",
                        "default": "all"
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of school records to return. Cap kept low so a single run finishes within Apify's 5-minute tester timeout. Increase explicitly for larger crawls.",
                        "default": 15
                    },
                    "maxListingPagesPerState": {
                        "title": "Max Listing Pages Per State",
                        "type": "integer",
                        "description": "Cap on listing pages crawled per state (each page has 15 schools). 0 = no cap. Use this to bound crawl size when running multiple states.",
                        "default": 0
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
