← Health board

CCB

Oregon Contractor Directory & Leads Scraper (CCB)

Pull every CCB-licensed contractor in any Oregon county — business name, license type, RMI, bond, insurance, address, and phone — or look one up by licence number or name, direct from the official state open-data API.

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

Verification

98%golden-diff success
45canary runs
0days since last canary run

Output fields

Authoritative field set from the dataset schema.

FieldType
statestring|null
countystring|null
license_numberstring|null
license_typestring|null
license_endorsementstring|null
business_namestring|null
rmi_namestring|null
addressstring|null
citystring|null
zip_codestring|null
phonestring|null
issue_datestring|null
expiration_datestring|null
bond_amountstring|null
bond_companystring|null
insurance_amountstring|null
insurance_companystring|null
source_urlstring|null

Sample row

{
  "state": "OR",
  "county": "Multnomah",
  "license_number": "100260",
  "license_type": "RSC",
  "license_endorsement": "Residential Specialty Contractor",
  "business_name": "THE FOXGLOVED PAINTERS & DESIGNERS INC",
  "rmi_name": "CICELY W KEIRNAN",
  "address": "8737 NE THOMPSON ST",
  "city": "PORTLAND",
  "zip_code": "97220",
  "phone": "5032552327",
  "issue_date": "06/30/1994",
  "expiration_date": "05/14/2027",
  "bond_amount": "20000",
  "bond_company": "WESTERN SURETY COMPANY",
  "insurance_amount": "1000000",
  "insurance_company": "TWIN CITY FIRE INS COMPANY",
  "source_url": "https://search.ccb.state.or.us/search/"
}

Inputs

FieldTypeReqDefaultDescription
mode string no "auto" auto (default): a licence number or business name below runs a lookup, none runs the county export. lookup: find licences by CCB licence number (exact) or business name (contains). export: counties and licence types, names ignored.
queries array no [] Look up many in ONE run: each value is matched as an exact CCB licence number and as a business-name substring. Rows come back in the lookup's shape (bond, insurance, RMI as person_name).
query string no — One value; same as the list above.
county string no "Multnomah" Oregon county name to retrieve contractors for (e.g. 'Multnomah', 'Lane County', 'Washington'). Case, spacing and a trailing 'County' do not matter. If it is missing or is not an Oregon county, the run returns the free county list instead of failing, so you can see the exact names.
counties array no ["Multnomah"] Look up many in ONE run instead of starting a run per lookup. Takes the same values as 'County'. Combined with 'County' if you fill both, and duplicates are removed. Billing is unchanged: you are charged per record returned, not per entry submitted.
licenseType string no — Optional partial match against the CCB endorsement description (e.g. 'Residential General Contractor', 'Electrical', 'Plumbing'). Leave blank for all license types.
maxResults integer no — Cap on the number of records returned PER ENTRY, not per run — so a batch cannot silently return only the first 500 rows overall and read as 'the rest don't exist'. Unset: 500 per county; 50 per lookup value.
licenseTypes array no [] Several endorsement words, any of them, e.g. 'Residential', 'Commercial'. Same as 'License type' for one.
statuses array no [] The CCB open-data set lists ACTIVE licences only: 'active' or 'all' (the same rows). Any other status returns a free row saying so.
status string no — One status; same as Statuses.
expiresAfter string no — Only licences expiring on or after this date (YYYY-MM-DD). With 'Expires on or before' it lists licences due for renewal in a window. Works on exports and lookups.
expiresBefore string no — Only licences expiring on or before this date (YYYY-MM-DD).
proxyConfiguration object no {"useApifyProxy":false} Optional. data.oregon.gov is reachable directly; a proxy is not needed.

Pricing

Pay per result (dataset-item) — no charge for empty runs.
Example: 500 contractor records at $0.002/result ≈ $1.00.

FAQ

Where does the data come from?

The official Oregon Construction Contractors Board (CCB) open-data registry, published on data.oregon.gov (Socrata, dataset g77e-6bhs — 'CCB Active Licenses'). Public, authoritative, and refreshed regularly.

Lookup or export — which do I use?

Lookup when you have CCB licence numbers or business names: put them in 'Licence numbers or business names' (statewide, exact licence number or name contains). Export when you want a county list: leave that empty and pick counties and licence types. 'Mode' can force one or the other; the default, auto, decides by whether you gave names or numbers.

What does the licenseType filter match?

It does a case-insensitive substring match against the CCB endorsement description field (e.g. 'Residential General Contractor', 'Commercial Specialty Contractor', 'Lead Based Paint Renovation Contractor'). Pass a partial string like 'General' or 'Electrical' to catch multiple related endorsements.

How many records does a typical county run return?

Counted on the live dataset 2026-07-28: Multnomah ~6,500, Washington ~5,400, Lane ~3,800. Smaller rural counties may have a few hundred. The actor pages through all results automatically.

What are the license type codes?

Common codes include RGC (Residential General Contractor), RSC (Residential Specialty Contractor), CGC (Commercial General Contractor), CSC (Commercial Specialty Contractor), LBPR (Lead-Based Paint Renovation Contractor), and others. The license_endorsement field gives the full human-readable description for each.

How do I find the right county name?

Use title-case Oregon county names: Multnomah, Lane, Washington, Clackamas, Marion, Jackson, Deschutes, etc. The actor normalizes case, so 'multnomah' and 'MULTNOMAH' both work.

How am I charged?

Pay per record returned — one PPE event per dataset item. Runs with no results incur no charge.

Is this personal data?

It's public professional-license data (business and license records as CCB publishes them); no personal/PII enrichment is added beyond what the state publishes.

How current is the data?

The CCB open-data export is refreshed regularly on data.oregon.gov; records reflect the most recently published snapshot. Expect up to a few days of lag for brand-new registrations.

Guides & use cases

Related actors