🇸🇬 MAS Financial Institutions Directory Change Watch
Pricing
from $53.60 / 1,000 institution deltas
🇸🇬 MAS Financial Institutions Directory Change Watch
Auditable deltas on Singapore's MAS Financial Institutions Directory — institutions added, removed, or with a licence/profile change. Keyed on the MAS entity id, seed-zero, one receipt per run.
Pricing
from $53.60 / 1,000 institution deltas
Rating
0.0
(0)
Developer
NexGen Watch
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
🔎 🇸🇬 MAS Financial Institutions Directory Change Watch
Compliance and onboarding teams need to know the moment a Singapore financial institution is licensed, delisted, or has its licence category changed. The MAS directory publishes state, not change. This turns it into an auditable delta feed keyed on the source-native MAS entity id.
Output is one institution_presence_preview row per result; billing is pay-per-event, the value event being one institution delta (a $0.02 start fee per run, then $0.08 per institution delta plus one $0.10 source check per run that reads the source). Source: eservices.mas.gov.sg.
Use cases by team
- Compliance & regulatory teams: Evidence, with dates, that an institution held a given MAS licence category when you onboarded it.
- Onboarding / KYC: Catch a counterparty's delisting or licence-category change before it becomes an incident.
- Capital-markets & financial-data teams: Maintain a licensed-entity reference set that updates itself with an audit trail.
- RegTech vendors: License a bounded, deterministic Singapore licensing feed instead of scraping the directory yourself.
📊 Sample Output
Real rows from run ENuvbubLSvKqTdY8D on build 0.1.19 (2026-09-17), the same input as the Quick start below — every value is as the source published it (emails masked, long text shortened):
| institution_ref | sector | institution_name | licence_categories | principal_address | run_id |
|---|---|---|---|---|---|
| 218382-C-XCHANGE-CENTRE | Payments | $&C XCHANGE CENTRE | ["Money-changing Licensee"] | 220 GEYLANG ROAD 389280 | ENuvbubLSvKqTdY8D |
| 2885-12-HRS-MONEY-EXCHANGER | Payments | 12 HRS MONEY EXCHANGER | ["Money-changing Licensee"] | 238 THOMSON ROAD #01-70A NOVENA SQUARE 307683 | ENuvbubLSvKqTdY8D |
| 2857-19-EXCHANGE-MONEY-CHANGER-TRADING | Payments | 19 EXCHANGE MONEY CHANGER & TRADING | ["Money-changing Licensee"] | 200 VICTORIA STREET #01-42A PARCO BUGIS JUNCTION 188021 | ENuvbubLSvKqTdY8D |
| 431405-2C2P-Pte-Ltd | Payments | 2C2P Pte. Ltd. | ["Major Payment Institution"] | 128 BEACH ROAD GUOCO MIDTOWN OFFICE #21-04 SINGAPORE 189773 | ENuvbubLSvKqTdY8D |
| 218381-8HEXA-FINANCIAL-PTE-LTD | Payments | 8HEXA FINANCIAL PTE. LTD. | ["Standard Payment Institution"] | 8 TEMASEK BOULEVARD #29-01 SUNTEC TOWER THREE 038988 | ENuvbubLSvKqTdY8D |
| 2892-A-MONEYLINK-EXCHANGE | Payments | A MONEYLINK EXCHANGE | ["Money-changing Licensee"] | 3 COLEMAN STREET #01-26 PENINSULA SHOPPING COMPLEX 179804 | ENuvbubLSvKqTdY8D |
| 89-A-WALIMOHAMED-BROS | Payments | A WALIMOHAMED BROS | ["Money-changing Licensee"] | 70 JELLICOE ROAD #01-05 V HOTEL LAVENDER 208767 | ENuvbubLSvKqTdY8D |
| 1528-A-EXPRESS-REMIT-PTE-LTD | Payments | A-EXPRESS REMIT PTE. LTD. | ["Major Payment Institution"] | 304 ORCHARD ROAD #02-28 LUCKY PLAZA 238863 | ENuvbubLSvKqTdY8D |
The run finished with the status message: NORMAL: PREVIEW (watchMode=false) 10 unbilled presence row(s) of 496 in scope; use watchMode=true for the billed change feed
✅ What you get
One of two dataset record types, discriminated by record_type: institution_delta or source_receipt. The institution_profile appears embedded in the before/after of a delta. In snapshot mode (watchMode=false) the dataset carries institution_presence_preview rows: the institution_profile shape, never billed.
Each row is flat JSON with these fields (from the dataset schema and the sample run; a field the source does not publish for a given row is null):
record_type(string) — Discriminator. institution_presence_preview = UNBILLED snapshot row (watchMode=false), the institution_profile shape plus billed=false.mas_entity_id(string/null) — MAS entity id: the leading token of the institution detail URL (source-native immutable id).institution_ref(string/null) — Full MAS institution detail path segment (id + name slug).sector(string/null) — MAS sector scope of the enumeration.institution_name(string/null) — Directory institution name.licence_categories(array/null) — Preview row: MAS licence categories held (institution_profile shape).licence_type_status(string/null) — Preview row: licence type / status from the MAS detail page, when enriched.incorporation(string/null) — Preview row: incorporation / registration text, when enriched.principal_address(string/null) — Preview row: institution principal address as published by MAS.phone(string/null) — Preview row: institution (not personal) contact number as published by MAS.institution_url(string/null) — Emitted MAS institution detail URL.source_url(string) — Exact public MAS request URL supporting this item.observed_at(string) — RFC3339 UTC time after shape validation.run_id(string) — Apify run id that produced this item.material_hash(string/null) — Preview row: SHA-256 over the material fields (the watch baseline signature).billed(boolean/null) — false on institution_presence_preview rows: snapshot rows are never charged.change_id(string/null) — Deterministic SHA-256 change identifier (institution_delta); billing dedup key.delta_type(string/null) — institution_delta only.licence_categories_before(array/null) — Official licence categories before the change (null on add).licence_categories_after(array/null) — Official licence categories after the change (null on removal).changed_fields(array/null) — Sorted JSON Pointers of changed material fields.before(object/null) — Institution profile before the change (null on add).after(object/null) — Institution profile after the change (null on removal).terminal_state(string/null) — source_receipt only.reason_code(string/null) — source_receipt terminal reason code.
What you get
institution_delta— one event per unique change, deduplicated bychange_id:added_to_directory,removed_from_directory,licence_category_changed,profile_changed- Optional
before/aftersnapshots on every change (includeBeforeAfter, on by default) - Coverage of all five public MAS sectors: Banking, Capital Markets, Financial Advisory, Insurance, Payments
- A removal grace window (
removalGraceRuns) so a paging hiccup is not reported as a delisting source_checkper run and asource_receiptthat is always emitted and never billed
Every run also writes a RUN_RECEIPT record to its key-value store with the source checks it made and the counts it charged — diagnostics never land in the paid dataset.
⚙️ Sample inputs
1. Quick start — the Store example (this is what the sample above came from)
{"maxItems": 10,"watchMode": false}
The sample run charged exactly: 1 × $0.02 apify-actor-start + 0 × $0.08 institution_delta + 1 × $0.10 source_check = $0.12 on the Free tier — snapshot preview rows are delivered unbilled; only the source check and the start fee were charged.
2. A smaller, narrowed run
{"maxItems": 5,"watchMode": false}
Caps the run at 5 rows; same billing shape as the sample run above.
3. Watch mode on a schedule
{"maxItems": 10,"watchMode": true}
The first run seeds a private baseline and emits zero deltas; every later run emits one row per change, billed at $0.08 each plus the $0.10 source check.
🧾 JSON sample record
One real record from run ENuvbubLSvKqTdY8D, exactly as it lands in the dataset (emails masked, long text shortened):
{"record_type": "institution_presence_preview","schema_version": "1.0","mas_entity_id": "218382","institution_ref": "218382-C-XCHANGE-CENTRE","sector": "Payments","institution_name": "$&C XCHANGE CENTRE","licence_categories": ["Money-changing Licensee"],"licence_type_status": null,"incorporation": null,"principal_address": "220 GEYLANG ROAD 389280","phone": "+65 65144960","institution_url": "https://eservices.mas.gov.sg/fid/institution/detail/218382-C-XCHANGE-CENTRE","source_url": "https://eservices.mas.gov.sg/fid/institution?sector=Payments&page=1","observed_at": "2026-09-17T17:35:59Z","run_id": "ENuvbubLSvKqTdY8D","material_hash": "d554a407a48df19af6ee706a919fb60ba78df419454de0c14d5eb8642e31b239","billed": false}
🔧 How it works
Source. The actor reads eservices.mas.gov.sg — endpoints: https://eservices.mas.gov.sg/fid/institution. Public pages and feeds only; nothing behind a login.
Transport. Plain HTTPS from the Apify platform, no proxy.
Watch semantics. Snapshot mode (watch_mode: false) returns a preview. Watch mode keys every record on a source-native id, stores a private baseline in a named key-value store, and on each later run emits one delta row per change (new / changed / removed). A blocked fetch is never diffed, so a source outage cannot show up as a mass removal.
Terminal states. A run ends NORMAL, CAPPED (your cap was reached), PARTIAL (something was withheld and the message says what), GENUINE_EMPTY (the source was read and truly had nothing in scope) or BLOCKED (the source refused or changed shape — the run FAILS loud and bills nothing). A zero-row run is never reported as a silent success.
Charging. Each institution delta is charged at the moment it is pushed (institution_delta); a row that fails to charge is not delivered, so the dataset count always equals the charged count. One source_check is charged per run that actually read the source.
How it works
Pick a sector (required) and optionally narrow by institution id, name, or licence category. It enumerates the public, logged-out MAS Financial Institutions Directory (eservices.mas.gov.sg/fid) with bounded pagination and bounded retries under a descriptive User-Agent. Each institution is keyed by its source-native MAS entity id — the leading token of its directory detail URL — within the selected sector, so identity is read from the source and never inferred. Detail URLs are discovered from same-origin directory links and validated against the published path contract rather than constructed by string-building. The first run seeds a private baseline and emits no alerts; later runs emit only institution_delta events, deduplicated by change_id.
Compliance & honest limits
- Public, logged-out MAS directory only — no API key, cookie, or login, and no access control is defeated.
- Identified, moderate automation: descriptive User-Agent, bounded pagination, bounded retries with backoff.
- One
sectorper run — the five public sectors are Banking, Capital Markets, Financial Advisory, Insurance and Payments. - The first run seeds a private baseline and emits zero deltas by design.
- A removal is reported only after
removalGraceRunshas elapsed, so transient paging gaps do not read as delistings. - This is a change feed over the public directory — it is not legal or regulatory advice, and it does not replace your own licence verification.
About
Part of the NexGenData registry- and procurement-watch family — one honest, deterministic contract across public official registers. Built by NexGenData. Questions or need a custom feed? Open an issue on the Actor page.
2026-07-26
Watch baselines now persist without baselineId. Previously, omitting the optional
baselineId made the actor use the run's default key-value store, which is created fresh for
every run — so the watch re-seeded on each run and never emitted a delta, while still charging
its source-check event. If you left baselineId blank, the watch was not working. It now
derives a stable baseline from the canonical scope (sector, institutionIds, nameContains,
categoryContains, nameMatchMode, includeDetail), exactly as this field's description
always promised. Pinning baselineId explicitly behaves as before.
includeDetail is part of that scope on purpose: licence_type_status and incorporation come
from the detail fetch and are both material, so sharing one baseline across detail and list mode
would emit a phantom profile_changed for the entire directory.
source_url and institution_url are now carried on removed_from_directory deltas. A
removal has no after-profile, so both fields were previously empty on exactly the delta type
where the click-through matters most.
Run memory raised to 1024 MB. apify-actor-start bills per gigabyte with a minimum of one,
so 512 MB cost the same as 1024 MB. No price change.
Preview vs Watch mode
- Preview / snapshot (watchMode = false): returns current MAS FID register presence for the scope; no baseline retained.
- Watch (watchMode = true, default): seeds a private baseline on the first run (zero deltas), then emits only qualified
institution_deltarows against it. A zero-delta poll over a complete/CAPPED read charges a singlesource_check; active runs bill viainstitution_delta.source_receiptdiagnostics go to theRUN_RECEIPTkey-value record and log — never the dataset.
What is not done. No login, no cookie or CAPTCHA bypass, no private or personal-account data, no browser automation.
⏰ Set it on a schedule
A single run is a snapshot. The value is the feed: open the actor in Apify Console → Schedules → Create new, add this actor with input 3 above (watch_mode: true), and pick a cadence:
- Daily —
0 7 * * *(07:00 UTC): catch changes within a day. - Weekly —
0 7 * * 1: a Monday digest.
Each run is independent; keep the same input on the schedule so the results stay comparable. Schedules can also POST results to a webhook (Console → Integrations).
💰 Pricing example
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
Actor Start (apify-actor-start) | $0.02 | $0.02 | $0.02 | $0.02 |
Institution delta (institution_delta) | $0.08 | $0.07 | $0.06 | $0.05 |
Source check (source_check) | $0.10 | $0.09 | $0.08 | $0.07 |
Worked at the live Free-tier price (watch mode, one delta per change):
- 8 institution deltas: $0.02 start + $0.10 source check + 8 × $0.08 = $0.76
- 25 institution deltas: $0.02 start + $0.10 source check + 25 × $0.08 = $2.12
- 2000 institution deltas: $0.02 start + $0.10 source check + 2000 × $0.08 = $160.12
A run that delivers zero rows charges the $0.02 start fee plus the $0.10 source check (the source was read and reported empty). A BLOCKED run (source refused) fails loud and charges no value event. The start fee is charged once per GB of run memory; the default run memory is 1024 MB.
Yield on the sample run: NORMAL: PREVIEW (watchMode=false) 10 unbilled presence row(s) of 496 in scope; use watchMode=true for the billed change feed. maxItems is a hard ceiling on what is delivered and billed, never a target.
⚖️ Legal & ToS
This actor reads public, logged-out pages and feeds published by eservices.mas.gov.sg. It collects only what the source publishes to any visitor, identifies itself, and does not access accounts, private data or anything behind authentication. Use the output in line with the source's terms and your local law; the intended use is B2B research and monitoring.
❓ FAQ
Q: Do I need an API key or a login?
A: No. The source (eservices.mas.gov.sg) is read logged-out; the input schema has no key field and the actor carries no secrets.
Q: Why did my run return 0 rows?
A: Read the run's status message. GENUINE_EMPTY means the source was read and had nothing in scope for your input (in watch mode the first run always seeds the baseline and returns zero deltas); BLOCKED means the source refused and the run failed without billing a value event — retry later or narrow the input. A zero-row run bills the start fee plus one source check.
Q: How many rows can one run return?
A: Up to maxItems (default 2000). Raise the cap for a bigger run; you pay per delivered row.
Q: What does watch mode remember between runs?
A: A private baseline of source-native record ids in a named key-value store. Each later run diffs the live source against it and emits only changes.
Q: How fresh is the data?
A: Every run reads the source live at run time; nothing is cached between runs except the watch baseline. Put it on a schedule for a continuous feed.
Q: What formats can I export?
A: The dataset downloads as JSON, CSV, Excel, XML or RSS from the run's Dataset tab or the Apify API, and any run can push to a webhook or integration.
Q: How is this different from the other company registry checks actors?
A: Same output shape and billing model; this one covers eservices.mas.gov.sg. The siblings under Related Actors cover the other sources or slices — run several on one schedule for a combined feed.
🆘 Troubleshooting
- Run FAILED with BLOCKED → the source refused the request or changed its page shape → nothing was billed beyond the start fee; retry after a while, and if it persists open an Issue with the run id.
- Status says CAPPED → your cap (
maxItems) was reached → raise it for a bigger run. - Input validation error on start → a field is outside the schema's allowed values → start from the Quick start block and change one field at a time.
- Run TIMED-OUT → a very wide request on a slow day → raise the run timeout in Run options or narrow the input; what was delivered before the timeout is still in the dataset.
- First watch run shows no deltas → expected: it seeds the baseline; changes appear from the second run.
🔗 Related Actors
- Finland PRH Business Filing Lookup — Look up Finnish companies by Business ID on the official PRH open-data trade register — name, company form, trade-register status, registration date,…
- Finland Trade Register Filing Events — Finnish Trade Register (PRH) public-notice events in a date window — one record per registration notice: business ID, company name, notice type and e…
- FMCSA Motor Carrier Authority Check — Resolves USDOT numbers against the official FMCSA SAFER company snapshot — legal/DBA name, entity type, operating status, out-of-service date, MC/MX…
- New York Active Corporation Check — Resolves entities against the New York Department of State active-corporations dataset — by DOS ID or exact name. One official answer per identity; a…
- New Zealand Gazette Insolvency Notice Watch — New Zealand Gazette insolvency notices — applications to wind up, liquidator, receiver and administrator appointments, bankruptcies, creditor meeting…
- Oregon New Businesses — Monthly Formation Feed — Oregon businesses registered in the latest published month, from the Secretary of State's official monthly new-business file — registry number, busin…
- 🏢 About NexGenData — NexGen Watch is NexGenData's fleet of 256 public monitoring and lookup actors built on official sources, pay-per-result. Browse the catalog at apify.com/nexgenwatch.
⭐ Found this useful?
If this actor saved you a manual check, a quick review on the Apify Store helps other teams find it. Feature request or a source that changed? Open it from the Issues tab — every one is read.
