← Health board

DLCP

DC Contractor License Lookup & List Scraper (DLCP)

Export every active Washington, DC contractor licence (5,909 on 2026-10-09): general contractors, home improvement and asbestos abatement firms, with address and registered agent. Filter by activity, status, state, city, ZIP, ward or name.

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

Verification

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

Output fields

Authoritative field set from the dataset schema.

FieldType
license_numberstring|null
license_activitystring|null
statusstring|null
status_datestring|null
initial_issue_datestring|null
license_start_datestring|null
expiration_datestring|null
business_namestring|null
trade_namestring|null
entity_typestring|null
owner_namestring|null
registered_agentstring|null
addressstring|null
streetstring|null
citystring|null
address_statestring|null
zip_codestring|null
premise_in_dcboolean|null
wardstring|null
mailing_addressstring|null
statestring|null
noticestring|null
notice_typestring|null
source_urlstring|null

Sample row

{
  "license_number": "410521000073",
  "license_activity": "General Contractor/Construction Manager",
  "status": "Active",
  "status_date": "2026-10-06",
  "initial_issue_date": "2020-11-05",
  "license_start_date": "2026-10-06",
  "expiration_date": "2030-10-31",
  "business_name": "Aku Consulting Inc.",
  "trade_name": "GOTA Engineering",
  "entity_type": "Domestic Business Corporation",
  "owner_name": null,
  "registered_agent": "REGISTERED AGENTS INC.",
  "address": "2402 17th Street SE, Washington, DC, 20020, USA",
  "street": "2402 17th Street SE",
  "city": "WASHINGTON",
  "address_state": "DC",
  "zip_code": "20020",
  "premise_in_dc": true,
  "ward": "Ward 8",
  "mailing_address": "2402 17th Street SE, Washington, DC, 20020, USA",
  "state": "DC",
  "source_url": "https://maps2.dcgis.dc.gov/dcgis/rest/services/FEEDS/DCRA/MapServer/0/query?where=CUSTOMERNUMBER%3D%27410521000073%27&outFields=%2A&f=json"
}

Inputs

FieldTypeReqDefaultDescription
activity string no — Which DLCP contractor licence activity to return: 'general_contractor' (General Contractor/Construction Manager), 'home_improvement' (Home Improvement Contractor) or 'asbestos' (Asbestos Abatement Business). Leave empty for all three. 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 every licence.
activities array no [] Several activities in ONE run, e.g. general_contractor and home_improvement. Combined with 'Licence activity' if you fill both.
status string no — Leave empty for Active licences (or for every status when you look up licence numbers). 'all' adds closed, cancelled, expired and suspended licences; 'expired' covers every 'Expired' variant DLCP files (Expired, Expired - Enforcement, Expired - 1st / 2nd / Final Penalty).
licenseNumber string no — A DC Basic Business Licence number to verify, digits only, e.g. 420225000088. Searches every status unless you set one.
licenseNumbers array no [] Several licence numbers in ONE run. The run log names any that matched nothing. Filters of different kinds combine (a licence must match all of them), so leave name, city and the other filters empty for a plain licence lookup.
name string no — Text the business name or trade name contains (case-insensitive), e.g. 'ROOFING' 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 licences each one matched.
addressState string no — Two-letter state of the business premises address, e.g. DC, MD or VA. Most DC-licensed contractors are based outside the District (on 2026-10-09: 2,863 active in MD, 1,278 in VA, 1,154 in DC).
addressStates array no [] Several states in ONE run. Combined with 'Business address state' if you fill both.
city string no — City of the business premises address, exact match ignoring case, e.g. 'Silver Spring'. DC premises file the city as 'Washington'.
cities array no [] Several cities in ONE run. Combined with 'City' if you fill both.
zip string no — ZIP of the business premises address, 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.
ward string no — DC ward of the business premises, 1 to 8 (only premises inside the District have a ward).
wards array no [] Several wards in ONE run, e.g. 5 and 6.
maxResults integer no 500 Cap on licences returned for the whole run (a spend control). DC had 5,909 active contractor licences and 20,910 in all statuses on 2026-10-09, 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. DC's open-data server 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: 1154 active contractor licences based in DC at $0.004/result ≈ $4.62.

FAQ

Where does the data come from?

From the 'Basic Business License' table that DC GIS publishes for the Department of Licensing and Consumer Protection (DLCP, formerly DCRA) on opendata.dc.gov, refreshed daily. The actor reads the three contracting business activities on every run.

Does it include phone numbers or emails?

No. The licence table publishes no phone number or email address, and the actor does not add any. Each licence carries a premises address, a mailing address and a registered agent.

Why are most of the contractors outside DC?

A contractor needs a DC licence to work in the District, wherever it is based. On 2026-10-09, 2,863 of the 5,909 active licences had a Maryland premises address, 1,278 a Virginia one and 1,154 a DC one. Set 'Business address state' to keep one state, or 'DC ward' for premises inside the District.

Are expired licences included?

Only when asked. The default is Active; 'all' returns every status DLCP records (20,910 licences on 2026-10-09), and 'expired' collects Expired, Expired - Enforcement and the three Expired penalty statuses. Looking up licence numbers searches every status unless you set one.

What happens if I type a value 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 every licence.

How am I charged?

$0.004 per licence returned. The default input returns the first 500 active licences ($2.00); every active licence (5,909) is about $24. Rows explaining an outage, an unrecognised filter or an empty result are free.

Guides & use cases

Related actors