How-to
How to run Maryland Contractor License Lookup & List Scraper (MHIC)
Step-by-step: the exact input, what each field does, and the rows that come back from the Maryland Home Improvement Commission's public query.
You want Maryland home improvement contractors from the Maryland Home Improvement Commission (MHIC), either a few registration numbers to check or a list of licensees in a city or ZIP. MHIC’s public query on the Department of Labor’s site is free, but it answers one city, ZIP, name or number at a time, shows 50 licences to a page and has no download. Maryland had 21,622 active licences on 2026-10-12, which is more than 430 result pages to copy, and even Baltimore alone is 1,552. This actor runs the same query and hands back the rows as a table.
What you’ll need
Nothing but an Apify account. The actor talks to MHIC’s query directly.
No API key and no proxy. The query page shows a reCAPTCHA box, but on 2026-10-12 MHIC returned results without it from every Apify egress we tried, so the actor does not solve it; if MHIC ever starts enforcing it, runs return a free notice row instead of data. The one thing the source does enforce is a Cloudflare rate limit, so the actor spaces its requests 2 seconds apart and pauses 60 seconds when it is refused.
Step 1: Open the actor
Open Maryland Contractor License Lookup & List Scraper (MHIC) on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.
Step 2: Fill in the input
| Field | Type | Required | What it does |
|---|---|---|---|
query | string | no | An MHIC registration number (‘161740’), a business name or part of one (‘Titan’), or a person’s name (‘Peter Krug’ — the person index is searched by last name, then every word… |
queries | array | no | Several lookups in ONE run, one per line. Combined with the field above if you fill both. (default []) |
city | string | no | Business-address city, exact match ignoring case and punctuation, e.g. ‘Silver Spring’. MHIC lists licensees by business address, not by where they work. |
cities | array | no | Several cities in ONE export. (default []) |
zipCode | string | no | 5-digit business ZIP, e.g. ‘21201’. |
zipCodes | array | no | Several ZIP codes in ONE export. (default []) |
nameFilter | string | no | Case-insensitive text in the trade name or the licensee’s name, e.g. ‘roofing’. |
nameFilters | array | no | Several name fragments in ONE export; a licence matching any of them is returned once. (default []) |
marylandAddressesOnly | boolean | no | Out-of-state contractors can hold an MHIC licence. Tick to drop licences whose business address is outside Maryland. |
maxResults | integer | no | EXPORT: cap on licences for the WHOLE run — your spend control (set 100000 to take every active licence). LOOKUP: cap per name or number (default 50). |
The field that decides everything is query. Fill it (or queries) and the run is a lookup: a number such as 161740 returns that registration, and a name is searched in both MHIC’s business-name index and its personal-name index (Titan returned 12 on 2026-10-12). Leave it empty and the run is an export, filtered by city, zipCode or nameFilter. With no filter at all it exports the whole state, up to maxResults.
The second is city. MHIC’s own city search is a prefix match, so typing Annapolis there also returns any city whose name starts with Annapolis; the actor keeps the exact city only. On 2026-10-12 MHIC listed 381 licences for “Annapolis” and the actor kept 377. If you want the neighbours too, list them in cities. A ZIP is the tighter filter and the fastest: ZIP 21201 is 33 licences.
A working input:
{
"city": "Annapolis",
"maxResults": 1000
}
Step 3: Run it
Press Start. The run log says how many licences MHIC lists for each city or ZIP, then how many it kept.
That input took 21 seconds on Apify on 2026-10-12, and the log read “city Annapolis: source lists 381, kept 377 in 16s”. ZIP 21201 took 10 seconds. The whole state is a different animal: 445 pages of 50, spaced out to stay under MHIC’s rate limit, so it took 906 and 914 seconds in two runs on 2026-10-12, about 15 minutes. A lookup of 161740 and Titan returned 13 licences in 74 seconds, 60 of them a pause after MHIC’s rate limit answered 429. If MHIC keeps refusing for several minutes, the searches it could not finish come back as free notice rows rather than as a short list that looks complete.
Step 4: Read the output
Each run returns a labelled table, not raw JSON:
Every row looks like this, a real row from a lookup run:
{
"license_number": "161740",
"license_suffix": null,
"person_name": "TSGAKRSTOS A DAFLA",
"business_name": "A TEAM LLC",
"address": "710 GEORGE ST",
"city": "BALTIMORE",
"address_state": "MD",
"zip_code": "21201",
"expiration_date": "2027-05-07",
"license_category": "CONTRACTOR/SALESMAN",
"business_reference": "05-163491",
"status": "Active",
"phone": null,
"matched_by": "license_number",
"license_type": "Home Improvement License",
"state": "MD",
"source_url": "https://www.dllr.state.md.us/cgi-bin/ElectronicLicensing/OP_Search/OP_search.cgi?calling_app=HIC::HIC_business_location"
}
| Field | Example value | Meaning |
|---|---|---|
license_number | 161740 | MHIC registration number (Reg. #) |
license_suffix | — | Registration suffix (-01, -02 …) when MHIC shows one |
person_name | TSGAKRSTOS A DAFLA | The licensed individual |
business_name | A TEAM LLC | Trade name, rejoined when MHIC’s column cut it |
address | 710 GEORGE ST | Business street address |
city | BALTIMORE | Business city |
address_state | MD | Business state (out-of-state firms hold MHIC licences) |
zip_code | 21201 | Business ZIP |
Most people came for the street address. Statewide it was filled on 21,621 of the 21,622 active licences, with ZIP and expiry on all of them. What is missing is just as plain: phone is always null, because MHIC publishes no phone and no email. license_number alone is not a unique key, since 562 licences carry a suffix such as -01; key on the number and the suffix together. business_reference is the unlabelled 05-NNNNNN number MHIC prints in front of the address on about 75% of rows, passed through as found, and it is not the registration number.
Step 5: Export it
Open the Dataset tab and export to CSV, JSON or Excel, or pull the same rows from the API, which is what you want if this is going to run on a schedule.
What it costs
$0.004 per licence returned, plus Apify’s own platform usage. The Annapolis run above is 377 rows, so $1.51. Baltimore’s 1,552 licences cost $6.21, the default export with an empty input is 500 rows ($2.00), and every active licence in the state is 21,622 rows ($86.49), for which the run’s max charge has to be at least that much. The full-state runs used $0.05 of compute each. Rows explaining an outage, a cut-short search or an unusable filter are free.
Where the data comes from
This reads the Maryland Home Improvement Commission’s public licence query, run by the Maryland Department of Labor, the page in the screenshot below, live on every run. Every night a canary runs this actor against that live source and checks that ZIP 21201 still returns at least 20 licences, each with a name, street address and expiry: what “verified” means.
If you need to check two or three contractors, the query is free and fine: type the registration number, read the expiry. It stops being reasonable at list size. Paging is a server session that breaks if you jump ahead, the rate limit refused us after about 60 requests at 2.3 a second, and a trade name longer than MHIC’s 35-character column is cut off and finishes inside the address cell, so a copied list mixes company names into street addresses. The actor rejoins the name and separates the street.
See it used
Export Annapolis, Maryland Home Improvement Contractors builds a mailing list of the 377 active licensees with an Annapolis business address. Verify Maryland MHIC Contractor Licenses checks a list of registration numbers and names for licences that are no longer active.
When you need a phone number, which MHIC does not publish, West Virginia Contractor License Lookup & Leads Scraper (WVCLB) has one on 99.9% of its licences, and 880 of them belong to firms with a Maryland mailing address.
Last updated 2026-10-12