← Health board

DLI

Minnesota Contractor License Lookup & Leads Scraper (DLI)

Verify a Minnesota residential contractor by license or name, or export the whole DLI roster filtered by subtype, status, city or ZIP — with phone, address & enforcement flag.

100%golden-diff pass
Run it on Apify → verified nightly

Verification

100%golden-diff success
44canary runs
0days since last canary run

Output fields

Authoritative field set from the dataset schema.

FieldType
statestring|null
license_numberstring|null
business_namestring|null
person_namestring|null
license_typestring|null
statusstring|null
issue_datestring|null
expiration_datestring|null
citystring|null
countystring|null
addressstring|null
zip_codestring|null
phonestring|null
enforcement_actionstring|null
renewal_in_progressstring|null
bond_amountstring|null
bond_companystring|null
insurance_companystring|null
matched_bystring|null
source_urlstring|null

Sample row

{
  "state": "MN",
  "license_number": "RR531208",
  "business_name": "RASSMUSSEN METAL ROOFING AND CONSTRUCTION INC (dba RMR CONSTRUCTION INC)",
  "person_name": null,
  "license_type": "Residential Contractors - Residential Roofer Contractor",
  "status": "REVOKED",
  "issue_date": "06/20/2005",
  "expiration_date": "03/31/2008",
  "city": "MINNEAPOLIS",
  "address": "5536 27TH AVE S",
  "zip_code": "55417",
  "phone": null,
  "enforcement_action": "1",
  "renewal_in_progress": null,
  "matched_by": "business_name",
  "source_url": "https://secure.doli.state.mn.us/ccld/data/MNDLILicRegCertExport_Residential_Contractors.csv"
}

Inputs

FieldTypeReqDefaultDescription
query string no "CONSTRUCTION" A Minnesota DLI residential-contractor license number, business name, or person name to verify or search. Searches by exact license number and by business/DBA name substring. Leave this and 'Search query (batch)' empty to export the statewide roster instead, narrowed by the filters below.
queries array no ["CONSTRUCTION"] Look up many in ONE run instead of starting a run per lookup. Takes the same values as 'Search query'. Combined with 'Search query' if you fill both, and duplicates are removed. Billing is unchanged: you are charged per record returned, not per entry submitted.
licenseSubtype string no — One DLI licence subtype: Qualifying Builder, Residential Building Contractor, Qualifying Remodeler, Residential Remodeler Contractor, Qualifying Roofer, Residential Roofer Contractor, Qualifying Installer, Manufactured Home Installer or Certificate of Exemption. Short words work too: 'builder', 'remodeler', 'roofer', 'installer' (each covers both its business licence and its qualifying-person licence), 'exemption'. Empty = every subtype. An unrecognised value is ignored with a log line; if nothing you gave is recognised, the run returns a free row saying so instead of the whole state.
licenseSubtypes array no [] Several subtypes in ONE run. Combined with 'Licence subtype' if you fill both.
status string no — active (DLI 'Issued'), expired, voluntary_termination, revoked, suspended, withdrawn, or all. Empty = active when exporting statewide, and every status when you give a search query (so existing lookups behave exactly as before).
statuses array no [] Several statuses in ONE run, e.g. revoked and suspended. Combined with 'Licence status' if you fill both.
city string no — Business city, exact match ignoring case and punctuation; 'St Paul', 'St. Paul' and 'Saint Paul' are the same city (DLI spells it both ways).
cities array no [] Several cities in ONE run. Combined with 'City' if you fill both. The roster has no county column, so filter by city or ZIP.
zip string no — Business ZIP, 5 digits (a ZIP+4 is matched on its first 5).
zips array no [] Several ZIPs in ONE run. Combined with 'ZIP code' if you fill both.
maxResults integer no — With a search query: cap on matches PER QUERY (default 50), so a batch cannot silently return only the first rows overall and read as 'no match'. Statewide export: cap for the whole run (default 500, a spend control). The full roster is 59,302 licences (25,359 active, measured 2026-10-07), so 100000 returns everything that matches; the run log states how many matched when the cap cuts it short.
enforcementOnly boolean no false When on, return only licensees with a DLI enforcement action on record (revocation, suspension, etc.). Works with a search query or statewide. Note: a statewide export defaults to active licences; set status to 'all' to include the revoked and expired licences most enforcement actions sit on.
proxyConfiguration object no {"useApifyProxy":false} Optional. The Minnesota DLI roster CSV is reachable directly; a proxy is not needed.

Pricing

Pay per result (dataset-item) — no charge for empty runs.
Example: 100 verified license records at $0.004/result ≈ $0.40.

FAQ

Where does the data come from?

The official Minnesota Department of Labor & Industry (DLI) residential-contractor licensee roster — a public dataset the state refreshes nightly.

What can I search by?

A DLI license number (exact) or a business/person name (substring, matches the DBA name too). Both return the matching licenses, deduped by license number. Leave the search empty to export the statewide roster instead, filtered by licence subtype, status, city or ZIP.

How big is a full export?

Measured 2026-10-07: 59,302 licences in the roster, 25,359 of them active (DLI status 'Issued'). An export defaults to active licences and 500 rows; set status to 'all' and maxResults to 100000 for everything. There is no county column in DLI's file, so narrow by city or ZIP.

What's the enforcement-action flag?

DLI publishes whether a licensee has an enforcement action on record. We surface that flag on every result, and 'Enforcement monitor mode' returns only licensees currently under one.

What fields do I get?

License number, business/person name, license subtype, status, original and expiration dates, city, address, ZIP, phone (when published), the enforcement-action flag, and a renewal-in-progress flag.

How am I charged?

Pay-per-result — per license match returned. No charge for searches with no results.

Is this personal data?

It's public professional-license data as DLI publishes it. We deliberately skip the roster's email column and add no personal/PII enrichment.

Guides & use cases

Related actors