# UK Barrister Register Scraper (`crawlerbros/uk-barrister-register-scraper`) Actor

Scrape the Bar Standards Board's official Barristers' Register for England & Wales. Search by name or chambers, filter by practising status/area of practice/public access, browse past disciplinary findings and interim suspensions, or enrich barrister URLs directly.

- **URL**: https://apify.com/crawlerbros/uk-barrister-register-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## UK Barrister Register Scraper

Scrape the **Bar Standards Board's** official public register for England & Wales — search the Barristers' Register by name or chambers, filter by practising status / area of practice / Public Access, browse past disciplinary findings, check barristers currently under interim suspension, look up BSB-regulated entities (chambers / legal-services businesses), or enrich specific barrister/finding URLs directly. Data comes straight from [barstandardsboard.org.uk](https://www.barstandardsboard.org.uk), the statutory regulator of barristers in England and Wales. No auth, no proxy, no cookies required.

### What this actor does

- **Five modes:**
  - `search` — search the live Barristers' Register by name or chambers/organisation
  - `disciplinaryFindings` — browse the public register of past disciplinary findings
  - `interimSuspensions` — list barristers currently subject to interim suspension or interim conditions
  - `entities` — BSB-regulated legal-services businesses ("entities"): authorised bodies, licensed bodies (ABS), and previously-authorised bodies
  - `byUrl` — fetch specific barrister-register or disciplinary-finding URLs directly
- **Rich filters** on `search`: practising status, area of practice (27 categories), Public Access registration, authorisation to conduct litigation, and register view (practising vs. sanctioned/disbarred)
- **Rich filters** on `disciplinaryFindings`: finding status, disciplinary action/sanction type, hearing type, and a decision-date window (past month / past year / custom range)
- **Full profile enrichment** — optionally fetches each barrister's/finding's detail page for chambers address, call date, Inn of Court, rights of audience, areas of practice, disciplinary history, breach/offence details, and more
- **Empty fields are always omitted** — every field on every record is real, extracted data (no `null`/`N/A` placeholders)

### Output fields

#### Barrister records (`recordType: "barrister"`)

| Field | Description |
|---|---|
| `barristerName` | Full name as shown on the register |
| `barristerId` | Bar Standards Board's internal register ID |
| `barristerUrl` / `sourceUrl` | Canonical register URL for this barrister |
| `practisingStatusBadge` | Register badge, e.g. `Practising`, `Disbarred` |
| `currentPractisingStatus` | `Employed`, `Self Employed`, `Dual Capacity`, `Disbarred`, etc. |
| `dateOfCall` | Month/year called to the Bar |
| `innOfCourt` | Inn of Court membership |
| `practisingCertificateValid` | Practising certificate validity period |
| `primaryPracticeAddress` | Chambers / employer address |
| `primaryPracticeSwitchboardNumber` | Chambers switchboard phone number |
| `rightsOfAudience` | List of rights of audience granted |
| `publicAccessRegistered` | Whether registered for the Public Access scheme (bool) |
| `authorisedToConductLitigation` | Whether authorised to conduct litigation (bool) |
| `areasOfPractice` | List of declared practice areas |
| `otherEntitlements` | Other regulatory entitlements (e.g. Immigration Work, Probate) |
| `youthCourtsRegistered` | Whether registered to work in Youth Courts (bool) |
| `disciplinaryFindings` | List of `{findingDate, hearingType, findingUrl, findingId}` if any exist |
| `registerView` | `practising` or `sanctionedNonPractising` |
| `recordType`, `scrapedAt` | Always present |

#### Disciplinary finding records (`recordType: "disciplinaryFinding"`)

| Field | Description |
|---|---|
| `barristerName` | Name of the barrister subject to the finding |
| `barristerRegisterUrl` / `barristerId` | Link back to the barrister's register entry |
| `findingUrl` / `findingId` / `sourceUrl` | Canonical finding URL and ID |
| `sanction` | Sanction imposed |
| `hearingType` | Tribunal/hearing type |
| `findingDate` | Date of the finding |
| `currentPractisingStatus`, `dateOfCall`, `innOfCourt` | Barrister's status at time of finding |
| `breachDetails` | Rules/Code of Conduct provisions breached |
| `offenceDetails` | Narrative description of the misconduct |

#### Interim suspension records (`recordType: "interimSuspension"`)

| Field | Description |
|---|---|
| `barristerName` | Name of the suspended barrister |
| `details` | Full text describing the suspension/conditions |
| `sourceUrl` | Link to the listing (with anchor) |

#### Entity records (`recordType: "entity"`)

| Field | Description |
|---|---|
| `entityName` | Name of the BSB-regulated entity |
| `tradingNameOf` | Underlying company name, if the entity trades under a different name |
| `entityStatus` | `authorised` / `licensed` / `previouslyAuthorised` |
| `entityType` | Legal structure, e.g. `Limited Liability Partnership`, `Private Limited Company` |
| `authorisationValidFrom` | Date authorisation/licence took effect (`YYYY-MM-DD`) |
| `renewalDate` | Next renewal date (authorised/licensed entities only) |
| `authorisationValidTo` | Date authorisation ended (previously-authorised entities only) |
| `practisingAddress` / `practisingAddressSecondary` | Registered practising address(es) |
| `telephone` | Contact telephone number, where published |
| `managers` | List of named managers/partners |
| `headOfLegalPractice` | Head of Legal Practice (HOLP) |
| `headOfFinanceAndAdministration` | Head of Finance and Administration (HOFA) |
| `administrationOfOaths` | Whether authorised to administer oaths (bool) |
| `authorisedToConductLitigation` | Whether authorised to conduct litigation (bool) |
| `sourceUrl` | The BSB entities-register download URL this record was extracted from |

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | `search` / `disciplinaryFindings` / `interimSuspensions` / `entities` / `byUrl` |
| `searchQuery` | string | `smith` | Name/chambers (mode=search, required) or optional name filter (mode=disciplinaryFindings, entities) |
| `searchField` | select | `name` | `name` or `organisation` (mode=search) |
| `registerView` | select | `practising` | `practising` or `sanctionedNonPractising` (mode=search) |
| `practisingStatus` | multi-select | – | Filter by `Dual Capacity` / `Employed` / `Self Employed` (mode=search) |
| `areasOfPractice` | multi-select | – | Filter by one or more of 27 practice areas (mode=search) |
| `publicAccessRegistered` | select | `any` | `any` / `yes` / `no` (mode=search) |
| `authorisedToConductLitigation` | select | `any` | `any` / `yes` / `no` (mode=search) |
| `sortOrder` | select | `recent` | `recent` or `relevance` (mode=disciplinaryFindings) |
| `findingStatus` | multi-select | – | Filter by `Final` / `Open to Appeal` / `Appeal Pending` (mode=disciplinaryFindings) |
| `disciplinaryActionType` | multi-select | – | Filter by `Disbarment` / `Fine` / `Other` / `Suspension` (mode=disciplinaryFindings) |
| `findingType` | multi-select | – | Filter by hearing type, e.g. Disciplinary Tribunal (3/5 person) (mode=disciplinaryFindings) |
| `findingDateRange` | select | any | `pastMonth` / `pastYear` / `custom` (mode=disciplinaryFindings) |
| `findingDateFrom` / `findingDateTo` | string | – | Custom decision-date range boundaries, format `YYYY-MM-DD` (findingDateRange=custom) |
| `entityStatus` | multi-select | – | Filter by `authorised` / `licensed` / `previouslyAuthorised` (mode=entities) |
| `startUrls` | array | – | Barrister/finding URLs to fetch directly (mode=byUrl) |
| `fetchFullProfile` | boolean | `true` | Fetch each record's detail page for extra fields |
| `maxItems` | integer | `30` | Hard cap on emitted records (1–1000) |

#### Example: search practising barristers by chambers, filtered

```json
{
  "mode": "search",
  "searchQuery": "no5",
  "searchField": "organisation",
  "areasOfPractice": ["crime", "employment"],
  "authorisedToConductLitigation": "yes",
  "maxItems": 50
}
```

#### Example: browse recent disciplinary findings

```json
{
  "mode": "disciplinaryFindings",
  "sortOrder": "recent",
  "maxItems": 50
}
```

#### Example: disciplinary findings, disbarment or suspension in the past year

```json
{
  "mode": "disciplinaryFindings",
  "disciplinaryActionType": ["disbarment", "suspension"],
  "findingDateRange": "pastYear",
  "maxItems": 50
}
```

#### Example: disciplinary findings in a custom date range

```json
{
  "mode": "disciplinaryFindings",
  "findingDateRange": "custom",
  "findingDateFrom": "2020-01-01",
  "findingDateTo": "2020-12-31",
  "maxItems": 50
}
```

#### Example: check barristers currently under interim suspension

```json
{
  "mode": "interimSuspensions",
  "maxItems": 50
}
```

#### Example: currently-authorised BSB entities matching a name

```json
{
  "mode": "entities",
  "searchQuery": "law",
  "entityStatus": ["authorised", "licensed"],
  "maxItems": 100
}
```

#### Example: fetch specific barrister URLs

```json
{
  "mode": "byUrl",
  "startUrls": [
    "https://www.barstandardsboard.org.uk/barristers-register/7C5DCA7B263721A6CB12F687568766BD.html"
  ]
}
```

### Use cases

- **Due diligence** — verify a barrister's practising status, Inn of Court, and disciplinary history before instructing them
- **Legal directories & comparison sites** — bulk-import chambers, practice areas, and contact details
- **Compliance monitoring** — track new disciplinary findings or interim suspensions as they're published
- **Recruitment & chambers research** — find barristers by practice area, chambers, or public-access availability
- **Journalism & legal research** — cross-reference disciplinary sanctions with case reporting

### Limitations

- The BSB also publishes a "Disqualified persons" page (people barred from working for any BSB-regulated entity). It is not a structured/searchable register — it is a single static sentence ("There are currently no persons disqualified") that is empty at the time of writing — so it is not exposed as a mode here. If the BSB later populates it with a real list, it can be added as a future mode.

### FAQ

**Is this official data?** Yes — everything comes directly from the Bar Standards Board's own public register at barstandardsboard.org.uk, the statutory regulator for barristers in England and Wales.

**What's the difference between `practising` and `sanctionedNonPractising` register views?** `practising` covers currently authorised practising barristers (Employed / Self Employed / Dual Capacity). `sanctionedNonPractising` covers barristers who have been disbarred or otherwise sanctioned and are no longer authorised to practise.

**Why do some barrister records have fewer fields than others?** The register itself only publishes certain fields for certain statuses — e.g. a disbarred barrister has no current chambers address, so that field is simply omitted rather than shown as empty.

**Does `searchQuery` support partial matches?** Yes — the register performs a substring/fuzzy match against barrister names or chambers/organisation names, same as the site's own search box.

**How far back do disciplinary findings go?** Per the Bar Standards Board's publication policy, historical findings before 2002 are not published, and findings without a suspension/disbarment are removed from the register after two years.

**Can I look up a barrister I already have a URL for?** Yes — use `mode: "byUrl"` with the full barrister-register or disciplinary\_finding URL(s).

**Is `fetchFullProfile` worth the extra request?** For `search` and `disciplinaryFindings`, the listing page already includes name, status/sanction, and address/hearing-type. Turning on `fetchFullProfile` (default) fetches each individual detail page for the complete profile — Inn of Court, rights of audience, areas of practice, breach/offence details, etc. Turn it off for a faster, lighter-weight listing-only crawl.

# Actor input Schema

## `mode` (type: `string`):

What to fetch from the Bar Standards Board register.

## `searchQuery` (type: `string`):

For mode=search: barrister name or chambers/organisation name (required). For mode=disciplinaryFindings: optional barrister name filter — leave empty to browse all findings. For mode=entities: optional entity/trading name filter — leave empty to include all entities.

## `searchField` (type: `string`):

Whether `searchQuery` matches the barrister's name or their chambers/organisation.

## `registerView` (type: `string`):

`Practising` = currently authorised practising barristers. `Sanctioned non-practising` = barristers disbarred or otherwise sanctioned who are no longer authorised to practise.

## `practisingStatus` (type: `array`):

Restrict to barristers with these practising statuses. Leave empty for all statuses. Only applies to the Practising register view.

## `areasOfPractice` (type: `array`):

Restrict to barristers practising in ANY of these areas of law. Leave empty for all areas. Only applies to the Practising register view.

## `publicAccessRegistered` (type: `string`):

Filter by whether the barrister is registered to accept work directly from the public (Public Access scheme).

## `authorisedToConductLitigation` (type: `string`):

Filter by whether the barrister is authorised to conduct litigation.

## `sortOrder` (type: `string`):

How to order the disciplinary findings listing.

## `findingStatus` (type: `array`):

Restrict to disciplinary findings with these statuses. Leave empty for all statuses.

## `disciplinaryActionType` (type: `array`):

Restrict to findings with ANY of these sanction types. Leave empty for all types.

## `findingType` (type: `array`):

Restrict to findings from ANY of these hearing types. Leave empty for all types.

## `findingDateRange` (type: `string`):

Restrict findings to a decision-date window. `custom` uses `findingDateFrom`/`findingDateTo`.

## `findingDateFrom` (type: `string`):

Start of the custom decision-date range, format `YYYY-MM-DD` (e.g. `2020-01-01`).

## `findingDateTo` (type: `string`):

End of the custom decision-date range, format `YYYY-MM-DD` (e.g. `2020-12-31`).

## `entityStatus` (type: `array`):

Restrict to BSB-regulated entities with these authorisation statuses. Leave empty for all statuses.

## `startUrls` (type: `array`):

Full barstandardsboard.org.uk barrister-register or disciplinary\_finding URLs to fetch directly.

## `fetchFullProfile` (type: `boolean`):

For mode=search and mode=disciplinaryFindings: fetch each record's full detail page for additional fields (chambers address, areas of practice, rights of audience, breach/offence details, etc). Uses one extra HTTP request per record.

## `maxItems` (type: `integer`):

Hard cap on the number of records emitted in this run.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "smith",
  "searchField": "name",
  "registerView": "practising",
  "practisingStatus": [],
  "areasOfPractice": [],
  "publicAccessRegistered": "any",
  "authorisedToConductLitigation": "any",
  "sortOrder": "recent",
  "findingStatus": [],
  "disciplinaryActionType": [],
  "findingType": [],
  "findingDateRange": "",
  "entityStatus": [],
  "startUrls": [
    "https://www.barstandardsboard.org.uk/barristers-register/7C5DCA7B263721A6CB12F687568766BD.html"
  ],
  "fetchFullProfile": true,
  "maxItems": 30
}
```

# Actor output Schema

## `barristers` (type: `string`):

Dataset containing all scraped barrister / disciplinary-finding / interim-suspension records.

# 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 = {
    "mode": "search",
    "searchQuery": "smith",
    "searchField": "name",
    "registerView": "practising",
    "practisingStatus": [],
    "areasOfPractice": [],
    "publicAccessRegistered": "any",
    "authorisedToConductLitigation": "any",
    "sortOrder": "recent",
    "findingStatus": [],
    "disciplinaryActionType": [],
    "findingType": [],
    "findingDateRange": "",
    "entityStatus": [],
    "startUrls": [
        "https://www.barstandardsboard.org.uk/barristers-register/7C5DCA7B263721A6CB12F687568766BD.html"
    ],
    "fetchFullProfile": true,
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/uk-barrister-register-scraper").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 = {
    "mode": "search",
    "searchQuery": "smith",
    "searchField": "name",
    "registerView": "practising",
    "practisingStatus": [],
    "areasOfPractice": [],
    "publicAccessRegistered": "any",
    "authorisedToConductLitigation": "any",
    "sortOrder": "recent",
    "findingStatus": [],
    "disciplinaryActionType": [],
    "findingType": [],
    "findingDateRange": "",
    "entityStatus": [],
    "startUrls": ["https://www.barstandardsboard.org.uk/barristers-register/7C5DCA7B263721A6CB12F687568766BD.html"],
    "fetchFullProfile": True,
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/uk-barrister-register-scraper").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 '{
  "mode": "search",
  "searchQuery": "smith",
  "searchField": "name",
  "registerView": "practising",
  "practisingStatus": [],
  "areasOfPractice": [],
  "publicAccessRegistered": "any",
  "authorisedToConductLitigation": "any",
  "sortOrder": "recent",
  "findingStatus": [],
  "disciplinaryActionType": [],
  "findingType": [],
  "findingDateRange": "",
  "entityStatus": [],
  "startUrls": [
    "https://www.barstandardsboard.org.uk/barristers-register/7C5DCA7B263721A6CB12F687568766BD.html"
  ],
  "fetchFullProfile": true,
  "maxItems": 30
}' |
apify call crawlerbros/uk-barrister-register-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/uk-barrister-register-scraper"
        }
    }
}

```

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/xFMXfqhqTWdgkv0xX/builds/cdNe27PuvxvxfEmcx/openapi.json
