Use General Osteopathic Council Register Scraper with Python
Search the General Osteopathic Council's public register (osteopathy.org.uk) by postcode/town, surname, or practice features, or look up exact registration numbers. Returns status, qualifications, training, and practice details.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"disabilityAccess": false,
"homeVisit": false,
"maxItems": 3,
"mode": "search",
"radius": "10mi",
"registrationNumbers": [
"1766"
],
"status": "",
"surname": "Smith",
"welshSpoken": false
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | Choose how to query the register. |
surname | string | optional | Exact surname as held by the register, case-insensitive (for example Smith). Partial surnames such as Smit do not match. Combine with location or practice features to narrow results. |
location | string | optional | Exact town, county or country name, or a UK postcode/outcode such as SW1A 1AA or SW1A. Town names must match the register's own location labels. |
radius | string | optional | Radius used when location is a UK postcode or outcode. Town and county searches use the register's own boundary. |
firstName | string | optional | Optional case-insensitive contains filter applied to the first-name part of the register name. |
disabilityAccess | boolean | optional | Only return osteopaths whose practice reports disabled access. Partial access counts as access, matching the register's own filter. |
homeVisit | boolean | optional | Only return osteopaths whose practice reports home visits. |
welshSpoken | boolean | optional | Only return osteopaths whose practice reports that Welsh is spoken. |
status | string | optional | Optional exact status filter applied after each register entry is read. Leave blank for every status. |
registeredAfter | string | optional | Optional ISO date (YYYY-MM-DD). Only return entries whose date of registration is on or after this date. |
registeredBefore | string | optional | Optional ISO date (YYYY-MM-DD). Only return entries whose date of registration is on or before this date. |
qualificationContains | string | optional | Optional case-insensitive text filter over the published qualifications, for example Ost or DO. |
registrationNumbers | array | optional | Exact registration numbers for byRegistrationNumbers mode. Strings or integers are accepted; duplicates and leading zeros are normalised. Only the first 10,000 unique numbers are read. |
maxItems | integer | optional | Hard cap on emitted osteopath records. The full practice-linked register currently holds about 5,688 unique registrants. |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/D0z92JrueW1JAhXKL/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
Osteopaths from the General Osteopathic Council public register: identity, GOsC registration number, practising status and regulatory flags, hearing-notes link, registration and qualification dates, every practice with contacts, primary-practice fields and optional distance.
Questions before you run
Which inputs are required?
The published required fields are mode
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build SH8rgwf1fMdTdbNJP and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.