Oregon Contractor License Lookup Scraper avatar

Oregon Contractor License Lookup Scraper

Pricing

Pay per event

Go to Apify Store
Oregon Contractor License Lookup Scraper

Oregon Contractor License Lookup Scraper

🔎 Search public Oregon CCB contractor records and export license numbers, business names, statuses, and addresses for verification, compliance, or leads.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Search the Oregon Construction Contractors Board (CCB) public license register and export structured contractor records in minutes.

Use this Actor to verify license status, discover Oregon contractors, monitor compliance lists, or enrich a CRM with official public CCB identifiers.

The scraper handles the CCB form session and pagination automatically. No Oregon account, GitHub token, or private credential is required.

What does Oregon Contractor License Lookup Scraper do?

The Actor searches Oregon's public contractor license lookup using one or more terms.

It returns:

  • CCB license number
  • registered business name
  • public license status
  • public mailing address
  • search term and result page
  • source URL and extraction timestamp

Search by a company name, license number, trade keyword, city, ZIP code, or address fragment supported by the public search.

Who is it for?

Contractor lead generation teams

Build targeted contractor lists for insurance, equipment, financing, software, and professional services outreach.

Compliance and procurement teams

Check whether vendors appear in the Oregon CCB register and retain timestamped verification evidence.

Property managers and homeowners

Look up contractors before procurement or renovation work.

Researchers and public-interest teams

Study contractor market coverage and license-status patterns using exportable records.

Developers and data teams

Feed official public contractor data into internal databases, dashboards, alerts, or enrichment pipelines.

Why use this Actor?

Oregon CCB publishes active licenses through the state's official Open Data API and all-status searches through a stateful ASP.NET flow. This Actor selects the appropriate official route automatically.

This Actor:

  • queries the official Open Data API for active-license searches
  • preserves the anonymous website session for all-status searches
  • submits required hidden form fields when using the website
  • follows result redirects
  • navigates API or website result pages
  • normalizes table values
  • applies an exact output limit
  • charges only for records saved

You receive clean JSON, CSV, Excel, XML, RSS, or Parquet through Apify Dataset exports.

What data can I extract?

FieldTypeDescription
licenseNumberstringOregon CCB license identifier
businessNamestringPublic registered contractor name
licenseStatusstringStatus shown by Oregon CCB
addressstringPublic address shown in search results
searchTermstringInput that produced the record
resultPagenumberResult page where it appeared
sourceUrlURLOregon CCB public result source
scrapedAtdatetimeUTC extraction timestamp

Optional or unavailable values are not invented.

How to scrape Oregon contractor licenses

  1. Open the Actor input page.
  2. Enter one or more search terms.
  3. Choose whether to request active licenses only.
  4. Set the maximum number of records.
  5. Click Start.
  6. Preview the dataset.
  7. Export it in your preferred format.

Start with a precise company name or license number when verifying one contractor.

Use broader terms such as a trade or city when building a prospect list.

Input

{
"searchTerms": ["construction", "plumbing"],
"activeOnly": true,
"maxItems": 100,
"maxPagesPerSearch": 25
}

searchTerms

A list of business names, CCB numbers, trade terms, cities, ZIP codes, or address fragments.

Duplicate and blank terms are removed.

activeOnly

Set to true to request active records from the source. Set to false to include all statuses returned by CCB.

maxItems

Maximum records saved across all search terms. Allowed range: 1 to 10,000.

maxPagesPerSearch

A safety limit for broad terms. Oregon CCB normally displays about 20 records per page.

Output example

{
"licenseNumber": "257762",
"businessName": "MT HOOD CONSTRUCTION & HANDYMAN SERVICES",
"licenseStatus": "Active",
"address": "PO BOX 534 BRIGHTWOOD OR 97011",
"searchTerm": "construction",
"resultPage": 1,
"sourceUrl": "https://search.ccb.state.or.us/search/list_results.aspx",
"scrapedAt": "2026-07-12T04:30:00.000Z"
}

Records from overlapping searches can describe the same license. Deduplicate downstream by licenseNumber when combining broad searches.

How much does it cost to look up Oregon contractor licenses?

The Actor uses pay-per-event pricing:

  • a small charge when the run starts
  • a per-item charge for each dataset record saved

Apify plan tiers receive volume-adjusted item prices. The Console shows the exact run estimate before execution.

HTTP-only extraction keeps compute use low. Set a conservative maxItems during evaluation.

Search strategies

Verify one contractor

Search an exact CCB number and set maxItems to 5.

Build a trade list

Search terms such as roofing, plumbing, or excavation and request active records.

Build a local list

Search a city or ZIP fragment, then filter and deduplicate the exported dataset.

Monitor status

Schedule exact license-number searches and compare licenseStatus between datasets.

Tips for accurate results

  • Use exact CCB numbers for verification.
  • Try legal and trading business names separately.
  • Keep multiple terms in one run for efficient batching.
  • Deduplicate overlapping broad queries by licenseNumber.
  • Store scrapedAt when creating audit evidence.
  • Confirm critical decisions on the official source page.

Scheduling and monitoring

Apify schedules can run this Actor hourly, daily, weekly, or monthly.

A monitoring workflow can:

  1. search a fixed list of license numbers
  2. save a dated dataset
  3. compare status with the prior run
  4. send changed rows to a webhook
  5. notify procurement or compliance staff

Use Apify webhooks with Slack, email automation, or your own API endpoint.

Integrations

Use licenseNumber as the stable key in these end-to-end workflows:

  1. Dataset → Google Sheets compliance queue: schedule a daily active-license search, export the dataset to a Sheet, and let reviewers add approval and follow-up columns without re-keying contractor details.
  2. Scheduled run → webhook status alert: search a fixed list of CCB numbers, compare each run with the previous dataset, and send changed or missing licenses through an Apify webhook to Slack, Zapier, Make, or an incident endpoint.
  3. Dataset → CRM lead pipeline: sync active rows to Airtable, HubSpot, or Salesforce by licenseNumber, then route newly found contractors to territory owners while preserving the Oregon CCB source link.

For warehouse analysis, load dated datasets into Snowflake, BigQuery, or PostgreSQL and track status changes over time.

API usage with JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/oregon-contractor-license-lookup-scraper').call({
searchTerms: ['roofing'],
activeOnly: true,
maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

API usage with Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/oregon-contractor-license-lookup-scraper').call(run_input={
'searchTerms': ['257762'],
'activeOnly': False,
'maxItems': 5,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

API usage with cURL

curl -X POST \
'https://api.apify.com/v2/acts/automation-lab~oregon-contractor-license-lookup-scraper/runs?token=YOUR_APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"searchTerms":["construction"],"activeOnly":true,"maxItems":100}'

Fetch run results from the dataset endpoint returned by the run API.

Use with Apify MCP

The scoped MCP endpoint is:

https://mcp.apify.com/?tools=automation-lab/oregon-contractor-license-lookup-scraper

Add it to Claude Code:

claude mcp add --transport http apify-oregon-ccb \
'https://mcp.apify.com/?tools=automation-lab/oregon-contractor-license-lookup-scraper'

For Claude Desktop, Cursor, or VS Code, add this HTTP server to the client's MCP JSON configuration (set APIFY_TOKEN in the client environment or complete the prompted Apify authentication):

{
"mcpServers": {
"apify-oregon-ccb": {
"type": "http",
"url": "https://mcp.apify.com/?tools=automation-lab/oregon-contractor-license-lookup-scraper"
}
}
}

Example prompts to ask Claude through MCP:

  • “Find 50 active Oregon roofing contractors and group them by city.”
  • “Check Oregon CCB license 257762 and summarize the record with its source URL.”
  • “Export active contractors matching plumbing to CSV and flag duplicate license numbers.”

Reliability

The scraper uses official public HTTP sources rather than a browser.

Active-only searches use Oregon's Open Data API, avoiding dependence on the slower interactive search form. All-status searches validate the website response, preserve cookies, submit ASP.NET hidden fields, follow the result redirect, and post pagination events.

If a broad term has no rows, the Actor moves to the next term without failing the whole run.

Limitations

  • Data is limited to what Oregon CCB publicly displays.
  • Source labels and page structure may change.
  • Search is controlled by the state website's matching behavior.
  • Broad terms can return thousands of records.
  • One contractor may match several input terms.
  • Result rows do not represent private complaint or payment data.
  • Temporary state-site maintenance can interrupt a run.

Use maxPagesPerSearch to bound unusually broad queries.

Troubleshooting

Why did my search return zero records?

Check spelling, try part of the legal business name, remove punctuation, or search the CCB number.

Why do I see duplicate licenses?

Overlapping search terms can return the same contractor. Deduplicate by licenseNumber.

Why did the run stop before all source results?

Increase maxItems or maxPagesPerSearch. Either limit may intentionally stop pagination.

Why did a normally working run fail?

The Oregon state site may be under maintenance. Review the Actor log and retry later.

Data freshness

Each run queries the live public Oregon CCB search application.

scrapedAt records when the row was extracted, not when the agency last updated the underlying license.

For recurring compliance checks, schedule fresh runs rather than relying on an old export.

Responsible use and legality

This Actor accesses public government license records without bypassing authentication.

Users are responsible for complying with applicable laws, source terms, marketing rules, privacy requirements, and internal policies.

Do not treat automated output as legal advice. Confirm high-impact licensing or procurement decisions with Oregon CCB.

Explore other Automation Labs actors for complementary public-business workflows:

Combine state-specific exports using stable license and source fields.

FAQ

Does the Actor require an Oregon account?

No. It uses the public CCB search surface.

Can I search inactive licenses?

Yes. Set activeOnly to false to request all source statuses.

Can I search multiple businesses at once?

Yes. Add multiple values to searchTerms; the global maxItems applies across them.

Can I export to Excel or CSV?

Yes. Use the Dataset export controls or API.

Does this replace official verification?

No. It automates collection of public records. Confirm critical decisions with the official agency.

Can I run it on a schedule?

Yes. Use Apify schedules and webhooks to build recurring monitoring workflows.

Support

For reproducible support, include:

  • the run URL
  • non-sensitive input
  • the search term involved
  • the relevant log excerpt
  • expected and actual result counts

Do not include private credentials or unrelated personal data.