# MAS Financial Institutions Directory Scraper (`automation-lab/mas-financial-institutions-directory`) Actor

Search the official MAS directory and export Singapore financial institutions with licence activities, contacts, addresses, and source links.

- **URL**: https://apify.com/automation-lab/mas-financial-institutions-directory.md
- **Developed by:** [Stas Persiianenko](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 $15.36 / 1,000 item extracteds

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

## MAS Financial Institutions Directory Scraper

Search the official **MAS financial institutions directory** and export structured records for Singapore-regulated institutions.

The Actor reads the Monetary Authority of Singapore Financial Institutions Directory on every run. It returns institution identity, displayed licence or institution types, regulated and exempt activities, website, telephone, address, source links, and an observation timestamp.

Use it for compliance screening, licence research, financial-market mapping, vendor onboarding, and repeatable directory snapshots.

### What does this MAS directory scraper do?

The Actor can:

- search by institution name, licence, or activity;
- enumerate an official MAS sector;
- select an exact licence or institution category;
- filter by a regulated activity;
- follow MAS result pagination;
- open each official institution detail page;
- preserve nested licence and activity relationships;
- export one normalized JSON record per institution;
- stop at a user-defined result limit;
- fail clearly if MAS returns an invalid or unavailable page.

Data comes from `https://eservices.mas.gov.sg/fid`. The Actor does not use a static company list or infer licences from third-party data.

### Who is it for?

#### Compliance and onboarding teams

Check whether counterparties appear in the current MAS directory and review the licence types and activities MAS displays.

#### Fintech and payments teams

Map payment institutions, merchant acquirers, money-transfer providers, or other regulated service categories.

#### Market researchers

Build structured lists of banks, insurers, advisers, capital-markets firms, and payments businesses for analysis.

#### Data and automation teams

Feed current public directory records into spreadsheets, databases, BI tools, n8n, Make, Zapier, or internal screening pipelines.

### What data can you extract?

| Field | Meaning |
| --- | --- |
| `institutionId` | Stable identifier contained in the MAS detail URL |
| `institutionName` | Institution name displayed by MAS |
| `institutionType` | First displayed licence or institution type |
| `institutionTypes` | All displayed licence and institution types |
| `licences` | Licence objects with type, displayed status, and activities |
| `regulatedActivities` | Deduplicated activities across displayed licences |
| `exemptActivities` | Activities grouped under licence types marked exempt |
| `incorporation` | MAS incorporation note, when displayed |
| `website` | Institution website displayed by MAS |
| `telephone` | Public telephone number displayed by MAS |
| `address` | Public address displayed by MAS |
| `keyPersonnel` | Public key-personnel names displayed by MAS |
| `resultUrl` | Official result page where the institution was found |
| `sourceUrl` | Official MAS institution detail URL |
| `observedAt` | UTC observation timestamp for the run |

Fields can be empty when MAS does not display that information. The Actor does not manufacture missing values.

### Why use this Actor?

- **Official source:** every exported institution is resolved through MAS FID.
- **Detailed records:** list cards are enriched from official institution detail pages.
- **Activity structure:** each licence keeps its own displayed activities.
- **Auditability:** every row includes result and source URLs plus `observedAt`.
- **Bounded runs:** `maxItems` provides a predictable output and billing cap.
- **No browser overhead:** server-rendered MAS pages are retrieved directly with bounded retries.
- **Safe failure behavior:** unexpected response shapes fail the run instead of pretending there were zero matches.

### How to scrape MAS financial institutions

1. Open the Actor in Apify Console.
2. Enter a search term, sector, category, or activity.
3. Set `maxItems` to the largest number of institutions you want.
4. Keep the default concurrency unless you have a specific reason to lower it.
5. Click **Start**.
6. Open the **Dataset** tab when the run completes.
7. Export results as JSON, CSV, Excel, XML, or another Apify-supported format.

A first run can use:

```json
{
  "term": "DBS",
  "maxItems": 10
}
```

### Input parameters

#### `term`

Free-text search sent to the official directory. MAS accepts institution names, licence types, and activities.

Examples:

- `DBS`
- `fund management`
- `payment`
- `insurance broker`

An empty term is valid when you use a sector, category, or activity filter. Leaving every filter empty enumerates the directory from its first page until `maxItems` is reached.

#### `sector`

Optional official MAS sector:

- Banking
- Capital Markets
- Financial Advisory
- Insurance
- Payments

#### `category`

Optional exact directory category or licence type, for example:

- `Local Bank`
- `Major Payment Institution`
- `Capital Markets Services Licensee`
- `Licensed Financial Adviser`

Use the wording shown by MAS.

#### `activity`

Optional official regulated-activity filter, for example:

- `Fund Management`
- `Merchant Acquisition Service`
- `Domestic Money Transfer Service`

#### `maxItems`

Maximum number of institution rows to save. Allowed range: 1–5,000. The default is 100 and the Console prefill uses 10.

#### `maxConcurrency`

Number of institution detail pages fetched simultaneously. Allowed range: 1–10. The conservative default is 5.

### Example inputs

#### Search for fund managers

```json
{
  "term": "fund management",
  "maxItems": 10
}
```

#### Export the Local Bank category

```json
{
  "term": "",
  "category": "Local Bank",
  "maxItems": 10
}
```

#### Screen merchant acquirers in the Payments sector

```json
{
  "term": "",
  "sector": "Payments",
  "activity": "Merchant Acquisition Service",
  "maxItems": 20
}
```

### Output example

A current search can produce a record like this:

```json
{
  "institutionId": "166",
  "institutionName": "DBS BANK LTD.",
  "institutionType": "Designated Payment System Settlement Institution",
  "institutionTypes": [
    "Designated Payment System Settlement Institution",
    "Exempt Capital Markets Services Entity",
    "Exempt Financial Adviser",
    "Local Bank"
  ],
  "licences": [
    {
      "type": "Exempt Capital Markets Services Entity",
      "status": "Exempt",
      "activities": [
        "Fund Management",
        "Dealing In Capital Markets Products"
      ]
    }
  ],
  "regulatedActivities": [
    "Fund Management",
    "Dealing In Capital Markets Products"
  ],
  "exemptActivities": [
    "Fund Management",
    "Dealing In Capital Markets Products"
  ],
  "incorporation": "Incorporated in Singapore",
  "website": "http://www.dbs.com/",
  "telephone": "+65 68788888",
  "address": "12 MARINA BOULEVARD, SINGAPORE 018982",
  "keyPersonnel": [],
  "resultUrl": "https://eservices.mas.gov.sg/fid/institution?term=DBS&page=1",
  "sourceUrl": "https://eservices.mas.gov.sg/fid/institution/detail/166-DBS-BANK-LTD",
  "observedAt": "2026-01-15T12:00:00.000Z"
}
```

The source changes over time. Treat this as a shape example, not a guarantee that a named institution will always have the same licences or contact details.

### How much does it cost to scrape MAS financial institutions?

This Actor uses pay-per-event pricing:

- **Start:** $0.005 once per run.
- **MAS institution record:** $0.02944 on FREE, $0.0256 on BRONZE, $0.019968 on SILVER, and $0.01536 on GOLD, PLATINUM, or DIAMOND.

Only records written to the default dataset incur the record event. Empty searches incur no record events.

Examples before any unrelated platform charges:

| Run | Example price |
| --- | ---: |
| 1 record on FREE | $0.03444 including start |
| 10 records on FREE | $0.2994 including start |
| 25 records on BRONZE | $0.645 including start |
| 100 records on BRONZE | $2.565 including start |
| 100 records on GOLD | $1.541 including start |

Your applicable Apify tier determines the per-record rate. Set `maxItems` to control the maximum number of chargeable rows.

### Recurring compliance screening

Apify schedules can run the same input daily, weekly, or monthly. Each row contains a stable MAS identifier, source URL, and observation timestamp, which makes it suitable for downstream comparison.

A typical workflow is:

1. schedule a bounded category or activity search;
2. export the dataset to your database;
3. key rows by `institutionId`;
4. compare `institutionTypes`, `licences`, contacts, and addresses with the prior snapshot;
5. send changes to a reviewer.

This Actor exports current observations. It does not itself maintain history, compute deltas, or send alerts.

### Spreadsheet and database integrations

From the Dataset tab, export CSV or Excel for one-off analysis.

For recurring work, connect the default dataset to:

- Google Sheets;
- Airtable;
- Make;
- Zapier;
- n8n;
- webhooks;
- cloud storage;
- a SQL or document database through your own integration.

Use `institutionId` as the preferred source identity and retain `sourceUrl` for review.

### Run with the Apify API

Replace `YOUR_TOKEN` with an Apify API token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~mas-financial-institutions-directory/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"sector":"Payments","activity":"Merchant Acquisition Service","maxItems":20}'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/mas-financial-institutions-directory').call({
  term: 'fund management',
  maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/mas-financial-institutions-directory').call(
    run_input={'category': 'Local Bank', 'maxItems': 10}
)
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/mas-financial-institutions-directory"
```

#### Claude Desktop

Add this server in Claude Desktop's MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/mas-financial-institutions-directory"
    }
  }
}
```

#### Cursor

Add the same `mcpServers.apify.url` value in Cursor's MCP settings.

#### VS Code

Add the same remote HTTP URL to your VS Code MCP server configuration, then authorize Apify when prompted.

Example prompts:

- “Search MAS for fund management institutions and return their licence activities and source links.”
- “Export the Local Bank category from MAS as a table.”
- “Find Payments-sector firms authorised for merchant acquisition and include public contact details.”

AI output should support, not replace, review of the official linked records.

### Reliability and failure behavior

The Actor validates HTTP status, response content type, and recognizable MAS page selectors.

It retries temporary network failures, HTTP 429, and temporary 5xx responses up to three times with backoff. It does not repeatedly retry deterministic 4xx errors.

The run fails instead of returning a misleading empty dataset when:

- MAS is unavailable after bounded retries;
- a response is not HTML;
- the expected official page structure is absent;
- an institution detail page has no recognizable name.

A valid search with no matching result completes successfully with zero dataset rows.

### Limits and responsible use

- The Actor exports only fields publicly displayed by MAS.
- It does not verify that displayed details are complete or error-free.
- It does not include historical, revoked, or suspended licences unless MAS displays them in the current directory result.
- `status` is `null` when MAS does not explicitly display a status in the licence heading.
- A financial institution can hold multiple licences, so licence counts and institution counts are not equivalent.
- Upstream wording, categories, and availability can change.
- Large runs make one detail request per accepted institution and can take longer.
- No residential proxy or browser fallback is enabled.

Use conservative schedules and result limits. Do not overload the source.

### Legal and ethical use

MAS FID is a public government directory, but users remain responsible for their purpose, storage, sharing, and downstream decisions.

Follow MAS terms, Apify terms, applicable privacy and data-protection law, and your organisation's compliance procedures. Public contact or personnel data should be used proportionately. Do not use this Actor for harassment, impersonation, spam, or automated adverse decisions without appropriate human review.

This Actor is an extraction tool, not legal, regulatory, investment, or compliance advice.

### FAQ

#### Why did my run return zero rows?

Confirm the spelling and try one filter at a time. MAS category and activity filters work best with the exact wording shown in the directory. An empty dataset can be valid for a real no-match query.

#### Why did the run fail instead of returning partial data?

The Actor fails when it cannot validate an official list or detail response. This prevents an upstream outage or changed page from looking like a real empty result. Review the run log and retry later if MAS was temporarily unavailable.

#### Why is `status` null?

MAS labels the section “Licence Type/Status” but does not always display a separate status value. The Actor records only explicit status words and does not infer “Active.”

#### Why can one institution have many types?

MAS can display several licences, exemptions, or institutional categories for one entity. `institutionType` is a convenience field; use `institutionTypes` and `licences` for complete analysis.

#### Can I scrape the whole directory?

Yes. Leave filters empty and raise `maxItems`, up to 5,000. Start with a smaller run to confirm the data and cost fit your workflow.

### Related automation-lab Actors

- [Australian ABN Register Scraper](https://apify.com/automation-lab/australian-abn-register-scraper) for Australian business identity and status checks.
- [UK Charity Commission Register Scraper](https://apify.com/automation-lab/uk-charity-commission-register-scraper) for UK charity due diligence.
- [Chicago Business Licenses Scraper](https://apify.com/automation-lab/chicago-business-licenses) for municipal licence monitoring.

### Support

If a run fails, include the run URL, input with secrets removed, expected result, and observed behavior in an Actor issue. Do not include API tokens or private downstream data.

# Actor input Schema

## `term` (type: `string`):

Search text accepted by the official MAS directory, such as DBS, fund management, or payment.

## `sector` (type: `string`):

Optional official directory sector filter. Leave empty to search all sectors.

## `category` (type: `string`):

Optional exact MAS category, such as Local Bank, Major Payment Institution, or Capital Markets Services Licensee.

## `activity` (type: `string`):

Optional official MAS activity filter, such as Fund Management or Merchant Acquisition Service.

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

Maximum number of institution records to export after following directory pagination.

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

Maximum simultaneous MAS institution detail requests. Keep the default for polite, reliable extraction.

## Actor input object example

```json
{
  "term": "DBS",
  "sector": "",
  "maxItems": 10,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing all exported MAS institution records.

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

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/mas-financial-institutions-directory").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 = {
    "term": "DBS",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/mas-financial-institutions-directory").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 '{
  "term": "DBS",
  "maxItems": 10
}' |
apify call automation-lab/mas-financial-institutions-directory --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/mas-financial-institutions-directory"
        }
    }
}

```

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/NEjBgxYyexg1sKJEd/builds/O7Y9LaJsqUNkmQl28/openapi.json
