Ofsted Reports Data Scraper avatar

Ofsted Reports Data Scraper

Pricing

from $10.00 / 1,000 results

Go to Apify Store
Ofsted Reports Data Scraper

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

Alkausari M

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

1

Monthly active users

9 days ago

Last modified

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.uk URL 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.

ExampleWhat it doesBest for
Today's full inspection reportsEvery children's home full inspection published today, nationwideThe schedulable default — put it on a daily Schedule and it's a working alert
London inspections, todaySame, narrowed to one regionLA commissioning teams — shows how the location filter works
Parse a list of PDFs directlySkips the search entirely — feed it report URLs you already haveBackfilling 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.

  1. Click Run, then open the Input tab.
  2. Paste a search URL from the Ofsted reports portal with your filters already applied — or a direct files.ofsted.gov.uk PDF URL for a single report.
  3. Set your inspection date range: latest_report_date_start and latest_report_date_end, both in DD-MM-YYYY format.
  4. 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.
  5. Click Start. The Actor walks search results → provider pages → full inspection PDFs, parsing each one it finds.
  6. 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

ParameterTypeRequiredDefaultDescription
start_urlsArrayYesAn Ofsted search URL, or a direct files.ofsted.gov.uk PDF URL
latest_report_date_startStringYesTodayStart of inspection date range (DD-MM-YYYY)
latest_report_date_endStringYesTodayEnd of inspection date range (DD-MM-YYYY)
only_latest_inspectionBooleanNotrueReturns only the latest inspection per URN. Turn off to extract full inspection history.
include_unsupportedBooleanNofalseInclude unsupported inspection types in the results, for later review.
max_depthIntegerNo3Keep at 3 for search-URL crawling; set to 1 only when passing direct PDF URLs.
enable_db_exportBooleanNofalseAlso insert records into your MySQL database, in addition to the Apify dataset.
rescrapeBooleanNofalseRe-process PDFs already in the database — useful after adding new fields. Existing rows are updated, not duplicated.
db_host / db_database / db_user / db_passwordStringIf DB exportMySQL 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 on pdf_url. Records are inserted on first run and updated on re-runs via ON 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_inspection on unless you need history. It skips redundant older reports for the same provider.
  • Keep max_depth at 3 for search URLs. Set it to 1 only when passing direct PDF URLs.
  • Turn on rescrape after adding fields. New fields won't backfill into already-scraped records unless you re-process them.

Troubleshooting

ProblemFix
No reports returnedDates must be DD-MM-YYYY. Then widen the range.
Search page found, but no PDFsmax_depth is 1. Use 3 for search URLs.
A field is emptyThe report didn't carry it. Blank beats a guess.
Reports missing from the datasetUnparseable 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.