Lead generation
Professional License Lookup Scraper — DE + CO Roster Export
Bulk-export professional and occupational license rosters from Delaware and Colorado state licensing-board open-data portals — nursing, real estate, contractors, medical, accountancy and more, one call per state, with disciplinary flags where published. No API key, no login.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
This Actor bulk-exports professional and occupational license rosters from official state licensing-board open-data portals — Delaware and Colorado in v1 (more states coming) — and returns one structured row per licensee per state. Each row carries the licensee's name, license number, profession, license type, current status, issue and expiration dates, and a disciplinary-action flag with detail where the state publishes one.
We built this as a self-serve alternative to paying for a dozen near-identical single-state, single-profession scrapers. One call per state buys you coverage across nursing, real estate, contractors and trades, medical practice, accountancy, and dozens of other regulated professions — not one narrow niche. It queries each state's own free, keyless Socrata open-data API directly, not a paywalled search UI.
What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes so every request looks like a browser, not Python. - 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per request,Retry-Afterhonoured. - 🧱 Graceful degradation per state — if one state's dataset hiccups, that state is skipped with a warning; your batch keeps running.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, a shared cross-state schema despite each state publishing wildly different raw field names.
- 🧩 Disciplinary-signal resolution done right — Delaware's inline flag is a dead column (always
"N"); we join the state's companion disciplinary dataset instead of trusting it. - 💰 Pay-Per-Event pricing — you only pay for licensee rows that land in your dataset. No data, no charge (beyond the small warm-up fee).
Use cases
- Background-check / HR / compliance vendors — verify a candidate or contractor's professional license is current before a hire or engagement.
- Staffing agencies — bulk-pull active licensees in a profession/region for a candidate pipeline.
- Lead-gen / sales prospecting — build a contact list of licensed professionals in a target trade or profession.
- Insurance underwriting — confirm license status and disciplinary history before binding a policy.
- List hygiene — drop licensees whose
status_normalizedcomes backinactive, or filter todisciplinary_onlybefore outreach.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
jurisdictions | array | no | Which state licensing-board rosters to query (more states coming). |
professionQuery | string | no | Substring filter against the profession/license-type field (e.g. "nursing", "real estate", "roofing"). Omit for a full multi-profession roster pull. |
nameQuery | string | no | Substring filter on licensee last/combined name. |
licenseNumber | string | no | Exact license-number lookup — narrows to (at most) one licensee per jurisdiction. |
activeOnly | boolean | no | Restrict to active/current license status per jurisdiction's own status vocabulary. |
disciplinaryOnly | boolean | no | Restrict to licensees with a disciplinary action on file. |
maxResults | integer | no | Cap on total rows collected across all requested jurisdictions. |
{
"jurisdictions": [
"DE",
"CO"
],
"professionQuery": "nursing",
"activeOnly": true,
"disciplinaryOnly": false,
"maxResults": 500,
"proxyConfiguration": {
"useApifyProxy": false
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
jurisdictionlicensee_namelicense_numberprofessionlicense_typestatusstatus_normalizedissue_dateexpiration_datedisciplinary_flagdisciplinary_detailcitymailing_statesource_record_urlregistry_urlscraped_at
{
"jurisdiction": "DE",
"licensee_name": "SHAHAN,BRIAN",
"license_number": "RS-0037427",
"profession": "Real Estate",
"license_type": "Salesperson",
"status": "Active",
"status_normalized": "active",
"issue_date": "2021-09-14",
"expiration_date": "2028-04-30",
"disciplinary_flag": false,
"disciplinary_detail": null,
"city": "WILMINGTON",
"mailing_state": "DE",
"source_record_url": "https://data.delaware.gov/resource/pjnv-eaih.json?license_no=RS-0037427",
"registry_url": "https://data.delaware.gov/d/pjnv-eaih",
"scraped_at": "2026-07-18T12:00:00+00:00"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Result row emitted | $0.0050 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
FAQ
Why only 2 states in v1?
robots.txt doesn't block the JSON endpoint. Adding a 3rd state is a contained per-state adapter, not a rewrite; more are on the roadmap.Does this cover attorneys / bar licenses?
How current is the data?
status/disciplinary_flag as "as published in the state's snapshot."Can I get every profession in one run?
professionQuery blank for a full multi-profession roster pull across whichever jurisdictions you select.What does `disciplinaryOnly` change?
Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors