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.
Verification
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
state | string|null |
county | string|null |
license_number | string|null |
license_type | string|null |
license_endorsement | string|null |
business_name | string|null |
rmi_name | string|null |
address | string|null |
city | string|null |
zip_code | string|null |
phone | string|null |
issue_date | string|null |
expiration_date | string|null |
bond_amount | string|null |
bond_company | string|null |
insurance_amount | string|null |
insurance_company | string|null |
source_url | string|null |
scraped_at | string|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
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
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