# Nebraska Contractor Registration Lookup & Leads Scraper (NDOL) (`scrapebench/nebraska-contractor-license-lookup`) Actor

Look up or export every current Nebraska contractor registration from the Department of Labor (NDOL) — registration number, name, address and expiry, plus phone on request. Filter by service, county, city, ZIP, state or name.

- **URL**: https://apify.com/scrapebench/nebraska-contractor-license-lookup.md
- **Developed by:** [ScrapeBench](https://apify.com/scrapebench) (community)
- **Categories:** Lead generation
- **Stats:** 5 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.004 / contractor registration

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Nebraska Contractor Registration Lookup & Leads Scraper (NDOL)

### Pain points

- NDOL's public search shows 25 firms per page — the full registry was 812 pages on 2026-10-07 — and has no export button.
- Phone numbers are not in the search results at all: each one sits on the firm's own details page, one click per contractor.
- NDOL keeps two separate name boxes (DBA name and corporation name) that match different firms, and its city box matches partial names and ignores the state: 'Linc' returns Lincoln, and 'Ashland' also returns Ashland, Wisconsin.

### What we solve

- One run returns the whole NDOL registry, or just the service category, county, city, ZIP, state or name you filter for.
- Turn on phone enrichment and every row also carries the firm's phone, email (when filed), corporation name, entity type, employee count and workers' comp status.
- Name searches cover both NDOL name indexes and say which one matched; city and ZIP are matched exactly.

### Summary

Get the Nebraska Department of Labor (NDOL) contractor registry as clean data: every current contractor and subcontractor registration — 20,299 on 2026-10-07, 15,909 of them with a Nebraska address and the rest out-of-state firms registered to work there — with registration number, name, expiry date, sales-tax option and mailing address. Switch on phone enrichment to add the phone number, email where filed, corporation name, entity type, employee count and workers' comp status from each firm's NDOL page. Leave the input empty for a statewide export, or narrow it by NDOL service category, county, city, ZIP, state, name or registration number. Nebraska registration is required of every contractor working in the state; it is a registration, not a competency licence, and this data does not show trade qualifications. Pay only per registration returned.

### Who it's for

- Building-supply distributors, roofing and HVAC manufacturers building Nebraska contractor lead lists
- General contractors and property managers checking that a subcontractor holds a current Nebraska registration
- Insurers, sureties and lenders verifying registration expiry and workers' comp status
- Data teams loading a statewide Nebraska contractor table into a CRM or warehouse

### How to use

Set the input, run the actor, and collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API). Example input:

```json
{
  "service": "Roofing Contractors",
  "county": "Douglas",
  "maxResults": 500
}
```

See **Inputs** below for every available field.

### What you get

One row per record:

| Field | Description |
|---|---|
| `registration_number` | NDOL registration number, e.g. 33053-26 — one row per registration |
| `business_name` | The name NDOL lists for the contractor (usually the DBA) |
| `status` | Always 'Registered' — NDOL's search lists only current registrations |
| `expiration_date` | Registration expiry date |
| `sales_tax_option` | Nebraska contractor sales-tax option elected (1, 2 or 3) |
| `address` | Mailing street address |
| `city` | Mailing city |
| `address_state` | Mailing state (out-of-state firms included) |
| `zip_code` | Mailing ZIP |
| `county` | The Nebraska county you searched, on county searches |
| `service` | The NDOL service category you searched, on service searches |
| `matched_by` | On name searches: business_name or corporation_name |
| `phone` | Business phone (phone enrichment on) |
| `email` | Business email when filed (phone enrichment on, ~7% of firms) |
| `corporation_name` | Legal name when filed (phone enrichment on) |
| `business_entity` | LLC, Corporation, Sole Proprietorship… (phone enrichment on) |
| `employees` | Employee count reported to NDOL (phone enrichment on) |
| `workers_comp_status` | Workers' compensation status (phone enrichment on) |
| `enrichment_status` | not_requested, enriched, failed or skipped_time_budget |
| `source_url` | The firm's NDOL details page |

Sample:

```json
{
  "registration_number": "33053-26",
  "business_name": "Allset Kitchens and Baths",
  "corporation_name": "Allset Kitchens and Baths",
  "status": "Registered",
  "expiration_date": "2027-07-01",
  "sales_tax_option": "2",
  "address": "1501 Schropp Circle",
  "city": "Ashland",
  "address_state": "NE",
  "zip_code": "68003",
  "county": null,
  "service": null,
  "matched_by": null,
  "phone": "(402) 598-7147",
  "email": null,
  "business_entity": "Corporation",
  "employees": 0,
  "workers_comp_status": "Exempt",
  "enrichment_status": "enriched",
  "state": "NE",
  "source_url": "https://dol.nebraska.gov/conreg/Contractor/Details/3305326"
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `service` | no | string | — | One of NDOL's 58 service categories (NAICS-based), by name or number: e.g. 'Roofing Contractors' or 19, 'electrical' (22), 'plumbing' (23 — plumbing, heating and air-conditioning). A word works when it matches exactly one category. Leave empty for every registered contractor. 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. |
| `services` | no | array | `[]` | Several service categories in ONE run, e.g. 19 and 22. Combined with 'Service' if you fill both. |
| `county` | no | string | — | Nebraska county as NDOL records it for the registration, e.g. 'Douglas' or 'Lancaster County'. Matches Nebraska firms only. NDOL's county is the firm's own record and does not always match the city in its mailing address. An unrecognised county is ignored with a log line. |
| `counties` | no | array | `[]` | Several Nebraska counties in ONE run. Combined with 'County' if you fill both. |
| `city` | no | string | — | Mailing-address city, exact match ignoring case and punctuation, e.g. 'Lincoln' (does not also match 'Lincolnville'). |
| `cities` | no | array | `[]` | Several cities in ONE run. Combined with 'City' if you fill both. |
| `zip` | no | string | — | Mailing-address ZIP, 5 digits (a ZIP+4 is accepted and matched on its first 5). |
| `zips` | no | array | `[]` | Several ZIPs in ONE run. Combined with 'ZIP code' if you fill both. |
| `state` | no | string | — | 2-letter state of the firm's mailing address, e.g. 'IA' for Iowa firms registered to work in Nebraska, or 'NE'. Leave empty for every state. Ignored when a county is given (a county is always a Nebraska county). |
| `states` | no | array | `[]` | Several 2-letter states in ONE run. Combined with 'Mailing-address state' if you fill both. |
| `name` | no | string | — | Text the firm's name contains (case-insensitive), e.g. 'ROOFING' or 'SMITH'. Both NDOL name indexes are searched — the listed (DBA) name and the corporation name — and matched_by says which one hit. |
| `names` | no | array | `[]` | Several name fragments in ONE run; a firm matching any of them is returned once. The run log says how many registrations each search returned. |
| `registrationNumber` | no | string | — | Look up one registration by its full number, e.g. '33053-26' (the dash is optional). |
| `registrationNumbers` | no | array | `[]` | Several full registration numbers in ONE run. |
| `maxResults` | no | integer | `500` | Cap on registrations returned for the whole run (a spend control). The full statewide registry is about 20,300 firms, so 100000 returns everything that matches. With several filter values the searches run in order and share this one cap. |
| `includePhone` | no | boolean | `false` | Off by default. NDOL publishes phone, email, corporation name, entity type, employee count and workers' comp status only on each firm's own page, so this fetches one extra page per row — about 15 rows a second measured 2026-10-07 (1,000 rows in 70 s), so ~35 seconds per 500 rows and roughly 25 minutes for the whole state. Rows are never held back for it: rows not enriched within the run's time budget say so in enrichment_status. No extra charge. |
| `proxyConfiguration` | no | object | `{"useApifyProxy": false}` | Optional. The NDOL site answers direct requests; enable a proxy only if runs come back with a 'blocked' notice. |

### Pricing (Pay Per Event)

You pay per result (`dataset-item`) — **no charge for empty runs**. Example: **252 Douglas County roofing contractors** at *$0.004/result* ≈ **$1.01**.

The full statewide export (20,299 registrations on 2026-10-07) is about $81. Apify platform usage is billed separately.

### Use cases

- Statewide export — pull all 20,299 current NDOL registrations in one run and load them into your CRM.
- Territory list — every registered roofing contractor in Douglas County (252 on 2026-10-07), with phone when enrichment is on.
- Vendor check — look up a subcontractor by registration number or name to confirm it is registered and when the registration expires.
- Out-of-state firms — filter the mailing-address state to IA (969 firms on 2026-10-07) to see Iowa contractors registered to work in Nebraska.

### Why this actor

- Covers the whole NDOL registry: 20,299 current registrations on 2026-10-07 — 4,525 with an Omaha address, 2,484 Lincoln, plus 4,390 out-of-state and Canadian firms.
- Mailing address on every row; phone on 1,000 of 1,000 enriched rows in a 2026-10-07 sample, email on 74 of them.
- One row per registration number (20,299 distinct of 20,299 rows statewide, 2026-10-07).
- Read live from NDOL's own search on every run, so a run is as current as the state's registry.
- Pay per registration returned; phone enrichment is free, and outage, bad-filter and no-match rows are free.

### Limitations & updates

Covers current NDOL contractor registrations only; expired registrations are not listed. Registration is not a competency licence, so trade qualifications are not shown. NDOL's list carries no county, so county is filled only on county searches. Phone, email, corporation name and business details require phone enrichment (one extra page per row); email is filed by a minority of firms. Mailing addresses are as filed and some carry typos or a PO box. With several filter values, the searches run in order and share one maxResults cap. If NDOL's site does not answer, the run returns a free row saying so instead of an empty dataset.

### FAQ

**Where does the data come from?**

From the Nebraska Department of Labor's public Contractor Registration search (dol.nebraska.gov/conreg), read live on every run. Phone, email and business details come from each firm's NDOL details page when phone enrichment is on.

**Is this a contractor licence?**

No. Nebraska requires every contractor and subcontractor working in the state to register with NDOL, but registration is not a competency licence and does not show trade qualifications. Electrical and plumbing licences are issued by other bodies and are not in this data.

**How many registrations are there, and how many have a phone or email?**

Counted 2026-10-07: 20,299 current registrations, every one with a mailing street address. NDOL keeps phone and email only on each firm's own page: in a 1,000-row enriched sample of Douglas County firms (2026-10-07), all 1,000 had a phone and 74 an email.

**How long does phone enrichment take?**

It fetches one extra page per row, about 15 rows a second (1,000 rows in 70 seconds, measured 2026-10-07): roughly 35 seconds per 500 rows and about 25 minutes for the whole state. Rows are never held back for it; any row not enriched in the run's time budget says so in enrichment_status.

**What does the county mean?**

It is the Nebraska county NDOL records for the registration, which does not always match the city in the firm's mailing address. NDOL's list does not show a county, so the county field is filled only on county searches, with the county you searched. Lancaster County returned 2,864 registrations on 2026-10-07.

**Are expired registrations included?**

No. NDOL's public search lists only current registrations; every expiry date in the 2026-10-07 statewide pull was in the future (2026-10-08 to 2027-12-31).

**What happens if I type a county or service 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, so a typo never bills you for 20,000 rows.

**How am I charged?**

$0.004 per registration returned. The default input returns the first 500 registrations statewide ($2.00); the full statewide export is about $81. Phone enrichment is free. Rows explaining an outage, an unrecognised filter, a time-budget cut or an empty result are free.

### Which actor to choose

Part of the contractor-data suite — pick the one that fits your goal:

- **Virginia Contractor License Lookup (DPOR Bulk)** — You need the same kind of statewide export for Virginia, with email.
- **Arkansas Contractor License Lookup & Verify (ACLB)** — You need Arkansas contractor licences, in bulk or one at a time.
- **Multi-State Contractor & Trade License Lookup** — You want the same contractor checked across several states in one run.
- **Iowa Contractor Registration Lookup & Leads Scraper (DIAL)** — You need Iowa contractors — every active DIAL registration statewide, with phone and email, filtered by trade, county, city or ZIP.
- **Mississippi Contractor License Lookup & Leads Scraper (MSBOC)** — You need Mississippi contractors — the active MSBOC roster with phone, street address and classifications, by county or class.
- **Ohio Contractor License Lookup & Leads Scraper (OCILB)** — You need Ohio electrical, HVAC, plumbing, hydronics or refrigeration contractors — the full OCILB roster, by trade and county.
- **Delaware Contractor License Lookup & List Scraper (DOR + DPR)** — You need Delaware contractors — DOR business licences plus DPR electrical, plumbing and HVACR licences, by city or ZIP.
- **DC Contractor License Lookup & List Scraper (DLCP)** — You need contractors licensed in Washington, DC — every active DLCP general contractor, home improvement and asbestos licence, by address state, ZIP or ward.
- **Arizona Contractor License Lookup & Leads Scraper (ROC)** — You need Arizona contractors — one ROC licence by number or name, or every active licence statewide with phone, by class and city.
- **West Virginia Contractor License Lookup & Leads Scraper (WVCLB)** — You need West Virginia contractors — every current WVCLB licence with phone and mailing address, by county or classification.
- **Colorado Electrical & Plumbing License Lookup & List Scraper** — You need Colorado electrical or plumbing licences — contractors, masters and journeymen statewide, with status and public disciplinary actions.
- **Maryland Contractor License Lookup & List Scraper (MHIC)** — You need Maryland home improvement contractors — every active MHIC licence with street address and expiry, by city or ZIP.
- **New Jersey Contractor License Lookup & Export (DCA)** — You need New Jersey contractors — active DCA home improvement, electrical, master plumber and HVACR licences statewide or by city, with street address and owner for home improvement firms.

### Guides & use cases

Written up on **[scrapebench.dev](https://scrapebench.dev)** — the bench that runs and verifies this actor against the live source every night:

- **How-to:** [How to run Nebraska Contractor Registration Lookup & Leads Scraper (NDOL)](https://scrapebench.dev/guides/how-to-nebraska-contractor-license-lookup/)
- **Use case:** [List Douglas County, Nebraska Roofing Contractors](https://scrapebench.dev/use-cases/douglas-county-roofing-contractors/)

More actors, coverage and nightly verification results: **[scrapebench.dev](https://scrapebench.dev)**

### Works with AI assistants (MCP)

Callable as an MCP tool, so Claude, Cursor, VS Code Copilot and other MCP clients can run it directly. Grab the config from the [MCP tab](https://apify.com/scrapebench/nebraska-contractor-license-lookup/api/mcp) on this page — Apify hosts the server and keeps that snippet current, and OAuth signs you in on first connect, so no API token goes in your config file.

Then just ask:

> "List the registered roofing contractors in Douglas County, Nebraska, with their addresses and phone numbers."

With phone enrichment on, that input returns 252 registrations (2026-10-07). Runs started this way bill exactly like any other run.

# Changelog

This Actor's version history is a separate document: https://apify.com/scrapebench/nebraska-contractor-license-lookup/changelog.md

# Actor input Schema

## `service` (type: `string`):

One of NDOL's 58 service categories (NAICS-based), by name or number: e.g. 'Roofing Contractors' or 19, 'electrical' (22), 'plumbing' (23 — plumbing, heating and air-conditioning). A word works when it matches exactly one category. Leave empty for every registered contractor. 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.

## `services` (type: `array`):

Several service categories in ONE run, e.g. 19 and 22. Combined with 'Service' if you fill both.

## `county` (type: `string`):

Nebraska county as NDOL records it for the registration, e.g. 'Douglas' or 'Lancaster County'. Matches Nebraska firms only. NDOL's county is the firm's own record and does not always match the city in its mailing address. An unrecognised county is ignored with a log line.

## `counties` (type: `array`):

Several Nebraska counties in ONE run. Combined with 'County' if you fill both.

## `city` (type: `string`):

Mailing-address city, exact match ignoring case and punctuation, e.g. 'Lincoln' (does not also match 'Lincolnville').

## `cities` (type: `array`):

Several cities in ONE run. Combined with 'City' if you fill both.

## `zip` (type: `string`):

Mailing-address ZIP, 5 digits (a ZIP+4 is accepted and matched on its first 5).

## `zips` (type: `array`):

Several ZIPs in ONE run. Combined with 'ZIP code' if you fill both.

## `state` (type: `string`):

2-letter state of the firm's mailing address, e.g. 'IA' for Iowa firms registered to work in Nebraska, or 'NE'. Leave empty for every state. Ignored when a county is given (a county is always a Nebraska county).

## `states` (type: `array`):

Several 2-letter states in ONE run. Combined with 'Mailing-address state' if you fill both.

## `name` (type: `string`):

Text the firm's name contains (case-insensitive), e.g. 'ROOFING' or 'SMITH'. Both NDOL name indexes are searched — the listed (DBA) name and the corporation name — and matched_by says which one hit.

## `names` (type: `array`):

Several name fragments in ONE run; a firm matching any of them is returned once. The run log says how many registrations each search returned.

## `registrationNumber` (type: `string`):

Look up one registration by its full number, e.g. '33053-26' (the dash is optional).

## `registrationNumbers` (type: `array`):

Several full registration numbers in ONE run.

## `maxResults` (type: `integer`):

Cap on registrations returned for the whole run (a spend control). The full statewide registry is about 20,300 firms, so 100000 returns everything that matches. With several filter values the searches run in order and share this one cap.

## `includePhone` (type: `boolean`):

Off by default. NDOL publishes phone, email, corporation name, entity type, employee count and workers' comp status only on each firm's own page, so this fetches one extra page per row — about 15 rows a second measured 2026-10-07 (1,000 rows in 70 s), so ~35 seconds per 500 rows and roughly 25 minutes for the whole state. Rows are never held back for it: rows not enriched within the run's time budget say so in enrichment_status. No extra charge.

## `proxyConfiguration` (type: `object`):

Optional. The NDOL site answers direct requests; enable a proxy only if runs come back with a 'blocked' notice.

## Actor input object example

```json
{
  "service": "Roofing Contractors",
  "services": [],
  "county": "Douglas",
  "counties": [],
  "cities": [],
  "zips": [],
  "states": [],
  "names": [],
  "registrationNumbers": [],
  "maxResults": 500,
  "includePhone": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Each row is one current Nebraska contractor registration: registration number, name, expiry, mailing address, and phone/email/entity details when phone enrichment is on.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapebench/nebraska-contractor-license-lookup").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("scrapebench/nebraska-contractor-license-lookup").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call scrapebench/nebraska-contractor-license-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapebench/nebraska-contractor-license-lookup"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Uy4MAtNNd9Bc5KrSY/builds/tDdlw7RAbWN5XjP4P/openapi.json
