# Fincen Msb Scraper (`normdata/fincen-msb-scraper`) Actor

The full FinCEN registry of registered Money Services Businesses: every US and foreign money transmitter, check casher, currency dealer and prepaid access business, with address, decoded activity types, states of operation and registration date. Filter for AML and KYB compliance, or look up by name.

- **URL**: https://apify.com/normdata/fincen-msb-scraper.md
- **Developed by:** [Norm Data](https://apify.com/normdata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.20 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

![Norm Data](https://i.ibb.co/rGbhM5Y8/Chat-GPT-Image-Sep-8-2026-02-20-50-PM.png)

## FinCEN MSB Scraper

Get the full **FinCEN registry of registered Money Services Businesses** with no API key and no
login. Every **money transmitter, check casher, currency dealer, money order business and
prepaid access** business registered under the Bank Secrecy Act, in and outside the United
States: about 33,000 registrants with legal and trade name, address, decoded **MSB activity
types**, **states of operation**, branch count and **FinCEN registration date**. Built for
**AML and BSA compliance**, MSB and money transmitter due diligence, KYB and counterparty
screening, fintech and crypto onboarding, and financial crime research.

Here is one real row:

```json
{
  "legal_name": "1111 RRM LLC",
  "dba_name": "TIENDA EL TIKAL",
  "street_address": "6117 WILCREST DR",
  "city": "HOUSTON",
  "state": "TX",
  "zip": "77072",
  "country": "UNITED STATES",
  "is_foreign": false,
  "address": "6117 WILCREST DR, HOUSTON, TX, 77072",
  "activity_codes": ["405", "408", "409"],
  "activities": ["Seller of money orders", "Check casher", "Money transmitter"],
  "activity_count": 3,
  "is_money_transmitter": true,
  "is_check_casher": true,
  "is_money_order_business": true,
  "is_currency_dealer": false,
  "is_prepaid_access": false,
  "states_of_activity": ["TX"],
  "state_count": 1,
  "operates_in_all_states": false,
  "operates_foreign": false,
  "branch_count": 1,
  "authorized_signature_date": "2025-10-28",
  "registration_date": "2025-10-28",
  "days_since_registration": 318,
  "fincen_msb_search_url": "https://www.fincen.gov/msb-registrant-search",
  "scraped_at": "2026-09-10T20:34:58.426Z"
}
```

### What it does

Reads the full FinCEN MSB registrant list in one pass, decodes the Form 107 activity codes into
labels, and normalizes every registrant into a flat row. Two modes:

- **Search** filters the registry into a list: by name, state, city, ZIP, MSB activity type,
  states of operation, US against foreign, branch count, or registration date.
- **Look up** resolves legal names or trade names, one row per identifier. A name that does not
  resolve comes back as an `error` row.

Missing source values are returned as `null`, never invented.

### Why this scraper

- **Decoded MSB activity types on every row.** The Form 107 codes (409 money transmitter, 408
  check casher, 407 and 415 currency and foreign exchange, 413 and 414 prepaid access, and the
  rest) turned into labels, plus one boolean per activity group so you can filter in a
  spreadsheet.
- **States of operation, expanded.** The list of states where each MSB is registered to offer
  services, as an array, with flags for all states, all territories and foreign.
- **Registration recency.** `registration_date`, `days_since_registration` and
  `registeredInLastDays` for a new-registrant watch list. Registrations lapse every two years,
  so this list is the currently-registered set.
- **The money transmitter segment.** About two thirds of the registry (roughly 23,000
  businesses). `moneyTransmittersOnly` isolates the group that matters most for fintech, crypto
  and payments due diligence.
- **Complete in one request.** The whole registry, about 33,000 registrants, comes back in one
  keyless request. A full run finishes in under a minute.
- **No API key, no login, no browser.** Reads only what FinCEN publishes.

### How it compares

| Capability | This actor | Other MSB / registry data on Apify |
|---|:--:|:--:|
| Full FinCEN MSB registrant list, one row per business | yes | no |
| **Decoded MSB activity types + per-activity booleans** | **yes** | **no** |
| States of MSB operation as an array | yes | no |
| Foreign vs US and all-states / all-territories flags | yes | no |
| Branch count | yes | no |
| Registration-date filter and recency | yes | no |
| Look up by legal or trade name | yes | no |
| Declared dataset schema + free-plan preview | yes | rare |

### Use cases

- **AML and BSA compliance.** Confirm a customer or counterparty is a registered MSB, read its
  activity types and states of operation, and keep the registration date on file for your
  program.
- **MSB and money transmitter due diligence.** Screen a payments, remittance or crypto
  counterparty before onboarding.
- **KYB and vendor screening.** Attach FinCEN MSB registration status to entity records in your
  KYB pipeline.
- **New-registrant monitoring.** Pull every MSB registered in the last N days for a
  market-entry or risk watch list.
- **Market and competitive research.** Count money transmitters or currency dealers by state,
  or find multi-branch operators.
- **Financial crime research.** Build a working set of MSBs by activity and geography.

### Quickstart

Search: money transmitters in Florida registered in the last 90 days.

```json
{
  "mode": "search",
  "state": ["FL"],
  "activity": ["money_transmitter"],
  "registeredInLastDays": 90,
  "maxItems": 100
}
```

Currency dealers and foreign exchange businesses in New York:

```json
{ "mode": "search", "state": ["NY"], "activity": ["currency_dealer", "foreign_exchange"], "maxItems": 500 }
```

Foreign-based money transmitters:

```json
{ "mode": "search", "foreignOnly": true, "activity": ["money_transmitter"], "maxItems": 1000 }
```

Look up a batch:

```json
{ "mode": "lookup", "identifiers": ["WESTERN UNION", "MONEYGRAM", "PAYPAL"] }
```

### Input reference

| Field | Applies to | Description |
|---|---|---|
| `maxItems` | all | Ceiling on rows written. |
| `mode` | all | `search` or `lookup`. |
| `name` | search | Legal or trade name contains this text. |
| `state` | search | Two-letter state code(s) of the business address. |
| `city` | search | City contains this text. |
| `zip` | search | ZIP code starts with this. |
| `activity` | search | One or more grouped activity types (`money_transmitter`, `check_casher`, `currency_dealer`, `money_orders`, `travelers_checks`, `prepaid_access`, `foreign_exchange`, `us_postal`, `other`). |
| `moneyTransmittersOnly` | search | Shortcut for activity `money_transmitter`. |
| `activityCode` | search | Advanced: exact Form 107 codes (409, 408, 415, ...). |
| `operatesInState` | search | Keep MSBs registered to operate in this state (or all states). |
| `foreignOnly` / `usOnly` | search | Location filter. |
| `foreignCountry` | search | Foreign location contains this text. |
| `minBranches` / `maxBranches` | search | Branch-count range. |
| `registeredAfter` / `registeredBefore` | search | Registration-date window (ISO). |
| `registeredInLastDays` | search | Registered within this many days. |
| `identifiers` | lookup | Legal names or trade names. |

### Output reference (selected)

| Field | Description |
|---|---|
| `legal_name` / `dba_name` | Legal name and registered trade name. |
| `street_address` / `city` / `state` / `zip` / `foreign_location` / `country` / `address` | Location. |
| `is_foreign` | MSB located outside the United States. |
| `activity_codes` / `activities` / `activity_count` | Form 107 codes and their decoded labels. |
| `is_money_transmitter` / `is_check_casher` / `is_currency_dealer` / `is_foreign_exchange_dealer` / `is_money_order_business` / `is_travelers_check_business` / `is_prepaid_access` / `is_us_postal` | One boolean per activity group. |
| `states_of_activity` / `state_count` | States where the MSB is registered to operate. |
| `operates_in_all_states` / `operates_in_all_territories` / `operates_in_all_states_and_territories` / `operates_foreign` | Coverage flags. |
| `branch_count` | Number of branches on the registration. |
| `authorized_signature_date` / `registration_date` / `days_since_registration` | Registration timing. |
| `query` / `error` | Set on an unresolved look-up row. |
| `fincen_msb_search_url` | The FinCEN MSB Registrant Search page. |
| `scraped_at` | ISO 8601 collection timestamp. |

### Run via API and CLI

```bash
curl -X POST "https://api.apify.com/v2/acts/USERNAME~fincen-msb-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"mode":"lookup","identifiers":["WESTERN UNION"]}'
```

```bash
apify call USERNAME/fincen-msb-scraper --input '{"mode":"search","moneyTransmittersOnly":true,"state":["CA"],"maxItems":1000}'
```

### Fetch results

```bash
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
```

### Billing and limits

- **Pay per result.** Billed per registrant row written.
- **No charge on failure.** A run that produces zero rows fails with a message and is not
  billed.
- An unresolved look-up name still writes one `error: "not found"` row and is billed as a base
  row.
- **Free Apify plans** run the built-in 10-row sample only.
- The whole registry comes back in a single keyless request, so a full run of every registrant
  finishes in under a minute. There is no pagination.

### FAQ and troubleshooting

**Do I need an API key?** No. The FinCEN MSB Registrant Search is public, with no key and no
login.

**Why did my run return zero rows?** No registrant matched the filters. Loosen them or widen
the date and branch ranges. A zero-row run fails and is not billed.

**Why is a business I know missing?** MSB registrations must be renewed every two years. This
list is the currently-registered set, so a business whose registration lapsed will not appear
until it re-registers.

**Why is `registeredBefore` returning nothing for old dates?** For the same reason. Registration
(received) dates on the list are all within roughly the last two years.

**What do the activity codes mean?** They are FinCEN Form 107 codes. The Actor decodes them
into the `activities` labels and the `is_*` booleans, so you rarely need the raw codes.

**Is registration an endorsement?** No. FinCEN states that registration is not an approval or
endorsement, and warns that fraudsters misuse it. This Actor reports registration facts only.

**How current is the data?** FinCEN refreshes the list on its own schedule. It is not real
time.

**Is this an official FinCEN tool?** No. Independent, not affiliated with FinCEN or the U.S.
Department of the Treasury. It reads only data FinCEN publishes.

### Local development

```bash
bun install
bun test                       # offline: parsing, normalisation, input logic
bun run src/main.ts            # reads storage/key_value_stores/default/INPUT.json
bun scripts/verify-live.mjs    # hits msb.fincen.gov directly, checks every mode
```

# Actor input Schema

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

Caps how many rows this run writes. Starts at 10 for a quick sample; raise it for a full run (the whole registry is about 33,000 businesses).

## `mode` (type: `string`):

Search filters the FinCEN MSB registrant list into a list. Look up resolves legal names or trade names, one row per identifier.

## `name` (type: `string`):

Match businesses whose legal name or registered trade name (DBA) contains this text.

## `state` (type: `array`):

Two-letter state code of the business address, e.g. CA, NY, TX. Leave empty for all states.

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

Match businesses whose city contains this text.

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

Match businesses whose ZIP code starts with this, e.g. 900 for Los Angeles area.

## `activity` (type: `array`):

Keep only businesses registered for one or more of these activity types. Combine freely.

## `moneyTransmittersOnly` (type: `boolean`):

Shortcut for activity money\_transmitter (Form 107 code 409), the largest segment and the one most relevant to fintech and crypto due diligence.

## `activityCode` (type: `array`):

Advanced: exact FinCEN Form 107 activity codes, e.g. 409, 408, 415. Combined with the activity field above.

## `operatesInState` (type: `array`):

Two-letter state code(s). Keep only businesses whose registered states of MSB activity include this state (or that are registered for all states).

## `foreignOnly` (type: `boolean`):

Only MSBs located outside the United States.

## `usOnly` (type: `boolean`):

Only MSBs located in the United States.

## `foreignCountry` (type: `string`):

Match foreign-based MSBs whose location contains this text, e.g. "HONG KONG", "CANADA", "UNITED KINGDOM".

## `minBranches` (type: `integer`):

Only businesses with at least this many branches.

## `maxBranches` (type: `integer`):

Only businesses with at most this many branches, e.g. 0 for single-location operators.

## `registeredAfter` (type: `string`):

ISO date (2026-01-01). Only businesses whose FinCEN registration (received) date is on or after this, a new-registrant filter.

## `registeredBefore` (type: `string`):

ISO date. Only businesses registered on or before this.

## `registeredInLastDays` (type: `integer`):

Only businesses whose registration date is within this many days, for a recent-registrations watch list.

## `identifiers` (type: `array`):

Legal names or DBA names. Each matches the first business whose legal or trade name contains the text; unmatched names come back as an error row.

## Actor input object example

```json
{
  "maxItems": 10,
  "mode": "search",
  "state": [
    "CA"
  ],
  "activity": [
    "money_transmitter"
  ],
  "moneyTransmittersOnly": false,
  "foreignOnly": false,
  "usOnly": false
}
```

# Actor output Schema

## `results` (type: `string`):

One dataset row per registered money services business (or per look-up name), with legal and trade name, address, decoded MSB activity types, states of MSB activity, branch count, and FinCEN registration date.

# 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 = {
    "maxItems": 10,
    "mode": "search",
    "state": [
        "CA"
    ],
    "activity": [
        "money_transmitter"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/fincen-msb-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 = {
    "maxItems": 10,
    "mode": "search",
    "state": ["CA"],
    "activity": ["money_transmitter"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/fincen-msb-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 '{
  "maxItems": 10,
  "mode": "search",
  "state": [
    "CA"
  ],
  "activity": [
    "money_transmitter"
  ]
}' |
apify call normdata/fincen-msb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,normdata/fincen-msb-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/egGfPk0rC7WwHYGcT/builds/CqiBTEVsom7zTBBVs/openapi.json
