OrbTop

NMLS Scraper - Mortgage Loan Originators, Lenders & Branches

BUSINESSLEAD GENERATIONOTHER

NMLS Consumer Access Scraper — Mortgage Loan Originators & Lenders

Scrape the NMLS Consumer Access registry for US mortgage companies, branches, and Mortgage Loan Originators (MLOs). Returns state-by-state licenses, regulator disclosures, sponsor relationships, and full contact info for ~500K active MLOs, ~40K companies, and ~125K branches — the same data mortgage recruiters and compliance teams pay $5K-$25K/year for.


NMLS Consumer Access Scraper Features

  • Extracts 25+ fields per entity including licenses, disclosures, contacts, and sponsor links
  • Returns per-state license details — license name, regulator, status, issue date, license number
  • Covers all three NMLS entity types: INDIVIDUAL (MLO), COMPANY, and BRANCH
  • Supports four query modes: by NMLS ID, by name, by US state, or by sponsoring company
  • Handles BotDetect CAPTCHA automatically via CapSolver — one solve per run
  • Cleans Cloudflare-obfuscated emails back to readable form, because obscurity isn't security
  • Returns clean JSON with flattened arrays — no nested objects, no HTML, no surprises
  • No proxies required — runs on any Apify plan including Free
  • Pay-per-record pricing: $0.10 per run + $0.001 per record

Who Uses NMLS Data?

  • Mortgage recruiters — Source licensed MLOs by state or sponsoring company for outreach
  • Wholesale lenders — Build territory lists of brokers and lenders with active licenses in target states
  • Compliance and risk teams — Screen counterparties for regulatory actions and license status before onboarding
  • Market researchers — Size the mortgage origination market by state, license type, or sponsor
  • Fintech and CRM integrators — Enrich existing mortgage contacts with NMLS IDs, license coverage, and disclosure history

How NMLS Consumer Access Scraper Works

  1. Pick a query mode. by_nmls_id is for direct enrichment of known IDs. by_name does a full-text search. by_state iterates all entities in one or more US states. by_company_employees pulls the MLO roster for a sponsoring company.
  2. The actor warms a session, solves the one-time BotDetect CAPTCHA, and then reuses the session for the rest of the run. One CAPTCHA per run, not one per record.
  3. Each matched entity's detail page is fetched and parsed — state licenses, regulatory actions, branch counts, employment history, and sponsor info all get flattened into a single row.
  4. Results stream into the Apify dataset as they're scraped. Pay-per-record billing means a full state-level pull costs a handful of dollars, not a subscription.

Input

{
    "mode": "by_state",
    "states": ["CA", "TX"],
    "entityType": "INDIVIDUAL",
    "includeDisclosures": true,
    "maxItems": 500,
    "proxyConfiguration": { "useApifyProxy": false }
}
Field Type Default Description
mode string by_name Query mode: by_nmls_id, by_name, by_state, or by_company_employees
nmlsIds array [] List of NMLS IDs (e.g., "3030"). Used when mode = by_nmls_id
names array [] Company or individual names to search. Used when mode = by_name
states array [] Two-letter US state codes (e.g., ["CA", "TX"]). Used when mode = by_state
entityType string "" (all) Filter to INDIVIDUAL, COMPANY, or BRANCH. Empty returns all
sponsoringCompanyIds array [] Sponsoring company NMLS IDs. Used when mode = by_company_employees
includeDisclosures boolean true Parse regulator action details from each entity page
maxItems integer 20 Max records to return (1-10000)
proxyConfiguration object {useApifyProxy: false} Proxy settings. NMLS does not require a proxy

Example inputs

Direct lookup by NMLS ID:

{ "mode": "by_nmls_id", "nmlsIds": ["3030", "2289"], "maxItems": 2 }

Search by name (company or individual):

{ "mode": "by_name", "names": ["Rocket Mortgage"], "entityType": "COMPANY", "maxItems": 10 }

Pull all MLOs sponsored by a company:

{ "mode": "by_company_employees", "sponsoringCompanyIds": ["2289"], "maxItems": 200 }

NMLS Consumer Access Scraper Output Fields

Every record uses the same flat schema regardless of entity type. Fields that don't apply to the entity type (e.g., sponsoring_company_* on a COMPANY) are empty strings or zeros.

{
  "nmls_id": "3030",
  "entity_type": "COMPANY",
  "legal_name": "Rocket Mortgage, LLC",
  "other_trade_names": ["Rocket", "Rocket HQ", "Rocket Mortgage", "Rocket Pro"],
  "prior_legal_names": ["Quicken Loans Inc.", "Quicken Loans, LLC"],
  "prior_other_trade_names": ["QLMS", "Rock Financial"],
  "primary_address": "1050 Woodward Avenue",
  "address_line2": "",
  "city": "Detroit",
  "state": "MI",
  "zip": "48226",
  "phone": "800-863-4332",
  "toll_free_phone": "800-863-4332",
  "fax": "855-455-4791",
  "website": "rocket.com/mortgage, www.rocketmortgage.com",
  "email": "CompanyLicensing@rocketmortgage.com",
  "state_licenses_count": 183,
  "state_licenses_active_count": 165,
  "state_licenses": [
    "Alabama - Consumer Credit License - Approved - Issued: 2009-11-10 - #20979",
    "California - DFPI - Residential Mortgage Lending Act License - Approved - Issued: 1998-11-19 - #4130233"
  ],
  "license_types": ["Mortgage Lender License", "Mortgage Servicer License"],
  "federal_registrations": [],
  "regulator_disclosures_count": 0,
  "regulator_disclosures": [],
  "branch_locations_active_count": 82,
  "branch_locations_count": 3862,
  "branch_states": ["AZ", "CA", "CO", "FL", "MI", "TX"],
  "sponsoring_company_nmls_id": "",
  "sponsoring_company_name": "",
  "employment_history": [],
  "office_locations": [],
  "is_active": true,
  "detail_url": "https://www.nmlsconsumeraccess.org/EntityDetails.aspx/COMPANY/3030",
  "scraped_at": "2026-04-21T14:22:27.831Z"
}
Field Type Description
nmls_id string NMLS unique identifier
entity_type string INDIVIDUAL, COMPANY, or BRANCH
legal_name string Legal name of the entity
other_trade_names array of strings DBAs currently in use
prior_legal_names array of strings Historical legal names
prior_other_trade_names array of strings Previously used DBAs
primary_address string Street address line 1
address_line2 string Suite, unit, or line 2
city string City
state string Two-letter state code
zip string ZIP code (5 or 9 digit)
phone string Primary phone
toll_free_phone string Toll-free phone if listed
fax string Fax number
website string Website URL(s), comma-separated
email string Primary email (Cloudflare obfuscation decoded)
state_licenses_count integer Total state licenses on record (active + inactive)
state_licenses_active_count integer Count of currently active licenses
state_licenses array of strings Formatted "State - License Name - Status - Issued: YYYY-MM-DD - #LicenseNum"
license_types array of strings Unique license type names across all states
federal_registrations array of strings Federal regulator registrations
regulator_disclosures_count integer Total regulatory actions on record
regulator_disclosures array of strings Formatted "Regulator - Date - Action Type - Case #"
branch_locations_active_count integer Active branches (companies only)
branch_locations_count integer Total branches past and present (companies only)
branch_states array of strings States where branches operate (companies, from search results)
sponsoring_company_nmls_id string Sponsoring company NMLS ID (MLOs only)
sponsoring_company_name string Sponsoring company legal name (MLOs only)
employment_history array of strings Employer history (individuals only)
office_locations array of strings Registered office locations (individuals only)
is_active boolean Whether the entity has at least one active license
detail_url string Direct link to the entity's NMLS detail page
scraped_at string ISO timestamp when the record was scraped

FAQ

How do I scrape NMLS Consumer Access?

NMLS Consumer Access Scraper handles it for you. Pick a query mode (by NMLS ID, name, state, or sponsoring company), set maxItems, and run. The actor solves the one-time BotDetect CAPTCHA on its own and returns structured JSON.

How much does NMLS Consumer Access Scraper cost to run?

NMLS Consumer Access Scraper uses pay-per-event pricing: $0.10 per run + $0.001 per record. A 100-MLO pull runs ~$0.20. A 5,000-MLO state sweep runs ~$5.10. A full 500K-MLO enumeration costs ~$500 — though you probably don't need the whole country.

Does NMLS Consumer Access Scraper need proxies?

No. The actor uses got-scraping to bypass Cloudflare without a proxy. The proxyConfiguration field is there if you want to route through Apify proxy for geo-targeting, but the default (no proxy) works fine on any plan.

Can I pull only MLOs sponsored by a specific company?

Yes. Set mode = by_company_employees and pass the company's NMLS ID in sponsoringCompanyIds. The actor fetches each sponsoring company's detail page, then searches for and enriches every MLO whose active sponsor ID matches.

What data can I get from NMLS?

NMLS Consumer Access Scraper returns per-state license details (regulator, license name, status, issue date, license number), regulatory action history, sponsor relationships for MLOs, branch counts for companies, full contact info, and up to 25+ structured fields per record. Consumer complaint counts are not exposed by the site itself and are therefore not included.

Is the data real-time?

NMLS Consumer Access Scraper hits the live NMLS Consumer Access registry. State regulators update the registry daily, so what you get is current as of the last regulator sync — typically within 24 hours for license changes.


Need More Features?

Need custom fields, per-state pagination strategies, or a different mortgage data source? File an issue or get in touch.

Why Use NMLS Consumer Access Scraper?

  • Affordable — $0.10/run + $0.001/record. A 5K-MLO state pull runs ~$5 versus $5K-$25K/year for equivalent commercial feeds.
  • Clean output — returns flat JSON with consistent field names, decoded emails, ISO dates, and flattened license arrays. No HTML, no nested objects, no cleanup required before you feed it into your CRM.
  • Blue ocean — the only Apify actor that targets NMLS Consumer Access. Every other mortgage-related actor on the store scrapes Zillow, which is not the same thing.