Arizona ROC License Scraper — Contractors
Pricing
from $3.00 / 1,000 license records
Arizona ROC License Scraper — Contractors
Scrape Arizona ROC contractor licenses, classifications, status, business details, qualifying parties, and public compliance records.
Pricing
from $3.00 / 1,000 license records
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Scrape the Arizona Registrar of Contractors (AZ ROC) public license database for full contractor license records. Search by license number, business name, qualifying party, or city — get status, classifications, bonds, complaints, personnel, and full contact details in structured JSON. Full pagination is supported across every results page. No login required.
Use cases
- Contractor verification — confirm a contractor is licensed and in good standing before hiring or paying a deposit
- Compliance monitoring — detect newly expired, suspended, or revoked licenses for vendor lists on recurring schedules
- Lead generation — build targeted lists of licensed Arizona contractors by city, classification, or active status
- Subcontractor sourcing — find qualified subcontractors by specialty classification (B-1, C-37, R-11, CR-39) and region
- Insurance underwriting — score contractors using complaint history, bond status, and surety coverage
- Due diligence — check complaint and disciplinary records before signing contracts
- Market research — analyze contractor density by city/classification, track new-license issuance trends
- Consumer protection — surface complaint counts and outcomes for homeowner pre-payment checks
Input
The actor supports four search modes. Use any one or combine multiple in a single run:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
licenseNumbers | array | no | [] | Direct license-number lookup (fastest). Example: ["333282", "123456"] |
companyNames | array | no | [] | Business names (partial match supported). Example: ["Desert HVAC", "Acme Plumbing"] |
qualifyingPartyNames | array | no | [] | Qualifying party names. Example: ["John Smith"] |
cities | array | no | [] | Arizona cities for region-based search. Example: ["Phoenix", "Tucson", "Scottsdale"] |
licenseType | select | no | "ALL" | ALL, RESIDENTIAL, COMMERCIAL, DUAL |
licenseStatus | select | no | "ALL" | ALL, ACTIVE, SUSPENDED, EXPIRED, REVOKED, CANCELLED |
licenseClassification | string | no | "" | Filter by AZ ROC classification code (e.g. "B-1", "C-37", "R-11", "CR-39") |
scrapeDetailPage | boolean | no | false | Open each detail page for bond, complaint, and personnel data (slower) |
scrapeComplaints | boolean | no | false | Include per-complaint records (requires scrapeDetailPage) |
maxResults | integer | no | 100 | Hard cap on records returned across all search jobs. 0 = unlimited |
resultsPerPage | select | no | "50" | 10, 20, or 50 (50 minimises pagination) |
maxConcurrency | integer | no | 3 | Parallel browser tabs. Keep ≤ 5 for residential proxies |
customProxyUrl | string | no | "" | Premium residential proxy URL for maximum reliability |
proxyConfiguration | object | no | residential | Apify proxy settings |
At least one search mode is required.
Example inputs
License number lookup:
{"licenseNumbers": ["333282", "123456"],"maxResults": 2}
Business name search:
{"companyNames": ["Desert HVAC"],"licenseStatus": "ACTIVE","maxResults": 50}
City lead generation with classification filter:
{"cities": ["Phoenix", "Tucson"],"licenseClassification": "C-37","licenseStatus": "ACTIVE","maxResults": 200}
Full enrichment with bonds and complaints:
{"companyNames": ["Desert HVAC"],"scrapeDetailPage": true,"scrapeComplaints": true,"maxResults": 25}
Output
Each record contains the full public record for one contractor license. When scrapeDetailPage is false (default), the fast list view populates license number, business name, qualifying party, classification, status, city, and phone. When true, bond details, complaint history, all classifications, and personnel are also collected.
| Field | Type | Description |
|---|---|---|
license_number | string | AZ ROC license number |
business_name | string | Legal business name |
dba_name | string|null | Doing-business-as name |
qualifying_party | string|null | Individual responsible for the license |
license_status | string | Active, Suspended, Expired, Revoked, or Cancelled |
license_type | string|null | Residential, Commercial, or Dual (inferred from classification) |
entity_type | string|null | CORPORATION, LLC, SOLE OWNER, etc. (detail only) |
primary_classification | string | Primary classification code |
classification_description | string|null | Primary classification description (detail only) |
classifications | array | All classifications [{code, description}] (detail only) |
city | string|null | Business address city |
state | string|null | Business address state |
zip | string|null | Business address ZIP (detail only) |
business_phone | string|null | Business phone, normalized (XXX) XXX-XXXX |
issued_date | string|null | Original license issue date (ISO 8601, detail only) |
renewed_through_date | string|null | License valid-through date (ISO 8601, detail only) |
bond_company | string|null | Surety company (detail only) |
bond_number | string|null | Bond identifier (detail only) |
bond_type | string|null | Bond type (detail only) |
bond_amount | string|null | Bond coverage amount (detail only) |
bond_status | string|null | Bond status (detail only) |
bond_effective_date | string|null | Bond effective date (ISO 8601, detail only) |
bond_expiration_date | string|null | Bond expiration date (ISO 8601, detail only) |
complaint_count | number | Total complaints shown (prior two years, detail only) |
open_cases | number|null | Open complaint cases (detail only) |
resolved_cases | number|null | Resolved complaint cases (detail only) |
disciplined_cases | number|null | Disciplined complaint cases (detail only) |
complaints | array|null | Per-complaint records [{date, type, status, summary}] (when scrapeComplaints enabled) |
personnel | array | Personnel [{name, position}] (detail only) |
profile_url | string | Direct AZ ROC profile link |
scraped_at | string | ISO 8601 timestamp |
source_url | string | Source page URL |
Pricing
| Event | Price |
|---|---|
| Actor Start | $0.00005 |
| License Record | $0.003 per record |
~$3.00 per 1,000 records. You only pay for records successfully scraped. Start with a small maxResults to test before scaling. Both PAY_PER_EVENT and usage-based (compute + proxy passthrough) monetization are enabled.
Technical notes
- Residential proxy recommended: The AZ ROC portal is a Salesforce Experience Cloud (LWC/Aura) site with bot protection that can challenge datacenter IP pools. The actor uses Apify residential proxy by default. For production bulk runs, provide a premium residential proxy via
customProxyUrl(Decodo/Bright Data/IPRoyal) for maximum reliability. - Salesforce LWC rendering: The portal uses Lightning Web Components which render asynchronously. The actor waits for network idle plus a buffer, and uses multi-selector fallbacks on every field to survive LWC DOM changes between releases.
- Pagination: Full Next-button pagination is supported. The actor stops after 3 consecutive scrolls with no new results or at a 5,000-record safety cap per search.
- Detail-page enrichment: By default the actor uses the fast list view (one page load per search + per-record list extraction). Enable
scrapeDetailPageto open each contractor's detail page for bond, complaint, and personnel data — roughly doubles runtime. - Classification codes: See the AZ ROC classification list for all specialty codes. License type is inferred from the classification prefix:
B-*→ Commercial,R-*→ Residential,C-*→ Commercial,CR-*→ Dual. - Deduplication: Records are deduplicated by license number within a single run.
Integration
Export scraped data, run the scraper via API, schedule and monitor runs, or integrate with other tools. The output dataset is compatible with:
- CSV/JSON/Excel export from Apify Console
- Zapier and Make webhooks
- Direct API access via Apify REST API
- CRM import (HubSpot, Salesforce) with field mapping
- AI agent tool calls via Apify MCP server — the actor exposes a single
license-recordevent with structured JSON output suitable for LLM consumption
What is Arizona ROC License Scraper?
Arizona ROC License Scraper turns the target data into structured, reusable results on Apify. Use it when you need repeatable collection for sales teams, agencies, recruiters, market researchers, and data-enrichment workflows without maintaining a custom scraper or one-off integration. Run it manually, schedule recurring jobs, call it through the Apify API, or connect it to an AI agent through the Apify MCP server.
The Actor stores results in an Apify dataset, where they can be previewed and exported as JSON, CSV, Excel, XML, or RSS. Availability and completeness depend on the source, supplied inputs, public visibility, authentication requirements, and upstream rate limits.
Use cases for Arizona ROC License Scraper
- Build structured datasets for research, reporting, enrichment, or monitoring.
- Automate repetitive collection with schedules, webhooks, and API calls.
- Feed clean records into spreadsheets, databases, CRMs, BI tools, AI agents, or RAG pipelines.
- Track changes over time by running the same validated input on a schedule.
- Replace fragile manual copy-and-paste work with a reproducible Apify workflow.
How to use Arizona ROC License Scraper
- Open the Actor input page and choose a focused, valid target.
- Set a conservative result limit for the first run.
- Start the Actor and inspect the dataset for coverage and field availability.
- Export the results or connect the dataset to your downstream system.
- Scale gradually and use scheduling, pagination, or proxies when supported.
Important input options
licenseNumbers— One or more AZ ROC license numbers to look up directly (e.g. '123456'). Fastest and most precise search method — direct single-record lookup, no pagination. Leading zeros are handled automatcompanyNames— Business names to search (e.g. 'Desert HVAC', 'Acme Plumbing'). Partial matches are supported by the AZ ROC portal. Each name triggers a separate search and may return multiple results acrosqualifyingPartyNames— Full name of the qualifying party (the individual responsible for the license). Format: 'First Last' (e.g. 'John Smith'). Partial names are accepted by the AZ ROC portal. Use this field whencities— Arizona city names to search by location (e.g. 'Phoenix', 'Tucson', 'Scottsdale', 'Mesa'). Each city triggers a separate search and may return thousands of records across many pages — all arlicenseType— Filter results by license type. 'ALL' returns all types. 'RESIDENTIAL' covers home construction/repair. 'COMMERCIAL' covers non-residential projects. 'DUAL' covers both. Applied as a client-licenseStatus— Filter by license status. 'ALL' returns every record regardless of standing. 'ACTIVE' returns only contractors currently authorized to work — the common choice for lead-generation and insuralicenseClassification— Optional classification code to filter results (e.g. 'B-1', 'R-11', 'C-37', 'CR-39'). Leave blank to include all classifications. Find all codes at https://roc.az.gov/license-classificationsscrapeDetailPage— When enabled, the scraper opens each contractor's detail page to collect complete information including bond details, all license classifications, complaint history, and qualifying party det
API and automation example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/az-roc-contractor-license-scraper').call({// Add the same input fields you use in the Apify Console.});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Related Apify Actors
Use these dedicated tools when a neighboring data source or workflow is a better match:
- Idealista Scraper — Extract Listings, Prices & Agency Contacts
- Realtor & Real Estate Agent Lead Scraper — Verified Emails
- Craigslist Scraper — Extract Listings, Prices & Locations
- Google Maps Restaurant Scraper
- Instagram Followers & Following Scraper — With Cookies
- Facebook Ads Library Scraper — Meta Ad Intelligence Tool
- Leads Finder Pro - B2B Leads with Emails [Apollo Alternative]
- Yellow Pages US Scraper — Business Leads & Reviews
- Justia Lawyer Directory Scraper — Attorney Leads
- Yellow Pages Australia Scraper — Business Leads & Reviews
Frequently asked questions
How many results can I scrape with Arizona ROC License Scraper?
The practical total depends on the source, input limits, pagination, available records, run timeout, and upstream restrictions. Start with a small run, verify the output, and increase the limit gradually.
Can I integrate Arizona ROC License Scraper with other apps?
Yes. Use Apify integrations, webhooks, schedules, dataset exports, Make, Zapier, Google Sheets, cloud storage, or your own application.
Can I use Arizona ROC License Scraper with the Apify API?
Yes. Start runs with the Apify REST API or an official Apify client, then retrieve records from the run's default dataset. Keep your API token in a secret or environment variable.
Can I use Arizona ROC License Scraper through an MCP Server?
Yes. The Apify MCP server can expose the Actor to compatible AI clients and agents. Review the input and expected cost before allowing an autonomous workflow to run it at scale.
Do I need proxies?
It depends on the source and volume. Use the default configuration first. For larger or geographically sensitive jobs, select an appropriate proxy configuration only when the Actor supports it.
Is it legal to scrape this data?
Scraping rules vary by source, jurisdiction, data type, and intended use. Collect only data you are authorized to access, respect applicable terms and privacy laws, and avoid restricted or personal data misuse. This documentation is not legal advice.
Your feedback
If a field is missing, a source layout has changed, or you need a supported use case documented, open an issue on the Actor page with a reproducible input and run ID.