NMLS Consumer Access Scraper
Pricing
from $1.00 / 1,000 record scrapeds
NMLS Consumer Access Scraper
Scrape NMLS Consumer Access for mortgage companies, MLOs, and branches — state licenses with statuses and dates, regulatory disclosures with PDF links, trade names, and sponsor/branch relationships. Search by name, NMLS ID, or state; CAPTCHA solved automatically. Clean JSON/CSV output.
Pricing
from $1.00 / 1,000 record scrapeds
Rating
0.0
(0)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Turn NMLS Consumer Access into structured mortgage-licensing data. Scrape any company, individual (MLO), or branch from nmlsconsumeraccess.org — legal name, NMLS ID, addresses, every state license with status and dates, regulatory-action disclosures with PDF links, trade names, and sponsor/branch relationships. Search by name, look up NMLS IDs directly, or sweep a whole state. JSON or CSV out, priced per result.
How it works

✨ Why use this scraper?
Vetting mortgage lenders? Building a state-by-state licensing dataset? Monitoring regulatory actions against loan originators? NMLS Consumer Access is the authoritative public registry — but it's gated behind a CAPTCHA and offers no export.
- 🎯 Four seeding modes. Search by company/person name, fetch exact NMLS IDs, sweep a state, or paste detail-page URLs — all classified automatically.
- 🤖 CAPTCHA handled for you. NMLS gates every page behind a BotDetect "Turing Test". The actor solves it once per session and reuses the unlocked session for every request in the run.
- 📜 Full state-license tables. Every license per entity: regulator, license name/number, status (
Approved,Voluntary Surrender, …), original issue date, status date, renewal year, and trade names attached to that license. Large lenders return 90–180 license rows each. - ⚖️ Regulatory disclosures with PDF links. Consent orders, final orders, and settlements — each with a direct document URL.
- 🔗 Relationship expansion. Optionally follow an individual's sponsoring companies and a company's branches (
maxSeedDepth), so one seed can map an entire lender's footprint. - 🏷 Trade-name history. Current and prior trade names plus prior legal names — track rebrands like Avex Funding → Better Mortgage.
- 📤 Clean exports. One row per entity, JSON + CSV, no duplicate rows within a run.
🎯 Use cases
| Team | What they build |
|---|---|
| Lead generation / sales | Contact lists of licensed mortgage companies and MLOs by state, with phone, email, and website |
| Compliance & risk | License-status monitoring and disclosure (regulatory-action) alerts on counterparties |
| Fintech / lending platforms | Partner-vetting pipelines keyed on NMLS ID with license coverage per state |
| Market research | State-by-state maps of active mortgage lenders, brokers, and servicers |
| Recruiters | MLO sourcing with sponsoring-company relationships |
| Journalists / researchers | Datasets on enforcement actions and license surrenders across the industry |
📥 Supported inputs
Pick a mode and fill in the matching field:
| Mode | Input field | Behaviour |
|---|---|---|
by_name | names | Runs an NMLS search per query. Add a city/state/ZIP to narrow (e.g. Rocket Mortgage Detroit MI) — NMLS rejects overly broad searches. |
by_id | nmlsIds | Fetches each ID's detail page directly. Each ID is tried as company → individual → branch (or restricted via entityType). |
by_state | states | Two-letter codes (TX, CA). Searches the whole state; pair with entityType to keep it focused. |
by_url | startUrls | Exact NMLS URLs — detail pages like https://www.nmlsconsumeraccess.org/EntityDetails.aspx/COMPANY/3030 or search URLs like https://www.nmlsconsumeraccess.org/Home.aspx/SubSearch?searchText=.... |
Not supported:
- Hosts outside
nmlsconsumeraccess.org - Federal-registry-only pages that have no standard entity detail layout
🔄 How it works
- Solve the gate once. NMLS redirects every request to a BotDetect CAPTCHA page. The actor solves it (CapSolver, with a local-OCR first attempt) and keeps the unlocked session cookie for the whole run.
- Seed from your names / IDs / states / URLs — searches go through NMLS's own JSON search endpoint.
- Fetch each entity's detail page in parallel over the shared session, re-solving transparently if the session ever expires.
- Parse company / individual / branch layouts into one structured row each: identity, addresses, contacts, state licenses, disclosures, trade names.
- Optionally expand to related entities — an individual's sponsoring companies, a company's branches — up to
maxSeedDepthhops andmaxSeedExpansionsentities. - Push one row per entity to the dataset; export JSON/CSV from the Storage tab.
⚙️ Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | by_name | Seeding mode: by_name / by_id / by_state / by_url. |
names | array | ["Rocket Mortgage Detroit MI"] | Search queries for by_name mode. |
nmlsIds | array | ["3030"] | Exact NMLS IDs for by_id mode. |
states | array | — | Two-letter state codes; the query in by_state mode, a filter otherwise. |
entityType | string | "" (any) | Restrict to COMPANY or INDIVIDUAL. |
startUrls | array | — | Exact NMLS detail/search URLs for by_url mode. |
includeDisclosures | boolean | true | Include regulatory-action documents in each row. |
maxSeedDepth | integer | 0 | Relationship-expansion hops (0 = seeds only, max 3). |
maxSeedExpansions | integer | 100 | Cap on entities added by expansion. |
maxItems | integer | 1000 | Hard cap on rows collected (controls billing). |
maxConcurrency | integer | 5 | Parallel detail fetches over the shared session. |
proxy | object | Apify RESIDENTIAL | NMLS sits behind Cloudflare and blocks datacenter IPs — keep residential. |
Example — fetch two lenders by ID and map their branches:
{"mode": "by_id","nmlsIds": ["330511", "1850"],"maxSeedDepth": 1,"maxSeedExpansions": 50,"maxItems": 100}
Example — all companies matching a name search:
{"mode": "by_name","names": ["Better Mortgage New York NY"],"entityType": "COMPANY","maxItems": 20}
📊 Output overview
Each entity is one dataset row with entityType set to COMPANY, INDIVIDUAL, or BRANCH. All three share the same core shape (identity, addresses, stateLicenses[], disclosures[]); companies add corporate fields (businessStructure, sponsoredMlos, trade-name history, branchListUrl), individuals add employers[] and sponsor references in relatedRefs[].
📦 Output sample
One company row, trimmed (this lender returns 93 license entries; two shown):
{"nmlsId": "330511","entityType": "COMPANY","name": "Better Mortgage Corporation","streetAddress": "1 World Trade Center 80th Floor New York, NY 10007","mailingAddress": "1 World Trade Center 80th Floor New York, NY 10007","phone": "415-523-8837","email": "licensingteam@better.com","website": ["www.better.com", "www.neohomeloans.com"],"otherTradeNames": ["Better Mortgage", "NEO Home Loans"],"priorOtherTradeNames": ["Avex Funding Corporation", "Better", "Better.com"],"priorLegalNames": ["Avex Funding Corporation"],"sponsoredMlos": "353","fiscalYearEnd": "12/31","formedIn": "California, United States","dateFormed": "02/25/2003","businessStructure": "Corporation","regulatoryActions": "Yes","stateLicenses": [{"regulator": "Arizona","licenseName": "Mortgage Banker License","authorizedToConductBusiness": "Yes","licenseNumber": "BK-0942146","originalIssueDate": "05/03/2017","status": "Approved","statusDate": "09/30/2025","renewedThrough": "2026","otherTradeNames": "Better Mortgage; NEO Home Loans"},{"regulator": "Alaska","licenseName": "Mortgage Broker/Lender License - Other Trade Name #1","authorizedToConductBusiness": "No","licenseNumber": "AK330511","originalIssueDate": "08/04/2020","status": "Voluntary Surrender","statusDate": "07/14/2022","renewedThrough": "None"}],"disclosures": [{"title": "Consent Order","url": "https://www.nmlsconsumeraccess.org/EntityDetails.aspx/Artifact/Other.pdf?q=277502-368825"},{"title": "Settlement","url": "https://www.nmlsconsumeraccess.org/EntityDetails.aspx/Artifact/Settlement.pdf?q=308059-398860"}],"branchListUrl": "https://www.nmlsconsumeraccess.org/EntityDetails.aspx/Branches/330511","sourceUrl": "https://www.nmlsconsumeraccess.org/EntityDetails.aspx/COMPANY/330511","scrapedAt": "2026-07-22T21:32:55.719Z"}
🗂 Key output fields
| Group | Fields |
|---|---|
| Identity | nmlsId, entityType (COMPANY / INDIVIDUAL / BRANCH), name, sourceUrl, scrapedAt |
| Contact | streetAddress, mailingAddress, phone, tollFreeNumber, fax, email, website[] |
| Names history | otherTradeNames[], priorOtherTradeNames[], priorLegalNames[], otherNames[] |
| Corporate (companies) | businessStructure, formedIn, dateFormed, fiscalYearEnd, stockSymbol, sponsoredMlos, branchListUrl |
| Licenses | stateLicenses[].{regulator, licenseName, licenseNumber, authorizedToConductBusiness, originalIssueDate, status, statusDate, renewedThrough, otherTradeNames, authorizedToRepresent} |
| Disclosures | regulatoryActions, selfReportedDisciplinaryActions, disclosures[].{title, url} (direct PDF links) |
| Relationships | employers[] (individuals), relatedRefs[].{entityType, nmlsId, name} (sponsors/branches found on the page) |
❓ FAQ
How does the actor get past the NMLS CAPTCHA? NMLS serves a BotDetect image CAPTCHA before any data page. The actor solves it automatically at run start and reuses the unlocked session for all requests, re-solving transparently if the session expires mid-run. Solving is built in — you don't configure anything.
Which entity types are returned?
Companies, individuals (MLOs), and branches. In by_id mode each ID is tried as company → individual → branch until one matches; use entityType to skip the guessing.
Why do my name searches return nothing or fail?
NMLS rejects overly broad queries (it caps result sets server-side). Narrow the search — add a city, state, or ZIP to the name, e.g. Better Mortgage New York NY.
How do I get a company's branches or an MLO's employer?
Set maxSeedDepth: 1. Companies expand to their branch entities (fetched from NMLS's branch-locations endpoint), individuals expand to their sponsoring companies. maxSeedExpansions caps the total.
Do I need my own proxy?
No — the default Apify residential proxy works. Note that NMLS blocks datacenter IPs, so switching the proxy group away from RESIDENTIAL will typically break the run.
Can it access licensee-only or authenticated NMLS data? No. Only the public Consumer Access pages are scraped — no NMLS portal logins, no non-public data.
How do I limit cost?
Set maxItems. The actor stops queuing new entities once the cap is reached; billing is per result plus a flat per-run start fee.
💬 Support
- For issues or feature requests, please use the Issues tab on the actor's Apify Console page.
- Author's website: https://muhamed-didovic.github.io/
- Email: muhamed.didovic@gmail.com
🛠 Additional services
- Custom output shape, additional fields, or one-off datasets: muhamed.didovic@gmail.com
- Need a similar scraper for other licensing registries or professional directories? Drop an email.
- For API access (no Apify fee, just a usage fee for the API): muhamed.didovic@gmail.com
🔎 Explore more scrapers
If this NMLS scraper was useful, see other scrapers and actors at memo23's Apify profile — covering job boards, real estate, directories, social media, and more.
🤖 For AI Agents & LLM Apps
Quick reference for agents calling this actor via the Apify API or MCP:
- Purpose: look up US mortgage companies, loan originators (MLOs), and branches in the NMLS Consumer Access registry, with state licenses and regulatory disclosures.
- Minimal input (tested):
{ "mode": "by_id", "nmlsIds": ["330511"], "maxItems": 1 }
- Key output fields (flat list):
nmlsId,entityType,name,streetAddress,phone,email,website,otherTradeNames,businessStructure,sponsoredMlos,stateLicenses(array of license objects),disclosures(array of{title, url}),sourceUrl. - Billing: pay-per-event — a flat fee per run start plus a fee per dataset row. Cap spend with
maxItems. - Behaviors to know: the actor solves NMLS's CAPTCHA itself (adds ~10–60 s at run start); requires residential proxy (default is correct); broad name searches are rejected by NMLS, so include a city/state in
names; one row per entity,entityTypetells you which parser produced it.
⚠️ Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the Nationwide Multistate Licensing System (NMLS), the State Regulatory Registry LLC (SRR), the Conference of State Bank Supervisors (CSBS), or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.
The scraper accesses only publicly available pages on nmlsconsumeraccess.org — the same consumer-facing registry data anyone can view in a browser. No authenticated NMLS portal content, licensee-only features, or non-public data is accessed. Users are responsible for ensuring their use complies with nmlsconsumeraccess.org's Terms of Use, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.
SEO Keywords
nmls scraper, nmls consumer access scraper, scrape nmls, nmls api, nmls data export, nmls license lookup api, mortgage license data, mortgage company license scraper, mlo license scraper, mortgage loan originator data, nmls id lookup, state mortgage license database, mortgage lender verification, mortgage broker license data, loan officer license lookup, mortgage compliance data, nmls regulatory actions data, mortgage industry dataset, mortgage lead generation data, nmls branch locations data, mortgage licensing api alternative