RICS APIrics.org ↗
Search the RICS-regulated surveying firm directory by location, firm name, keyword, and service type. Returns firm contact details, addresses, and service facets.
What is the RICS API?
The RICS Firms API provides access to the official RICS Find a Chartered Surveyor directory via 2 endpoints, returning firm contact details, addresses, RICS regulation status, and filterable service categories. The search_firms endpoint accepts location, keyword, firm name, and service ID parameters, while get_places returns structured place data to power location autocomplete in search interfaces.
curl -X GET 'https://api.parse.bot/scraper/fadc5416-5581-4a1f-8b37-cd12a66e5c02/search_firms?page=1&keyword=valuation&location=London&page_size=25&service_id=110' \ -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 rics-org-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.
"""Walkthrough: RICS Firms API — find regulated surveyors by location and service."""
from parse_apis.rics_firms_api import RICSFirms, FirmNotFound
client = RICSFirms()
# Discover places matching a query — single-page, bounded.
for place in client.places.search(query="Manchester", limit=5):
print(place.name, place.parent_name)
# Search for firms in London — paginated, capped at 5 total items.
for firm in client.firms.search(location="London", limit=5):
print(firm.firm_name, firm.city, firm.postcode)
# Drill into one firm from a keyword search.
firm = client.firms.search(keyword="party wall", limit=1).first()
if firm:
print(firm.firm_name, firm.telephone, firm.email, firm.rics_regulated)
# Typed error handling around a search that may yield no results.
try:
for f in client.firms.search(firm_name="NonexistentFirmXYZ999", limit=3):
print(f.firm_name)
except FirmNotFound as exc:
print(f"No firms found: {exc}")
print("exercised: places.search / firms.search (location) / firms.search (keyword) / firms.search (firm_name)")
Search for RICS regulated surveying firms by location, firm name, or keyword. Returns paginated results with firm contact details, service areas, and available service filter facets. At least one of location, firm_name, or keyword should be provided for meaningful results. Pagination advances via the page parameter; service_facets in the response enumerate available service filters with their counts for the current query.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| keyword | string | Keyword search (e.g. 'party wall', 'valuation', 'building survey'). |
| location | string | Location name to search within (e.g. 'London', 'Manchester', 'Birmingham'). |
| firm_name | string | Firm name to search for. |
| page_size | integer | Results per page. |
| service_id | string | Service type ID for filtering results. IDs available from the service_facets field in search results. |
{
"type": "object",
"fields": {
"page": "integer - current page number",
"firms": "array of firm objects with firm_id, office_id, firm_name, rics_regulated, address, city, county, postcode, telephone, email, website_url, about_us, offers_free_advice, target_residential, target_commercial, has_logo",
"page_size": "integer - results per page",
"page_count": "integer - total number of pages",
"total_results": "integer - number of firms returned on the current page",
"service_facets": "array of service filter options with id, name, and count"
}
}About the RICS API
What the API covers
The API exposes the full public content of the RICS regulated firms directory at ricsfirms.com. Each firm record in search_firms results includes fields such as firm_id, office_id, firm_name, rics_regulated, address, city, county, postcode, telephone, email, and website. Results are paginated using page and page_size parameters, with page_count and total_results available to drive pagination UI.
Filtering and facets
search_firms supports four independent filter dimensions: location (a place name such as 'London' or 'Birmingham'), keyword (a service term such as 'party wall', 'valuation', or 'building survey'), firm_name (for direct lookup by firm), and service_id (a structured service type filter). Service IDs are not hardcoded — they come from the service_facets array returned alongside every result set, each facet carrying an id, name, and count. This means you can build a dynamic filter UI directly from live response data without maintaining a static list of service codes.
Location resolution
The get_places endpoint resolves location strings to structured place objects before passing them to search_firms. Each place record contains id, name, parent_name, and box_type_id. The query parameter accepts partial place names for autocomplete-style matching, and an optional country code parameter narrows results to a specific country. This two-step flow — resolve place, then search — mirrors how the official directory handles location input.
Coverage notes
The directory reflects RICS-regulated firms and offices listed on the public ricsfirms.com directory. Data includes contact-level details for individual offices (distinct office_id per location), so multi-office firms appear as separate records. There is no endpoint for individual surveyor profiles or membership credential lookups — coverage is at the firm/office level only.
The RICS API is a managed, monitored endpoint for rics.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when rics.org 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 rics.org 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 'find a surveyor near me' tool using
locationandservice_idfilters fromsearch_firms - Populate a location autocomplete field with
get_placesbefore submitting a firm search - Aggregate RICS-regulated firms by service category using
service_facetscounts from search results - Compile a contact list of regulated firms in a target city using
city,telephone, andemailfields - Cross-reference firm registration status using the
rics_regulatedflag returned per firm - Filter surveying firms offering specific services (e.g. 'party wall', 'valuation') using the
keywordparameter - Map office coverage across postcodes by extracting
postcodeandcountyfrom paginated results
| 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 RICS provide an official developer API for the firm directory?+
What does `service_facets` in the `search_firms` response actually contain?+
service_facets includes an id, a human-readable name, and a count indicating how many firms in the current result set offer that service. You pass the id value back as the service_id parameter on a subsequent call to filter results to that service type. The facets reflect the live distribution of the current search, so they update as you change location or keyword filters.Does the API distinguish between different offices of the same firm?+
firm_id and an office_id. A firm with multiple offices will appear as separate records with the same firm_id but distinct office_id values, each with its own address, postcode, telephone, and email fields.Does the API return individual surveyor profiles or membership credentials?+
How does pagination work in `search_firms`?+
page and page_size input parameters. The response includes page_count (total pages available) and total_results (the count of records on the current page). To retrieve all firms matching a query, iterate from page 1 through page_count, keeping keyword, location, and service_id parameters constant across requests.