Gas Safe Register APIgassaferegister.co.uk ↗
Search Gas Safe Register by location or postcode. Retrieve UK registered gas businesses, engineer details, qualifications, and registration status via 3 endpoints.
What is the Gas Safe Register API?
The Gas Safe Register API exposes 3 endpoints for searching and verifying UK-registered gas businesses and engineers. Use search_businesses to find certified businesses by city or postcode with full contact details, or get_business_engineers to look up a specific business by registration number and retrieve every engineer on its register along with their qualifications, services, and current status.
curl -X GET 'https://api.parse.bot/scraper/82a3f423-3c12-4a96-adf0-1f9c67dc1389/search_businesses?location=Manchester&service_type=Domestic&include_engineers=false' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace gassaferegister-co-uk-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Gas Safe Register API Client
This module provides a Python client for searching Gas Safe registered businesses
and engineers in the UK.
Get your API key from: https://parse.bot/settings
"""
import os
import requests
from typing import Optional
class ParseClient:
"""Client for interacting with the Gas Safe Register Parse API."""
def __init__(self, api_key: Optional[str] = None):
"""Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "82a3f423-3c12-4a96-adf0-1f9c67dc1389"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key must be provided or set in PARSE_API_KEY environment variable")
def _call(self, endpoint: str, method: str = "POST", **params) -> dict:
"""Make an API call to the Parse endpoint.
Args:
endpoint: The endpoint name to call
method: HTTP method (GET or POST)
**params: Query parameters or request body
Returns:
Response JSON as dictionary
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {
"X-API-Key": self.api_key,
"Content-Type": "application/json"
}
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params)
else:
response = requests.post(url, headers=headers, json=params)
response.raise_for_status()
return response.json()
def search_businesses(
self,
location: str,
service_type: str = "Domestic",
page: int = 1,
include_engineers: str = "true"
) -> dict:
"""Search for Gas Safe registered businesses by location.
Args:
location: City name or UK postcode
service_type: Type of gas service ('Domestic' or 'Commercial')
page: Page number (1-indexed, 10 results per page)
include_engineers: Whether to fetch engineer details ('true' or 'false')
Returns:
Dictionary containing business results with optional engineer details
"""
return self._call(
"search_businesses",
method="GET",
location=location,
service_type=service_type,
page=page,
include_engineers=include_engineers
)
def search_businesses_basic(
self,
location: str,
service_type: str = "Domestic",
page: int = 1
) -> dict:
"""Search for Gas Safe registered businesses by location (without engineer details).
Args:
location: City name or UK postcode
service_type: Type of gas service ('Domestic' or 'Commercial')
page: Page number (1-indexed, 10 results per page)
Returns:
Dictionary containing business results without engineer details
"""
return self._call(
"search_businesses_basic",
method="GET",
location=location,
service_type=service_type,
page=page
)
def get_business_engineers(self, registration_number: str) -> dict:
"""Get engineers for a specific Gas Safe registered business.
Args:
registration_number: Gas Safe registration number (e.g. '167722')
Returns:
Dictionary containing business details and engineers
"""
return self._call(
"get_business_engineers",
method="GET",
registration_number=registration_number
)
def main():
"""Practical workflow: Search for businesses, then get detailed engineer info for top results."""
# Initialize the client
client = ParseClient()
location = "London"
service_type = "Domestic"
# Step 1: Search for Gas Safe businesses in a location
print("=" * 70)
print(f"Searching for Gas Safe registered {service_type} businesses in {location}...")
print("=" * 70)
search_results = client.search_businesses_basic(
location=location,
service_type=service_type,
page=1
)
total_results = search_results.get("total_results", 0)
results_on_page = search_results.get("results_on_page", 0)
businesses = search_results.get("businesses", [])
print(f"\nFound {total_results} businesses total")
print(f"Displaying {results_on_page} results on page 1\n")
# Step 2: Display summary of first few businesses
print("-" * 70)
print("BUSINESSES FOUND:")
print("-" * 70)
for idx, business in enumerate(businesses[:5], 1):
print(f"\n{idx}. {business['business_name']}")
print(f" Reg #: {business['registration_number']}")
print(f" Address: {business['address']['full_address']}")
print(f" Phone: {business['telephone']}")
print(f" Email: {business['email']}")
# Step 3: Get detailed engineer information for each of the top 3 businesses
print("\n" + "=" * 70)
print("FETCHING DETAILED ENGINEER INFORMATION...")
print("=" * 70)
for idx, business in enumerate(businesses[:3], 1):
registration_number = business["registration_number"]
business_name = business["business_name"]
print(f"\n{idx}. {business_name} (Reg #{registration_number})")
print("-" * 70)
try:
engineer_data = client.get_business_engineers(registration_number)
business_info = engineer_data.get("business", {})
engineers = engineer_data.get("engineers", [])
print(f" Location: {business_info['address']['full_address']}")
print(f" Phone: {business_info['telephone']}")
print(f" Email: {business_info['email']}")
print(f" Out of hours available: {business_info.get('out_of_hours_available', False)}")
print(f"\n ENGINEERS ({len(engineers)} registered):")
if engineers:
for eng_idx, engineer in enumerate(engineers, 1):
print(f" {eng_idx}. {engineer['name']}")
print(f" Services: {', '.join(engineer['services'])}")
print(f" Status: {engineer['status']}")
if engineer.get('telephone'):
print(f" Phone: {engineer['telephone']}")
else:
print(" No engineers found for this business")
except Exception as e:
print(f" Error fetching engineers: {e}")
# Step 4: Search for Commercial services to show different service types
print("\n" + "=" * 70)
print(f"Searching for {location} - COMMERCIAL services...")
print("=" * 70)
commercial_results = client.search_businesses_basic(
location=location,
service_type="Commercial",
page=1
)
commercial_total = commercial_results.get("total_results", 0)
commercial_businesses = commercial_results.get("businesses", [])
print(f"\nFound {commercial_total} commercial service providers")
if commercial_businesses:
print(f"Showing {len(commercial_businesses[:3])} results:\n")
for idx, business in enumerate(commercial_businesses[:3], 1):
print(f"{idx}. {business['business_name']}")
print(f" Reg #: {business['registration_number']}")
print(f" Address: {business['address']['full_address']}")
print(f" Phone: {business['telephone']}\n")
else:
print("No commercial service providers found in this location.\n")
# Summary statistics
print("=" * 70)
print("SEARCH SUMMARY")
print("=" * 70)
print(f"Location: {location}")
print(f"Domestic businesses found: {total_results}")
print(f"Commercial businesses found: {commercial_total}")
print(f"Total: {total_results + commercial_total}")
print("\nUse registration numbers to get detailed engineer information.")
if __name__ == "__main__":
main()Search for Gas Safe registered businesses by location. Returns business details with contact info and optionally fetches engineer details for each business. Supports pagination (10 results per page). Results are randomly ordered by the upstream site.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number (1-indexed, 10 results per page) |
| locationrequired | string | City name (e.g. 'Cambridge') or UK postcode (e.g. 'CB1 1JY') |
| service_type | string | Type of gas service: 'Domestic' or 'Commercial' |
| include_engineers | string | Whether to fetch engineer details for each business: 'true' or 'false'. Setting to 'true' makes additional requests per business and is slower. |
{
"type": "object",
"fields": {
"page": "integer - Current page number",
"location": "string - Search location used",
"businesses": "array of business objects with contact info, address, and optional engineers array",
"service_type": "string - Service type filter used",
"total_results": "integer - Total number of results",
"results_on_page": "integer - Number of results on this page"
},
"sample": {
"data": {
"page": 1,
"location": "Manchester",
"businesses": [
{
"email": "[email protected]",
"address": {
"town": "MANCHESTER",
"county": "Lancashire",
"street": "Astley Moss, ASTLEY TYLDESLEY",
"premise": "Fourwinds Farm",
"postcode": "M29 7LY",
"full_address": "Fourwinds Farm, Astley Moss, ASTLEY TYLDESLEY, MANCHESTER, Lancashire, M29 7LY"
},
"engineers": [],
"telephone": "+1 (555) 012-3456",
"trading_name": null,
"business_name": "John Doe",
"distance_miles": "",
"registration_number": "186520",
"out_of_hours_available": false
}
],
"service_type": "Domestic",
"total_results": 50,
"results_on_page": 10
},
"status": "success"
}
}About the Gas Safe Register API
What the API Returns
All three endpoints draw from the official Gas Safe Register, the UK's legal register for gas engineers. search_businesses_basic returns a paginated list of businesses matching a city name or postcode — each object includes the business name, telephone, email, address, and Gas Safe registration number. search_businesses extends that by also returning an engineers array per business, at the cost of additional latency. get_business_engineers targets a single business by its registration_number and returns that business's full engineer list, including each engineer's name, telephone, services covered, and current registration status.
Filtering and Pagination
All search endpoints accept a location parameter (required) accepting either a city name such as Cambridge or a UK postcode such as CB1 1JY. An optional service_type filter narrows results to Domestic or Commercial gas work. Results are paginated at 10 per page; the page parameter is 1-indexed. Each response includes total_results and results_on_page so callers can implement full pagination loops. Note that the upstream source returns results in a random order, so the same location query may produce differently-ordered pages across requests.
Engineer Detail Fields
When engineer data is present — either via include_engineers=true on a search or via get_business_engineers — each engineer object carries name, services (the gas work categories they are qualified for), telephone, and status (active/expired). The business object itself includes out_of_hours_available, which indicates whether the business accepts emergency callouts outside standard working hours.
Coverage Notes
The API covers businesses and engineers currently listed on Gas Safe Register for Great Britain, Isle of Man, Jersey, and Guernsey. Results reflect the current state of the register and are subject to updates as engineers add, renew, or lose their Gas Safe certification.
The Gas Safe Register API is a managed, monitored endpoint for gassaferegister.co.uk — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when gassaferegister.co.uk changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official gassaferegister.co.uk API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a postcode-based directory of local Gas Safe registered engineers for a home services platform
- Verify a contractor's Gas Safe registration number before booking using
get_business_engineers - Filter search results by
service_typeto surface only commercial gas engineers for B2B procurement tools - Aggregate engineer qualification data across a city to analyse local coverage of specific gas services
- Automate registration status checks for landlords who must confirm engineer credentials for annual gas safety certificates
- Power a trade insurance quoting tool by pre-filling engineer and business details from the register
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Gas Safe Register have an official developer API?+
What does `get_business_engineers` return that the search endpoints don't?+
get_business_engineers takes a single registration_number and returns the full engineer list for that specific business, including each engineer's name, services, telephone, and status. The search endpoints return businesses by location; engineer detail is only included when you pass include_engineers=true to search_businesses, which adds latency. If you already have a registration number, get_business_engineers is the direct and faster path.Why do repeated searches for the same location return results in a different order?+
Does the API return historical or expired engineer records?+
status field that indicates active or expired registration, but the API does not expose historical records of past engineers or lapsed businesses. You can fork this API on Parse and revise it to add an endpoint targeting historical or lapsed registration lookups if that surface becomes available.Can I retrieve a list of all Gas Safe businesses nationally, without filtering by location?+
location parameter or a specific registration_number. There is no endpoint for a full national dump or region-agnostic browse. You can fork this API on Parse and revise it to add a broader enumeration endpoint if your use case requires national coverage.