# England School & Academy Trust Change Signals (`starshaped_bullsnake/england-school-academy-trust-change-signals`) Actor

Detect material organisation changes between official current and historical DfE GIAS public snapshots.

- **URL**: https://apify.com/starshaped\_bullsnake/england-school-academy-trust-change-signals.md
- **Developed by:** [Starshape Tools](https://apify.com/starshaped_bullsnake) (community)
- **Stats:** 2 total users, 1 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 changed organization signals

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

## England School & Academy Trust Change Signals

Detect what changed in official Department for Education Get Information about Schools (GIAS) public data since your previous successful run.

This Actor covers **England only**. GIAS is the official register for educational establishments in England; Scotland, Wales, and Northern Ireland use separate services. The Actor is a persistent change detector, not a generic school-directory scraper.

### What this Actor does

On a live run it acquires the current public GIAS establishment, group, and SAT/MAT membership downloads, normalizes the fields needed for change detection, compares them with the previous successful snapshot, emits one Dataset record per material signal, and advances the baseline only after output succeeds.

Examples:

- `Capacity increased from 600 to 750`
- `School joined Example Multi Academy Trust`
- `Community school converted to Academy converter`
- `School closed (close date 31/08/2026): Example School`

### Who it is for

- education technology and software suppliers
- facilities, construction, catering, and estates suppliers
- recruitment and staffing providers
- insurance and consulting teams
- academy trust market-intelligence teams
- education-sector sales and CRM operations

### Official data source

Source: [DfE Get Information about Schools public downloads](https://get-information-schools.service.gov.uk/Downloads).

The Actor uses the official public download flow for:

- all establishment records
- all group records
- academy SAT/MAT membership

GIAS public downloads are updated daily. GIAS content is available under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/), except where otherwise stated.

No proxy or browser automation is required. The Actor does not collect governors, trustees, personal email addresses, or login-protected information.

### Signal types

Implemented signals:

- `NEW_SCHOOL`
- `SCHOOL_CLOSED`
- `SCHOOL_OPENED`
- `STATUS_CHANGED`
- `TRUST_CHANGED`
- `ESTABLISHMENT_TYPE_CHANGED`
- `CAPACITY_INCREASED`
- `CAPACITY_DECREASED`
- `ACADEMY_CONVERSION`
- `SCHOOL_NAME_CHANGED`
- `PHASE_CHANGED`
- `ADDRESS_CHANGED`

URN is the primary school key. School names are never used for entity matching. Trust affiliation uses the official trust identifier/name exposed by GIAS and, when needed, unambiguous active SAT/MAT membership rows. The Actor does not guess a trust relationship when the official data is ambiguous.

### First-run baseline behavior

The first live run stores the normalized GIAS snapshot and emits **zero signals**. Existing schools are not returned as `NEW_SCHOOL`.

Expected sequence:

1. first run: baseline, 0 signals
2. same source snapshot: 0 signals
3. later GIAS snapshot with changes: relevant signals
4. rerun against that same snapshot: 0 signals

`baselineOnly: true` deliberately refreshes the complete snapshot without emitting differences.

### Example input

```json
{
  "signalTypes": ["TRUST_CHANGED", "CAPACITY_INCREASED", "SCHOOL_CLOSED"],
  "postcodePrefixes": ["LS", "BD"],
  "minCapacityIncrease": 50,
  "maxItems": 500
}
```

Other filters include school status, establishment type, URN, and trust ID. Filters and `maxItems` affect Dataset output only; the baseline still represents the complete official source.

### Example output

```json
{
  "signalType": "CAPACITY_INCREASED",
  "severity": "HIGH",
  "detectedAt": "2026-09-13T00:00:00.000Z",
  "urn": "100001",
  "schoolName": "Example Academy",
  "schoolStatus": "Open",
  "establishmentType": "Academy converter",
  "phase": "Secondary",
  "trustId": "1234",
  "trustName": "Example Multi Academy Trust",
  "localAuthority": "Leeds",
  "postcode": "LS1 1AA",
  "previousValue": 600,
  "currentValue": 750,
  "previousCapacity": 600,
  "currentCapacity": 750,
  "openDate": "01/09/2020",
  "closeDate": null,
  "signalSummary": "Capacity increased from 600 to 750",
  "sourceUrl": "https://get-information-schools.service.gov.uk/Downloads"
}
```

Each Dataset item represents exactly one signal. A school can therefore produce more than one record on the same source date, for example `STATUS_CHANGED` plus `SCHOOL_CLOSED`.

### Severity

`HIGH` is used for school closure, academy/trust changes, academy conversion, and major capacity changes. Smaller capacity changes, new/opened schools, status changes, and establishment-type changes are generally `MEDIUM`. Name, phase, and address changes are `LOW`.

Severity is deterministic prioritization, not predictive risk scoring.

### Scheduling recommendation

GIAS public downloads are updated daily, so a daily schedule is appropriate. More frequent runs normally see the same source snapshot and emit nothing.

### Data freshness

Freshness is limited by the official GIAS publication cycle. This Actor does not claim real-time monitoring or instant alerts.

### Snapshot safety and idempotency

Processing order is:

`official download → parse/normalize → schema/count validation → diff → Dataset output → summary → baseline commit`

The previous baseline remains authoritative when acquisition, parsing, required-field validation, source-date validation, source-count validation, Dataset output, or summary output fails. A large implausible collapse in school or academy-trust count is rejected instead of being committed.

`maxItems` never truncates the snapshot. Re-running an unchanged official snapshot emits no duplicate signals.

The baseline format remains compatible with earlier versions of this Actor. Capacity comparisons intentionally require a numeric value on both sides, so the first run after adding capacity tracking does not create false capacity signals from an older baseline that did not store capacity.

### Sample mode

`mode: "sample"` runs deterministic in-memory before/after data through the real change logic. It demonstrates trust change, academy conversion, capacity increase/decrease, closure, and a new school without reading or modifying the production baseline.

### Known limitations

- GIAS covers England, not the whole United Kingdom.
- The Actor can only detect changes represented in the official public downloads.
- `SCHOOL_CLOSED` requires explicit official status/close-date evidence. A row disappearing from a snapshot is not automatically labelled as a closure.
- `SCHOOL_OPENED` requires an explicit transition from a closed status or removal of a close date alongside an open status.
- A material correction in GIAS can look the same as a real-world change.
- Cosmetic text normalization reduces, but cannot eliminate, every possible formatting-only metadata change.
- Contact-detail changes are not emitted in this version; the Actor deliberately keeps its signal set focused on organisation-level public fields.

### Compute / storage behavior

Live runs download the three required current GIAS files. A named Apify Key-value Store holds the persistent normalized baseline. The default Dataset contains only change signals. The default Key-value Store receives a `SUMMARY` record with source diagnostics, entity counts, signal counts, source dates, and snapshot status.

# Actor input Schema

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

Use live for official GIAS public data, or sample for a deterministic self-contained demonstration that does not access production baseline state.

## `signalTypes` (type: `array`):

Optional change-type filter. Supported values are documented in the README. The persistent snapshot always remains complete.

## `schoolStatuses` (type: `array`):

Only emit signals whose current GIAS school status matches one of these values.

## `establishmentTypes` (type: `array`):

Only emit signals whose current establishment type matches one of these values.

## `postcodePrefixes` (type: `array`):

Only emit signals for England postcodes beginning with one of these prefixes.

## `urns` (type: `array`):

Only emit signals for these official school URNs.

## `trustIds` (type: `array`):

Only emit signals for these GIAS academy-trust identifiers.

## `minCapacityIncrease` (type: `integer`):

Minimum absolute increase required for CAPACITY\_INCREASED output.

## `minCapacityDecrease` (type: `integer`):

Minimum absolute decrease required for CAPACITY\_DECREASED output.

## `baselineOnly` (type: `boolean`):

Refresh the complete official snapshot without emitting differences.

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

Limits Dataset output only. It never truncates the source snapshot.

## `maxSignals` (type: `integer`):

Backward-compatible alias used only when maxItems is not provided.

## `includeSchools` (type: `boolean`):

When false, only trust/academy-conversion signals are eligible for output.

## `includeAcademyTrusts` (type: `boolean`):

Controls TRUST\_CHANGED and ACADEMY\_CONVERSION output.

## Actor input object example

```json
{
  "mode": "live",
  "minCapacityIncrease": 1,
  "minCapacityDecrease": 1,
  "baselineOnly": false,
  "maxItems": 100,
  "includeSchools": true,
  "includeAcademyTrusts": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (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("starshaped_bullsnake/england-school-academy-trust-change-signals").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("starshaped_bullsnake/england-school-academy-trust-change-signals").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 starshaped_bullsnake/england-school-academy-trust-change-signals --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,starshaped_bullsnake/england-school-academy-trust-change-signals"
        }
    }
}
```

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/Sb2NL3r456bgjTzUm/builds/iSI8vPfA37hxRjPMA/openapi.json
