← Health board

DOR + DPR

Delaware Contractor License Lookup & List Scraper (DOR + DPR)

Export every current Delaware contractor business licence (13,215 on 2026-10-07) with street address, plus active DPR electrical, plumbing and HVACR licences. Filter by trade, residency, city, ZIP or name.

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

Verification

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

Output fields

Authoritative field set from the dataset schema.

FieldType
datasetstring|null
license_numberstring|null
license_categorystring|null
boardstring|null
residencystring|null
statusstring|null
business_namestring|null
trade_namesarray|null
person_namestring|null
issue_datestring|null
valid_fromstring|null
expiration_datestring|null
addressstring|null
citystring|null
address_statestring|null
zip_codestring|null
statestring|null
noticestring|null
notice_typestring|null
source_urlstring|null

Sample row

{
  "license_number": "1989001012",
  "dataset": "business_license",
  "license_category": "RESIDENT CONTRACTOR",
  "board": null,
  "residency": "resident",
  "status": null,
  "business_name": "HATZEL & BUEHLER INC",
  "trade_names": [],
  "person_name": null,
  "issue_date": null,
  "valid_from": "2025-01-01",
  "expiration_date": "2027-12-31",
  "address": "1 RIGHTER PARKWAY, SUITE 300",
  "city": "WILMINGTON",
  "address_state": "DE",
  "zip_code": "19803",
  "state": "DE",
  "source_url": "https://data.delaware.gov/resource/5zy2-grhr.json?license_number=1989001012"
}

Inputs

FieldTypeReqDefaultDescription
source string no "both" Which Delaware roster to read. 'business' = contractor business licences from the Division of Revenue (firms, with street address). 'trade' = electrical, plumbing and HVACR licences from the Division of Professional Regulation (individuals, city and ZIP only). 'both' returns business licences first, then trade licences, up to Maximum results. A filter one roster cannot apply (trade or a non-active status on business licences, residency on trade licences) leaves that roster out rather than being ignored.
residency string no "all" Resident or non-resident contractor business licence category. Applies to business licences only; setting it leaves trade licences out.
trade string no — A DPR trade: 'electrical', 'plumbing', 'hvacr', 'homeowner' (homeowner electrical permits, left out unless asked for), or an exact licence type such as 'Master Electrician', 'Journeyperson Electrician' or 'Master HVACR Restricted'. Applies to trade licences only; setting it leaves business licences out. 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.
trades array no [] Several trades in ONE run, e.g. plumbing and hvacr. Combined with 'Trade' if you fill both.
status string no "active" Trade-licence status. 'active' (default) keeps current licences; 'all' includes expired, closed and revoked ones. The business roster lists only current licences, so 'active' and 'all' both return all of it and any other status leaves it out.
city string no — City on the licence, exact match ignoring case, e.g. 'Dover' or 'Wilmington'. Partial city names do not match.
cities array no [] Several cities in ONE run. Combined with 'City' if you fill both.
zip string no — ZIP on the licence, 5 digits (a ZIP+4 is accepted and matched on its first 5).
zips array no [] Several ZIPs in ONE run. Combined with 'ZIP code' if you fill both.
name string no — Text the name contains (case-insensitive): the legal business name or any trade name (DBA) on business licences, or 'LAST,FIRST' on trade licences, e.g. 'ELECTRIC' or 'SMITH'.
names array no [] Several name fragments in ONE run; a licence matching any of them is returned once. The run log says how many returned licences each one matched.
maxResults integer no 500 Cap on licences returned for the whole run (a spend control). Both rosters together are about 20,400 current licences, so 100000 returns everything that matches. The run log states how many matched when the cap cuts it short.
proxyConfiguration object no {"useApifyProxy":false} Optional. data.delaware.gov answers direct requests; enable a proxy only if runs come back with a 'blocked' notice.

Pricing

Pay per result (dataset-item) — no charge for empty runs.
Example: 881 Dover contractor and trade licences at $0.004/result ≈ $3.52.

FAQ

Where does the data come from?

From two public-domain datasets on data.delaware.gov: 'Delaware Business Licenses' (Department of Finance, Division of Revenue; the four contractor categories) and 'Professional and Occupational Licensing' (Department of State, Division of Professional Regulation; the Electrical Examiners and Plumbing/HVACR boards). Both were last updated 2026-09-29 when counted. The actor queries them on every run.

Does it include phone numbers or emails?

No. Neither roster publishes a phone number or email address, and the actor does not add any. Business licences carry a street address; trade licences carry only city, state and ZIP.

What is the difference between the two rosters?

A business licence is the Division of Revenue licence a contracting firm needs to work in Delaware, filed as RESIDENT CONTRACTOR or NON-RESIDENT CONTRACTOR (plus 68 construction transportation contractors). A trade licence is held by an individual electrician, plumber or HVACR technician, from master down to apprentice. Every row says which roster it came from in 'dataset'. The two are not joined: the rosters share no common key, and matching firm names to people's names would be guesswork.

Are expired licences included?

The business roster lists only current licences (every term runs to December 2026 or later). Trade licences default to Active; set status to 'all' for every status DPR records (18,591 trade licences on 2026-10-07) or pick one such as expired or revoked.

What happens if I type a trade or ZIP the actor does not know?

That value is ignored and the run log says so. If none of the values you gave for a filter is recognised, the run returns one free row explaining it instead of the whole state. A filter only one roster can apply leaves the other roster out: a trade filter returns trade licences only, a residency filter business licences only.

How am I charged?

$0.004 per licence returned. The default input returns the first 500 licences ($2.00); the full statewide export of 20,420 licences is about $82. Rows explaining an outage, an unrecognised filter or an empty result are free.

Guides & use cases

Related actors