AZ ROC Contractor License Scraper — Arizona Lookup avatar

AZ ROC Contractor License Scraper — Arizona Lookup

Pricing

from $107.50 / 1,000 license records

Go to Apify Store
AZ ROC Contractor License Scraper — Arizona Lookup

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

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Features

Limited permissions

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:

FieldWhat it contains
license_numberROC license number, for example 333282
business_nameLicensed business name
qualifying_partyThe person AZ ROC lists as qualifying party
license_statusStatus as shown by the portal, for example Active
primary_classificationClassification code and name, for example CR-10 Drywall
license_typeResidential, Commercial or Dual, inferred from the classification prefix (R residential, CR dual, B, C, K, L commercial)
city, state, zipBusiness location from the results list
business_phoneBusiness phone, formatted like (602) 317-1895
profile_url, source_url, scraped_atPortal links and collection time
complaint_countnull 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.

InputExampleNotes
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
licenseStatusACTIVEALL, ACTIVE, SUSPENDED, EXPIRED, REVOKED or CANCELLED, applied to results
licenseClassificationR-11Keeps codes that equal or start with this value
licenseTypeRESIDENTIALChosen in the portal's form when the option is offered
maxResults100Total records across all searches; 0 means no limit
resultsPerPage5010, 20 or 50 rows per portal page
scrapeDetailPage, scrapeComplaintsfalseDetail mode and per-complaint rows (see below)
maxConcurrency31 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:

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 os
from apify_client import ApifyClient
client = 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.

EventFREEBRONZESILVERGOLDPLATINUM / DIAMOND
License record (one dataset row)USD 0.134377USD 0.131017USD 0.127658USD 0.107501USD 0.107501
Actor start (per started GB of allocated memory)USD 0.006251USD 0.006094USD 0.005938USD 0.005USD 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.

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