{
  "data": {
    "id": "pxEtWDylYNl6lItlw",
    "actId": "5BKeN2aUL19MTrry1",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-04T09:50:28.918Z",
    "finishedAt": "2026-11-04T09:50:37.569Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 8564,
      "runTimeSecs": 8.564,
      "computeUnits": 0.009515555555555555,
      "imageSizeBytes": 320475136
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Bar Standards Board Barrister Register Scraper Input\",\n  \"description\": \"Search or bulk-download the Bar Standards Board's official Barristers' Register, browse disciplinary findings or interim suspensions, export BSB-regulated entities, or fetch barrister and finding URLs directly.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"What to fetch from the Bar Standards Board register.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"search\",\n        \"authorisedBarristers\",\n        \"disciplinaryFindings\",\n        \"interimSuspensions\",\n        \"byUrl\",\n        \"entities\"\n      ],\n      \"enumTitles\": [\n        \"Search the Barristers' Register (by name / chambers)\",\n        \"Full authorised-practising register (bulk CSV, ~18,700 barristers)\",\n        \"Browse past disciplinary findings\",\n        \"Barristers with interim suspensions or conditions\",\n        \"Fetch specific barrister / finding URLs\",\n        \"BSB-regulated entities (chambers / legal businesses)\"\n      ],\n      \"default\": \"search\",\n      \"prefill\": \"search\"\n    },\n    \"searchQuery\": {\n      \"title\": \"Search query (mode=search, authorisedBarristers, disciplinaryFindings, entities)\",\n      \"type\": \"string\",\n      \"description\": \"For mode=search: barrister name or chambers/organisation name (required). For mode=authorisedBarristers: optional name/chambers filter over the full register. 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.\",\n      \"editor\": \"textfield\",\n      \"default\": \"\",\n      \"prefill\": \"smith\"\n    },\n    \"searchField\": {\n      \"title\": \"Search by (mode=search)\",\n      \"type\": \"string\",\n      \"description\": \"Whether `searchQuery` matches the barrister's name or their chambers/organisation (mode=search and mode=authorisedBarristers).\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"name\",\n        \"organisation\"\n      ],\n      \"enumTitles\": [\n        \"Barrister name\",\n        \"Chambers / organisation name\"\n      ],\n      \"default\": \"name\",\n      \"prefill\": \"name\"\n    },\n    \"registerView\": {\n      \"title\": \"Register view (mode=search)\",\n      \"type\": \"string\",\n      \"description\": \"`Practising` = currently authorised practising barristers. `Sanctioned non-practising` = barristers disbarred or otherwise sanctioned who are no longer authorised to practise.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"practising\",\n        \"sanctionedNonPractising\"\n      ],\n      \"enumTitles\": [\n        \"Practising barristers\",\n        \"Sanctioned non-practising barristers (disbarred etc.)\"\n      ],\n      \"default\": \"practising\",\n      \"prefill\": \"practising\"\n    },\n    \"practisingStatus\": {\n      \"title\": \"Practising status filter (mode=search)\",\n      \"type\": \"array\",\n      \"description\": \"Restrict to barristers with these practising statuses. Leave empty for all statuses. Applies to mode=search (practising view only) and mode=authorisedBarristers.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"dual-capacity\",\n          \"employed\",\n          \"self-employed\"\n        ],\n        \"enumTitles\": [\n          \"Dual Capacity\",\n          \"Employed\",\n          \"Self Employed\"\n        ]\n      },\n      \"uniqueItems\": true,\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"areasOfPractice\": {\n      \"title\": \"Areas of practice filter (mode=search)\",\n      \"type\": \"array\",\n      \"description\": \"Restrict to barristers practising in ANY of these areas of law. Leave empty for all areas. Applies to mode=search (practising view only) and mode=authorisedBarristers.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"admiralty\",\n          \"arbitrator-or-umpire-or-mediator\",\n          \"chancery-contentious\",\n          \"chancery-non-contentious\",\n          \"commercial-and-financial-services-1\",\n          \"competition\",\n          \"construction\",\n          \"crime\",\n          \"defamation\",\n          \"employment\",\n          \"european\",\n          \"family-children\",\n          \"family-other\",\n          \"immigration\",\n          \"insolvency\",\n          \"intellectual-property\",\n          \"international\",\n          \"landlord-tenant-non-residential\",\n          \"landlord-tenant-residential\",\n          \"licensing\",\n          \"other\",\n          \"other-common-law\",\n          \"personal-injury\",\n          \"planning\",\n          \"professional-discipline\",\n          \"professional-negligence\",\n          \"public-law-1\",\n          \"revenue\"\n        ],\n        \"enumTitles\": [\n          \"Admiralty\",\n          \"Arbitrator, umpire or mediator\",\n          \"Chancery (contentious)\",\n          \"Chancery (non-contentious)\",\n          \"Commercial and Financial Services\",\n          \"Competition\",\n          \"Construction\",\n          \"Crime\",\n          \"Defamation\",\n          \"Employment\",\n          \"European\",\n          \"Family - children\",\n          \"Family - other\",\n          \"Immigration\",\n          \"Insolvency\",\n          \"Intellectual property\",\n          \"International\",\n          \"Landlord & tenant (non-residential)\",\n          \"Landlord & tenant (residential)\",\n          \"Licensing\",\n          \"Other\",\n          \"Other common law\",\n          \"Personal injury\",\n          \"Planning\",\n          \"Professional discipline\",\n          \"Professional negligence\",\n          \"Public Law\",\n          \"Revenue\"\n        ]\n      },\n      \"uniqueItems\": true,\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"publicAccessRegistered\": {\n      \"title\": \"Public Access registered (mode=search)\",\n      \"type\": \"string\",\n      \"description\": \"Filter by whether the barrister is registered to accept work directly from the public (Public Access scheme). Applies to mode=search (practising view only) and mode=authorisedBarristers.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"yes\",\n        \"no\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Public Access registered only\",\n        \"Not Public Access registered only\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"authorisedToConductLitigation\": {\n      \"title\": \"Authorised to conduct litigation (mode=search)\",\n      \"type\": \"string\",\n      \"description\": \"Filter by whether the barrister is authorised to conduct litigation. Applies to mode=search (practising view only) and mode=authorisedBarristers.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"yes\",\n        \"no\"\n      ],\n      \"enumTitles\": [\n        \"Any\",\n        \"Authorised to conduct litigation only\",\n        \"Not authorised to conduct litigation only\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"sortOrder\": {\n      \"title\": \"Sort order (mode=disciplinaryFindings)\",\n      \"type\": \"string\",\n      \"description\": \"How to order the disciplinary findings listing.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"recent\",\n        \"relevance\"\n      ],\n      \"enumTitles\": [\n        \"Most recent first\",\n        \"Relevance\"\n      ],\n      \"default\": \"recent\",\n      \"prefill\": \"recent\"\n    },\n    \"findingStatus\": {\n      \"title\": \"Finding status filter (mode=disciplinaryFindings)\",\n      \"type\": \"array\",\n      \"description\": \"Restrict to disciplinary findings with these statuses. Leave empty for all statuses.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"final\",\n          \"openToAppeal\",\n          \"appealPending\"\n        ],\n        \"enumTitles\": [\n          \"Final\",\n          \"Open to Appeal\",\n          \"Appeal Pending\"\n        ]\n      },\n      \"uniqueItems\": true,\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"disciplinaryActionType\": {\n      \"title\": \"Disciplinary action type filter (mode=disciplinaryFindings)\",\n      \"type\": \"array\",\n      \"description\": \"Restrict to findings with ANY of these sanction types. Leave empty for all types.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"disbarment\",\n          \"fine\",\n          \"other\",\n          \"suspension\"\n        ],\n        \"enumTitles\": [\n          \"Disbarment\",\n          \"Fine\",\n          \"Other\",\n          \"Suspension\"\n        ]\n      },\n      \"uniqueItems\": true,\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"findingType\": {\n      \"title\": \"Hearing type filter (mode=disciplinaryFindings)\",\n      \"type\": \"array\",\n      \"description\": \"Restrict to findings from ANY of these hearing types. Leave empty for all types.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"determination-by-consent\",\n          \"disciplinary-tribunal-3-person\",\n          \"disciplinary-tribunal-5-person\",\n          \"visitors-hearing-appeal\"\n        ],\n        \"enumTitles\": [\n          \"Determination By Consent\",\n          \"Disciplinary Tribunal (3 person)\",\n          \"Disciplinary Tribunal (5 Person)\",\n          \"Visitors Hearing (appeal)\"\n        ]\n      },\n      \"uniqueItems\": true,\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"findingDateRange\": {\n      \"title\": \"Finding date range (mode=disciplinaryFindings)\",\n      \"type\": \"string\",\n      \"description\": \"Restrict findings to a decision-date window. `custom` uses `findingDateFrom`/`findingDateTo`. The window is applied to each finding's decision date.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"\",\n        \"pastMonth\",\n        \"pastYear\",\n        \"custom\"\n      ],\n      \"enumTitles\": [\n        \"Any time\",\n        \"Past month\",\n        \"Past year\",\n        \"Custom date range\"\n      ],\n      \"default\": \"\",\n      \"prefill\": \"\"\n    },\n    \"findingDateFrom\": {\n      \"title\": \"Finding date from (mode=disciplinaryFindings, findingDateRange=custom)\",\n      \"type\": \"string\",\n      \"description\": \"Start of the custom decision-date range, format `YYYY-MM-DD` (e.g. `2020-01-01`).\",\n      \"editor\": \"textfield\"\n    },\n    \"findingDateTo\": {\n      \"title\": \"Finding date to (mode=disciplinaryFindings, findingDateRange=custom)\",\n      \"type\": \"string\",\n      \"description\": \"End of the custom decision-date range, format `YYYY-MM-DD` (e.g. `2020-12-31`).\",\n      \"editor\": \"textfield\"\n    },\n    \"entityStatus\": {\n      \"title\": \"Entity status filter (mode=entities)\",\n      \"type\": \"array\",\n      \"description\": \"Restrict to BSB-regulated entities with these authorisation statuses. Leave empty for all statuses.\",\n      \"editor\": \"select\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"authorised\",\n          \"licensed\",\n          \"previouslyAuthorised\"\n        ],\n        \"enumTitles\": [\n          \"Currently authorised (BSB Authorised Body)\",\n          \"Currently licensed (BSB Licensed Body / ABS)\",\n          \"Previously authorised (no longer regulated)\"\n        ]\n      },\n      \"uniqueItems\": true,\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"startUrls\": {\n      \"title\": \"Barrister / finding URLs (mode=byUrl)\",\n      \"type\": \"array\",\n      \"description\": \"Full barstandardsboard.org.uk barrister-register or disciplinary_finding URLs to fetch directly.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [\n        \"https://www.barstandardsboard.org.uk/barristers-register/7C5DCA7B263721A6CB12F687568766BD.html\"\n      ]\n    },\n    \"fetchFullProfile\": {\n      \"title\": \"Fetch full profile details\",\n      \"type\": \"boolean\",\n      \"description\": \"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. Not used by mode=authorisedBarristers (the CSV already contains the full record).\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on the number of records emitted in this run. The full authorised-practising register currently has about 18,700 rows.\",\n      \"minimum\": 1,\n      \"maximum\": 20000,\n      \"default\": 30,\n      \"prefill\": 1\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Bar Standards Board Barrister Register Scraper\n\nScrape the **Bar Standards Board's** official public register for England & Wales. Search the Barristers' Register by name or chambers, pull the complete authorised-practising register in a single run, browse past disciplinary findings with sanctions, costs and decision documents, check interim suspensions, export BSB-regulated entities, or fetch specific barrister and finding URLs directly. Everything comes from [barstandardsboard.org.uk](https://www.barstandardsboard.org.uk), the statutory regulator of barristers in England and Wales. No login, no cookies, no proxy configuration and no API key are needed.\n\n## What this actor does\n\n- **Six modes:**\n  - `authorisedBarristers` — the full authorised-practising register (about 18,700 barristers) from the BSB's own published CSV, with contact details, member status, reserved activities and any current disciplinary finding\n  - `search` — live search of the Barristers' Register by barrister name or chambers/organisation name\n  - `disciplinaryFindings` — browse the public register of past disciplinary findings, sorted by date or relevance\n  - `interimSuspensions` — barristers currently subject to an interim suspension or interim conditions\n  - `entities` — BSB-regulated legal-services businesses (authorised bodies, licensed bodies/ABS, and previously-authorised bodies), including their reserved legal activities\n  - `byUrl` — fetch one or more barrister-register or disciplinary-finding URLs directly\n- **Filters that match the regulator's own register:** practising status, 28 areas of practice, Public Access registration, conduct-of-litigation authorisation, register view (practising vs. sanctioned non-practising)\n- **Disciplinary filters:** finding status, sanction type, hearing type, and a decision-date window (past month, past year, or a custom range)\n- **Deep profiles:** call date, Inn of Court, practising certificate validity, chambers address and switchboard, other addresses and numbers, rights of audience, areas of practice, other entitlements, youth-courts registration and disciplinary history\n- **Decision documents:** finding records include sanction, costs, status and links to published decision/report documents where the BSB provides them\n- **Empty fields are always omitted** — every value is real extracted data, never `null`, `N/A` or a placeholder sentence\n\n## Output per barrister (`recordType: \"barrister\"`)\n\n`search` returns the listing fields plus enrichment from each profile page. `authorisedBarristers` returns the full CSV record, which also carries the address split and member status. Fields the source does not publish for an individual are omitted.\n\n| Field | Description |\n|---|---|\n| `barristerName` | Full name as published, including title and post-nominal honours where present |\n| `title` / `forenames` / `surname` / `honours` | Name parts from the full-register CSV |\n| `barristerId` | BSB register ID extracted from the profile URL (search / byUrl only) |\n| `barristerUrl` / `sourceUrl` | Canonical register profile URL, or the CSV download URL for full-register records |\n| `practisingStatusBadge` | Badge shown on the register, e.g. `Practising`, `Disbarred` |\n| `currentPractisingStatus` | `Employed`, `Self Employed`, `Dual Capacity`, `Disbarred`, etc. |\n| `memberStatus` | Membership position, e.g. `Tenant`, `Door Tenant`, `Sole Practitioner`, `Manager (BSB Authorised Body)` |\n| `dateOfCall` | Month and year called to the Bar |\n| `innOfCourt` | Inn of Court |\n| `practisingCertificateValid` | Practising certificate validity period |\n| `primaryPracticeAddress` | Main chambers / employer address |\n| `addressName`, `addressFloorStreet`, `addressTown`, `addressCounty`, `addressPostcode`, `addressCountry` | Address components from the full-register CSV |\n| `primaryPracticeSwitchboardNumber` | Main switchboard number |\n| `otherPracticeAddresses` | Additional practice addresses listed for the barrister |\n| `otherPracticeSwitchboardNumbers` | Additional switchboard numbers |\n| `fax` | Fax number, where the BSB publishes one |\n| `rightsOfAudience` | Rights of audience granted |\n| `publicAccessRegistered` | Whether registered for the Public Access scheme (boolean) |\n| `authorisedToConductLitigation` | Whether authorised to conduct litigation (boolean) |\n| `areasOfPractice` | Declared areas of practice |\n| `otherEntitlements` | Other regulatory entitlements, e.g. probate activities, reserved instrument activities, administration of oaths |\n| `youthCourtsRegistered` | Whether registered for youth courts (boolean) |\n| `disciplinaryFindings` | List of findings with `findingId`, `findingDate`, `hearingType`, `findingUrl`, `breachDetails`, `offenceDetails`, `sanction`, `costs`, `findingStatus`. `findingDate` is ISO 8601: `YYYY-MM-DD` for full decision dates, `YYYY-MM` for the month-precision summary boxes shown on barrister profiles. The summary boxes themselves carry only date/type/URL/ID; the other finding fields are available in `disciplinaryFindings` and `byUrl` finding records and in CSV-nested findings |\n| `registerView` | `practising` or `sanctionedNonPractising` |\n| `recordType`, `scrapedAt` | Always present |\n\n## Output per disciplinary finding (`recordType: \"disciplinaryFinding\"`)\n\n| Field | Description |\n|---|---|\n| `barristerName` | Barrister subject to the finding |\n| `barristerRegisterUrl` / `barristerId` | Link back to the barrister's register entry |\n| `findingUrl` / `findingId` / `sourceUrl` | Canonical finding URL and ID |\n| `sanction` | Sanction imposed |\n| `costs` | Costs order, where published |\n| `findingStatus` | `Final`, `Open to Appeal` or `Appeal Pending` |\n| `hearingType` | Tribunal / hearing type |\n| `findingDate` | Decision date in ISO 8601 (`YYYY-MM-DD`) |\n| `currentPractisingStatus`, `dateOfCall`, `innOfCourt` | Barrister's details at the time of the finding |\n| `breachDetails` | Rules / Code of Conduct provisions breached |\n| `offenceDetails` | Narrative description of the misconduct |\n| `documents` | Published decision/report documents as `{documentTitle, documentUrl, documentType}` |\n\n## Output per interim suspension (`recordType: \"interimSuspension\"`)\n\n| Field | Description |\n|---|---|\n| `barristerName` | Name of the suspended barrister |\n| `details` | Full text of the suspension or interim conditions |\n| `sourceUrl` | Link to the listing anchor |\n| `recordType`, `scrapedAt` | Always present |\n\n## Output per entity (`recordType: \"entity\"`)\n\n| Field | Description |\n|---|---|\n| `entityName` | Name of the BSB-regulated entity |\n| `tradingNameOf` | Underlying company name when the entity trades under a different name |\n| `entityStatus` | `authorised`, `licensed` or `previouslyAuthorised` |\n| `entityType` | Legal structure, e.g. `Limited Liability Partnership`, `Private Limited Company` |\n| `authorisationValidFrom` | Date authorisation or licence took effect |\n| `renewalDate` | Next renewal date (current entities) |\n| `authorisationValidTo` | Date authorisation ended (previously-authorised entities) |\n| `practisingAddress` / `practisingAddressSecondary` | Registered practice address(es) |\n| `telephone` | Telephone number, where published |\n| `managers` | Named managers / partners |\n| `headOfLegalPractice` | Head of Legal Practice (HOLP) |\n| `headOfFinanceAndAdministration` | Head of Finance and Administration (HOFA) |\n| `administrationOfOaths` | Authorised to administer oaths (boolean) |\n| `authorisedToConductLitigation` | Authorised to conduct litigation (boolean) |\n| `fullRightsOfAudience` | Authorised to exercise full rights of audience (boolean) |\n| `probateActivities` | Authorised for probate activities (boolean) |\n| `reservedInstrumentActivities` | Authorised for reserved instrument activities (boolean) |\n| `approvedTrainingOrganisation` | Approved training organisation (boolean) |\n| `immigrationAdvice` | Authorised to undertake immigration advice (boolean) |\n| `sourceUrl` | The BSB entities-register workbook URL |\n| `recordType`, `scrapedAt` | Always present |\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `search` | `search` / `authorisedBarristers` / `disciplinaryFindings` / `interimSuspensions` / `entities` / `byUrl` |\n| `searchQuery` | string | – | Barrister/chambers query for `search` (required); optional name/chambers filter for `authorisedBarristers`, `disciplinaryFindings` and `entities` |\n| `searchField` | select | `name` | Match `searchQuery` against `name` or `organisation` (mode=search and authorisedBarristers) |\n| `registerView` | select | `practising` | `practising` or `sanctionedNonPractising` (mode=search) |\n| `practisingStatus` | multi-select | – | `Dual Capacity` / `Employed` / `Self Employed` (mode=search, authorisedBarristers) |\n| `areasOfPractice` | multi-select | – | Any of 28 practice areas (mode=search, authorisedBarristers) |\n| `publicAccessRegistered` | select | `any` | `any` / `yes` / `no` (mode=search, authorisedBarristers) |\n| `authorisedToConductLitigation` | select | `any` | `any` / `yes` / `no` (mode=search, authorisedBarristers) |\n| `sortOrder` | select | `recent` | `recent` or `relevance` (mode=disciplinaryFindings) |\n| `findingStatus` | multi-select | – | `Final` / `Open to Appeal` / `Appeal Pending` (mode=disciplinaryFindings) |\n| `disciplinaryActionType` | multi-select | – | `Disbarment` / `Fine` / `Other` / `Suspension` (mode=disciplinaryFindings) |\n| `findingType` | multi-select | – | Determination by consent, Disciplinary Tribunal (3/5 person), Visitors Hearing (appeal) (mode=disciplinaryFindings) |\n| `findingDateRange` | select | any | `pastMonth` / `pastYear` / `custom` (mode=disciplinaryFindings) |\n| `findingDateFrom` / `findingDateTo` | string | – | Custom decision-date boundaries in `YYYY-MM-DD` (findingDateRange=custom) |\n| `entityStatus` | multi-select | – | `authorised` / `licensed` / `previouslyAuthorised` (mode=entities) |\n| `startUrls` | array | – | Barrister or finding URLs (mode=byUrl) |\n| `fetchFullProfile` | boolean | `true` | Fetch each search/finding detail page for extra fields (not used by authorisedBarristers) |\n| `maxItems` | integer | `30` | Hard cap on emitted records (1–20,000) |\n\n### Example: pull the complete authorised-practising register\n\n```json\n{\n  \"mode\": \"authorisedBarristers\",\n  \"maxItems\": 20000\n}\n```\n\n### Example: full register filtered to crime barristers with Public Access\n\n```json\n{\n  \"mode\": \"authorisedBarristers\",\n  \"areasOfPractice\": [\"crime\"],\n  \"publicAccessRegistered\": \"yes\",\n  \"maxItems\": 500\n}\n```\n\n### Example: search barristers at a chambers\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"no5\",\n  \"searchField\": \"organisation\",\n  \"areasOfPractice\": [\"crime\", \"employment\"],\n  \"authorisedToConductLitigation\": \"yes\",\n  \"maxItems\": 50\n}\n```\n\n### Example: browse recent disciplinary findings\n\n```json\n{\n  \"mode\": \"disciplinaryFindings\",\n  \"sortOrder\": \"recent\",\n  \"maxItems\": 50\n}\n```\n\n### Example: disbarment or suspension in a custom period\n\n```json\n{\n  \"mode\": \"disciplinaryFindings\",\n  \"disciplinaryActionType\": [\"disbarment\", \"suspension\"],\n  \"findingDateRange\": \"custom\",\n  \"findingDateFrom\": \"2020-01-01\",\n  \"findingDateTo\": \"2020-12-31\",\n  \"maxItems\": 50\n}\n```\n\n### Example: barristers under interim suspension\n\n```json\n{\n  \"mode\": \"interimSuspensions\",\n  \"maxItems\": 50\n}\n```\n\n### Example: currently-authorised BSB entities matching a name\n\n```json\n{\n  \"mode\": \"entities\",\n  \"searchQuery\": \"law\",\n  \"entityStatus\": [\"authorised\", \"licensed\"],\n  \"maxItems\": 200\n}\n```\n\n### Example: fetch specific barrister or finding URLs\n\n```json\n{\n  \"mode\": \"byUrl\",\n  \"startUrls\": [\n    \"https://www.barstandardsboard.org.uk/barristers-register/7C5DCA7B263721A6CB12F687568766BD.html\",\n    \"https://www.barstandardsboard.org.uk/disciplinary_finding/183742.html\"\n  ]\n}\n```\n\n## Use cases\n\n- **Due diligence** — verify a barrister's practising status, certificate validity, Inn of Court and disciplinary history before instructing them\n- **Legal directories and comparison sites** — import the full authorised-practising register with chambers, contact details and practice areas\n- **Compliance monitoring** — track new disciplinary findings, sanctions and interim suspensions as they are published\n- **Recruitment and chambers research** — size practice areas, identify Public Access or litigation-authorised barristers, and map chambers\n- **Regulatory analytics** — measure the distribution of practising statuses, areas of practice and reserved activities across England & Wales\n- **Journalism and legal research** — cross-reference a finding's sanction, costs and published decision documents with case reporting\n\n## Limitations\n\n- The BSB's **Disqualified persons** page is currently empty (\"There are currently no persons disqualified\"), so it is not exposed as a mode. This is a currently-empty surface, not a proven unparseable page.\n- The **full-register CSV** does not publish a barrister profile URL or register ID. Those two fields are available in `search` and `byUrl` records, but not in `authorisedBarristers` records.\n- The register's own **date filter** is unreliable and can return the full findings list for any date selected. The actor therefore applies the decision-date window to each finding's actual decision date, so the filter works as expected.\n- Historical findings before 2002 are not published by the BSB.\n- Some addresses or phone numbers are genuinely unpublished by the BSB for a particular barrister; those fields are omitted rather than invented.\n\n## FAQ\n\n**Is this official data?** Yes. Every record comes from the Bar Standards Board's own public register at barstandardsboard.org.uk, the statutory regulator for barristers in England and Wales.\n\n**What is the difference between the `search` and `authorisedBarristers` modes?** `search` asks the live register for a name or chambers match and can enrich each result from its profile page. `authorisedBarristers` downloads the BSB's published full-register CSV in one request and returns every authorised practising barrister with the complete CSV field set. Use the CSV mode for bulk work and `search` for targeted lookups.\n\n**What is the difference between `practising` and `sanctionedNonPractising`?** `practising` covers currently authorised barristers who hold a practising certificate. `sanctionedNonPractising` covers disbarred or unregistered barristers who have a current disciplinary finding.\n\n**Why do some barrister records have fewer fields than others?** The register only publishes certain details for certain statuses. For example, a disbarred barrister has no current chambers address, so that field is omitted rather than shown as empty.\n\n**Does `searchQuery` support partial matches?** Yes. The register performs a substring match on names or chambers/organisation names, the same as the site's own search box. The full-register mode applies the same partial-match rule to the CSV.\n\n**Can I get every barrister in one run?** Yes. Use `mode: \"authorisedBarristers\"` and set `maxItems` to `20000`, the current maximum and above the register size (18,739 rows at the latest verification).\n\n**How current is the register?** The BSB updates the register continuously, with up to an hour of processing lag. The full-register CSV is regenerated by the BSB; `sourceUrl` identifies the current downloadable asset (the URL itself does not encode a snapshot date).\n\n**Can I look up a barrister when I only have a URL?** Yes. Use `mode: \"byUrl\"` with full barrister-register or disciplinary_finding URLs.\n\n**Are decision documents always available?** No. The BSB publishes a decision or report document for some findings only. When a document is published, it appears in `documents`; otherwise the field is omitted.\n\n**Do I need to set up a proxy?** No. The actor connects to the public register directly. Just fill in the input and run it.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "bar-standards-board-barrister-register-scraper",
      "title": "Bar Standards Board Barrister Register Scraper",
      "description": "Search the Bar Standards Board’s official Barristers’ Register, download the full authorised-practising register, browse disciplinary findings with sanctions and costs, check interim suspensions, and export BSB-regulated entities.",
      "version": "1.0",
      "buildTag": "latest",
      "dockerfile": "./Dockerfile",
      "readme": "# Bar Standards Board Barrister Register Scraper\n\nScrape the **Bar Standards Board's** official public register for England & Wales. Search the Barristers' Register by name or chambers, pull the complete authorised-practising register in a single run, browse past disciplinary findings with sanctions, costs and decision documents, check interim suspensions, export BSB-regulated entities, or fetch specific barrister and finding URLs directly. Everything comes from [barstandardsboard.org.uk](https://www.barstandardsboard.org.uk), the statutory regulator of barristers in England and Wales. No login, no cookies, no proxy configuration and no API key are needed.\n\n## What this actor does\n\n- **Six modes:**\n  - `authorisedBarristers` — the full authorised-practising register (about 18,700 barristers) from the BSB's own published CSV, with contact details, member status, reserved activities and any current disciplinary finding\n  - `search` — live search of the Barristers' Register by barrister name or chambers/organisation name\n  - `disciplinaryFindings` — browse the public register of past disciplinary findings, sorted by date or relevance\n  - `interimSuspensions` — barristers currently subject to an interim suspension or interim conditions\n  - `entities` — BSB-regulated legal-services businesses (authorised bodies, licensed bodies/ABS, and previously-authorised bodies), including their reserved legal activities\n  - `byUrl` — fetch one or more barrister-register or disciplinary-finding URLs directly\n- **Filters that match the regulator's own register:** practising status, 28 areas of practice, Public Access registration, conduct-of-litigation authorisation, register view (practising vs. sanctioned non-practising)\n- **Disciplinary filters:** finding status, sanction type, hearing type, and a decision-date window (past month, past year, or a custom range)\n- **Deep profiles:** call date, Inn of Court, practising certificate validity, chambers address and switchboard, other addresses and numbers, rights of audience, areas of practice, other entitlements, youth-courts registration and disciplinary history\n- **Decision documents:** finding records include sanction, costs, status and links to published decision/report documents where the BSB provides them\n- **Empty fields are always omitted** — every value is real extracted data, never `null`, `N/A` or a placeholder sentence\n\n## Output per barrister (`recordType: \"barrister\"`)\n\n`search` returns the listing fields plus enrichment from each profile page. `authorisedBarristers` returns the full CSV record, which also carries the address split and member status. Fields the source does not publish for an individual are omitted.\n\n| Field | Description |\n|---|---|\n| `barristerName` | Full name as published, including title and post-nominal honours where present |\n| `title` / `forenames` / `surname` / `honours` | Name parts from the full-register CSV |\n| `barristerId` | BSB register ID extracted from the profile URL (search / byUrl only) |\n| `barristerUrl` / `sourceUrl` | Canonical register profile URL, or the CSV download URL for full-register records |\n| `practisingStatusBadge` | Badge shown on the register, e.g. `Practising`, `Disbarred` |\n| `currentPractisingStatus` | `Employed`, `Self Employed`, `Dual Capacity`, `Disbarred`, etc. |\n| `memberStatus` | Membership position, e.g. `Tenant`, `Door Tenant`, `Sole Practitioner`, `Manager (BSB Authorised Body)` |\n| `dateOfCall` | Month and year called to the Bar |\n| `innOfCourt` | Inn of Court |\n| `practisingCertificateValid` | Practising certificate validity period |\n| `primaryPracticeAddress` | Main chambers / employer address |\n| `addressName`, `addressFloorStreet`, `addressTown`, `addressCounty`, `addressPostcode`, `addressCountry` | Address components from the full-register CSV |\n| `primaryPracticeSwitchboardNumber` | Main switchboard number |\n| `otherPracticeAddresses` | Additional practice addresses listed for the barrister |\n| `otherPracticeSwitchboardNumbers` | Additional switchboard numbers |\n| `fax` | Fax number, where the BSB publishes one |\n| `rightsOfAudience` | Rights of audience granted |\n| `publicAccessRegistered` | Whether registered for the Public Access scheme (boolean) |\n| `authorisedToConductLitigation` | Whether authorised to conduct litigation (boolean) |\n| `areasOfPractice` | Declared areas of practice |\n| `otherEntitlements` | Other regulatory entitlements, e.g. probate activities, reserved instrument activities, administration of oaths |\n| `youthCourtsRegistered` | Whether registered for youth courts (boolean) |\n| `disciplinaryFindings` | List of findings with `findingId`, `findingDate`, `hearingType`, `findingUrl`, `breachDetails`, `offenceDetails`, `sanction`, `costs`, `findingStatus`. `findingDate` is ISO 8601: `YYYY-MM-DD` for full decision dates, `YYYY-MM` for the month-precision summary boxes shown on barrister profiles. The summary boxes themselves carry only date/type/URL/ID; the other finding fields are available in `disciplinaryFindings` and `byUrl` finding records and in CSV-nested findings |\n| `registerView` | `practising` or `sanctionedNonPractising` |\n| `recordType`, `scrapedAt` | Always present |\n\n## Output per disciplinary finding (`recordType: \"disciplinaryFinding\"`)\n\n| Field | Description |\n|---|---|\n| `barristerName` | Barrister subject to the finding |\n| `barristerRegisterUrl` / `barristerId` | Link back to the barrister's register entry |\n| `findingUrl` / `findingId` / `sourceUrl` | Canonical finding URL and ID |\n| `sanction` | Sanction imposed |\n| `costs` | Costs order, where published |\n| `findingStatus` | `Final`, `Open to Appeal` or `Appeal Pending` |\n| `hearingType` | Tribunal / hearing type |\n| `findingDate` | Decision date in ISO 8601 (`YYYY-MM-DD`) |\n| `currentPractisingStatus`, `dateOfCall`, `innOfCourt` | Barrister's details at the time of the finding |\n| `breachDetails` | Rules / Code of Conduct provisions breached |\n| `offenceDetails` | Narrative description of the misconduct |\n| `documents` | Published decision/report documents as `{documentTitle, documentUrl, documentType}` |\n\n## Output per interim suspension (`recordType: \"interimSuspension\"`)\n\n| Field | Description |\n|---|---|\n| `barristerName` | Name of the suspended barrister |\n| `details` | Full text of the suspension or interim conditions |\n| `sourceUrl` | Link to the listing anchor |\n| `recordType`, `scrapedAt` | Always present |\n\n## Output per entity (`recordType: \"entity\"`)\n\n| Field | Description |\n|---|---|\n| `entityName` | Name of the BSB-regulated entity |\n| `tradingNameOf` | Underlying company name when the entity trades under a different name |\n| `entityStatus` | `authorised`, `licensed` or `previouslyAuthorised` |\n| `entityType` | Legal structure, e.g. `Limited Liability Partnership`, `Private Limited Company` |\n| `authorisationValidFrom` | Date authorisation or licence took effect |\n| `renewalDate` | Next renewal date (current entities) |\n| `authorisationValidTo` | Date authorisation ended (previously-authorised entities) |\n| `practisingAddress` / `practisingAddressSecondary` | Registered practice address(es) |\n| `telephone` | Telephone number, where published |\n| `managers` | Named managers / partners |\n| `headOfLegalPractice` | Head of Legal Practice (HOLP) |\n| `headOfFinanceAndAdministration` | Head of Finance and Administration (HOFA) |\n| `administrationOfOaths` | Authorised to administer oaths (boolean) |\n| `authorisedToConductLitigation` | Authorised to conduct litigation (boolean) |\n| `fullRightsOfAudience` | Authorised to exercise full rights of audience (boolean) |\n| `probateActivities` | Authorised for probate activities (boolean) |\n| `reservedInstrumentActivities` | Authorised for reserved instrument activities (boolean) |\n| `approvedTrainingOrganisation` | Approved training organisation (boolean) |\n| `immigrationAdvice` | Authorised to undertake immigration advice (boolean) |\n| `sourceUrl` | The BSB entities-register workbook URL |\n| `recordType`, `scrapedAt` | Always present |\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | select | `search` | `search` / `authorisedBarristers` / `disciplinaryFindings` / `interimSuspensions` / `entities` / `byUrl` |\n| `searchQuery` | string | – | Barrister/chambers query for `search` (required); optional name/chambers filter for `authorisedBarristers`, `disciplinaryFindings` and `entities` |\n| `searchField` | select | `name` | Match `searchQuery` against `name` or `organisation` (mode=search and authorisedBarristers) |\n| `registerView` | select | `practising` | `practising` or `sanctionedNonPractising` (mode=search) |\n| `practisingStatus` | multi-select | – | `Dual Capacity` / `Employed` / `Self Employed` (mode=search, authorisedBarristers) |\n| `areasOfPractice` | multi-select | – | Any of 28 practice areas (mode=search, authorisedBarristers) |\n| `publicAccessRegistered` | select | `any` | `any` / `yes` / `no` (mode=search, authorisedBarristers) |\n| `authorisedToConductLitigation` | select | `any` | `any` / `yes` / `no` (mode=search, authorisedBarristers) |\n| `sortOrder` | select | `recent` | `recent` or `relevance` (mode=disciplinaryFindings) |\n| `findingStatus` | multi-select | – | `Final` / `Open to Appeal` / `Appeal Pending` (mode=disciplinaryFindings) |\n| `disciplinaryActionType` | multi-select | – | `Disbarment` / `Fine` / `Other` / `Suspension` (mode=disciplinaryFindings) |\n| `findingType` | multi-select | – | Determination by consent, Disciplinary Tribunal (3/5 person), Visitors Hearing (appeal) (mode=disciplinaryFindings) |\n| `findingDateRange` | select | any | `pastMonth` / `pastYear` / `custom` (mode=disciplinaryFindings) |\n| `findingDateFrom` / `findingDateTo` | string | – | Custom decision-date boundaries in `YYYY-MM-DD` (findingDateRange=custom) |\n| `entityStatus` | multi-select | – | `authorised` / `licensed` / `previouslyAuthorised` (mode=entities) |\n| `startUrls` | array | – | Barrister or finding URLs (mode=byUrl) |\n| `fetchFullProfile` | boolean | `true` | Fetch each search/finding detail page for extra fields (not used by authorisedBarristers) |\n| `maxItems` | integer | `30` | Hard cap on emitted records (1–20,000) |\n\n### Example: pull the complete authorised-practising register\n\n```json\n{\n  \"mode\": \"authorisedBarristers\",\n  \"maxItems\": 20000\n}\n```\n\n### Example: full register filtered to crime barristers with Public Access\n\n```json\n{\n  \"mode\": \"authorisedBarristers\",\n  \"areasOfPractice\": [\"crime\"],\n  \"publicAccessRegistered\": \"yes\",\n  \"maxItems\": 500\n}\n```\n\n### Example: search barristers at a chambers\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQuery\": \"no5\",\n  \"searchField\": \"organisation\",\n  \"areasOfPractice\": [\"crime\", \"employment\"],\n  \"authorisedToConductLitigation\": \"yes\",\n  \"maxItems\": 50\n}\n```\n\n### Example: browse recent disciplinary findings\n\n```json\n{\n  \"mode\": \"disciplinaryFindings\",\n  \"sortOrder\": \"recent\",\n  \"maxItems\": 50\n}\n```\n\n### Example: disbarment or suspension in a custom period\n\n```json\n{\n  \"mode\": \"disciplinaryFindings\",\n  \"disciplinaryActionType\": [\"disbarment\", \"suspension\"],\n  \"findingDateRange\": \"custom\",\n  \"findingDateFrom\": \"2020-01-01\",\n  \"findingDateTo\": \"2020-12-31\",\n  \"maxItems\": 50\n}\n```\n\n### Example: barristers under interim suspension\n\n```json\n{\n  \"mode\": \"interimSuspensions\",\n  \"maxItems\": 50\n}\n```\n\n### Example: currently-authorised BSB entities matching a name\n\n```json\n{\n  \"mode\": \"entities\",\n  \"searchQuery\": \"law\",\n  \"entityStatus\": [\"authorised\", \"licensed\"],\n  \"maxItems\": 200\n}\n```\n\n### Example: fetch specific barrister or finding URLs\n\n```json\n{\n  \"mode\": \"byUrl\",\n  \"startUrls\": [\n    \"https://www.barstandardsboard.org.uk/barristers-register/7C5DCA7B263721A6CB12F687568766BD.html\",\n    \"https://www.barstandardsboard.org.uk/disciplinary_finding/183742.html\"\n  ]\n}\n```\n\n## Use cases\n\n- **Due diligence** — verify a barrister's practising status, certificate validity, Inn of Court and disciplinary history before instructing them\n- **Legal directories and comparison sites** — import the full authorised-practising register with chambers, contact details and practice areas\n- **Compliance monitoring** — track new disciplinary findings, sanctions and interim suspensions as they are published\n- **Recruitment and chambers research** — size practice areas, identify Public Access or litigation-authorised barristers, and map chambers\n- **Regulatory analytics** — measure the distribution of practising statuses, areas of practice and reserved activities across England & Wales\n- **Journalism and legal research** — cross-reference a finding's sanction, costs and published decision documents with case reporting\n\n## Limitations\n\n- The BSB's **Disqualified persons** page is currently empty (\"There are currently no persons disqualified\"), so it is not exposed as a mode. This is a currently-empty surface, not a proven unparseable page.\n- The **full-register CSV** does not publish a barrister profile URL or register ID. Those two fields are available in `search` and `byUrl` records, but not in `authorisedBarristers` records.\n- The register's own **date filter** is unreliable and can return the full findings list for any date selected. The actor therefore applies the decision-date window to each finding's actual decision date, so the filter works as expected.\n- Historical findings before 2002 are not published by the BSB.\n- Some addresses or phone numbers are genuinely unpublished by the BSB for a particular barrister; those fields are omitted rather than invented.\n\n## FAQ\n\n**Is this official data?** Yes. Every record comes from the Bar Standards Board's own public register at barstandardsboard.org.uk, the statutory regulator for barristers in England and Wales.\n\n**What is the difference between the `search` and `authorisedBarristers` modes?** `search` asks the live register for a name or chambers match and can enrich each result from its profile page. `authorisedBarristers` downloads the BSB's published full-register CSV in one request and returns every authorised practising barrister with the complete CSV field set. Use the CSV mode for bulk work and `search` for targeted lookups.\n\n**What is the difference between `practising` and `sanctionedNonPractising`?** `practising` covers currently authorised barristers who hold a practising certificate. `sanctionedNonPractising` covers disbarred or unregistered barristers who have a current disciplinary finding.\n\n**Why do some barrister records have fewer fields than others?** The register only publishes certain details for certain statuses. For example, a disbarred barrister has no current chambers address, so that field is omitted rather than shown as empty.\n\n**Does `searchQuery` support partial matches?** Yes. The register performs a substring match on names or chambers/organisation names, the same as the site's own search box. The full-register mode applies the same partial-match rule to the CSV.\n\n**Can I get every barrister in one run?** Yes. Use `mode: \"authorisedBarristers\"` and set `maxItems` to `20000`, the current maximum and above the register size (18,739 rows at the latest verification).\n\n**How current is the register?** The BSB updates the register continuously, with up to an hour of processing lag. The full-register CSV is regenerated by the BSB; `sourceUrl` identifies the current downloadable asset (the URL itself does not encode a snapshot date).\n\n**Can I look up a barrister when I only have a URL?** Yes. Use `mode: \"byUrl\"` with full barrister-register or disciplinary_finding URLs.\n\n**Are decision documents always available?** No. The BSB publishes a decision or report document for some findings only. When a document is published, it appears in `documents`; otherwise the field is omitted.\n\n**Do I need to set up a proxy?** No. The actor connects to the public register directly. Just fill in the input and run it.\n",
      "input": {
        "title": "Bar Standards Board Barrister Register Scraper Input",
        "description": "Search or bulk-download the Bar Standards Board's official Barristers' Register, browse disciplinary findings or interim suspensions, export BSB-regulated entities, or fetch barrister and finding URLs directly.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "What to fetch from the Bar Standards Board register.",
            "editor": "select",
            "enum": [
              "search",
              "authorisedBarristers",
              "disciplinaryFindings",
              "interimSuspensions",
              "byUrl",
              "entities"
            ],
            "enumTitles": [
              "Search the Barristers' Register (by name / chambers)",
              "Full authorised-practising register (bulk CSV, ~18,700 barristers)",
              "Browse past disciplinary findings",
              "Barristers with interim suspensions or conditions",
              "Fetch specific barrister / finding URLs",
              "BSB-regulated entities (chambers / legal businesses)"
            ],
            "default": "search",
            "prefill": "search"
          },
          "searchQuery": {
            "title": "Search query (mode=search, authorisedBarristers, disciplinaryFindings, entities)",
            "type": "string",
            "description": "For mode=search: barrister name or chambers/organisation name (required). For mode=authorisedBarristers: optional name/chambers filter over the full register. 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.",
            "editor": "textfield",
            "default": "",
            "prefill": "smith"
          },
          "searchField": {
            "title": "Search by (mode=search)",
            "type": "string",
            "description": "Whether `searchQuery` matches the barrister's name or their chambers/organisation (mode=search and mode=authorisedBarristers).",
            "editor": "select",
            "enum": [
              "name",
              "organisation"
            ],
            "enumTitles": [
              "Barrister name",
              "Chambers / organisation name"
            ],
            "default": "name",
            "prefill": "name"
          },
          "registerView": {
            "title": "Register view (mode=search)",
            "type": "string",
            "description": "`Practising` = currently authorised practising barristers. `Sanctioned non-practising` = barristers disbarred or otherwise sanctioned who are no longer authorised to practise.",
            "editor": "select",
            "enum": [
              "practising",
              "sanctionedNonPractising"
            ],
            "enumTitles": [
              "Practising barristers",
              "Sanctioned non-practising barristers (disbarred etc.)"
            ],
            "default": "practising",
            "prefill": "practising"
          },
          "practisingStatus": {
            "title": "Practising status filter (mode=search)",
            "type": "array",
            "description": "Restrict to barristers with these practising statuses. Leave empty for all statuses. Applies to mode=search (practising view only) and mode=authorisedBarristers.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "dual-capacity",
                "employed",
                "self-employed"
              ],
              "enumTitles": [
                "Dual Capacity",
                "Employed",
                "Self Employed"
              ]
            },
            "uniqueItems": true,
            "default": [],
            "prefill": []
          },
          "areasOfPractice": {
            "title": "Areas of practice filter (mode=search)",
            "type": "array",
            "description": "Restrict to barristers practising in ANY of these areas of law. Leave empty for all areas. Applies to mode=search (practising view only) and mode=authorisedBarristers.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "admiralty",
                "arbitrator-or-umpire-or-mediator",
                "chancery-contentious",
                "chancery-non-contentious",
                "commercial-and-financial-services-1",
                "competition",
                "construction",
                "crime",
                "defamation",
                "employment",
                "european",
                "family-children",
                "family-other",
                "immigration",
                "insolvency",
                "intellectual-property",
                "international",
                "landlord-tenant-non-residential",
                "landlord-tenant-residential",
                "licensing",
                "other",
                "other-common-law",
                "personal-injury",
                "planning",
                "professional-discipline",
                "professional-negligence",
                "public-law-1",
                "revenue"
              ],
              "enumTitles": [
                "Admiralty",
                "Arbitrator, umpire or mediator",
                "Chancery (contentious)",
                "Chancery (non-contentious)",
                "Commercial and Financial Services",
                "Competition",
                "Construction",
                "Crime",
                "Defamation",
                "Employment",
                "European",
                "Family - children",
                "Family - other",
                "Immigration",
                "Insolvency",
                "Intellectual property",
                "International",
                "Landlord & tenant (non-residential)",
                "Landlord & tenant (residential)",
                "Licensing",
                "Other",
                "Other common law",
                "Personal injury",
                "Planning",
                "Professional discipline",
                "Professional negligence",
                "Public Law",
                "Revenue"
              ]
            },
            "uniqueItems": true,
            "default": [],
            "prefill": []
          },
          "publicAccessRegistered": {
            "title": "Public Access registered (mode=search)",
            "type": "string",
            "description": "Filter by whether the barrister is registered to accept work directly from the public (Public Access scheme). Applies to mode=search (practising view only) and mode=authorisedBarristers.",
            "editor": "select",
            "enum": [
              "any",
              "yes",
              "no"
            ],
            "enumTitles": [
              "Any",
              "Public Access registered only",
              "Not Public Access registered only"
            ],
            "default": "any",
            "prefill": "any"
          },
          "authorisedToConductLitigation": {
            "title": "Authorised to conduct litigation (mode=search)",
            "type": "string",
            "description": "Filter by whether the barrister is authorised to conduct litigation. Applies to mode=search (practising view only) and mode=authorisedBarristers.",
            "editor": "select",
            "enum": [
              "any",
              "yes",
              "no"
            ],
            "enumTitles": [
              "Any",
              "Authorised to conduct litigation only",
              "Not authorised to conduct litigation only"
            ],
            "default": "any",
            "prefill": "any"
          },
          "sortOrder": {
            "title": "Sort order (mode=disciplinaryFindings)",
            "type": "string",
            "description": "How to order the disciplinary findings listing.",
            "editor": "select",
            "enum": [
              "recent",
              "relevance"
            ],
            "enumTitles": [
              "Most recent first",
              "Relevance"
            ],
            "default": "recent",
            "prefill": "recent"
          },
          "findingStatus": {
            "title": "Finding status filter (mode=disciplinaryFindings)",
            "type": "array",
            "description": "Restrict to disciplinary findings with these statuses. Leave empty for all statuses.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "final",
                "openToAppeal",
                "appealPending"
              ],
              "enumTitles": [
                "Final",
                "Open to Appeal",
                "Appeal Pending"
              ]
            },
            "uniqueItems": true,
            "default": [],
            "prefill": []
          },
          "disciplinaryActionType": {
            "title": "Disciplinary action type filter (mode=disciplinaryFindings)",
            "type": "array",
            "description": "Restrict to findings with ANY of these sanction types. Leave empty for all types.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "disbarment",
                "fine",
                "other",
                "suspension"
              ],
              "enumTitles": [
                "Disbarment",
                "Fine",
                "Other",
                "Suspension"
              ]
            },
            "uniqueItems": true,
            "default": [],
            "prefill": []
          },
          "findingType": {
            "title": "Hearing type filter (mode=disciplinaryFindings)",
            "type": "array",
            "description": "Restrict to findings from ANY of these hearing types. Leave empty for all types.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "determination-by-consent",
                "disciplinary-tribunal-3-person",
                "disciplinary-tribunal-5-person",
                "visitors-hearing-appeal"
              ],
              "enumTitles": [
                "Determination By Consent",
                "Disciplinary Tribunal (3 person)",
                "Disciplinary Tribunal (5 Person)",
                "Visitors Hearing (appeal)"
              ]
            },
            "uniqueItems": true,
            "default": [],
            "prefill": []
          },
          "findingDateRange": {
            "title": "Finding date range (mode=disciplinaryFindings)",
            "type": "string",
            "description": "Restrict findings to a decision-date window. `custom` uses `findingDateFrom`/`findingDateTo`. The window is applied to each finding's decision date.",
            "editor": "select",
            "enum": [
              "",
              "pastMonth",
              "pastYear",
              "custom"
            ],
            "enumTitles": [
              "Any time",
              "Past month",
              "Past year",
              "Custom date range"
            ],
            "default": "",
            "prefill": ""
          },
          "findingDateFrom": {
            "title": "Finding date from (mode=disciplinaryFindings, findingDateRange=custom)",
            "type": "string",
            "description": "Start of the custom decision-date range, format `YYYY-MM-DD` (e.g. `2020-01-01`).",
            "editor": "textfield"
          },
          "findingDateTo": {
            "title": "Finding date to (mode=disciplinaryFindings, findingDateRange=custom)",
            "type": "string",
            "description": "End of the custom decision-date range, format `YYYY-MM-DD` (e.g. `2020-12-31`).",
            "editor": "textfield"
          },
          "entityStatus": {
            "title": "Entity status filter (mode=entities)",
            "type": "array",
            "description": "Restrict to BSB-regulated entities with these authorisation statuses. Leave empty for all statuses.",
            "editor": "select",
            "items": {
              "type": "string",
              "enum": [
                "authorised",
                "licensed",
                "previouslyAuthorised"
              ],
              "enumTitles": [
                "Currently authorised (BSB Authorised Body)",
                "Currently licensed (BSB Licensed Body / ABS)",
                "Previously authorised (no longer regulated)"
              ]
            },
            "uniqueItems": true,
            "default": [],
            "prefill": []
          },
          "startUrls": {
            "title": "Barrister / finding URLs (mode=byUrl)",
            "type": "array",
            "description": "Full barstandardsboard.org.uk barrister-register or disciplinary_finding URLs to fetch directly.",
            "editor": "stringList",
            "default": [],
            "prefill": [
              "https://www.barstandardsboard.org.uk/barristers-register/7C5DCA7B263721A6CB12F687568766BD.html"
            ]
          },
          "fetchFullProfile": {
            "title": "Fetch full profile details",
            "type": "boolean",
            "description": "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. Not used by mode=authorisedBarristers (the CSV already contains the full record).",
            "default": true,
            "prefill": false
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Hard cap on the number of records emitted in this run. The full authorised-practising register currently has about 18,700 rows.",
            "minimum": 1,
            "maximum": 20000,
            "default": 30,
            "prefill": 1
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Bar Standards Board Barrister Register Scraper Output",
        "description": "Barristers, past disciplinary findings, interim suspensions and BSB-regulated entities from the Bar Standards Board's official public register (barstandardsboard.org.uk).",
        "properties": {
          "barristers": {
            "type": "string",
            "title": "Bar Standards Board register records",
            "description": "Dataset containing all scraped barrister, disciplinary-finding, interim-suspension and entity records.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Barristers, findings & entities",
              "transformation": {
                "fields": [
                  "recordType",
                  "barristerName",
                  "currentPractisingStatus",
                  "memberStatus",
                  "dateOfCall",
                  "innOfCourt",
                  "primaryPracticeAddress",
                  "areasOfPractice",
                  "sourceUrl"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "1af3945b0e059cc2c7b245d2ceb3d97151e05ff5b932f7a8fe1ebaa0e28242e0",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.009515555555555555
    }
  }
}