← Health board

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.

100%golden-diff pass
Run it on Apify → verified nightly

Verification

100%golden-diff success
2canary runs
20days since last canary run

Output fields

Authoritative field set from the dataset schema.

FieldType
license_numberstring|null
business_namestring|null
dba_namestring|null
classificationstring|null
classification_detailstring|null
license_class_typestring|null
statusstring|null
person_namestring|null
principalsarray|null
phonestring|null
addressstring|null
citystring|null
address_statestring|null
zip_codestring|null
issue_datestring|null
expiration_datestring|null
matched_bystring|null
license_typestring|null
statestring|null
noticestring|null
notice_typestring|null
source_urlstring|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

FieldTypeReqDefaultDescription
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