AZ ROC Contractor License Scraper — Arizona Lookup
Pricing
from $107.50 / 1,000 license records
AZ ROC Contractor License Scraper — Arizona Lookup
Look up Arizona ROC contractor licenses by license number, business name, qualifying party or city: status, classification and phone. USD 0.134 a record.
Pricing
from $107.50 / 1,000 license records
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Features
Share
AZ ROC Contractor License Scraper looks up Arizona Registrar of Contractors (AZ ROC) license records by license number, business name, qualifying party or city, and returns the license number, business name, qualifying party, status, primary classification, city, ZIP, business phone and profile link. It is built for license verification, contractor prospecting and insurance or supplier sales in Arizona, and it costs USD 134.38 per 1,000 records on the FREE tier (USD 0.134377 per record, USD 107.50 per 1,000 on GOLD).
What does the AZ ROC scraper return?
Each dataset row is one license. The default fast mode reads the portal's results list:
| Field | What it contains |
|---|---|
license_number | ROC license number, for example 333282 |
business_name | Licensed business name |
qualifying_party | The person AZ ROC lists as qualifying party |
license_status | Status as shown by the portal, for example Active |
primary_classification | Classification code and name, for example CR-10 Drywall |
license_type | Residential, Commercial or Dual, inferred from the classification prefix (R residential, CR dual, B, C, K, L commercial) |
city, state, zip | Business location from the results list |
business_phone | Business phone, formatted like (602) 317-1895 |
profile_url, source_url, scraped_at | Portal links and collection time |
complaint_count | null in fast mode, because the results list does not show complaints; detail mode fills it |
Detail mode (scrapeDetailPage: true) opens each license's detail page and also fills dba_name, entity_type, classifications, classification_description, issued_date, renewed_through_date, the bond_* fields of the active bond (or the last bond listed), complaint_count (open + disciplined + resolved/settled cases), open_cases, resolved_cases, disciplined_cases, personnel and, with scrapeComplaints, the complaints list. The portal shows no bond expiration date, so bond_expiration_date stays null, and other fields the portal does not show are null or empty. The run saves OUTPUT with the record count, charged events and stop reason.
How do I do an AZ ROC contractor search by name or license number?
Fill one or more search modes. Each entry runs its own portal search, and duplicate license numbers are removed across all of them.
| Input | Example | Notes |
|---|---|---|
licenseNumbers | ["333282", "352664"] | Exact ROC license numbers; fastest and most precise |
companyNames | ["Desert HVAC"] | Partial business-name search |
qualifyingPartyNames | ["John Smith"] | Search by the qualifying party's name |
cities | ["Phoenix", "Tucson"] | All licenses with a business address in the city |
licenseStatus | ACTIVE | ALL, ACTIVE, SUSPENDED, EXPIRED, REVOKED or CANCELLED, applied to results |
licenseClassification | R-11 | Keeps codes that equal or start with this value |
licenseType | RESIDENTIAL | Chosen in the portal's form when the option is offered |
maxResults | 100 | Total records across all searches; 0 means no limit |
resultsPerPage | 50 | 10, 20 or 50 rows per portal page |
scrapeDetailPage, scrapeComplaints | false | Detail mode and per-complaint rows (see below) |
maxConcurrency | 3 | 1 to 20 browser tabs; keep it at 5 or lower |
Verify a list of licenses:
{"licenseNumbers": ["333282", "352664"],"maxResults": 2}
Can I get a list of licensed Arizona contractors by city?
Yes. Put one or more cities in cities, set licenseStatus to ACTIVE and add a classification if you want one trade. The Actor follows every results page until maxResults is reached.
{"cities": ["Scottsdale"],"licenseStatus": "ACTIVE","licenseClassification": "CR-39","maxResults": 250}
Set maxResults to 0 to collect every match. Each search then reads up to 200 portal pages, and the run stops at your maximum cost per run.
Does it include bonds and complaint history?
Only in detail mode, and only when the portal shows them. With scrapeDetailPage: true the Actor opens each result's license detail page and reads the bond, case counts, personnel, entity type and issue and renewal dates. scrapeComplaints: true adds the per-complaint lines the page lists, which the portal limits to the prior two years. These lines are read as text, and a license with listed complaints has not yet been tested. If a detail page fails after retries, the Actor saves the fast-mode row for that license and does not charge for it. Detail mode is much slower than fast mode.
When should I use it, and when not?
Use it when you need Arizona contractor license status, classification and phone in bulk: a nightly check of your subcontractors' licenses, a list of active roofing (CR-42) or HVAC (CR-39) contractors in Phoenix, or ROC numbers for a CRM.
Use another Actor when:
- Your market is another state: Oregon CCB Contractor License Scraper, TDLR License Scraper for Texas, California CSLB Scraper or Nevada Contractor License Lookup.
- You want contractors across several states in one dataset: Contractor License Leads.
- You need contractor emails and websites: Contractor Leads Scraper.
- You need a contractor's BBB rating: BBB Business Scraper.
How do I run it from code?
JavaScript with apify-client:
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({cities: ['Mesa'],licenseStatus: 'ACTIVE',maxResults: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) console.log(item.license_number, item.business_name, item.business_phone);
Python with apify-client:
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("muhammadafzal/az-roc-contractor-license-scraper").call(run_input={"licenseNumbers": ["333282"],"maxResults": 1,})for item in client.dataset(run.default_dataset_id).iterate_items():print(item["license_number"], item["license_status"], item["primary_classification"])
Use it from an AI assistant
AZ ROC Contractor License Scraper works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add the single-tool URL https://mcp.apify.com/?tools=muhammadafzal/az-roc-contractor-license-scraper to your client and ask, for example: "Check whether Arizona ROC licenses 333282 and 352664 are active and give me each holder's classification and phone." Each record is charged at the prices below, so include a result limit.
What does the output look like?
The record from a cloud run of the Console prefill input (license lookup, fast mode) on 2026-10-26, shortened:
{"license_number": "333282","business_name": "Grey Wolf Drywall LLC","dba_name": null,"qualifying_party": "Alfonso Lopez","license_status": "Active","license_type": "Dual","primary_classification": "CR-10 Drywall","classifications": [],"city": "Waddell","state": "AZ","zip": "85355","business_phone": "(602) 317-1895","bond_company": null,"complaint_count": null,"personnel": [],"profile_url": "https://azroc.my.site.com/AZRoc/s/contractor-search?licenseId=a0o8y0000004CQAAA2","scraped_at": "2026-10-26T07:29:54.231Z","source_url": "https://azroc.my.site.com/AZRoc/s/contractor-search"}
How much does an AZ ROC lookup cost?
The Actor uses pay-per-event pricing, and platform usage is included in the event prices.
| Event | FREE | BRONZE | SILVER | GOLD | PLATINUM / DIAMOND |
|---|---|---|---|---|---|
| License record (one dataset row) | USD 0.134377 | USD 0.131017 | USD 0.127658 | USD 0.107501 | USD 0.107501 |
| Actor start (per started GB of allocated memory) | USD 0.006251 | USD 0.006094 | USD 0.005938 | USD 0.005 | USD 0.005 |
The default memory is 2 GB, so a run pays two start events. Worked totals on the FREE tier:
- 1 license lookup: USD 0.134377 + 2 × USD 0.006251 = USD 0.15
- 100 records: 100 × USD 0.134377 + 2 × USD 0.006251 = USD 13.45
Records removed by your status or classification filters are not charged. Set maxResults to cap the cost of city searches, which can match thousands of licenses.
Limits and reliability
- Speed: a one-license lookup took about 23 seconds in the 2026-10-26 cloud run. The portal is a browser application, so expect seconds per search and more for detail mode.
- Freshness: data is read live from the AZ ROC contractor search portal at run time.
- Errors: failed portal requests are retried up to three times; records already saved are kept.
FAQ
Is there a free AZ ROC lookup?
Yes. AZ ROC's own contractor search website is free for single lookups. This Actor is for bulk lookups, scheduled checks and exports, and it charges per record.
What is an AZ ROC number?
It is the license number AZ ROC issues to a contractor, shown on bids and vehicles. Pass it in licenseNumbers to check that license.
Does it return expired or revoked licenses?
Yes, when the portal lists them. Leave licenseStatus at ALL, or pick EXPIRED, REVOKED, SUSPENDED or CANCELLED.
Why is complaint_count empty?
Fast mode leaves it null because the results list does not show complaints. Use detail mode for complaint counts, and confirm complaint history on the AZ ROC website before decisions.
How is the license type decided?
It is inferred from the classification prefix, for example CR-10 is Dual and R-11 is Residential. It is not read from a separate portal field.
Can I look up hundreds of license numbers at once?
Yes. Put them all in licenseNumbers and set maxResults at least as high as the list length.
Related Actors
- Oregon CCB Contractor License Scraper and TDLR License Scraper: other state license records
- BBB Business Scraper: BBB ratings and accreditation for contractors
- BidNet Direct Scraper: public construction bids and RFPs
- Building Permits Scraper: permit-based contractor leads
- Auto Dealer Leads Scraper: another lead source in this collection
Legal and compliance
The Actor reads the public AZ ROC contractor search portal without logging in or bypassing access controls. Qualifying-party names and phone numbers can be personal data: use them lawfully and follow CAN-SPAM, TCPA and Do Not Call rules for outreach. Confirm license status and complaints with AZ ROC before hiring or compliance decisions. This tool is not affiliated with the Arizona Registrar of Contractors, and this is not legal advice.
Last verified: 2026-10-27