← 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 — direct from the official state open-data API.

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

Verification

100%golden-diff success
298canary 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
scraped_atstring|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
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 500 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'. Defaults to 500.

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.

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