An async Python client for the UK Financial Conduct Authority's Financial Services Register RESTful API.
Covers firms, individuals, funds, permissions, disciplinary history, and regulated markets, with Pydantic-typed responses and cursor-based pagination.
- Python 3.11+
httpx,pydantic
pip install fca-apiimport asyncio
import fca_api
async def main():
async with fca_api.async_api.Client(
credentials=("your.email@example.com", "your_api_key")
) as client:
page = await client.search_frn("Barclays")
for firm in page.data:
print(f"{firm.name} (FRN: {firm.frn}) — {firm.status}")
if page.data:
details = await client.get_firm(page.data[0].frn)
print(details.name, details.status, details.effective_date)
if __name__ == "__main__":
asyncio.run(main())fca_api.async_api.Client— Pydantic-typed responses, cursor pagination, the default choice.fca_api.raw_api.RawClient— thin wrapper around the HTTP endpoints; raw JSON in, raw JSON out.
async with fca_api.async_api.Client(credentials=("email", "key")) as client:
page = await client.search_frn("revolution")
while True:
for firm in page.data:
print(f"{firm.name} — {firm.status}")
if not page.pagination.has_next:
break
page = await client.fetch_next_page(page.pagination.next_page)
# Or collect at least N items in one call:
page = await client.search_frn("revolution", result_count=100)The next_page token is self-contained — it embeds the endpoint and arguments,
so a separate process can resume with only the token in hand. See
PageTokenSerializer if you want to sign or encrypt tokens crossing a trust boundary.
firm = await client.get_firm("123456")
print(firm.name, firm.status)
addresses = await client.get_firm_addresses("123456")
for address in addresses.data:
print(", ".join(address.address_lines))people = await client.search_irn("John Smith")
for person in people.data:
print(f"{person.name} (IRN: {person.irn})")
funds = await client.search_prn("Vanguard")
for fund in funds.data:
print(f"{fund.name} (PRN: {fund.prn})")import fca_api.exc
try:
firm = await client.get_firm("invalid_frn")
except fca_api.exc.FcaRequestError as e:
print(f"API request failed: {e}")Pass any async context manager factory as api_limiter; the client enters it
around each request.
from asyncio_throttle import Throttler
async with fca_api.async_api.Client(
credentials=("email", "key"),
api_limiter=Throttler(rate_limit=10),
) as client:
page = await client.search_frn("test")async with fca_api.raw_api.RawClient(credentials=("email", "key")) as client:
response = await client.search_frn("Barclays")
for item in response.data or []:
print(item)
print(response.result_info)Full reference at docs.release.art/fca-api.
Every public class and method carries a docstring; use help() in the REPL or
your IDE.
Get credentials from the FCA Developer Portal (free registration). Keep them out of version control.
Mozilla Public License 2.0 — see LICENSE.