Ofsted Inspections Scraper (England Schools & Childcare)
Pricing
from $5.00 / 1,000 provider record delivereds
Ofsted Inspections Scraper (England Schools & Childcare)
Search and monitor England's public Ofsted inspection register. Get normalized provider records (URN, provider, type, overall grade, inspection date, report URL) by keyword, postcode, local authority or URN, and only new or changed providers in monitor mode.
Pricing
from $5.00 / 1,000 provider record delivereds
Rating
0.0
(0)
Developer
Steadfetch
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share
Apify Actor by Steadfetch: search and monitor England's public Ofsted inspection register, with normalized records and only new-or-changed results in monitor mode.
What it does
- Searches Ofsted's public inspection register (reports.ofsted.gov.uk) by keyword, postcode, local-authority code or Ofsted URN.
- Returns one normalized dataset item per provider: URN, provider name, provider category/type, overall grade, inspection date, report URL, and English postal county. Missing grade, date and county are returned as
null-- never inferred. - Filters results by provider category using
providerTypes(case-insensitive match). - Handles the national result pagination for you: it follows the site's own "next page" links until
maxResultsis reached. - Monitor mode: delivers only providers that are new or whose grade, inspection date, category or address changed since the previous run for the same Apify user. A quiet run pushes no results.
- Daily captures: every run uploads the full result set to S3 at
qa/ofsted/<date>/so the QA team can inspect what was returned. Best-effort -- missing S3 credentials never fail the Actor. - Validates every item against the dataset schema in
.actor/dataset_schema.jsonbefore it reaches the dataset. WithstrictSchema: true(the default) invalid data fails the run instead of being published. - Reads public register metadata only: no report bodies, staff names, parent letters or personal data. No login, paywall, CAPTCHA or anti-bot bypass.
How to use
Run it from the Apify Console or with the CLI:
$apify call steadfetch/ofsted-inspection-monitor --input='{"query":"primary school","maxResults":10}'
Then read the run's default dataset (JSON, CSV or the API).
Input fields
| Field | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
urns | array of strings | No | [] | Look up specific providers by Ofsted URN. Exact matches only. | ["140696"] |
query | string | No | "primary school" | Free-text search: name, URN or keyword. | "primary school" |
postcode | string | No | - | Search around a UK postcode or place name. | "SW1A 1AA" |
localAuthority | string | No | - | Numeric Ofsted local-authority code (from the site's Local Authority filter). | "202" |
providerTypes | array of strings | No | [] | Case-insensitive category filter (for example Primary, Independent School). Leave empty for all types. | ["Primary", "Nursery"] |
monitorMode | boolean | No | false | Deliver only new or changed providers and bill one monitor-check per provider checked. | true |
knownState | object | No | {} | Optional monitor seed. Empty keeps the state saved for your Apify user. | {} |
maxResults | integer | No | 100 | Maximum providers delivered to the dataset. | 100 |
strictSchema | boolean | No | true | Fail the run when an item does not match the output schema. Keep enabled. | true |
Provide at least one of urns, query, postcode or localAuthority. URN lookups take precedence over the other selectors.
Example input
Matches the declared exampleRunInput exactly:
{"query": "primary school","maxResults": 10}
Output
Example output
{"url": "https://reports.ofsted.gov.uk/provider/21/140696","title": "Ab Kettleby Primary School","scrapedAt": "2026-10-26T09:00:00.000Z","urn": "140696","provider": "Ab Kettleby Primary School","providerType": "Primary","providerTypeCode": "21","address": "Wartnaby Road, Ab Kettleby, Melton Mowbray, Leicestershire, LE14 3JJ","grade": "Good","inspectionDate": "2023-01-27","reportUrl": "https://reports.ofsted.gov.uk/provider/21/140696","sourceUrl": "https://reports.ofsted.gov.uk/search?q=primary+school","postalCounty": "Leicestershire","lad": null,"ons_code": null}
In monitor mode each emitted item also carries changeType (new or updated) and changedFields.
Output fields
| Field | Type | Description |
|---|---|---|
url | string | Report URL (common Steadfetch envelope, required). |
title | string | null | Provider name from the result block. |
scrapedAt | date-time | ISO 8601 UTC timestamp of the run (common envelope, required). |
urn | string | Ofsted Unique Reference Number (required). |
provider | string | Provider name; falls back to the URN when the source does not declare one (required). |
providerType | string | null | Ofsted category shown on the result block. |
providerTypeCode | string | null | Provider type segment of the report URL. |
address | string | null | Provider postal address. |
grade | string | null | Latest overall grade, or null when the block does not declare one. |
inspectionDate | date | null | Latest report date, ISO 8601, or null. |
reportUrl | string | Official Ofsted provider report page. |
sourceUrl | string | Search URL the provider was found on. |
postalCounty | string | null | English postal county extracted from the address (the word immediately before the postcode). |
lad | string | null | Local Authority derived from the address. Null -- not published by Ofsted on the result page. |
ons_code | string | null | ONS code for the Local Authority. Placeholder -- null until a lookup is implemented. |
changeType | string | null | Monitor mode only: new or updated. |
changedFields | array | Monitor mode only: fields that changed since the previous run. |
New fields are additive and required fields never change, so downstream code can rely on url, scrapedAt, urn and provider.
Pricing
Pay-per-event with the Apify synthetic events plus the reserved monitor event:
apify-actor-startat 0.00005 USD per run (Apify-recommended default, includes the first 5 seconds of compute).apify-default-dataset-itemat 5 USD per 1,000 results. Every delivered provider is one result; unchanged checks in monitor mode deliver nothing and cost nothing.monitor-checkat 0.40 USD per 1,000 checks, charged once per provider actually checked in a monitor run, including checks where nothing changed. Extract runs never charge it.
There is no custom per-result event, so users are never billed twice for the same record.
Works on the Apify free plan: at 0.005 USD per result, the 5 USD monthly credit covers roughly 1,000 delivered providers, minus the negligible run-start charge.
Data attribution: contains public sector information licensed under the Open Government Licence v3.0. (c) Crown copyright. Each row carries the reportUrl and sourceUrl it came from.
FAQ
Does the Actor need a login or paid subscription to Ofsted? No. It only reads public inspection register pages.
Why no browser? The Ofsted search is server-rendered HTML, so HTTP + Cheerio is roughly 10x cheaper and faster than a browser. No JavaScript rendering is required.
When am I charged? Once per run start (apify-actor-start), once per delivered provider (apify-default-dataset-item) and, in monitor mode only, once per provider checked (monitor-check). Failed runs that deliver no results only incur the start event.
Does it return people's names? No. Only public register metadata about the provider (institution) is emitted. Report bodies, staff names and parent letters are never read or returned.
What happens if a provider has no published grade? The record is still returned with grade: null and inspectionDate: null. The Actor never invents values.
Is the output schema stable? Yes. New fields are added additively and required fields never change.
Support
Report bugs or request features through the Apify Store page (Issues tab) of this Actor, or through the Steadfetch actors repository issues. Include the run ID and the input used.
Maintenance
This Actor is tested daily in the Steadfetch catalog QA, and every change passes npm test (lint, typecheck, Vitest) plus the shared publish gate before publication. The source's robots file is checked before every change; the Actor only requests /search, never the disallowed /unsubscribe/ or /subscribe/validate/ paths.