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.
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 |
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 |
|---|---|---|---|---|
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