# FinCEN MSB Registrant Search (`automation-lab/fincen-msb-registrant-search`) Actor

Search FinCEN MSB registrations by legal or DBA name and business address geography. Export addresses, activity codes, operating states, branches and form dates for recurring counterparty checks. Registration is not licensing or endorsement.

- **URL**: https://apify.com/automation-lab/fincen-msb-registrant-search.md
- **Developed by:** [Automation Lab](https://apify.com/automation-lab) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.65 / 1,000 item processeds

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

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

## FinCEN MSB Registrant Search

Refresh **FinCEN MSB registrations** for recurring counterparty checks. Search the official public export by legal name, DBA name, city, address state, or ZIP, then export structured business records to your compliance dashboard or spreadsheet.

FinCEN registration is **not** a license, endorsement, verification of legitimacy, or recommendation. Listing absence is not proof of wrongdoing. Use independent due diligence before any financial decision.

### What does this Actor do?

Each run downloads the official FinCEN MSB Registrant Search export, applies your filters locally, and saves matching rows in the default Apify dataset. The source is updated weekly, not in real time. The Actor does not register businesses or access the BSA E-Filing system.

### Who is it for?

- Compliance analysts refreshing business counterparty records.
- Fintech operations teams maintaining company reference data.
- Researchers comparing declared money-services activities across business locations.

### Why use it?

Get typed arrays for activity codes and operating states, normalized form dates, preserved leading-zero ZIP codes, and a retrieval timestamp without manually cleaning the Excel-labelled export. All source columns are retained; there are no invented lead scores or licensing judgments.

### Getting started

1. Enter a legal-name substring, such as `coinbase`.
2. Optionally narrow by business address state, city, ZIP, or DBA.
3. Set a global result limit.
4. Run and inspect the dataset and coverage summary.
5. Export JSON, CSV, or Excel using Apify dataset export.

```json
{"legalName":"coinbase","maxItems":10}
```

### Input parameters

| Field | Meaning |
| --- | --- |
| `legalName` | Case-insensitive substring of legal name |
| `dbaName` | Case-insensitive substring of DBA name |
| `city` | Case-insensitive substring of business address city |
| `state` | Exact US state/territory postal code of business address |
| `zip` | Exact five-digit ZIP or ZIP+4, as a string |
| `maxItems` | Global maximum matching distinct rows; default 100, range 1–30000 |

All filters are combined using **AND**. Text filters are trimmed, then matched literally as substrings without word boundaries or spelling correction. State is trimmed and uppercased. Blank strings disable their filter. A missing DBA cannot match a nonempty DBA filter.

State filters the **address**, not the declared operating footprint. `NY` will not include a California-address business merely because it operates in New York. ZIP equality does not treat a five-digit ZIP as a ZIP+4 prefix. Unknown parameters, invalid states, malformed ZIPs, and noninteger/out-of-range limits fail validation.

With no filters, the Actor returns the first matching source rows up to the limit. Zero/unlimited is unsupported. The complete export is downloaded even for a one-record request. Exact duplicate source rows are removed before the global limit; source order is retained. No explicit-URL input or pagination mode is offered.

### Extracted data

| Field | Description |
| --- | --- |
| `legalName`, `dbaName` | Registrant-supplied legal and trading names |
| `streetAddress`, `city`, `state`, `zip` | Business address, not branch addresses |
| `activityCodes` | Form 107 activity codes as an array |
| `operatingStates` | Declared operating state/territory codes |
| `geographicFlag` | Raw source flag A/B/C/D; no inferred footprint |
| `foreignLocation` | Source foreign-location label |
| `branchCount` | Declared number of branches |
| `signedDate`, `receivedDate` | Form signature and receipt dates, YYYY-MM-DD |
| `sourceUrl` | Official homepage, not a record-specific URL |
| `sourceUpdatedDate` | Homepage's displayed weekly update date |
| `scrapedAt` | UTC retrieval timestamp |

Blank DBA, address state, foreign location, and geographic flag become null. Other source strings retain their values. Activities and operating states are arrays. For example, code 409 denotes money transmitter, 408 check casher, and 415 dealer in foreign exchange. These are declarations, not independently verified capabilities.

### Output example

This is an observed business record from the official export.

```json
{
  "legalName": "Coinbase FC Fund LLC",
  "dbaName": null,
  "streetAddress": "1 Bluxome Street, Suite 405",
  "city": "San Francisco",
  "state": "CA",
  "zip": "94107",
  "activityCodes": ["409", "415"],
  "operatingStates": ["AZ", "CA", "CT", "NY"],
  "geographicFlag": null,
  "foreignLocation": null,
  "branchCount": 0,
  "signedDate": "2026-09-13",
  "receivedDate": "2026-09-13",
  "sourceUrl": "https://msb.fincen.gov/",
  "sourceUpdatedDate": "2026-10-05",
  "scrapedAt": "2026-10-10T06:10:02.223Z"
}
```

`SUMMARY` in the run key-value store records the source update date, export row count, saved count, and limit. A successful zero-match run is allowed; an unexpectedly empty or malformed source export fails instead of claiming an empty search result.

### How much does it cost to search FinCEN MSB registrations?

Pay-per-event pricing charges a one-time start fee and one item event per saved registrant row. Rejected and duplicate rows have no item charge. No separate charges apply to addresses, branches, activities, or dates.

The start fee is $0.005 per run. Per saved row: FREE $0.0089056, BRONZE $0.007744, SILVER $0.0060403, and GOLD/PLATINUM/DIAMOND $0.0046464. Spend tiers follow qualifying aggregate monthly Store spend, not a private per-Actor volume discount. Check the pricing panel for your account.

At BRONZE, estimates are $0.08244 for 10 saved rows, $0.7794 for 100, and $7.749 for 1,000. A zero-match valid search pays the start fee only. Account spending limits can stop output early. The run coverage report includes the actual saved count and a budget-exhaustion flag.

### Source coverage and limitations

The official search describes current public registrations. Previously registered businesses that do not renew are not included according to FinCEN. The Actor does **not** retrieve historical filings, archived registrations, acknowledgement letters, BSA IDs, beneficial owners, phone numbers, email addresses, branch locations, sanctions screening, or licenses.

FinCEN warns its downloadable spreadsheet is not a substitute for the webpage. Export row counts can differ from the homepage's displayed business count; one row must not be assumed to equal a unique licensed business. Multiple distinct source rows for an entity are preserved, not merged into fabricated registration history. For important decisions, confirm information on the official website. Some current registrations are excluded by FinCEN and registrant-supplied information can be incomplete or incorrect.

### Reliability and troubleshooting

The Actor uses direct HTTP, without a paid proxy or browser fallback. Transient network failures, HTTP 408/429 and selected 5xx responses get at most two retries per request. A changed export header, malformed row, inaccessible source, or missing freshness date fails the run with an error.

If no rows match, shorten the name substring or search by state instead. Abbreviations, spelling variations, and missing source data can affect results. If a source-format error occurs, do not treat the run as a clean compliance result; retry later or contact support with the run ID.

### Integrations

Export the default dataset to Google Sheets, a warehouse, or your existing counterparty onboarding workflow. Schedule separate runs weekly and compare them downstream using names and addresses. The Actor does not maintain cross-run history, calculate changes, send alerts, or automate approval decisions. Keep full exports outside language-model context.

### API usage

Use your Apify token in an authorization header; never share it in datasets.

```bash
curl -X POST 'https://api.apify.com/v2/acts/automation-lab~fincen-msb-registrant-search/runs' \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"state":"NY","city":"New York","maxItems":100}'
```

The response contains a run ID, not results. Follow that run until successful, then read its `defaultDatasetId`.

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/fincen-msb-registrant-search')
  .call({ legalName: 'coinbase', maxItems: 10 });
const { items } = await client.dataset(run.defaultDatasetId).listItems({ limit: 10 });
console.log(items);
```

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/fincen-msb-registrant-search').call(
    run_input={'legalName': 'coinbase', 'maxItems': 10})
print(client.dataset(run['defaultDatasetId']).list_items(limit=10).items)
```

### MCP usage

For Claude Desktop, Cursor, and VS Code, use the JSON configuration below in your client's MCP settings. Example prompts: “Find Coinbase legal names” or “Return NY-address registrants, at most 100 rows.”

Select the stable Actor-specific tool subset:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/fincen-msb-registrant-search"
```

```json
{"mcpServers":{"apify":{"url":"https://mcp.apify.com?tools=automation-lab/fincen-msb-registrant-search"}}}
```

Discover actual names and schemas using scoped `tools/list`. Actor selection also includes run/storage utility tools; discovery is not permission to run or abort. Example authorized request: “Search Coinbase legal names, return at most 10 rows, and explain that registration is not endorsement.”

Start once and retain the run/storage IDs. If nonterminal, check that same run with 2/4/8-second backoff capped at 10 seconds and a 120-second total deadline; report pending at the deadline. A transport timeout is not a reason to restart. After success, read pages of 20 untransformed source rows with explicit offsets and fields, at most 100 rows and 64 KiB of serialized UTF-8 data admitted to model context, whichever comes first. Enforce byte limits host-side, disclose omissions and continuation offsets, and keep full exports downstream. If the client cannot intercept oversized responses, do not claim a hard byte guarantee. This consumer budget does not change collection limits. No numeric token-saving claim is made.

### Legality, responsible use and privacy

Use this public company registry for lawful business due diligence, not harassment or speculative judgments about individuals. Registration information is supplied by registrants and is not verified or licensed by FinCEN. This Actor is not affiliated with FinCEN and provides no legal advice.

No AI is used in the runtime or generated records. Input, datasets and logs remain in the user's Apify run storage under account retention settings; delete run storage in Apify when no longer needed. There is no cross-run cache or fixed global dataset. For help, open an Actor issue with your run ID.

Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed; reports are retained for 30 days.

### FAQ

**Can I retrieve previous filings?** No. Only the current official export is processed, without historical reconstruction.

**Does state mean operating state?** No. It filters business address state. Operating states are output only.

**Why is the export count different from the website count?** The source may have multiple distinct rows and its export is not guaranteed to match the webpage count. Do not interpret either as licensing verification.

**Does a listed company have FinCEN approval?** No. FinCEN expressly warns against that claim.

**Can I automate recurring checks?** Schedule runs and compare datasets in your own workflow. There is no built-in change detector or notification service.

### Related workflows

This is a standalone FinCEN business-registration dataset. SEC investment-adviser and NFA registrant corpora concern different entities and cannot substitute for MSB coverage. Combine only separately identified records with independent matching and official verification.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation-lab/fincen-msb-registrant-search/changelog.md

# Actor input Schema

## `legalName` (type: `string`):

Case-insensitive substring of legal name after trimming the input. Combined with other filters using AND. Empty means no name filter.

## `dbaName` (type: `string`):

Case-insensitive substring of DBA name after trimming the input; missing DBA cannot match a nonempty filter. Combined using AND.

## `state` (type: `string`):

Exact US state or territory postal code of the business address, not operating states. Input is trimmed and uppercased. Empty means no state filter.

## `city` (type: `string`):

Case-insensitive substring of address city after trimming input. Combined with other filters using AND.

## `zip` (type: `string`):

Exact five-digit ZIP or ZIP+4, preserving leading zeroes. Combined with other filters using AND. Empty means no ZIP filter.

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

Global maximum of distinct matching current export rows saved per run, after filtering and duplicate removal. Default 100; 1–30000. Zero/unlimited is unsupported. The entire official export is fetched regardless of this limit. Source order is retained.

## Actor input object example

```json
{
  "legalName": "coinbase",
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (type: `string`):

Matching current export records.

## `summary` (type: `string`):

Source freshness, export and result counts.

# 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 = {
    "legalName": "coinbase",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/fincen-msb-registrant-search").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 = {
    "legalName": "coinbase",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/fincen-msb-registrant-search").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 '{
  "legalName": "coinbase",
  "maxItems": 10
}' |
apify call automation-lab/fincen-msb-registrant-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/fincen-msb-registrant-search"
        }
    }
}
```

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/CFMW2dQAcXVBk9PBL/builds/6ZTX90uK5BPBOPBaU/openapi.json
