# WA Graduate Outcomes - Earnings, Completion & Remedial (`j0401/wa-graduate-outcomes`) Actor

Washington high-school graduate outcomes (OSPI, public): median earnings after graduation, post-secondary completion, and remedial course rates by district or school. The outcome side of WA school data.

- **URL**: https://apify.com/j0401/wa-graduate-outcomes.md
- **Developed by:** [Wenhao Yang](https://apify.com/j0401) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 wa graduate outcomes records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

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

## WA Graduate Outcomes - Earnings, Completion & Remedial (`wa-graduate-outcomes`)

Pull **Washington high-school graduate outcomes** - from WA OSPI's graduate-outcomes data (**3.4M+ records** across three tables, free public open data): **how much a district's graduates earn** after high school, **whether they complete a post-secondary degree**, and **whether they need remedial (catch-up) college courses**.

This is the **output side of WA's K-12 school system** - what happens to a high school's graduates after they leave. It is the sibling of **[WA School Enrollment](https://apify.com/j0401/wa-school-enrollment)** (`wa-school-enrollment`): enrollment is the *inputs* (who is coming into the district), this is the *outcomes* (how their graduates do). Both come from WA OSPI, both use the **same district / school codes**, so a real-estate or education buyer can pull the full school-quality picture for one district - headcounts and demographics, then the graduate results behind them.

Built for **real-estate developers and brokers sizing an area**, **education startups building a Washington district/school list**, **municipal and policy researchers**, and **parents comparing high schools** - anyone who wants a district's graduate results, not just its headcount.

### The core tool: a district's (or school's) graduate outcomes

Give a district or school, get its outcome rows across the metric you choose:

```
input { "districtCode": "31002", "metric": "earnings" }      // Everett
  Cascade High School   Bachelor's or Higher  4 yrs out   $43,300 median
  Cascade High School   Associate/Certificate 4 yrs out   $37,800 median  (202 grads)
  ...
input { "schoolName": "Ballard High School", "metric": "completion" }
  Ballard High School   cohort 2018  Bachelor's or Higher  6 yrs out   0.53  (53% earned a degree)
input { "schoolName": "Ballard High School", "metric": "remedial" }   // catch-up rates
  Ballard High School   cohort 2024  2-Year/CTC  both subjects   0.25  (25%)
```

**One run = a whole cohort's outcomes**, by year after graduation, by highest achievement (earnings) or degree type (completion) or subject (remedial).

### What each record has

| Field | Meaning |
|---|---|
| `metric` | `earnings` / `completion` / `remedial` (which table) |
| `organizationLevel` | `School Dist` (school-granular) / `County` / `Statewide` /  |
| `districtCode` / `districtName` | WA school district (same code as the enrollment actor) |
| `schoolCode` / `schoolName` | The high school (school-granular rows) |
| `target` | Earnings: highest achievement (HS Diploma / Associate-Cert / Bachelor's+); Completion: degree type |
| `metric` | In each output row this is the **observation point**, not the table name: Earnings = years after graduation (`1``15`); Completion / Remedial = the graduating cohort year. The `metric` *input* selects the table |
| `medianEarnings` / `medianHours` | Earnings: median wage + hours worked in the metric year |
| `pct` | Completion / remedial: the rate, as a decimal (`0.34` = 34%) |
| `pctGroup` | Completion / remedial: suppression bucket (`0-2`, for very small cohorts) |
| `cohort` / `cohorttype` | Completion: graduating year + 1yr/3yr observation window |
| `level` / `subject` | Remedial: enrollment level (2-year/4-year) + subject (English / Math / Both) |
| `numRecords` | Earnings: number of graduates behind the median |

### Typical questions it answers

- **Do this district's graduates earn well?** - `districtCode` + `metric=earnings` (median by years-out and achievement).
- **Does a high school send kids to college who finish?** - `schoolName` + `metric=completion`.
- **How much remediation do a school's college-bound need?** - `metric=remedial`.
- **Which district's schools score best on outcomes?** - `aggregate=true` + `groupBy=school` for an overview.
- **Compare a district to its county** - `districtCode` vs `county` rollup.

### Inputs (all optional)

| Input | What it does |
|---|---|
| `districtCode` / `districtName` | Target a school district (its high schools' rows) |
| `schoolName` | Target one high school (substring) |
| `county` | County-wide rollup layer |
| `metric` | `earnings` (default) / `completion` / `remedial` |
| `highestAchievement` | Earnings: HS Diploma / Associate-Cert / Bachelor's+ |
| `demotype` | Student group (All Students default / Gender / Race / FRPL / GPA) |
| `aggregate` / `groupBy` | One row per school (or district) instead of outcome rows |
| `maxResults` | Cap records pushed (default 200) |

**Empty input** returns a safe snapshot: the districts present in the earnings table, largest first (also the daily-quality-test default).

### Low cost

**From $0.001 per record** - with a per-run charge cap so a mistake can't run up a big bill.

OSPI pre-aggregates outcomes into **pivot tables that hide fake "schools"** - synthetic rows whose codes read `9999` ("District Wide") or a literal `NULL` ("Statewide Comparison") sit alongside real high schools and would be billed and ranked as schools by a naive pull. We strip those merge-rows out of both raw results and roll-ups, and read the suppression buckets (`redactedPct` = the state hides small cohorts behind a `0-2` text band) for what they are. You query one outcomes surface across all three large tables (229k earnings / 2.5M completion / 623k remedial rows); the synthetic-school stripping and suppression buckets stay on our side.

### Data source & freshness

- **Source**: [data.wa.gov - WA OSPI Graduate Outcomes](https://data.wa.gov/) (`39uh-rsgs` Earnings, `udag-wz3k` Post-Secondary Completion, `y8qh-965v` Remedial Coursetaking; Socrata SODA API, free public, no login). Pre-aggregated - no individual student records.
- **Coverage**: 229,206 earnings rows across ~542 WA high schools + county/statewide rollups; completion cohorts 2005-2022; remedial through the 2024 cohort.
- **Update cadence**: OSPI refreshes annually as each new graduating cohort's outcomes are reported.

# Actor input Schema

## `districtCode` (type: `string`):

Exact WA school-district code, e.g. "31002" (Everett) or "17001" (Seattle). Returns that district's high-school graduate-outcome rows.

## `districtName` (type: `string`):

District name, substring, case-insensitive. E.g. "Everett", "Seattle School District".

## `schoolName` (type: `string`):

High-school name, substring. E.g. "Ballard High School", "Cascade High School". Returns that school's graduate-outcome rows.

## `county` (type: `string`):

County name, e.g. "King". Returns the county-wide graduate-outcome rollup.

## `metric` (type: `string`):

earnings = median earnings 1-15 years after graduation (by highest achievement). completion = post-secondary completion rates by graduating cohort. remedial = college remedial (catch-up) course rates.

## `highestAchievement` (type: `string`):

Earnings only: filter to graduates whose highest attainment is this. Blank = all levels (each level row is separate).

## `demotype` (type: `string`):

Which group's outcomes to show. Earnings: All Students / Gender / Race-Ethnicity / FRPL / GPA. Blank = All Students.

## `aggregate` (type: `boolean`):

When on, returns one summary row per school (or district) present in the chosen metric - a compact overview of which schools have outcome data. Computed server-side.

## `groupBy` (type: `string`):

school = one row per high school; lea = one row per school district.

## `maxResults` (type: `integer`):

Cap the number of records pushed (0 = a reasonable ceiling). A district's full outcome rows can reach a few hundred; an aggregate has at most ~540 schools.

## Actor input object example

```json
{
  "metric": "earnings",
  "aggregate": false,
  "groupBy": "school",
  "maxResults": 200
}
```

# Actor output Schema

## `recordsUrl` (type: `string`):

Washington graduate-outcome records - as JSON

## `datasetUrl` (type: `string`):

No description

## `runUrl` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("j0401/wa-graduate-outcomes").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("j0401/wa-graduate-outcomes").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call j0401/wa-graduate-outcomes --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,j0401/wa-graduate-outcomes"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/0QVbBE5V63yjqvT80/builds/V0JRDixrlsczXWxOZ/openapi.json
