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.
Verification
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
state | string|null |
license_number | string|null |
business_name | string|null |
person_name | string|null |
license_type | string|null |
status | string|null |
issue_date | string|null |
expiration_date | string|null |
city | string|null |
county | string|null |
address | string|null |
zip_code | string|null |
phone | string|null |
enforcement_action | string|null |
renewal_in_progress | string|null |
bond_amount | string|null |
bond_company | string|null |
insurance_company | string|null |
matched_by | string|null |
source_url | string|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
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
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