ROC
Arizona Contractor License Lookup & Leads Scraper (ROC)
Look up any Arizona ROC contractor licence by number or name, or export every active licence statewide (58,184 on 2026-10-07) with phone, street address, class, qualifying party and principals.
Verification
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
license_number | string|null |
business_name | string|null |
dba_name | string|null |
classification | string|null |
classification_detail | string|null |
license_class_type | string|null |
status | string|null |
person_name | string|null |
principals | array|null |
phone | string|null |
address | string|null |
city | string|null |
address_state | string|null |
zip_code | string|null |
issue_date | string|null |
expiration_date | string|null |
matched_by | string|null |
license_type | string|null |
state | string|null |
notice | string|null |
notice_type | string|null |
source_url | string|null |
Sample row
{
"license_number": "234021",
"business_name": "Arcadia Roofing, LLC",
"dba_name": null,
"classification": "CR-42",
"classification_detail": "CR-42 Roofing",
"license_class_type": "Specialty Dual",
"status": "Active",
"person_name": "Tommy Louis Leale",
"principals": [
"Tommy Louis Leale (Member;Qualifying Party)"
],
"phone": "(602) 840-7663",
"address": "3008 N. 44th Street",
"city": "Phoenix",
"address_state": "AZ",
"zip_code": "85018",
"issue_date": "2007-06-16",
"expiration_date": "2027-06-30",
"matched_by": "export",
"license_type": "Contractor License",
"state": "AZ",
"source_url": "https://roc.az.gov/posting-list"
} Inputs
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
mode | string | no | "auto" | auto (default): a name or number below runs a lookup, none runs an export. lookup: find licences by ROC number or business/person name, every status. export: active licences statewide by the filters below (classification, city, ZIP, expiry), names and numbers ignored. |
query | string | no | — | An ROC licence number ('333473' or 'ROC 333473'), a business name ('Arcadia Roofing'), or a person's name written FIRST then LAST ('Tommy Leale'). Leave empty to run an export instead. |
queries | array | no | [] | Several lookups in ONE run, one per line. Combined with the field above if you fill both. |
classification | string | no | — | An ROC class code ('R-42', 'CR-11', 'B', 'KB-1') or a word from the class name ('roofing' = every *-42 Roofing class, 'electrical', 'swimming pools'). A value that matches no class on the list is dropped and logged. |
classifications | array | no | [] | Several classifications in ONE export, e.g. R-39 and CR-39. |
licenseTypes | array | no | [] | Same as Classifications (ROC's licence types are its classes): codes like 'R-42' or words like 'roofing' (every *-42 Roofing class: C-42, R-42, CR-42). |
licenseType | string | no | — | One licence type; same as Classification. |
statuses | array | no | [] | Keep only licences with these ROC statuses ('Active', 'Revoked', 'Expired', 'Suspended' ...). Lookups search every status unless this is set; the statewide export holds Active licences only. |
status | string | no | — | One status; same as Statuses. |
expiresAfter | string | no | — | ISO date, e.g. 2026-12-01. With 'Expires on or before', lists licences due for renewal in a window. Export rows only (the lookup source shows no expiry date). |
expiresBefore | string | no | — | ISO date, e.g. 2027-02-28. |
licenseClassType | string | no | — | Residential, Commercial, Dual, General or Specialty — matched against ROC's class type ('Specialty Dual', 'General Residential', ...). |
licenseClassTypes | array | no | [] | Several license types in ONE export. |
city | string | no | — | Mailing-address city, exact match ignoring case and punctuation, e.g. 'Scottsdale'. ROC lists licences by mailing address, not by where the contractor works. |
cities | array | no | [] | Several cities in ONE export. |
zipCode | string | no | — | 5-digit mailing ZIP, e.g. '85018'. |
zipCodes | array | no | [] | Several ZIP codes in ONE export. |
nameFilter | string | no | — | Case-insensitive text in the business name, DBA or qualifying party. |
nameFilters | array | no | [] | Several name fragments in ONE export; a licence matching any of them is returned once. |
arizonaAddressesOnly | boolean | no | false | Out-of-state contractors can hold an ROC licence: 9,336 of 58,184 active licences (16%, 2026-10-07) have a mailing address outside Arizona. Tick to drop them. |
includePhone | boolean | no | true | The posting list has no phone column. When ticked, each exported licence is matched to ROC's contractor search for its phone and the people on the licence (owners, officers, qualifying party). Adds time, not cost. Rows that could not be matched have no phone or principals. |
maxResults | integer | no | 500 | EXPORT: cap on licences for the WHOLE run — your spend control (58,184 active licences on 2026-10-07; set 100000 to take everything that matches). LOOKUP: cap per name or number (default 50). |
proxyConfiguration | object | no | {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"],"apifyProxyCountry":"US"} | Used only to download the statewide posting list in EXPORT mode, and only if the direct download is refused (ROC's Cloudflare blocks datacenter IPs). Residential is the setting that works; lookups never use it. |
Pricing
Pay per result (dataset-item) — no charge for empty runs.
Example: 244 Phoenix roofing contractors at $0.004/result ≈ $0.98.
FAQ
Where does the data come from?
From the Arizona Registrar of Contractors (ROC). Export mode downloads ROC's Posting List (roc.az.gov/posting-list), the official CSV of every active licence; lookups and the phone/principals match use ROC's public contractor search (azroc.my.site.com). Both are read on every run.
How many licences are there?
58,184 active licences on the 2026-10-07 Posting List, across 157 classifications. Largest: KB-2 Dual Residential and Small Commercial 4,331, B General Residential 3,971, KB-1 Dual Building 3,617, B-1 General Commercial 3,028, CR-11 Electrical 2,990. Largest cities: Phoenix 9,162, Tucson 4,835, Mesa 4,010, Scottsdale 2,597.
Lookup or export — which do I use?
Lookup when you have licence numbers or names and want their current status: fill 'License number or name' (or the batch list). Export when you want a list: leave that field empty and set filters. Lookups cover every status; exports cover active licences only, because the Posting List holds only those. 'Mode' can force one or the other (lookup, export); the default, auto, decides by whether you gave names or numbers.
Can I list licences that are about to expire?
Yes, in an export: set 'Expires on or after' and 'Expires on or before' (dates like 2027-01-31) together with any other filter. Lookup rows come from ROC's contractor search, which shows no expiry date, so the window applies to exports only.
How do I name a classification?
By ROC code ('R-42', 'CR-11', 'B', 'KB-1' — exact, case and dash optional) or by a word from the class name ('roofing' returns C-42, R-42 and CR-42; 'electrical' every electrical class). R is residential, C commercial and CR dual. A value that matches no class on the list is dropped and logged.
Does it include out-of-state contractors?
Yes: 9,336 of the 58,184 active licences (16.0%) have a mailing address outside Arizona, most often California (2,662), Texas (937) and Utah (657). Tick 'Arizona mailing addresses only' to drop them. ROC lists licences by mailing address, not by where the contractor works.
Why is phone missing on some rows?
The Posting List has no phone column, so each exported licence is matched to ROC's contractor search by licence number. Phone and principals are null when the search has no account for the licence, does not answer, or a very large export runs out of time before reaching it. Untick 'Add phone + principals' for the fastest export.
How am I charged?
$0.004 per licence returned. The default export returns 500 licences ($2.00); Phoenix roofing contractors were 244 ($0.98) on 2026-10-11. Rows explaining an outage or an unrecognised filter are free.
Guides & use cases
Related actors