# Washington Contractor Licenses (L\&I) with Bond & Insurance (`jserle/wa-contractor-license-registry`) Actor

Washington State contractor licences from the official L\&I registry: business name, licence, address, phone, UBI, specialty and status. Find newly licensed contractors or current insurance-policy and dated surety-bond renewals. Optional principals, bond, insurance and signer joins.

- **URL**: https://apify.com/jserle/wa-contractor-license-registry.md
- **Developed by:** [JS Tech Solutions](https://apify.com/jserle) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 contractor licence records

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Washington Contractor Licenses: L\&I Registry with Principals, Bond & Insurance

Pulls the Washington State contractor licence registry published by the Department of Labor & Industries (L\&I) on data.wa.gov into clean JSON records: business name, licence number and type, mailing address, phone, UBI, business type, specialties, effective and expiration dates, status and suspend date, primary principal. Optionally joins the four L\&I addenda on licence number, so every record can also carry its **principals** (owners), **bond** (surety firm, amount, expiration, cancellation, impairment), **insurance** (carrier, policy, amount, expiration, agency) and **authorized signers**.

This is the same registry behind L\&I's "Verify a contractor" lookup, read from the state's open-data API rather than scraped from the website, so it does not break when the site changes and it returns thousands of licences per run instead of one lookup at a time. Filter by effective or expiration date, status, city, ZIP, state, licence type, specialty, business name, licence number or UBI.

### Who uses this data

- **Building-material, equipment and tool suppliers** opening accounts with newly licensed contractors the week they get licensed (the default run), by city, ZIP or specialty.
- **Surety and insurance agents** working renewal leads: licences expiring next quarter, bonds with a cancellation on file, policies expiring, all with the contractor's phone and principal name.
- **Subcontractor marketplaces, GCs and construction lead-gen** building or refreshing a vetted contractor list, filtered to Active, by trade (electrical, plumbing, roofing, HVAC, concrete) and territory.
- **Lenders, property managers and homeowners' platforms** checking that a contractor is currently Active, bonded and insured before engagement.
- **Researchers and journalists** tracking contractor formation, churn, suspensions and out-of-state entrants.

### What you get

One dataset item per licence, most recently effective first. A real item from `{"join": ["principals", "bond", "insurance"], "maxResults": 3}`, run 2026-08-23, untouched except that `bonds` and `insurancePolicies` (the full arrays) are elided for length; each contains the same object shown under `currentBond` and `currentInsurance`:

```json
{
  "licenseNumber": "AARDVGC741N1",
  "businessName": "AARDVARK GUTTER CLEANING",
  "licenseType": "CC",
  "licenseTypeDescription": "CONSTRUCTION CONTRACTOR",
  "statusCode": "A",
  "status": "ACTIVE",
  "suspendDate": null,
  "licenseEffectiveDate": "2026-08-21",
  "licenseExpirationDate": "2028-08-21",
  "daysUntilExpiration": 729,
  "address1": "PO Box 8025",
  "address2": null,
  "city": "MOSCOW",
  "state": "ID",
  "zip": "83843",
  "zip5": "83843",
  "phone": "208-596-2905",
  "businessType": "I",
  "businessTypeDescription": "Individual",
  "specialtyCode1": "01",
  "specialtyDescription1": "GENERAL",
  "specialtyCode2": null,
  "specialtyDescription2": null,
  "ubi": "603396918",
  "primaryPrincipalName": "Wilder, David Olley",
  "principals": [
    { "name": "Wilder, David Olley", "startDate": "2026-08-21", "endDate": null }
  ],
  "currentBond": {
    "firm": "Nationwide Mutual Ins Co",
    "accountId": "7901345789",
    "amount": 30000,
    "receivedByLniDate": "2026-08-21",
    "effectiveDate": "2026-08-21",
    "expirationDate": null,
    "untilCanceled": true,
    "cancelDate": null,
    "impaired": false,
    "impairedDate": null
  },
  "currentInsurance": {
    "company": "Scottsdale Ins Co",
    "policyNumber": "CPS8458126",
    "amount": 1000000,
    "effectiveDate": "2026-07-01",
    "expirationDate": "2027-07-01",
    "cancelDate": null,
    "agencyName": null,
    "lastUpdatedDate": "2026-08-21"
  },
  "sourceDataset": "m8qx-ubtq",
  "sourceDatasetTitle": "L&I Contractor License Data - General",
  "source": "https://data.wa.gov/resource/m8qx-ubtq.json",
  "datasetPage": "https://data.wa.gov/d/m8qx-ubtq",
  "attribution": "Washington State Department of Labor & Industries",
  "sourcePublishedAt": "2026-08-23T14:34:25.000Z",
  "fetchedAt": "2026-08-23T16:37:41.038Z"
}
```

Join fields appear only when that join is requested, so an un-joined run has a flat, stable column set. With `bond` joined, `bonds` is every bond L\&I has on file for the licence (history included) and `currentBond` is the one in force on the run date: no cancellation dated on or before that day, not past its expiration, most recently effective, or `null` if none. `insurancePolicies` and `currentInsurance` work the same way. `principals` carries owners with start and end dates; `authorizedSigners` carries the people named to sign permits or affidavits, with their role.

L\&I publishes bond expiration as text: a date, or the literal "Until Canceled". That is delivered as an ISO `expirationDate` plus an `untilCanceled` flag. All other dates are ISO 8601 calendar dates. `daysUntilExpiration` is counted from the run date and goes negative for expired licences. `phone` is formatted `208-596-2905` when L\&I published ten digits. `zip5` is the five-digit ZIP; `zip` is as published (sometimes nine digits). Text fields are delivered as L\&I published them, so `city` can read `SEATTLE` on one licence and `Seattle` on another; the `city`, `state`, `specialty` and `businessName` filters are case-insensitive. Records are deduplicated on licence number, which L\&I's own dataset notes call the unique identifier.

### Input

Everything is optional. Run it with no input and you get the 100 most recently effective **Active** licences from the **last 30 days**: the new-contractor feed.

| Field | Type | Default | Notes |
| --- | --- | --- | --- |
| `effectiveWithinDays` | integer | `30` | Licences effective in the last N days. `0` disables the window and searches the whole registry. Ignored when an effective-date range, a licence number or a UBI is given. |
| `effectiveDateFrom` / `effectiveDateTo` | ISO date | - | Explicit effective-date range; replaces the N-day window. |
| `expirationDateFrom` / `expirationDateTo` | ISO date | - | Licences expiring in this range. Renewal leads. |
| `status` | enum | `active` | `active`, `expired`, `suspended`, `outOfBusiness`, `inactive`, `reLicensed`, or `any`. |
| `licenseType` | enum | `any` | `CC` construction, `EC` electrical, `PC` plumbing, `LC` elevator. |
| `specialty` | string | - | An L\&I specialty code (`01` GENERAL, `CB` PAINTING/WALLCOVERING, `CD` ROOFING, `BI` CONCRETE, `BW` LANDSCAPING, `SM` HVAC/R, `SK` floor covering, `HM` HANDYMAN) or a word from the description (`ROOFING`). Matches either specialty slot. `%` and `_` are rejected. |
| `city` | string | - | Case-insensitive exact match on the address city, e.g. `Seattle`, `Spokane`, `Vancouver`, `Tacoma`. The registry has no county column. |
| `zip` | string | - | ZIP prefix: `981` for Seattle-area ZIPs, `98101` for one ZIP. |
| `state` | string | - | Two-letter state of the mailing address. The registry includes out-of-state contractors licensed in Washington (3,090 Active in OR, 1,156 in ID on 2026-08-23). |
| `businessName` | string | - | Case-insensitive substring on the business name. `%` and `_` are rejected. |
| `licenseNumber` | string | - | One licence exactly, e.g. `04CONCL862CR`. Disables the N-day window. |
| `ubi` | string | - | Nine-digit Washington UBI. A UBI can carry several licences. Disables the N-day window. |
| `join` | array | `[]` | Any of `principals`, `bond`, `insurance`, `signers`. Each join adds two health-check requests on its source plus at least one request per 100 licences. Joined rows ride inside the licence record and are not charged separately. |
| `maxResults` | integer | `100` | 1 to 50000. This is your cost cap: you pay per delivered record. |
| `includeRaw` | boolean | `false` | Attach a `raw` object with the untouched data.wa.gov rows under their L\&I column names. |

Every filter is evaluated by data.wa.gov, not after download, so a narrow run is fast and cheap.

#### Example inputs

**New contractors this week, with owner and bond, for account opening** (supplier):

```json
{
  "effectiveWithinDays": 7,
  "join": ["principals", "bond"],
  "maxResults": 500
}
```

**Active licences expiring in the next quarter, with current bond and insurance** (surety or insurance agent; 5,234 Active licences expire between 2026-09-22 and 2026-12-21 as of 2026-08-23):

```json
{
  "effectiveWithinDays": 0,
  "expirationDateFrom": "2026-09-22",
  "expirationDateTo": "2026-12-21",
  "join": ["bond", "insurance"],
  "maxResults": 6000
}
```

**Every active roofing contractor in the Seattle ZIPs** (marketplace or GC):

```json
{
  "effectiveWithinDays": 0,
  "specialty": "ROOFING",
  "zip": "981",
  "maxResults": 1000
}
```

**One contractor, full file** (pre-engagement check):

```json
{
  "licenseNumber": "04CONCL862CR",
  "status": "any",
  "join": ["principals", "bond", "insurance", "signers"],
  "includeRaw": true
}
```

### Pricing

**$0.003 per record; you pay only for records delivered.** One charge per dataset item, nothing else. Joined principals, bonds, policies and signers are part of the record, not extra items. Set `maxResults` and you have set your bill: 100 records is $0.30, and a run delivers up to 50,000 records (about $150 at list price); to retrieve more than that, for example all 56,306 Active licences, split the job by date range or ZIP prefix across runs. A search that matches nothing is free.

### Data source, refresh and licence

Records come from five Socrata (SODA) datasets published by the **Washington State Department of Labor & Industries** on data.wa.gov. Row counts read live on 2026-08-23:

| Dataset | ID | Rows | Used for |
| --- | --- | --- | --- |
| [L\&I Contractor License Data - General](https://data.wa.gov/d/m8qx-ubtq) | `m8qx-ubtq` | 120,000 licences (56,306 Active) | every record |
| [L\&I Contractor License - Principal Data](https://data.wa.gov/d/4xk5-x9j6) | `4xk5-x9j6` | 250,811 rows across 146,654 licences | `join: principals` |
| [L\&I Contractor License Data - Bond](https://data.wa.gov/d/bzff-4fmt) | `bzff-4fmt` | 176,491 rows across 82,416 licences | `join: bond` |
| [L\&I Contractor License Data - Insurance](https://data.wa.gov/d/ciwg-agsx) | `ciwg-agsx` | 76,779 rows across 70,720 licences | `join: insurance` |
| [L\&I Contractor Authorized Signer Data](https://data.wa.gov/d/s7ge-wicw) | `s7ge-wicw` | 10,428 rows across 8,310 licences | `join: signers` |

**Refresh:** the General dataset's own notes say "L\&I Contractor Contractor Data is updated thee times per day: 7:30 a.m., 12:15 p.m., 5:15 p.m." (typos in the original); the Insurance dataset carries the same three-times-daily note, and the Principal and Signer datasets state a daily 7:30 a.m. posting. All five datasets showed a `rowsUpdatedAt` of 2026-08-23 when read that day. Every record carries `sourcePublishedAt`, the General dataset's own publication timestamp, so you can see how fresh the copy you were served is. 665 Active licences had an effective date in the 30 days to 2026-08-23, and the newest effective date was 2026-08-21.

**Licence:** the General and Principal datasets carry the licence **"Open Data Commons Public Domain Dedication and License"** (`PDDL`, [terms](http://opendatacommons.org/licenses/pddl/1.0/)) in their own Socrata metadata; the Insurance and Signer datasets carry **"Public Domain"**; the Bond dataset's metadata carries no licence field (all read 2026-08-23). All five state the attribution "Labor & Industries" and link to L\&I's public Verify a Contractor service as their source.

This Actor is **not affiliated with or endorsed by the Washington State Department of Labor & Industries**. Attribution on every record: "Washington State Department of Labor & Industries".

The Actor reads the public SODA endpoints with a descriptive User-Agent (`jserle-apify-actor/wa-contractor-license-registry`), sends requests one at a time with the 1-second `Crawl-delay` from the host's robots.txt (which does not disallow `/resource/*`), uses no app token, and caches nothing between runs. A default run makes four requests; each join adds two health-check requests (an unfiltered count and a five-row sample that must carry every column the normalizer reads) plus at least one request per 100 licences; a run that spans more than one page of 1,000 licences adds one recount request at the end.

### Limitations

- **The General dataset holds exactly 120,000 rows**, a round figure, and its notes say a UBI may carry multiple records. Whether L\&I caps the export is not stated in the metadata; the dataset spans effective dates from 1935 to 2026-08-21 and every status, so it is not a recent-only slice.
- **No county.** L\&I publishes city, state and ZIP. Use `zip` prefixes or a list of cities for a territory.
- **Joins are a snapshot of what L\&I has on file.** Every requested join source is checked before use (row count above a floor, required columns present on an unfiltered sample), so an emptied or renamed addendum fails the run rather than delivering licences with empty joins; a licence with genuinely no bond or policy on file gets an empty array. A new licence normally has its principal, bond and insurance rows within the same day: of the 25 newest Active licences on 2026-08-23, 25 had principal rows, 25 had a bond row and 24 had an insurance row. Signer rows exist for only 8,310 licences, and 65% of signer rows carry no signer name; nameless rows are skipped, so `authorizedSigners` is empty for most licences.
- **Bond and insurance history is included**, not just the current instrument. `currentBond` and `currentInsurance` pick the one in force on the run date; use the arrays for cancellations, impairments and lapses.
- **Phone and principal are as registered with L\&I.** 53 of 120,000 licences have no phone and 286 have no primary principal; those fields are `null`.
- **A filter that matches nothing returns zero records and succeeds.** That is a valid, free answer. The run only fails when the source itself is broken, and then it exits non-zero having pushed nothing and charged nothing: when a dataset (the registry or any requested join) stops publishing a column the normalizer reads or reports an implausibly small row count, when the registry returns no rows to the default query, returns fewer rows than data.wa.gov's own count for the same filter, shifts under a multi-page walk (the same licence on two pages, or a different count after paging than before; L\&I rewrites the dataset three times a day, so re-run), or when a monetized run cannot read its charge allowance. Individual malformed rows are skipped and counted in the run summary rather than delivered.

### FAQ

#### How do I do a Washington contractor license lookup in bulk?

Set `effectiveWithinDays: 0`, `status: "any"` and whatever narrows it (city, ZIP, specialty, name), or pass `licenseNumber` or `ubi` for one contractor. Every record carries the L\&I licence number, UBI, status, effective and expiration dates.

#### Can I check whether a Washington contractor is bonded and insured?

Yes. Add `join: ["bond", "insurance"]`. `currentBond` and `currentInsurance` are the instruments in force on the run date, with firm, amount and expiration; `bonds` and `insurancePolicies` carry the history including cancellations and impaired bonds.

#### How do I get a list of newly licensed contractors in Washington?

That is the default run: Active licences effective in the last 30 days, newest first. Set `effectiveWithinDays: 7` and schedule the Actor weekly for a rolling new-contractor feed.

#### Can I find contractors whose licence or bond is about to expire?

Use `expirationDateFrom` and `expirationDateTo` with `effectiveWithinDays: 0` for licence renewals, and `join: ["bond", "insurance"]` to read `currentBond.expirationDate` and `currentInsurance.expirationDate` on the same records.

#### Does it cover electricians and plumbers as well as general contractors?

Yes. The registry holds construction (CC), electrical (EC), plumbing (PC) and elevator (LC) contractor licences; filter with `licenseType`.

#### Who are the owners of a Washington contractor?

`join: ["principals"]` attaches every principal L\&I has on file with start and end dates; `primaryPrincipalName` is on every record without a join.

### Related datasets

Other datasets by the same author, all pay-per-record with source, refresh cadence and licence stated on each listing:

**Public procurement and RFP feeds**

- [E-Rate Form 470 RFP Scraper (USAC School & Library Bids)](https://apify.com/jserle/erate-form-470-rfp-feed)
- [NYC PASSPort Procurement Scraper (RFPs, Bids & Contracts)](https://apify.com/jserle/nyc-passport-procurement)

**Nursing home and long-term care data**

- [New York Nursing Home Bed Availability (NYSDOH) Scraper](https://apify.com/jserle/ny-nursing-home-bed-census)
- [Nursing Home Deficiency Citations (CMS) Scraper](https://apify.com/jserle/nursing-home-deficiency-citations)
- [Nursing Home Fines & Civil Money Penalties (CMS) Scraper](https://apify.com/jserle/nursing-home-penalties-fines)
- [Nursing Home Directory & Ownership (CMS Form 671) Scraper](https://apify.com/jserle/ltc-facility-characteristics)
- [Nursing Home Daily Nurse Staffing (CMS PBJ) Scraper](https://apify.com/jserle/cms-nursing-home-staffing-daily)
- [Nursing Home Change of Ownership (CMS SNF CHOW) Scraper](https://apify.com/jserle/snf-change-of-ownership-tracker)

**Medicare provider enrollment data**

- [Medicare Revoked Providers List (CMS Revocations) Scraper](https://apify.com/jserle/medicare-revoked-providers)
- [Medicare Opt-Out Providers List (CMS Affidavits) Scraper](https://apify.com/jserle/medicare-opt-out-physicians)
- [Medicare Revalidation Due Date List (CMS) Scraper](https://apify.com/jserle/medicare-revalidation-due-leads)

**Developer and AI test data**

- [Synthetic Invoice OCR Ground Truth Dataset Generator](https://apify.com/jserle/ocr-ground-truth-document-factory)

# Actor input Schema

## `effectiveWithinDays` (type: `integer`):

Keep licences whose effective date falls within the last N days. The normal default is 30. Insurance-policy or bond-renewal searches automatically disable this window unless you explicitly provide a value. Ignored when an explicit effective-date range is given.

## `effectiveDateFrom` (type: `string`):

ISO date, for example 2026-01-01. Keeps licences effective on or after this date. Overrides the N-day window.

## `effectiveDateTo` (type: `string`):

ISO date, for example 2026-06-30. Keeps licences effective on or before this date. Overrides the N-day window.

## `expirationDateFrom` (type: `string`):

ISO date. Keeps licences that expire on or after this date. Combine with Expiration date to for renewal leads, e.g. every active licence expiring next quarter.

## `expirationDateTo` (type: `string`):

ISO date. Keeps licences that expire on or before this date.

## `insuranceExpirationFrom` (type: `string`):

Inclusive start of a current insurance-policy expiration window. Searches the actual insurance addendum first, automatically includes the complete insurance join and removes the implicit new-license window. Canceled, expired and future-effective policies do not match.

## `insuranceExpirationTo` (type: `string`):

Inclusive end of a current insurance-policy expiration window. Both one-sided and two-sided policy windows are supported. Records without a current, dated policy do not match.

## `bondExpirationFrom` (type: `string`):

Inclusive start of a current surety-bond expiration window. Must be paired with Bond expires on or before; maximum window is 366 days. Automatically includes the complete bond join. Until Canceled bonds have no dated renewal and never match.

## `bondExpirationTo` (type: `string`):

Inclusive end of the surety-bond expiration window. Must be paired with Bond expires on or after. The source stores US dates as text, so exact padded and unpadded dates are searched without unsafe date casts.

## `status` (type: `string`):

L\&I status of the licence. Default Active. Choose Any to include expired, suspended and out-of-business licences.

## `licenseType` (type: `string`):

L\&I licence type: construction (CC), electrical (EC), plumbing (PC) or elevator (LC) contractor.

## `specialty` (type: `string`):

An L\&I specialty code (for example 01 for GENERAL, CB for PAINTING/WALLCOVERING, 03 for PUMP & IRRIGATION) or a word from the specialty description (for example ROOFING). Matched against both specialty slots on the licence.

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

Case-insensitive exact match on the licence address city, for example Seattle or Spokane. The registry publishes city, state and zip but no county.

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

Keeps licences whose ZIP starts with this, so 981 covers Seattle-area ZIPs and 98101 is one ZIP.

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

Two-letter state of the licence mailing address. Most licences are WA, but out-of-state contractors licensed in Washington are included in the registry. Leave blank for all.

## `businessName` (type: `string`):

Case-insensitive substring matched against the business name.

## `licenseNumber` (type: `string`):

Look up one licence exactly, for example 04CONCL862CR. Overrides the N-day window.

## `ubi` (type: `string`):

Washington Unified Business Identifier, nine digits. A UBI can carry more than one licence. Overrides the N-day window.

## `join` (type: `array`):

Each selected join adds one extra request per 100 licences and attaches an array to every record: principals (owners with start and end dates), bond (surety firm, amount, effective and expiration dates, cancellation, impairment), insurance (carrier, policy, amount, expiration, agency), signers (people authorized to sign permits or affidavits). Joined rows are included in the record; they are not charged separately.

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

How many licences to deliver, most recently effective first. You are charged per delivered record, so this is also your cost cap.

## `includeRaw` (type: `boolean`):

Attach a `raw` object with the untouched data.wa.gov rows this record was built from (general plus any joined rows), under their L\&I column names.

## Actor input object example

```json
{
  "status": "active",
  "licenseType": "any",
  "join": [],
  "maxResults": 100,
  "includeRaw": false
}
```

# Actor output Schema

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

One item per Washington contractor licence delivered by this run, with the optional principals, bond, insurance and signer joins attached.

## `summary` (type: `string`):

Source row counts, filters applied, join hit counts, malformed rows skipped, delivered records, and whether the charge limit stopped the run.

# 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 = {
    "status": "active",
    "licenseType": "any",
    "join": [],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("jserle/wa-contractor-license-registry").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 = {
    "status": "active",
    "licenseType": "any",
    "join": [],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("jserle/wa-contractor-license-registry").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 '{
  "status": "active",
  "licenseType": "any",
  "join": [],
  "maxResults": 100
}' |
apify call jserle/wa-contractor-license-registry --silent --output-dataset

```

## MCP server setup

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

```

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/rBoXBNgHWh4eDJ0kQ/builds/opLDT1LSbW6FUbU94/openapi.json
