# UK Solicitor & Law Firm Register (SRA) (`onibaku/uk-solicitor-firms`) Actor

Search every law firm on the Solicitors Regulation Authority register: status, offices, phone, email, website, areas of law, company number. Filter by name, location, postcode or practice area, or watch for new, closed and intervened firms. Includes data supplied by the SRA.

- **URL**: https://apify.com/onibaku/uk-solicitor-firms.md
- **Developed by:** [Onibaku](https://apify.com/onibaku) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## UK Solicitor & Law Firm Register (SRA)

Search **every law firm on the Solicitors Regulation Authority register** (about 25,000 firms and 34,000 offices
in England and Wales) and get one clean row per firm: **authorisation status**, firm type, constitution, Companies
House number, **head office and branch addresses, phone numbers, emails and websites**, areas of law, trading and
previous names, and a link to the firm's page on the SRA register.

Filter by firm name, town, county or postcode, and area of law. Or run it on a schedule with `onlyChanges` to
**monitor firms**: each run returns only firms that are new, have changed (status, name, offices, contact details,
areas of law) or have gone, including firms the SRA has **intervened in** or that have **closed**.

The data comes from the SRA's data sharing web service, which the SRA refreshes every 24 hours.

**This actor includes data supplied by the Solicitors Regulation Authority.**
([SRA attribution statement](https://www.sra.org.uk/sra/how-we-work/privacy-data-information/data-sharing/attribution/))

### What it's for

- **Know your business (KYB) and onboarding:** check a law firm is authorised, and that its SRA number, company
  number and address match what it told you, before you pay it or work with it.
- **Monitoring panels and counterparties:** lenders, insurers, conveyancing panels and claims businesses can watch
  the firms they work with and hear the day after one is intervened in, starts closing or moves office.
- **Legal tech, insurers and suppliers:** size a market ("authorised family law firms in Yorkshire"), keep a CRM in
  step with the register, or spot new firms as they're authorised.
- **Directories and comparison sites:** a full, daily-fresh list of firms with their practice areas and contact
  details.
- **AI agents:** one call answers "is this firm SRA-authorised and where are its offices?" (see MCP below).

### Input

| Field | What it does |
| --- | --- |
| `searchTerms` | Firm name contains any of these (practice, trading, previous and office names). |
| `locations` | Postcode area (`LS`), district (`M1`, `SW1A`), full postcode, or part of a town, county or address (`Manchester`, `Kent`). A firm matches if any office does. |
| `areasOfLaw` | Part of an area of law the firm lists: `Family`, `Immigration`, `Personal Injury`, `Property - Residential`, `Employment`, `Criminal`... |
| `statuses` | `authorised` (default), `closing`, `closed`, `intervened`, `not-separately-authorised` (freelance solicitors and in-house teams). |
| `sraNumbers` | Look up firms by SRA number (the firm's or an office's). |
| `companyNumbers` | Look up firms by Companies House number. |
| `oneRowPerOffice` | One row per office instead of per firm. With `locations`, only offices in those places. |
| `onlyChanges` | Return only firms that are new, changed or gone since the last run with the same filters. |
| `maxResults` | Cap on rows (default 1,000). |

**Family law firms in Leeds:**

```json
{ "locations": ["Leeds"], "areasOfLaw": ["Family"] }
```

**Check a list of firms:**

```json
{ "sraNumbers": ["465525", "62726"], "statuses": ["authorised", "closing", "closed", "intervened", "not-separately-authorised"] }
```

**Daily watch on every authorised firm in London (schedule it):**

```json
{ "locations": ["London"], "onlyChanges": true, "maxResults": 100000 }
```

### Output

One row per firm:

```json
{
    "sraNumber": 465525,
    "practiceName": "Borneo Martell Turner Coulston LLP",
    "status": "authorised",
    "statusDetail": "Recognised body: authorised",
    "authorisationType": "Recognised body",
    "authorisedSince": "2011-11-01",
    "statusDate": "2011-11-01",
    "regulator": "SRA",
    "constitution": "Limited liability partnership",
    "companyNumber": "OC327261",
    "freelanceBasis": null,
    "tradingNames": [],
    "previousNames": ["BORNEO HUGHES MARTELL LLP"],
    "areasOfLaw": ["Litigation - Other", "Family / Matrimonial", "Property - Residential", "Criminal"],
    "websites": ["www.bmtclaw.co.uk"],
    "numberOfOffices": 3,
    "headOffice": {
        "officeId": 465525,
        "officeName": "Borneo Martell Turner Coulston LLP",
        "officeType": "Head office",
        "address": "29 Billing Road",
        "town": "NORTHAMPTON",
        "county": "NORTHAMPTONSHIRE",
        "postcode": "NN1 5DQ",
        "country": "England",
        "phone": "01604622101",
        "email": "clare.debanke@bmtclaw.co.uk",
        "website": "www.bmtclaw.co.uk"
    },
    "offices": [{ "officeId": 465525, "officeType": "Head office", "...": "..." }, { "officeId": 591088, "officeType": "Branch", "...": "..." }],
    "sraRegisterUrl": "https://www.sra.org.uk/consumers/register/organisation/?sraNumber=465525",
    "source": "This actor includes data supplied by the Solicitors Regulation Authority: https://www.sra.org.uk/sra/how-we-work/privacy-data-information/data-sharing/attribution/"
}
```

With `oneRowPerOffice`, each row has the firm's fields plus one office's fields at the top level instead of
`headOffice` and `offices`.

With `onlyChanges`, each row also has `changeType` (`new`, `changed` or `removed`) and `changedFields` (any of
`practiceName`, `status`, `names`, `companyNumber`, `areasOfLaw`, `offices`, `contactDetails`). A firm that drops
out of your status filter (for example an authorised firm that's intervened in) is reported once as `changed`
with its new status. A `removed` row means the firm has left the register or no longer matches your other
filters; it only carries the SRA number and name.

### Pricing

**$0.0015 per row returned**, plus a token $0.00005 per run. 1,000 firms cost $1.50. With `onlyChanges`, you only
pay for the firms that changed, so a daily watch usually costs a few cents.

### Good to know

- The register covers **firms**, not individual solicitors.
- Status comes from the SRA's own classification. `not-separately-authorised` covers freelance solicitors, and
  organisations such as councils and companies whose in-house solicitors are on the register.
- Not every firm lists areas of law (about 8,400 do), so an `areasOfLaw` filter leaves out the rest.
- `onlyChanges` keeps its memory in a named key-value store in your Apify account (`uk-solicitor-firms-seen`),
  separately for each set of filters. Delete the store to start afresh.
- **Use the data lawfully.** The SRA's terms forbid using it to send unsolicited marketing, and UK law (PECR and
  UK GDPR) limits unsolicited emails and calls. Some freelance solicitors' records are effectively personal data.
- This actor isn't affiliated with or endorsed by the Solicitors Regulation Authority.

### Use it from Claude, ChatGPT or Cursor (MCP)

AI assistants can call this actor as a tool through Apify's MCP server. Add this server URL to your MCP client and
sign in with your Apify account when prompted:

```
https://mcp.apify.com?tools=onibaku/uk-solicitor-firms
```

### Data source

The [SRA data sharing web service](https://www.sra.org.uk/sra/how-we-work/data-sharing/), used under the SRA's
data sharing terms and conditions. This actor includes data supplied by the Solicitors Regulation Authority
([attribution statement](https://www.sra.org.uk/sra/how-we-work/privacy-data-information/data-sharing/attribution/)).
Every row's `sraRegisterUrl` links to the firm's page on the SRA register.

Questions or feature requests? Open an issue on the actor's Issues tab or email admin@onibaku.co.uk.

# Actor input Schema

## `searchTerms` (type: `array`):

Matched against the practice name, trading names, previous names and office names, case-insensitive. Leave empty for every firm.

## `locations` (type: `array`):

A postcode area (LS), district (M1, SW1A) or full postcode, or part of a town, county or address (Manchester, Kent). A firm matches if any of its offices does.

## `areasOfLaw` (type: `array`):

Part of an area of law the firm lists, e.g. "Family", "Immigration", "Personal Injury", "Property - Residential", "Employment", "Criminal". Firms that list no areas are left out when this is set.

## `statuses` (type: `array`):

Which firms to include. Authorised = currently authorised by the SRA (the default). Not separately authorised covers freelance solicitors and in-house legal teams.

## `sraNumbers` (type: `array`):

Look up specific firms by SRA number (a firm's or one of its offices').

## `companyNumbers` (type: `array`):

Look up firms by company registration number, e.g. OC327261 or 01234567.

## `oneRowPerOffice` (type: `boolean`):

Return each office (head office and branches) as its own row instead of one row per firm with an offices list. With locations set, only the offices in those locations are returned.

## `onlyChanges` (type: `boolean`):

Remembers the firms each run returned (per set of filters) and next time returns only firms that are new, changed (status, name, offices, contact details, areas of law) or gone. Use with a schedule to monitor firms. The first run returns every match.

## `maxResults` (type: `integer`):

Stop after this many rows.

## Actor input object example

```json
{
  "locations": [
    "Leeds"
  ],
  "areasOfLaw": [
    "Family"
  ],
  "statuses": [
    "authorised"
  ],
  "oneRowPerOffice": false,
  "onlyChanges": false,
  "maxResults": 1000
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Leeds"
    ],
    "areasOfLaw": [
        "Family"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("onibaku/uk-solicitor-firms").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Leeds"],
    "areasOfLaw": ["Family"],
}

# Run the Actor and wait for it to finish
run = client.actor("onibaku/uk-solicitor-firms").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Leeds"
  ],
  "areasOfLaw": [
    "Family"
  ]
}' |
apify call onibaku/uk-solicitor-firms --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,onibaku/uk-solicitor-firms"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/5VcKb6dwtuqLFs2Qh/builds/fxaRG3bJOkV7KKDW4/openapi.json
