# Kansas City KS Contractor License Lookup & Leads Scraper (`scrapebench/kansas-contractor-license-lookup`) Actor

Contractors licensed by the Unified Government of Wyandotte County / Kansas City, Kansas: business name, street address, licence number, phone, e-mail and contact name. Export the list or look up a firm or licence number.

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

## Pricing

$0.002 / contractor record

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

## Kansas City KS Contractor License Lookup & Leads Scraper

### Pain points

- Kansas has no statewide contractor licence: cities and counties license contractors, so a Kansas contractor list has to be read locality by locality.
- The Unified Government's licensee search stops at '100+' results and shows 10 rows a page, so its contractor list cannot be read whole from it (checked 2026-11-06).
- Phone, e-mail and the contact's name are not on the result list: each licence has to be opened on its own page.

### What we solve

- The Unified Government's contractor licences read by licence-number range, so no search hits the 100-result cap.
- Each delivered licence's own page is opened for its phone, e-mail and contact name.
- Old rows cleaned out: licences that expired more than 3 years ago are left out of exports; each row says whether its licence is Unexpired, Expired or carries no expiry date.
- Looks up licence numbers or business names live on the Unified Government's search.

### Summary

Contractor licences issued by the Unified Government of Wyandotte County and Kansas City, Kansas (UG), from its Accela Citizen Access licensee search. Each row has the licence number, business name, street address, city, state and ZIP; each licence's own page adds the phone, e-mail and the contact's name. In a sample of 35 current licences read on November 6, 2026, every row had an address, 32 a phone and 27 an e-mail. Current licences carry six-digit numbers and the UG prints no expiry or status for them, so they are marked No expiry date; older numbers expired by 2020 and are left out. Kansas City, Kansas only: Kansas has no statewide contractor licence, and firms from Missouri and elsewhere appear when they are licensed to work in Kansas City, Kansas. Exports read a stored copy of the register (its date is in the run log); lookups search the UG live. Pay only per licence returned.

### Who it's for

- Building-material suppliers and distributors selling to contractors working in Kansas City, Kansas
- Subcontractors and staffing firms looking for contractors licensed in Wyandotte County
- Property managers and developers checking a contractor's Kansas City, Kansas licence
- Insurers and bonding agents reaching Kansas City-area trades

### How to use

This actor does two jobs. Run it, then collect results from the run's dataset (export to JSON/CSV/Excel, or pull via the Apify API).

**Get a list (export):** no names, just filters; returns the whole matching list.

```json
{
  "maxResults": 1000
}
```

**Check specific firms (lookup):** put company names or licence numbers in `mode`, `queries`; **Inputs** below says how each is matched.

```json
{
  "mode": "lookup",
  "queries": [
    "SANTOS PAINTING",
    "010506"
  ],
  "maxResults": 20
}
```

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

### What you get

One row per record:

| Field | Description |
|---|---|
| `license_number` | Licence number as the UG issued it (six digits for current licences, e.g. 010506); listing_id holds the same |
| `license_type` | The UG's licence type (Contractor) |
| `business_name` | Business name as registered |
| `address` | Street address |
| `city` | City |
| `address_state` | State of the address (KS, MO, …) |
| `zip_code` | ZIP code |
| `phone` | Phone, from the licence's own page, where the UG has one |
| `email` | E-mail, from the licence's own page, where the UG has one |
| `expiration_date` | Licence expiry (YYYY-MM-DD), where the UG prints one (not on current six-digit licences) |
| `extras.expiry_status` | Unexpired, Expired or No expiry date, derived from the expiry (the UG publishes no status) |
| `extras.person_name` | The contact's name from the licence's own page |
| `extras.locality` | The local register the licence comes from (Kansas City) |
| `source_url` | The licensee's own page on the UG's search (the part after # keeps rows with a shared licence number apart) |

Sample:

```json
{
  "license_number": "010506",
  "license_type": "Contractor",
  "business_name": "SANTOS PAINTING LLC",
  "address": "2941 N 123RD ST",
  "city": "KANSAS CITY",
  "address_state": "KS",
  "zip_code": "66109",
  "phone": "9139915178",
  "email": "SANTOSPAINTINGLLC.KC@GMAIL.COM",
  "state": "KS",
  "extras": {
    "locality": "Kansas City",
    "expiry_status": "No expiry date",
    "licence_type": "Contractor"
  },
  "source_url": "https://aca-prod.accela.com/UG/GeneralProperty/LicenseeDetail.aspx?LicenseeNumber=010506&LicenseeType=Contractor#%7CSANTOS%20PAINTING%20LLC%7C2941%20N%20123RD%20ST"
}
```

### Inputs

| Field | Required | Type | Default | Description |
|---|---|---|---|---|
| `mode` | no | string | `"auto"` | export: no names, just filters; returns the whole matching list. lookup / verify: put company names (matched if contained in the company name) or licence numbers (exact) in 'queries'. auto picks the mode for you. |
| `query` | no | string | — | A business name (or listing number) to look up live. Kept alongside 'queries' for saved tasks. |
| `queries` | no | array | `[]` | A business name (or listing number) to look up live. Several values in one run; combined with 'query'. |
| `locality` | no | string | — | Only listings in this locality. Kept alongside 'localities' for saved tasks. |
| `localities` | no | array | `[]` | Only listings in this locality. Several values in one run; combined with 'locality'. |
| `expiry_status` | no | string | — | Only listings in this expiry_status. Kept alongside 'expiry_statuses' for saved tasks. |
| `expiry_statuses` | no | array | `[]` | Only listings in this expiry_status. Several values in one run; combined with 'expiry_status'. |
| `categories` | no | array | `[]` | Only rows from this licence type (one or more). Available: Contractor. |
| `licenseTypes` | no | array | `[]` | Same filter as 'Licence type', under the name every state licence actor takes; the two lists are combined. |
| `expiresAfter` | no | string | — | Only licences expiring on or after this date (YYYY-MM-DD). Licences with no published expiry are left out when set. |
| `expiresBefore` | no | string | — | Only licences expiring on or before this date (YYYY-MM-DD): renewals coming due. |
| `maxResults` | no | integer | `500` | Per query in lookup mode; per run in export mode. |
| `proxyConfiguration` | no | object | `{"useApifyProxy": false}` | Used only for live lookups; exports read the stored snapshot. |

### Pricing (Pay Per Event)

You pay per result (`dataset-item`) — **no charge for empty runs**. Example: **1000 contractor licences** at *$0.004/result* ≈ **$4.00**.

Notices (unknown licence type, no match, source unavailable, stale copy, rows not opened in time) are free.

### Use cases

- Sales lists: contractors licensed to work in Kansas City, Kansas, with phone, e-mail and street address.
- Cross-state outreach: the Missouri firms licensed on the Kansas side of the metro.
- Contractor checks: confirm a firm holds a Unified Government licence before work starts.
- Market sizing: count the contractors licensed in Wyandotte County by home city or state.

### Why this actor

- The Unified Government's contractor register, not the first 100 rows of a search.
- Phone and e-mail from each licence's own page, which the result list does not show.
- Long-expired rows filtered out, every row flagged Unexpired, Expired or no expiry date.
- Pay per licence; notices are free.

### Limitations & updates

Covers the Unified Government of Wyandotte County / Kansas City, Kansas licensee register (Accela Citizen Access), Contractor licences, Kansas City, Kansas only: not the rest of Kansas. Current licences carry no expiry or status. Exports leave out licences that expired more than 3 years ago and come from a stored copy. Phone and e-mail are read per delivered row from each licence's page; if the run's time runs out first, the remaining rows carry the list fields only and a free notice says how many. One run returns at most 100,000 rows.

### FAQ

**Where does the data come from?**

The Unified Government of Wyandotte County / Kansas City, Kansas's Accela Citizen Access licensee search (aca-prod.accela.com/UG). Exports come from a stored copy of that register; the run log gives its date. Lookups search the UG live. Phone and e-mail are read from each delivered licence's own page.

**Does it cover all of Kansas?**

No. Kansas has no statewide contractor licence: cities and counties license contractors. This actor reads the Unified Government of Kansas City, Kansas today; Johnson County (Overland Park, Olathe …) and Wichita / Sedgwick County are not included yet.

**Are expired licences included?**

Exports leave out licences that expired more than 3 years ago. Current licences (six-digit numbers) carry no expiry date in the register, so they come with expiry_status No expiry date; the UG publishes no status. Lookups return every row the search finds.

**Is there a phone or email?**

Yes, where the UG has one: each delivered licence's own page is opened for its phone, e-mail and contact name. In a sample of 35 licences read on 2026-11-06, 32 had a phone and 27 an e-mail.

**Which licence types are covered?**

Contractor, the one type the UG's search returns rows for (2026-11-06). Its Master Electrician, Master Mechanic, Master Plumber and Other types returned no rows; Security (guard firms) is not a contractor licence and is left out.

**How do I look up a firm or a licence number?**

Put business names or licence numbers in queries and set mode to lookup. Both match from the start of the UG's own value: 'SANTOS PAINTING' finds SANTOS PAINTING LLC; a licence number is typed as issued (010506).

**How am I charged?**

One event per licence returned. Notices are free.

### 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 Kansas City KS Contractor License Lookup & Leads Scraper](https://scrapebench.dev/guides/how-to-kansas-contractor-license-lookup/)
- **Use case:** [Kansas City KS Licensed Contractors (Unified Government)](https://scrapebench.dev/use-cases/kansas-city-ks-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/kansas-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:

> "Find Santos Painting's contractor licence with Kansas City, Kansas: licence number, address, phone and e-mail."

That is a lookup for the business name SANTOS PAINTING (run live 2026-11-06: one licence, 010506, with phone and e-mail). Keep maxResults small on a first call. Runs started this way bill exactly like any other run.

### Data & lawful use

This actor collects publicly available information that the Unified Government of Wyandotte County and Kansas City, Kansas (UG) publishes for public
lookup — licence records, business listings and the contact details professionals list there.
Some of it identifies individuals (sole proprietors, licence holders, agents), so treat any
names, phone numbers and emails in your results as personal data.

When you run this actor, you decide what is collected and what it is used for, so you are the
controller of that data and we act only as your processor (Apify Standard Actor Contract).
You need a lawful basis for your use, must honour opt-out and deletion requests, and must
follow the marketing rules that apply to you (CAN-SPAM, TCPA, GDPR, CCPA and similar).
Don't use the output for unsolicited bulk messaging, for screening covered by the FCRA, or
for anything the source's own terms forbid.

Your results are stored in your own Apify account. We don't keep a copy of your results and
don't sell or share them.

### Disclaimer

This is an independent tool. It is not affiliated with, endorsed by or sponsored by
the Unified Government of Wyandotte County and Kansas City, Kansas (UG). Names and marks are used only to describe the data source. Records are
provided as published by the source and may be out of date or incomplete. For anything
consequential (hiring, a permit, a legal decision), confirm the record with the issuing
agency. You are responsible for making sure your use complies with applicable law and the
source's terms.

### Need help?

Open an issue on this actor's **Issues** tab and we'll respond there. Bug reports, missing
fields and feature requests are all welcome. Guides and examples: [scrapebench.dev](https://scrapebench.dev).

If you are a person named in this data and want your record removed from our copy, email
apify-help@scrapebench.dev; the source agency remains the official record.

Your run may be used to improve our services. If something looks off, or you want this actor to fit your use better, please share your run data with us: [Apify Console → Settings → Security → Share run data with developers](https://console.apify.com/settings/security). It lets us see exactly what went wrong and keep improving the actor.

If this actor saved you time, a short review on its Store page helps other buyers find it.

# Actor input Schema

## `mode` (type: `string`):

export: no names, just filters; returns the whole matching list. lookup / verify: put company names (matched if contained in the company name) or licence numbers (exact) in 'queries'. auto picks the mode for you.

## `query` (type: `string`):

A business name (or listing number) to look up live. Kept alongside 'queries' for saved tasks.

## `queries` (type: `array`):

A business name (or listing number) to look up live. Several values in one run; combined with 'query'.

## `locality` (type: `string`):

Only listings in this locality. Kept alongside 'localities' for saved tasks.

## `localities` (type: `array`):

Only listings in this locality. Several values in one run; combined with 'locality'.

## `expiry_status` (type: `string`):

Only listings in this expiry_status. Kept alongside 'expiry_statuses' for saved tasks.

## `expiry_statuses` (type: `array`):

Only listings in this expiry_status. Several values in one run; combined with 'expiry_status'.

## `categories` (type: `array`):

Only rows from this licence type (one or more). Available: Contractor.

## `licenseTypes` (type: `array`):

Same filter as 'Licence type', under the name every state licence actor takes; the two lists are combined.

## `expiresAfter` (type: `string`):

Only licences expiring on or after this date (YYYY-MM-DD). Licences with no published expiry are left out when set.

## `expiresBefore` (type: `string`):

Only licences expiring on or before this date (YYYY-MM-DD): renewals coming due.

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

Per query in lookup mode; per run in export mode.

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

Used only for live lookups; exports read the stored snapshot.

## Actor input object example

```json
{
  "mode": "auto",
  "queries": [],
  "localities": [],
  "expiry_statuses": [],
  "categories": [],
  "licenseTypes": [],
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per business listing; notices are free.

# 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/kansas-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/kansas-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/kansas-contractor-license-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapebench/kansas-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/RDd6XRJTjVHwKQUK0/builds/vOwIwmdm0w9aLOtPb/openapi.json
