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.
Verification
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
dataset | string|null |
license_number | string|null |
license_category | string|null |
board | string|null |
residency | string|null |
status | string|null |
business_name | string|null |
trade_names | array|null |
person_name | string|null |
issue_date | string|null |
valid_from | string|null |
expiration_date | string|null |
address | string|null |
city | string|null |
address_state | string|null |
zip_code | string|null |
state | string|null |
notice | string|null |
notice_type | string|null |
source_url | string|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
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
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