Ofsted Reports Data Scraper
Pricing
from $10.00 / 1,000 results
Ofsted Reports Data Scraper
Turn Ofsted children's home inspection reports into usable data for research, monitoring and analysis. Find ratings, providers, managers, outcomes and enforcement history by date—without reading hundreds of PDFs manually. Export to CSV, schedule runs, use the API, or connect AI agents via MCP.
Pricing
from $10.00 / 1,000 results
Rating
0.0
(0)
Developer
Alkausari M
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
1
Monthly active users
9 days ago
Last modified
Categories
Share
This Actor walks Ofsted's public register at reports.ofsted.gov.uk, finds the full inspection reports in your date range, and parses each PDF into 18 clean fields — the three judgement ratings, registered provider and address, responsible individual, registered manager, inspection dates, enforcement action, named inspectors, home capacity and specialism.
Paste a search URL, set a date range, hit Start. Results land in your Apify dataset as JSON, CSV, Excel or API — and optionally straight into your own MySQL table, deduplicated on re-runs so a daily schedule never creates a duplicate row.
No proxies. No PDF parsing code. No infrastructure to maintain.
Who it's for
- Compliance and safeguarding teams — know within a day when a provider in your portfolio drops to Requires Improvement or Inadequate, or picks up an enforcement action.
- Local authority commissioning — check ratings across every home you place into, without opening a single PDF by hand.
- Researchers, journalists and policy analysts — build a multi-year ratings dataset across providers and regions for trend analysis.
- Sector consultancies — turn inspection PDFs into clean rows for client reporting.
- Data and BI teams — feed dashboards from the Apify API, or a MySQL table kept in sync on a schedule.
Key features
- 📄 Full PDF parsing — 18 structured fields from each inspection report
- 🚫 No proxy required — reads Ofsted's public reports directly, so no residential proxy traffic to pay for
- 📅 Date-filtered crawling — target only inspections in your date range
- ♻️ Deduplicated re-runs — already-processed PDFs are skipped, so a daily schedule never duplicates rows
- 🗄 Optional MySQL export — insert/update straight into your own database
- 🔗 Direct PDF mode — pass a
files.ofsted.gov.ukURL to process a single report - 🛡 Resilient — auto-retry with backoff; unparseable PDFs are logged separately, never silently dropped
Ready-made examples
Don't want to build a search URL? These are pre-configured — open one, hit Run example, get results. Each becomes a normal task, so you can change the date range or filters and save it as your own.
| Example | What it does | Best for |
|---|---|---|
| Today's full inspection reports | Every children's home full inspection published today, nationwide | The schedulable default — put it on a daily Schedule and it's a working alert |
| London inspections, today | Same, narrowed to one region | LA commissioning teams — shows how the location filter works |
| Parse a list of PDFs directly | Skips the search entirely — feed it report URLs you already have | Backfilling a known set of reports, or seeing the 18-field output in seconds |
Examples remember their settings, so any of them can be put on a Schedule — see Integrations & scheduling.
How to run
▶️ In a hurry? Start from a ready-made example instead — the filters are already set.
- Click Run, then open the Input tab.
- Paste a search URL from the Ofsted reports portal with your filters already applied — or a direct
files.ofsted.gov.ukPDF URL for a single report. - Set your inspection date range:
latest_report_date_startandlatest_report_date_end, both inDD-MM-YYYYformat. - On your first run, use a 2–3 day date range. It's enough to see the output shape and measure the cost before committing to a large run.
- Click Start. The Actor walks search results → provider pages → full inspection PDFs, parsing each one it finds.
- View results in the Output tab, or download from Storage → Dataset.
Each report means downloading and parsing one PDF, so expect roughly [X] seconds per report — about [Y] per hour. Reports are processed with a delay between requests on purpose: it keeps the load on a public government server modest.
Minimal input
{"start_urls": [{ "url": "https://reports.ofsted.gov.uk/search?q=&level_1_types=3&level_2_types%5B0%5D=11&status%5B0%5D=1&start=0&rows=10" }],"latest_report_date_start": "15-02-2026","latest_report_date_end": "17-02-2026"}
That's all you need. MySQL export is off by default — every run lands in your Apify dataset with no database configuration required.
Single-report mode
Already have a specific report's URL? Skip the search step entirely:
{"start_urls": [{ "url": "https://files.ofsted.gov.uk/v1/file/50287454" }],"max_depth": 1}
Input
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
start_urls | Array | Yes | — | An Ofsted search URL, or a direct files.ofsted.gov.uk PDF URL |
latest_report_date_start | String | Yes | Today | Start of inspection date range (DD-MM-YYYY) |
latest_report_date_end | String | Yes | Today | End of inspection date range (DD-MM-YYYY) |
only_latest_inspection | Boolean | No | true | Returns only the latest inspection per URN. Turn off to extract full inspection history. |
include_unsupported | Boolean | No | false | Include unsupported inspection types in the results, for later review. |
max_depth | Integer | No | 3 | Keep at 3 for search-URL crawling; set to 1 only when passing direct PDF URLs. |
enable_db_export | Boolean | No | false | Also insert records into your MySQL database, in addition to the Apify dataset. |
rescrape | Boolean | No | false | Re-process PDFs already in the database — useful after adding new fields. Existing rows are updated, not duplicated. |
db_host / db_database / db_user / db_password | String | If DB export | — | MySQL connection details. |
Output
One record per inspection report:
{"PDF URL": "https://files.ofsted.gov.uk/v1/file/50298941","Unique reference number": "2587763","Registered provider": "Mercia Children Services Ltd","Registered provider address": "Windsor House, Bayshill Road, Cheltenham, Gloucestershire GL50 3AT","Provision sub-type": "Children's home","Responsible individual": "Michael Lloyd","Registered manager": "David Griffiths","Inspection dates": "3 and 4 March 2026","Inspection type": "Full inspection","Overall experiences and progress": "good","Help and protection": "good","Leadership and management": "good","Date of last inspection": "25 February 2025","Overall judgement at last inspection": "good","Enforcement action since last inspection": "None","Inspectors": [{ "name": "Helen Fee", "role": "Social Care Inspector" }],"Home Capacity": "4","Home Type": "social and emotional difficulties"}
Download the dataset as JSON, CSV, Excel, HTML or XML.
MySQL export
Optional. When enable_db_export is on, two tables are created automatically on first run:
ofsted_reports— primary output, keyed onpdf_url. Records are inserted on first run and updated on re-runs viaON DUPLICATE KEY UPDATE, so re-running never creates duplicates.ofsted_unsupported_reports— PDFs that don't match the expected Ofsted layout (e.g. older report formats) are logged here for review rather than silently dropped.
Add your connection details alongside the normal input:
{"start_urls": [{ "url": "https://reports.ofsted.gov.uk/search?q=&level_1_types=3&level_2_types%5B0%5D=11&status%5B0%5D=1&start=0&rows=10" }],"latest_report_date_start": "15-02-2026","latest_report_date_end": "28-02-2026","enable_db_export": true,"db_host": "your-db-host","db_database": "your-database-name","db_user": "your-db-user","db_password": "your-db-password"}
Set rescrape: true to re-process PDFs already in the database — useful when new fields have been added and you want them backfilled. Existing rows are updated, not duplicated.
Integrations & scheduling
Results don't have to stay on Apify. Without writing any code you can:
- Send new reports to Google Sheets, Airtable or Slack — pick the integration on the Actor's Integrations tab and every run appends its results automatically
- Connect anything else via Zapier or Make — triggered when a run finishes
- Fire a webhook to your own server the moment a run completes, with a link to the fresh dataset
- Pull the data over the API in JSON, CSV, Excel or XML — one URL, ideal for a script or notebook
- Write straight to MySQL — see MySQL export
- Call it from an AI agent over MCP — Apify's MCP server exposes this Actor as a tool for any MCP-compatible agent (Claude, and others), so an agent can pull inspection data mid-conversation instead of you writing integration code
Run it on a schedule. Save a task with a rolling date window — say the last 7 days — set it to run every morning, and send the output to a sheet. That's a working new-inspection alert with no code at all. Deduplication means re-runs never create duplicate rows.
Tips
- Narrow your search URL first. Apply filters (location, provision type, status) on the Ofsted reports portal itself, then paste the resulting URL — it's the single biggest lever on both run time and cost.
- Leave
only_latest_inspectionon unless you need history. It skips redundant older reports for the same provider. - Keep
max_depthat3for search URLs. Set it to1only when passing direct PDF URLs. - Turn on
rescrapeafter adding fields. New fields won't backfill into already-scraped records unless you re-process them.
Troubleshooting
| Problem | Fix |
|---|---|
| No reports returned | Dates must be DD-MM-YYYY. Then widen the range. |
| Search page found, but no PDFs | max_depth is 1. Use 3 for search URLs. |
| A field is empty | The report didn't carry it. Blank beats a guess. |
| Reports missing from the dataset | Unparseable layouts are logged, not dropped — set include_unsupported: true to see them. |
Support
Bugs, feature requests, or custom work — extra fields, other Ofsted provision types, scheduled pipelines — open an issue on the Actor's Issues tab or email alkausarimujahid@gmail.com.


