Minnesota DLI Contractor License Lookup
Pricing
from $0.86 / 1,000 item extracteds
Minnesota DLI Contractor License Lookup
Search and export official Minnesota DLI residential contractor licenses by business, number, type, status, city, and enforcement indicator.
Pricing
from $0.86 / 1,000 item extracteds
Rating
0.0
(0)
Developer
Automation Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Search, filter, and export Minnesota DLI contractor licenses from the official residential-contractor roster.
Use a business name, holder name, license number, type, status, city, enforcement indicator, or renewal indicator to turn the state CSV into integration-ready records.
The Actor is designed for contractor verification, procurement screening, compliance reviews, and scheduled status checks.
What does Minnesota DLI Contractor License Lookup do?
The Actor downloads the public residential-contractor roster published by the Minnesota Department of Labor and Industry (DLI).
It then:
- validates your filters;
- downloads the current official CSV;
- checks that the response has the expected DLI structure;
- parses and normalizes every row;
- applies all requested filters together;
- deduplicates records by license number;
- stops at your
maxItemslimit; - saves typed records to the default Apify dataset.
No login, browser, or proxy is required.
Who is it for?
Procurement teams
Verify a contractor before onboarding or renewing an agreement.
Compliance and risk teams
Review license status, expiry, and DLI's enforcement-action indicator.
Marketplaces and property platforms
Enrich contractor profiles with official public license facts and provenance.
Data and operations teams
Export a repeatable snapshot to JSON, CSV, Excel, a warehouse, or an automation workflow.
Developers
Call one Actor endpoint instead of writing and maintaining CSV download, parsing, filtering, and normalization code.
Why use this Actor?
- Official source: every row comes from DLI's public residential-contractor export.
- Useful filters: search by broad text or narrow fields without downloading the file yourself.
- Typed results: dates, booleans, contact fields, status, and provenance have stable names.
- Bounded output:
maxItemscontrols dataset size and the number of returned license records. - Clear failure behavior: an unavailable or unrecognizable source fails the run instead of pretending there are zero matches.
- Scheduling ready: rerun the same input to compare snapshots in your own workflow.
What data can I extract?
| Field | Meaning |
|---|---|
holderType | DLI's business/person classification |
licenseType | Top-level license category |
licenseSubtype | Specific contractor license or certificate subtype |
name | Official holder name |
businessName | Published DBA name |
addressLine1, addressLine2 | Published business address |
city, state, zipCode | Published location |
phone, email | Public contact values present in the roster |
licenseNumber | DLI license, registration, or certificate number |
licenseStatus | Status text in the current roster |
originalDate | Original date, normalized to YYYY-MM-DD |
expirationDate | Expiry date, normalized to YYYY-MM-DD |
hasEnforcementAction | Boolean derived from DLI's enforcement indicator |
renewalInProgress | Boolean derived from DLI's renewal indicator |
sourceUrl | Exact official CSV URL |
sourceAgency | Publishing regulator |
retrievedAt | UTC retrieval timestamp |
All fields can be null when DLI leaves a source cell empty.
Getting started
- Open the Actor in Apify Console.
- Enter one or more filters.
- Keep
maxItemssmall for your first run. - Click Start.
- Open the Dataset tab.
- Review or export the matching license rows.
- Save the task if you want to schedule the same check.
A simple broad search:
{"query": "CONSTRUCTION","maxItems": 10}
An exact lookup:
{"licenseNumber": "XB230289","maxItems": 5}
An enforcement-indicator snapshot:
{"enforcementOnly": true,"maxItems": 100}
Input parameters
| Input | Type | Default | Description |
|---|---|---|---|
query | string | none | Substring across holder name, DBA, license number, type/subtype, and city |
businessName | string | none | Substring in holder or DBA name |
licenseNumber | string | none | Exact license number, case-insensitive |
licenseType | string | none | Substring in type or subtype |
licenseStatus | string | none | Exact DLI status |
city | string | none | Exact city, case-insensitive |
enforcementOnly | boolean | false | Keep only rows carrying DLI's enforcement indicator |
renewalInProgressOnly | boolean | false | Keep only rows marked as renewal in progress |
maxItems | integer | 100 | Save 1 to 50,000 matching records |
Filters are combined with AND logic.
For example, city: "ROCHESTER" and licenseStatus: "Issued" returns only issued records in Rochester.
query is also combined with every specific filter.
Output example
A current record has this shape (values below are illustrative and anonymized):
{"holderType": "Business","licenseType": "Residential Contractors","licenseSubtype": "Residential Building Contractor","name": "SAMPLE CONTRACTOR LLC","businessName": "SAMPLE HOME BUILDERS","addressLine1": "100 SAMPLE AVE","addressLine2": null,"city": "MINNEAPOLIS","state": "MN","zipCode": "55401","phone": null,"email": null,"licenseNumber": "BC123456","licenseStatus": "Issued","originalDate": "2020-04-15","expirationDate": "2027-03-31","hasEnforcementAction": false,"renewalInProgress": false,"sourceUrl": "https://secure.doli.state.mn.us/ccld/data/MNDLILicRegCertExport_Residential_Contractors.csv","sourceAgency": "Minnesota Department of Labor and Industry (DLI)","retrievedAt": "2026-09-15T08:00:00.000Z"}
How much does it cost to look up Minnesota contractor licenses?
Pricing has two events:
- Run started: $0.00005 once per run.
- License record returned: tiered per matching dataset item.
At the BRONZE tier, a returned license record costs $0.00144.
Approximate BRONZE examples:
| Matching records | Approximate total |
|---|---|
| 1 | $0.00149 |
| 10 | $0.01445 |
| 100 | $0.14405 |
| 1,000 | $1.44005 |
An empty valid search incurs only the start fee.
The selected result cap controls the number of paid record events; infrastructure usage is not charged separately under pay-per-event pricing.
Search and filtering tips
- Use
licenseNumberfor the narrowest verification. - Use
businessNamewhen punctuation or spacing may differ from your internal record. - Use
queryfor discovery across several identity fields. - Status values in DLI data include Issued, Expired, Revoked, Suspended, Voluntary Termination, and Withdrawn.
- Use
licenseTypewith phrases such asResidential Building Contractor,Qualifying Builder, orResidential Roofer Contractor. - Combine
enforcementOnlywith another filter for focused recurring checks. - Increase
maxItemsonly when you need more matches.
Enforcement and renewal indicators
hasEnforcementAction reports whether DLI's published row contains the enforcement-action flag.
It does not describe the action, allegation, order, or case outcome.
renewalInProgress reports the roster's renewal marker.
Neither boolean should be interpreted as legal advice or as a complete regulatory history.
Follow the official source and DLI guidance when a decision requires case-level context.
Recurring verification workflow
- Create an Apify Task with a stable license or supplier filter.
- Schedule it daily, weekly, or before a procurement checkpoint.
- Send results to your preferred storage or automation.
- Compare
licenseStatus,expirationDate,hasEnforcementAction, andrenewalInProgresswith your previous snapshot. - Route material changes to a human reviewer.
The Actor returns the current roster snapshot; it does not maintain history or send alerts by itself.
Export and integrations
The default dataset supports:
- JSON and JSONL;
- CSV and Excel;
- XML and RSS;
- direct API reads;
- Make integrations;
- Zapier integrations;
- webhooks;
- Google Sheets workflows;
- cloud warehouse loaders.
For a CRM or vendor database, use licenseNumber as the stable join key when it is present.
Run through the API with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~minnesota-dli-contractor-license-lookup/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"businessName":"CONSTRUCTION","licenseStatus":"Issued","maxItems":25}'
To wait for results in one request:
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~minnesota-dli-contractor-license-lookup/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"licenseNumber":"XB230289","maxItems":5}'
Run through the API with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/minnesota-dli-contractor-license-lookup').call({enforcementOnly: true,maxItems: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Run through the API with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/minnesota-dli-contractor-license-lookup').call(run_input={'city': 'DULUTH', 'licenseStatus': 'Issued', 'maxItems': 100})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Use with MCP and AI agents
Add the Apify MCP server to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/minnesota-dli-contractor-license-lookup"
Claude Desktop
Add this HTTP MCP server in your Claude Desktop configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/minnesota-dli-contractor-license-lookup"}}}
Cursor
Add the same apify server URL under Settings → MCP in Cursor.
VS Code
Add the same HTTP MCP server URL to your workspace MCP configuration in VS Code.
Example prompts:
- “Verify Minnesota DLI contractor license XB230289 and summarize its status and expiry.”
- “Return up to 50 issued residential building contractors in Duluth.”
- “Export 20 Minnesota contractor rows carrying DLI's enforcement indicator.”
Source freshness and reliability
Each run downloads the roster currently available at DLI's official URL.
The Actor does not cache a private copy between runs.
DLI controls publication timing, corrections, outages, and field coverage.
Transient network errors, rate limits, and server errors are retried up to three times with bounded backoff.
If the response is unavailable or no longer resembles the expected CSV, the run fails visibly.
Limitations
- Coverage is the DLI residential contractor roster, not every Minnesota occupation or trade.
- Electrical, plumbing, boiler, and other rosters are outside this Actor's scope.
- The source may contain historical expired certificates as well as current records.
- Public contact fields can be blank.
- Search is textual and case-insensitive; it does not perform fuzzy identity resolution.
- Enforcement output is only DLI's indicator, not enforcement case details.
- The Actor returns a current snapshot and does not calculate changes from previous runs.
- Broad unfiltered output is capped by
maxItems.
Failure behavior and troubleshooting
My run returns zero records
Check spelling, remove one filter, or use query for a broader substring search.
Remember that specific filters are combined with AND logic.
My status filter returns less than expected
Try removing the status filter and inspect the current text published by DLI.
The run fails while downloading
Inspect the run log for the HTTP status. A DLI outage or changed CSV structure intentionally causes failure rather than unreliable empty output.
Retry later after confirming the official source is reachable.
Dates or contact values are null
Those cells are blank in the official roster. The Actor does not infer or enrich missing government data.
Should I enable a proxy?
No proxy input is needed. The source is a public downloadable file and the Actor uses direct HTTPS.
Responsible use and legality
The Actor processes publicly accessible professional and business license data published by a government regulator.
Use it for legitimate verification, compliance, research, and data-quality purposes.
Follow applicable privacy, anti-discrimination, procurement, records-retention, and consumer-reporting rules.
Do not treat one automated field as a final eligibility or legal conclusion.
Verify material decisions against the linked official source and provide appropriate human review.
Related Automation Lab Actors
- California Contractor License Lookup for California CSLB contractor records.
- North Carolina Contractor License Lookup for North Carolina general contractors.
- Chicago Business Licenses Scraper for Chicago business-license records.
Choose this Actor when your source of truth is Minnesota DLI's residential-contractor roster.
FAQ
Is this an official Minnesota government service?
No. It is an independent Apify Actor that reads and links to DLI's official public data.
Does it verify all Minnesota professional licenses?
No. It is intentionally limited to the residential-contractor export.
Can I download the whole roster?
Yes. Run without filters and set maxItems high enough, up to 50,000. The source currently contains more rows than that, so the Actor's documented cap still applies.
Can I search by a person's name?
Yes. Use businessName to search both official holder and DBA names, or use query to search those fields plus license, type, and city.
Are email and phone always available?
No. They are returned only when DLI publishes them in the row.
Does an enforcement flag mean the license is currently revoked?
Not necessarily. Treat the indicator and status as separate source fields and review official case information for any consequential decision.
Are no-result runs charged?
A valid no-result run incurs the one-time start event but no per-record events.
Can I schedule it?
Yes. Save the input as an Apify Task, add a schedule, and compare each dataset with your own previous snapshot.