Arizona ROC License Scraper — Contractors
Pricing
from $107.50 / 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 $107.50 / 1,000 license records
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Arizona ROC Contractor License Scraper
Free-plan limit: Apify free-plan users receive at most 5 delivered license records per run. Paid and agentic-payment runs may use the configured
maxResultslimit.
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 | "" | Optional custom proxy URL that overrides the Actor-managed DataImpulse residential proxy |
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
This Actor uses pay-per-event pricing. These are the current Apify Store event prices:
| Event | Price (USD) | When it is charged |
|---|---|---|
license-record | $0.003 | License Record — Charged once per license record scraped. |
apify-actor-start | $0.00005 | Actor Start — Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). — Charged once per run. |
Apify platform usage for this Actor run is included alongside the event prices above; no separate per-run platform-usage fee is passed to users.
This covers Apify platform usage for this Actor run. Other Apify products or usage outside this Actor run may still follow your account plan.
Technical notes
- Residential proxy: The AZ ROC portal is a Salesforce Experience Cloud (LWC/Aura) site with bot protection that can challenge datacenter IP pools. The Actor-managed route uses US-targeted DataImpulse residential proxy. For a different provider, supply its proxy URL through
customProxyUrl. - 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