# FCA Register Scraper - UK Firms with Phone, Email & Website (`scrapersdelight/fca-register-firms-scraper`) Actor

Export UK FCA-authorised firms and appointed representatives from the Financial Services Register with phone, email and website, status, FRN, Companies House number, permissions and AR network. No FCA API key needed. $0.013 per firm with contact details.

- **URL**: https://apify.com/scrapersdelight/fca-register-firms-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$13.00 / 1,000 per firm with contact details

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

## FCA Register Scraper — UK Financial Firms with Phone, Email & Website

Export firms from the **UK FCA Financial Services Register** as B2B leads, one row per firm: **phone, email and website**, plus FRN, register status and its effective date, head-office address, Companies House number, permissions, trading names, and the appointed-representative network (the principal firm on an AR's row, the AR list on a principal's row).

**You do not need an FCA API key.** Other FCA register actors make you sign up for the FCA developer portal and paste in your own email and key. This one reads the register website's own public data calls, so you can run it straight away.

**$0.013 per firm, and only for firms that publish a phone, email or website.** Firms with no contact details, firms your filters remove, FRNs that aren't on the register, and duplicates are never charged.

### 💡 What does this Actor do?

The FCA Financial Services Register is the public record of UK authorised firms and appointed representatives. For most firms that record includes a phone number, an email address and a website. The register website shows one firm at a time. This Actor exports the firms that match your search, along with their contact details:

- **Search by name keyword.** Enter words like `mortgage`, `insurance`, `wealth`, `credit`, `pensions` or a brand name. The Actor pages through every match the register returns, up to 500 per page.
- **Filter by permission** before paying for anything. For example, keep only firms with *Consumer Credit* permission, or firms whose permitted activities include *Debt-counselling* or *mortgage*. This check runs on the search results, so firms that fail it cost you nothing.
- **Map an appointed-representative (AR) network.** Enter a principal firm's FRN, such as a mortgage or insurance network, and get every current AR as its own row with its own phone, email and website.
- **Look up exact FRNs** for KYC, onboarding or list refreshes.
- **Filter by status:** current firms (the default), former firms, or all.

**Who uses it:** fintech and regtech vendors (KYC, compliance, reporting and CRM software for regulated firms), lead sellers who sell to mortgage and insurance brokers and their ARs, financial-services recruiters, and compliance teams checking counterparties.

### 📤 What you get: one row per firm

| Field | What it is |
|---|---|
| `frn` | FCA Firm Reference Number, the register's own ID. Rows are de-duplicated on it. |
| `firmName` | Registered name |
| `status`, `statusClass`, `statusEffectiveDate`, `statusExplained` | Status exactly as the register publishes it (e.g. *Authorised*, *Registered*, *Appointed representative*, *No longer authorised*), grouped as `current` / `former` / `unknown`, the date the status took effect, and the register's own one-line explanation of it |
| **`phone`**, `phoneCountryCode`, `phoneE164` | Phone exactly as recorded, the dialling code recorded with it, and the number in E.164 format (null if the conversion would be a guess) |
| **`email`**, `emailDomain` | Firm email as recorded |
| **`website`**, `websiteUrl`, `websiteDomain` | Firm website as recorded, as a clickable URL, and as a bare domain |
| `hasReachableContact` | True when the firm publishes at least one of phone, email or website. Only these rows are charged. |
| `addressType`, `addressLines`, `town`, `county`, `postcode`, `country`, `fullAddress` | Principal place of business |
| `companiesHouseNumber`, `countryOfIncorporation`, `firstAuthorisationDate` | Company identifiers |
| `businessType`, `primarySector`, `sectors`, `regulators`, `dualRegulated` | Business type, the FCA's primary sector for the firm, and whether it is FCA-only or FCA + PRA |
| `tradingNames`, `currentNames`, `previousNames` | Current trading names, plus every registered and trading name with its effective-from and effective-to dates |
| `permissionCount`, `permissionCategories`, `permissions` | Every permitted activity with its category (Consumer Credit, Insurance Distribution, Regulated Home Finance, Designated Investment Business, CBTL, ...) |
| `hasConsumerCreditPermission`, `clientMoneyPermission`, `cbtlStatus`, `psdStatus`, `emoneyStatus` | Register flags |
| `appointedRepresentativeCount`, `appointedRepresentatives` | On a principal firm's row: its current AR count and AR list (name, FRN, type, effective date; up to 500) |
| `isAppointedRepresentative`, `principalFirms`, `principalFirmFrn`, `principalFirmName` | On an AR's row: the principal firm(s) it trades under |
| `disciplinaryActionCount`, `disciplinaryHistory` | Number of published disciplinary actions. The date, type and text of each are optional. |
| `complaintsContact` | Optional: the complaints contact the firm registered (name, job title, phone, email) |
| `approvedIndividualCount`, `approvedIndividuals` | Optional: approved and certified individuals (name, IRN, status, controlled functions) |
| `registerUrl`, `organisationId`, `matchedBy`, `scrapedAt` | The firm's page on the register, the register's internal record ID, which of your inputs found the firm, and when the row was read |

### 📊 Field fill, measured on real runs (2026-09-23)

Contact fill depends on the kind of firm, so each group below is measured separately.

| Group | Firms | Phone | Email | Website | Companies House no. |
|---|---|---|---|---|---|
| Directly authorised firms matching `insurance` (the first 204 current, non-AR firms) | 204 | 98% | 98% | 89% | 92% |
| Every current AR of one mortgage network (Mortgage Intelligence, FRN 305330) | 139 | 97% | 94% | 37% | 67% |
| Every current firm matching `credit union` | 351 | 98% | 95% | 73% | — |
| All 968 `credit union` matches with an FRN, **any status** | 968 | 54% | 46% | 33% | 60% |
| …of which **former** firms (No longer authorised / Revoked / former AR) | 616 | 30% | 18% | 11% | — |

**Current firms usually publish a contact. Former firms often don't.** That is why the default status filter is *current*, and why contact-less rows are never charged. Postcode is filled on 97–100% of rows and status on 100% in every group. The first three groups are lower bounds for Companies House number, which is not read for the few firms with no contact.

### ⚙️ Input

| Input | Default | What it does |
|---|---|---|
| `searchTerms` | `[]` (demo: `mortgage`) | Firm-name keywords. The register searches names and FRNs, not postcodes. |
| `frns` | `[]` | Exact FRNs. Each one is returned whatever its status. |
| `principalFrns` | `[]` | Principal firms whose current ARs you want, one row per AR |
| `statusFilter` | `current` | `current`, `former` or `all` |
| `includeAppointedRepresentatives` | `false` | Also return ARs that match your search terms. ARs outnumber directly authorised firms on the register. |
| `permissionCategories` | `[]` | Keep firms holding a permission in these categories. Checked before any firm page is fetched. |
| `permissionContains` | `[]` | Keep firms with a permitted activity containing these words. Combined with the categories using AND. |
| `requireContact` | `any` | `any` / `phone` / `email` / `website`, or `none` to also get contact-less firms free of charge |
| `maxResults` | `25` | Maximum firms delivered. `0` = no limit. |
| `includePermissions`, `includeTradingNames`, `includeAppointedRepresentativeList` | on | Include the full lists in each row |
| `includeDisciplinaryHistory`, `includeComplaintsContact`, `includeApprovedIndividuals` | off | Include the optional details. |
| `maxConcurrency` | `4` | Firm pages fetched in parallel |
| `proxyConfiguration` | no proxy | The register answers Apify's network directly. If the direct connection fails, the run switches to Apify RESIDENTIAL (GB) once by itself. |

If you give no search terms, FRNs or principal FRNs, the Actor runs the demo scope (`searchTerms: ["mortgage"]`) up to `maxResults`.

#### Example inputs

Consumer-credit firms that do debt work, with contact details:

```json
{ "searchTerms": ["credit", "debt"], "permissionCategories": ["Consumer Credit"], "permissionContains": ["Debt"], "maxResults": 500 }
```

Every current AR of a mortgage network:

```json
{ "principalFrns": ["305330"], "maxResults": 0 }
```

Exact firms, any status, with disciplinary history:

```json
{ "frns": ["122702", "912350"], "statusFilter": "all", "includeDisciplinaryHistory": true }
```

### 🧾 Example row (real, from the 2026-09-23 `insurance` run)

```json
{
  "frn": "773457",
  "firmName": "Pikl Insurance Services Limited",
  "status": "Authorised",
  "statusClass": "current",
  "statusEffectiveDate": "2017-05-02",
  "isAppointedRepresentative": false,
  "businessType": "Regulated",
  "primarySector": "Personal and Commercial Lines Insurance Intermediaries",
  "companiesHouseNumber": "10449346",
  "regulators": ["Financial Conduct Authority"],
  "phone": "01603559361",
  "phoneCountryCode": "+44",
  "phoneE164": "+441603559361",
  "email": "info@pikl.com",
  "website": "www.pikl.com",
  "websiteUrl": "http://www.pikl.com",
  "hasReachableContact": true,
  "addressLines": ["The Atrium", "St. Georges Street"],
  "town": "Norwich",
  "county": "Norfolk",
  "postcode": "NR3 1AB",
  "tradingNames": ["Pikl"],
  "previousNames": [
    { "name": "Inlet Insurance Services Limited", "type": "Registered", "effectiveFrom": "2017-07-05", "effectiveTo": "2019-06-27" }
  ],
  "permissionCount": 7,
  "permissionCategories": ["Consumer Credit", "Insurance Distribution"],
  "permissions": [
    { "activity": "Credit Broking", "category": "Consumer Credit" },
    { "activity": "Arranging deals in investments", "category": "Insurance Distribution" }
  ],
  "hasConsumerCreditPermission": true,
  "clientMoneyPermission": "Not hold and not control client money",
  "appointedRepresentativeCount": 2,
  "appointedRepresentatives": [
    { "name": "Pikl Underwriting Ltd", "frn": "923578", "type": "Full", "effectiveDate": "2020-03-30" },
    { "name": "Sykes Cottages Ltd", "frn": "492189", "type": "Introducer", "effectiveDate": "2022-06-07" }
  ],
  "disciplinaryActionCount": 0,
  "registerUrl": "https://register.fca.org.uk/s/firm?id=001b000003hfm82AAA",
  "matchedBy": "search:insurance"
}
```

*(Lists shortened for the README. The dataset carries them in full.)*

### 💰 Pricing

- **$0.013 per firm delivered with a phone, email or website**, counted once per FRN. That is **$13 per 1,000 firms**.
- **Never charged:** firms with no published contact (delivered free only if you set `requireContact: none`), firms your status or permission filters remove, FRNs not on the register, unreachable records and duplicates.
- No start fee. You set the maximum spend in Apify's run options, and the Actor stops cleanly when it is reached. It never delivers a row it hasn't charged for.
- Measured running cost on the default setup (512 MB, no proxy): ~$0.00014 per delivered firm.

### 🔁 Run summary

Every run writes a `RUN_SUMMARY` record to its key-value store. It shows:

- for each search term: how many rows the register counted against how many were read. A term read to the end must match the register's count, or the run fails rather than hand you a silently partial list.
- how many firms each filter removed, how many had no contact, which FRNs weren't found, and anything unreachable.
- the status breakdown of everything the search returned.

### ❓ FAQ

**Do I need an FCA developer account or API key?** No. The Actor reads the same public data the register website shows you.

**Can I search by postcode or town?** No. The register's search matches firm names and FRNs only. Search by sector words (`mortgage`, `insurance`, `wealth`, `finance`), use the permission filters, and filter the dataset by `postcode` or `town` afterwards.

**Why did my search term fail?** The register refuses a term that matches more than about 50,000 of its records. `financial` does, for example. The run reports it in `RUN_SUMMARY`. Use a more specific word, or split it into several.

**Why is a principal's AR list capped at 500 on its row?** Very large networks list thousands of ARs. To get all of them with their contact details, use `principalFrns`, which returns every AR as its own row with no cap.

**How fresh is the data?** Each run reads the live register.

### ⚠️ Honest limits

- **Name search only.** The register does not search by postcode, permission or sector. The permission filters are applied to the search results the register returns.
- **Very broad words are refused** by the register (over ~50,000 matching records). This is reported, never silently truncated.
- **Former firms** (No longer authorised, Revoked, Cancelled) mostly publish no contact: phone 30%, email 18%, website 11% on 616 former credit unions, against 94–98% phone/email for current firms. The default status is *current*.
- Entries the register lists **without an FRN** (mostly *Unauthorised* firms) are skipped and counted in `RUN_SUMMARY`.
- **Phones are shipped as recorded.** Some are recorded without the leading 0 (e.g. `2071161000` with code `+44`). `phoneE164` is only filled when the conversion is certain. A non-UK number with a trunk 0 is left null rather than guessed.
- **Websites and emails are shipped as recorded**, typos included (e.g. `wwww.` prefixes). Nothing is corrected or completed. The FCA's own addresses (fca.org.uk and the other regulator domains) never ship as a firm's contact.
- Individuals (people search) are not covered; this Actor exports firms. Approved individuals appear only as an optional list on their firm's row.
- A very large firm's register page is several MB (Barclays: 8.3 MB). Such rows arrive fine but take a few seconds each.

### ℹ️ About

This Actor is independent and not affiliated with the Financial Conduct Authority or the Prudential Regulation Authority.

# Actor input Schema

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

Words the FCA register's own search matches against firm names, e.g. mortgage, insurance, wealth, credit, payments, pensions, or a brand. Every matching firm is read, page by page, until Max firms is reached. The register searches NAMES (and FRNs), not postcodes or permissions — use the permission filters below for that. A word matching more than ~50,000 register rows (e.g. financial) is refused by the register itself and reported in RUN\_SUMMARY.

## `frns` (type: `array`):

Exact FCA Firm Reference Numbers to look up, e.g. 122702. Each is delivered whatever its status (the status is in the row). FRNs not on the register are reported in RUN\_SUMMARY and never charged.

## `principalFrns` (type: `array`):

FRNs of principal firms (networks such as mortgage or insurance networks). Every CURRENT appointed representative of each principal is returned as its own row, with its own phone, website and email and a link back to the principal. The permission filters do not apply here (ARs hold no permissions of their own).

## `statusFilter` (type: `string`):

<b>current</b> keeps firms the register shows as Authorised, Registered, EEA Authorised, Authorised - applied to cancel or a current appointed representative. <b>former</b> keeps No longer authorised / Revoked / Cancelled / Unauthorised. <b>all</b> keeps both (entries with no status, e.g. 'No Status', only appear under all).

## `includeAppointedRepresentatives` (type: `boolean`):

Appointed representatives (ARs) trade under a principal firm's authorisation and outnumber principals on the register. Off = search terms return directly authorised/registered firms only. On = ARs matching your terms are returned too. Principal FRNs above always return ARs.

## `permissionCategories` (type: `array`):

Keep only firms holding a permission in one of these register categories, e.g. Consumer Credit, Insurance Distribution, Regulated Home Finance, Designated Investment Business, CBTL, Payment Services Directive, Second Electronic Money Directive, Claims Management, Accepting deposits, CryptoAssets. Case-insensitive, part of a name matches. Applied before any firm page is fetched, so it costs nothing. Empty = no filter.

## `permissionContains` (type: `array`):

Keep only firms with a permitted activity whose name contains one of these words, e.g. mortgage, Credit Broking, Debt-counselling, pension, Arranging deals in investments, Managing investments. Combined with the categories above by AND. Empty = no filter.

## `requireContact` (type: `string`):

<b>any</b> = only firms that publish a phone, website or email on the register (the only rows ever charged). <b>phone</b> / <b>email</b> / <b>website</b> = only firms with that one. <b>none</b> = also deliver firms with no published contact, free of charge.

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

Stop after delivering this many firms. 0 = no limit.

## `includePermissions` (type: `boolean`):

Every permitted activity with its category. The categories list and permission count are always included.

## `includeTradingNames` (type: `boolean`):

Registered and trading names with effective dates, and previous names with end dates. The current trading names list is always included.

## `includeAppointedRepresentativeList` (type: `boolean`):

On a principal firm's row, list its current ARs (name, FRN, type, effective date; up to 500). The AR count is always included.

## `includeDisciplinaryHistory` (type: `boolean`):

Date, type and published text of each disciplinary action. The count is always included.

## `includeComplaintsContact` (type: `boolean`):

The complaints contact the firm registered (name, job title, phone, email).

## `includeApprovedIndividuals` (type: `boolean`):

Current approved/certified individuals (name, IRN, status, controlled functions; up to 500). The count is always included.

## `maxConcurrency` (type: `integer`):

Firm pages fetched in parallel. The register is a shared public service; 4 is polite and fast.

## `proxyConfiguration` (type: `object`):

The register answers Apify's own network directly (measured 2026-09-23), so no proxy is needed. If the direct connection fails, the run escalates to Apify RESIDENTIAL (GB) once by itself.

## Actor input object example

```json
{
  "searchTerms": [
    "mortgage"
  ],
  "frns": [],
  "principalFrns": [],
  "statusFilter": "current",
  "includeAppointedRepresentatives": false,
  "permissionCategories": [],
  "permissionContains": [],
  "requireContact": "any",
  "maxResults": 10,
  "includePermissions": true,
  "includeTradingNames": true,
  "includeAppointedRepresentativeList": true,
  "includeDisciplinaryHistory": false,
  "includeComplaintsContact": false,
  "includeApprovedIndividuals": false,
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `firms` (type: `string`):

FRN, firm name, status and effective date, phone, email, website, head-office address, Companies House number, permissions, trading names, principal firm (for ARs) and AR list (for principals).

## `runSummary` (type: `string`):

Register match counts per search term, rows read vs counted, what your filters removed, firms without contact, FRNs not found and anything unreachable (none of it charged).

# 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 = {
    "searchTerms": [
        "mortgage"
    ],
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/fca-register-firms-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 = {
    "searchTerms": ["mortgage"],
    "maxResults": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/fca-register-firms-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 '{
  "searchTerms": [
    "mortgage"
  ],
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call scrapersdelight/fca-register-firms-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapersdelight/fca-register-firms-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/eOQX88cOqExrRSgsB/builds/r1nrNGRkNMFKoG56j/openapi.json
