How I built an FCA Register scraper on Apify (and why it's the B2B data gap nobody talks about)
Source: Dev.to
The opportunity
The FCA Financial Services Register is a live register of every firm authorised to provide financial services in the UK – about 50,000 firms ranging from large banks to one‑person IFAs. It includes regulated permissions, principal address, trading names, and enforcement history, making it essential for compliance teams, fintech sales, and KYC workflows.
The FCA provides a free official REST API at register.fca.org.uk/Developer. After registering an account and obtaining an API key, you can make authenticated requests without any paid tier. Despite this, there was no Apify actor for the register, leaving a notable gap in the UK data ecosystem.
Architecture
The actor uses only plain HTTP requests (no Playwright, Cheerio, or browser automation). The key FCA API endpoints are:
| Endpoint | Description |
|---|---|
GET /V0.1/Search?q={query}&type=firm | Search for firms by name or keyword; returns FRNs |
GET /V0.1/Firm/{FRN} | Fetch base details for a specific firm |
GET /V0.1/Firm/{FRN}/Address | Registered address, phone, website |
GET /V0.1/Firm/{FRN}/Names | Trading and historical names |
GET /V0.1/Firm/{FRN}/Permissions | Full list of FCA‑regulated activities |
All endpoints require the headers X-Auth-Email and X-Auth-Key. The rate limit is roughly 100 requests per 60 seconds, which translates to about 25 fully‑enriched firms per minute (four API calls per firm).
async function fcaFetch(path: string, email: string, apiKey: string): Promise> {
await rateLimit(); // 700 ms minimum gap between calls
const res = await fetch(`${BASE_URL}${path}`, {
headers: {
'X-Auth-Email': email,
'X-Auth-Key': apiKey,
},
});
// ... error handling, retry logic
return res.json() as FcaApiResponse;
}
The main challenge was normalising the permissions endpoint, which returns an object where each key is a permission name (e.g., "Accepting deposits") and the value is an array of limitations. The actor transforms this into a simple list of permission strings.
Two modes
searchFirms– Provide a query such as"payment institution"or"consumer credit"and receive a paginated list of matching firms, each enriched with the full profile. Ideal for building prospect lists.lookupFirms– Supply a list of FRNs directly. Useful for KYC workflows where you already have a firm’s reference number and only need to verify its status and permissions.
Result
Each firm is output as a JSON object, for example:
{
"frn": "730427",
"organisationName": "Monzo Bank Limited",
"status": "Authorised",
"businessType": "UK Authorised Bank",
"companiesHouseNumber": "09446231",
"tradingNames": ["Monzo"],
"address": {
"town": "London",
"postcode": "EC2A 2DA",
"website": "https://monzo.com",
"phone": "0800 802 1281"
},
"permissions": [
"Accepting deposits",
"Dealing in investments as agent",
"Issuing electronic money"
],
"registerUrl": "https://register.fca.org.uk/s/firm?id=730427"
}
Available on Apify
The actor is live on the Apify Store:
Pricing is set at $0.10 per firm (PPE), so a 100‑firm compliance check costs about $11 total. API credentials are free, and the data is publicly available for programmatic access. This fills a genuine gap for anyone building KYC automation, fintech CRMs, or sales tooling for the regulated sector.