# Arizona ROC Contractor License Scraper (`maximedupre/arizona-roc`) Actor

Search public Arizona ROC contractor licenses by license number, business name, qualifying party, or city. Get contact, classification, bond, and complaint data when available.

- **URL**: https://apify.com/maximedupre/arizona-roc.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.70 / 1,000 licenses

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

### 🔎 Find public Arizona contractor license data

Built for compliance teams, sales teams, and contractor researchers, **Arizona ROC Contractor License Scraper** searches live public Arizona Registrar of Contractors records. Get license names, standing, type, classifications, contact details, and full-record data when AZ ROC shows it.

- **[ROC Lookup](https://apify.com/maximedupre/arizona-roc/examples/roc-lookup)** — look up a contractor by an exact license number.
- **[AZ ROC License Search](https://apify.com/maximedupre/arizona-roc/examples/az-roc-license-search)** — search public licenses by number, business, person, or city.
- **[Arizona Contractor License](https://apify.com/maximedupre/arizona-roc/examples/arizona-contractor-license)** — review a contractor's standing, type, contact details, and public profile.
- **[General Contractor License AZ](https://apify.com/maximedupre/arizona-roc/examples/general-contractor-license-az)** — find general contractor licenses by city or business name.
- **[AZ ROC License Classifications](https://apify.com/maximedupre/arizona-roc/examples/az-roc-license-classifications)** — find licenses by classification name or code.
- **[ROC License Search by Name](https://apify.com/maximedupre/arizona-roc/examples/roc-license-search-by-name)** — search legal names, DBA names, or qualifying-party names.

#### 📋 What data is returned?

Each dataset row is one contractor license. It can include:

- `licenseNumber`, `legalBusinessName`, `dbaName`, and `qualifyingPartyName`
- `standing`, `licenseType`, and `classifications`
- `businessAddress`, `phone`, and `profileUrl`
- Full-record fields such as `entityType`, dates, `mailingAddress`, and `personnel`
- `bonds` with public company, number, type, amount, standing, and dates
- `complaintHistory` with public case counts and case details

Some values are `null` or empty when AZ ROC does not list them. Without full records, detail fields may be empty. If one license appears in more than one search value, the first eligible match is saved and later matches are ignored.

#### 🚀 How to run the Actor

1. Choose a `target`: license number, business name, qualifying party, or Arizona city.
2. Add one or more values for that Target.
3. Add optional standing, license type, or classification filters.
4. Turn on `includeFullRecord` if you need bonds, personnel, dates, or complaint history.
5. Run the Actor and open the default dataset.

The Actor reads live public data at run time. You do not need AZ ROC login details. Full records take longer because each public license page must be opened.

#### 🎛️ Input

Only the list for the chosen `target` is used. Other Target lists are ignored.

| Field | Use |
| --- | --- |
| `target` | Required search field: `license-number`, `business-name`, `qualifying-party`, or `city`. |
| `licenseNumbers` | One or more exact license numbers. |
| `businessNames` | One or more legal or DBA business names. |
| `qualifyingPartyNames` | One or more qualifying-party names. |
| `cities` | One or more Arizona city names. |
| `standings` | Optional current standing labels. Empty keeps all standings. |
| `licenseTypes` | Optional `residential`, `commercial`, or `dual` filters. |
| `classifications` | Optional classification names or codes. |
| `includeFullRecord` | Opens each license page for more public details. |

```json
{
  "target": "city",
  "cities": ["Phoenix"],
  "standings": ["Active"],
  "licenseTypes": ["commercial"],
  "classifications": ["B-1"],
  "includeFullRecord": true
}
````

#### 📤 Output

Results are saved in the default Apify dataset. You can view them as a table or export them in supported dataset formats.

```json
{
  "licenseNumber": "123456",
  "legalBusinessName": "Desert Sun Builders LLC",
  "dbaName": "Desert Sun Construction",
  "qualifyingPartyName": "Jamie Smith",
  "standing": "Active",
  "licenseType": "commercial",
  "classifications": [{"code": "B-1", "name": "General Commercial Contractor"}],
  "businessAddress": {"street": "1700 W Washington St", "city": "Phoenix", "state": "AZ", "postalCode": "85007"},
  "phone": "+1 602-555-0123",
  "profileUrl": "https://roc.az.gov/contractor-search",
  "entityType": "Limited Liability Company",
  "issueDate": "2018-04-12",
  "renewalDate": "2026-04-30",
  "expirationDate": "2027-04-30",
  "mailingAddress": {"street": "PO Box 123", "city": "Phoenix", "state": "AZ", "postalCode": "85001"},
  "personnel": [{"name": "Jamie Smith", "role": "Member"}],
  "bonds": [],
  "complaintHistory": null
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. You are charged for each contractor license that is successfully saved to the dataset. Searches with no saved licenses do not create a license charge. Check the Actor pricing tab for the current event price.

#### 🔌 Integrations

Use Apify datasets, API, schedules, webhooks, and platform integrations to send saved license data into your workflow.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I search several fields in one run?

No. One run uses one Target. Run separate searches when you need different fields.

##### Why are some full-record fields empty?

AZ ROC may not publish every field for every license. You must also turn on `includeFullRecord` to collect the detail-page fields.

##### Does this include old complaint history?

It returns only the complaint and discipline data shown on the current public AZ ROC record. It does not add older history from other sources.

##### Does it find contractor email addresses?

No. It returns public fields in the AZ ROC record and does not enrich email addresses.

##### Does it return only new licenses on later runs?

No. Duplicate license numbers are removed within one run. The Actor does not track changes or keep an only-new feed across runs.

### 📝 Changelog

- 0.0: Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~arizona-roc/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [FCC License Search](https://apify.com/maximedupre/fcc-license-search-scraper) — search public U.S. radio licenses, holders, locations, and activity.
- [GLEIF LEI Lookup](https://apify.com/maximedupre/gleif-lei-lookup) — look up public legal entity and registration data for company checks.
- [Business Address Scraper](https://apify.com/maximedupre/business-address-scraper) — find source-backed business addresses on company websites.
- [Google Maps Phone Number Scraper](https://apify.com/maximedupre/google-maps-phone-number-scraper) — collect public business phone and listing details for local research.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose the Arizona ROC search field. Options for other Targets are ignored.

## `licenseNumbers` (type: `array`):

Enter one or more exact Arizona ROC license numbers. Used only for the License number Target.

## `businessNames` (type: `array`):

Enter one or more business names. Used only for the Business name Target.

## `qualifyingPartyNames` (type: `array`):

Enter one or more qualifying-party names. Used only for the Qualifying party Target.

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

Enter one or more Arizona city names. Used only for the Arizona city Target.

## `standings` (type: `array`):

Keep licenses with any of these current AZ ROC standing labels. Leave this empty to keep all standings.

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

Keep licenses with any chosen license type. Leave this empty to keep all types.

## `classifications` (type: `array`):

Keep licenses with any of these AZ ROC classification names or codes. Leave this empty to keep all classifications.

## `includeFullRecord` (type: `boolean`):

Get slower full records with entity type, dates, all classifications, mailing address, personnel, and bond details. Public complaint and discipline data is included when AZ ROC shows it.

## `__concurrency` (type: `integer`):

Internal optimization concurrency.

## `__isDebug` (type: `boolean`):

Internal debug logs and resource telemetry.

## Actor input object example

```json
{
  "target": "license-number",
  "licenseNumbers": [
    "335252"
  ],
  "includeFullRecord": false
}
```

# Actor output Schema

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

Open license names, standing, contact details, classifications, and full public record details when requested.

# 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 = {
    "target": "license-number",
    "licenseNumbers": [
        "335252"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/arizona-roc").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 = {
    "target": "license-number",
    "licenseNumbers": ["335252"],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/arizona-roc").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "target": "license-number",
  "licenseNumbers": [
    "335252"
  ]
}' |
apify call maximedupre/arizona-roc --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/arizona-roc",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Arizona ROC Contractor License Scraper",
        "description": "Search public Arizona ROC contractor licenses by license number, business name, qualifying party, or city. Get contact, classification, bond, and complaint data when available.",
        "version": "0.0",
        "x-build-id": "lzOYd76RIRrhysirR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~arizona-roc/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-arizona-roc",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/maximedupre~arizona-roc/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-arizona-roc",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/maximedupre~arizona-roc/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-arizona-roc",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "target"
                ],
                "properties": {
                    "target": {
                        "title": "Target",
                        "enum": [
                            "license-number",
                            "business-name",
                            "qualifying-party",
                            "city"
                        ],
                        "type": "string",
                        "description": "Choose the Arizona ROC search field. Options for other Targets are ignored.",
                        "default": "license-number"
                    },
                    "licenseNumbers": {
                        "title": "License numbers",
                        "minItems": 1,
                        "type": "array",
                        "description": "Enter one or more exact Arizona ROC license numbers. Used only for the License number Target.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        },
                        "default": [
                            "335252"
                        ]
                    },
                    "businessNames": {
                        "title": "Business names",
                        "minItems": 1,
                        "type": "array",
                        "description": "Enter one or more business names. Used only for the Business name Target.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "qualifyingPartyNames": {
                        "title": "Qualifying party names",
                        "minItems": 1,
                        "type": "array",
                        "description": "Enter one or more qualifying-party names. Used only for the Qualifying party Target.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "cities": {
                        "title": "Arizona cities",
                        "minItems": 1,
                        "type": "array",
                        "description": "Enter one or more Arizona city names. Used only for the Arizona city Target.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "standings": {
                        "title": "License standings",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Keep licenses with any of these current AZ ROC standing labels. Leave this empty to keep all standings.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "licenseTypes": {
                        "title": "License types",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Keep licenses with any chosen license type. Leave this empty to keep all types.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "residential",
                                "commercial",
                                "dual"
                            ],
                            "enumTitles": [
                                "Residential",
                                "Commercial",
                                "Dual"
                            ]
                        }
                    },
                    "classifications": {
                        "title": "Contractor classifications",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Keep licenses with any of these AZ ROC classification names or codes. Leave this empty to keep all classifications.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "includeFullRecord": {
                        "title": "Get full records",
                        "type": "boolean",
                        "description": "Get slower full records with entity type, dates, all classifications, mailing address, personnel, and bond details. Public complaint and discipline data is included when AZ ROC shows it.",
                        "default": false
                    },
                    "__concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Internal optimization concurrency."
                    },
                    "__isDebug": {
                        "title": "Debug mode",
                        "type": "boolean",
                        "description": "Internal debug logs and resource telemetry."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
