Tennessee License Scraper: Contractors & Pro Licenses
Pricing
from $8.32 / 1,000 results
Tennessee License Scraper: Contractors & Pro Licenses
Search Tennessee's official license verification for contractors, real estate, cosmetology, security, engineers and 40+ boards. Get name, license number, type, status, expiration, city and county. Filter by board, license type, status, county and state.
Pricing
from $8.32 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Tennessee License Scraper
Here is one real result, with every field the actor returns:
{"licenseNumber": "69162","name": "HANS & HEATHER BEAN DBA B & B ROOFING & REMODLING","entityType": "Organization","profession": "Contractor","licenseType": "Contractor","board": "Contractors and Ltd Licensed Plumbers","status": "Expired","expirationDate": "10/31/2025","city": "COOKEVILLE","state": "Tennessee","zip": "38506","county": "Putnam","addressLine": null,"phone": null,"email": null,"originalLicenseDate": "10/06/2015","alternateNames": "B & B ROOFING AND REMODELING","classifications": "BC: BC-21","monetaryLimit": "Monetary Limit - Value: $500,000.00","recordId": "C67435","detailUrl": "https://access.cloud.commerce.tn.gov/portal/search/C67435/detail","hasDetails": true,"searchQuery": "roofing","source": "Tennessee Dept of Commerce & Insurance (access.cloud.commerce.tn.gov)","observedAt": "2026-08-11T22:08:47.573Z"}
Every value above is the exact record from a live run. Fields are null when the Tennessee portal does not publish that value for the licensee.
The most complete Tennessee license scraper available. It searches the state's licensing portal across every regulating board, returns every field a license record exposes (including the full mailing address, county, original licensure date, alternate/DBA names, license classifications and monetary limits), and gives you seven filters (board, license type, status, entity type, county, state, plus multi-term search) to target exactly the licensees you need.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor searches the Tennessee Department of Commerce & Insurance licensing portal for each term you provide, combines and de-duplicates the results across searches, applies your filters, and writes one normalized record per license to the run's dataset. With includeDetails on (the default) it opens each license's detail page to add the full mailing address, county, original licensure date, alternate/DBA names, license classifications and any monetary or aggregate limits. Missing source values are returned as null rather than invented. A term can be a licensee or business name, a city, a county, or a trade keyword.
Coverage spans every board on the portal (contractors, cosmetology, real estate, architects and engineers, and more), including many out-of-state licensees. Requests default to Apify Residential proxy in the US for reliable access.
Quickstart
Open the actor, paste this into the input, and press Run. It returns up to 8 roofing and cosmetology licenses with full details.
{"searchQueries": ["roofing", "cosmetology"],"maxLicenses": 8,"includeDetails": true,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Every input field is optional. Each term in searchQueries runs a separate search; results are merged and de-duplicated.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
searchQueries | string[] | no | ["roofing"] | One or more search terms: a licensee or business name, a city, a county, or a trade keyword. Each runs a separate search; results are combined and de-duplicated. |
boards | string[] | no | (any) | Limit to these regulating boards, using exact portal labels, for example Contractors and Ltd Licensed Plumbers, Real Estate, Cosmetology. |
licenseTypes | string[] | no | (any) | Limit to these license types, for example Contractor, Home Improvement Contractors, Cosmetologist. |
statuses | string[] | no | (any) | Limit to these statuses, for example Active, Expired, Closed, Inactive, Current. |
entityTypes | string[] | no | (any) | Limit to Individual and/or Organization. |
counties | string[] | no | (any) | Limit to these Tennessee counties, for example Davidson, Shelby, Knox. |
states | string[] | no | (any) | Limit by the licensee's state of record, for example Tennessee, Georgia. Many out-of-state licensees are included. |
maxLicenses | integer | no | 50 | Maximum licenses to collect across all searches. Range 1 to 1000000. |
includeDetails | boolean | no | true | Enrich each license with its full detail record (address, county, dates, alternate names, classifications, limits). Off returns the faster listing-only view. |
proxy | object | no | Apify Residential US | Proxy used for requests. Residential US is recommended for reliable access. |
Filters combine with logical AND and are applied to the collected licenses.
Output reference
One dataset item per license. Types: string, boolean, or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
licenseNumber | string | License number as issued by the board. |
name | string | Licensee or business name. |
entityType | string | Individual or Organization. |
profession | string | Profession of the licensee. |
licenseType | string | Specific license type. |
board | string | Regulating board that issued the license. |
status | string | License status, for example Active, Expired, Closed. |
expirationDate | string | License expiration date (MM/DD/YYYY). |
city | string | City on the license record. |
state | string | State of record. |
zip | string | ZIP code on the license record. |
county | string | Tennessee county (from the detail record). |
addressLine | string | Full mailing street address (from the detail record), or null. |
phone | string | Phone number when published, or null. |
email | string | Email when published, or null. |
originalLicenseDate | string | Date the license was first issued (MM/DD/YYYY). |
alternateNames | string | Alternate or DBA names, or null. |
classifications | string | License classifications, for example BC: BC-21. |
monetaryLimit | string | Monetary or aggregate limit on the license, or null. |
recordId | string | Internal portal record ID (used to build detailUrl). |
detailUrl | string | Link to the official license detail page. |
hasDetails | boolean | true when the detail record was fetched and merged. |
searchQuery | string | Which search term returned this record. |
source | string | Source system the record came from. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
Example output record
Real record from the same live run (input {"searchQueries": ["roofing", "cosmetology"], "maxLicenses": 8}):
{"licenseNumber": "100","name": "WEST ROOFING AND SUPPLY/SHELTER DIST.","entityType": "Organization","profession": "Liquid Petroleum Dealer","licenseType": "Liquefied Petroleum Gas-Dealer","board": "Liquefied Petroleum Gas","status": "Closed","expirationDate": "12/31/2005","city": "NASHVILLE","state": "Tennessee","zip": "37210","county": "Davidson","addressLine": null,"phone": null,"email": null,"originalLicenseDate": "01/27/2000","alternateNames": null,"classifications": "Specialty: CLASS II-BOTTLE STORAGE-MIN. 500 WATER GAL. STORAG","monetaryLimit": null,"recordId": "C390299","detailUrl": "https://access.cloud.commerce.tn.gov/portal/search/C390299/detail","hasDetails": true,"searchQuery": "roofing","source": "Tennessee Dept of Commerce & Insurance (access.cloud.commerce.tn.gov)","observedAt": "2026-08-11T22:08:59.720Z"}
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~tennessee-licenses-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQueries":["roofing"],"statuses":["Active"],"maxLicenses":50}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~tennessee-licenses-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQueries":["Nashville"],"boards":["Cosmetology"],"counties":["Davidson"],"maxLicenses":200}'
Apify CLI:
apify call scrapers_lat/tennessee-licenses-scraper \--input '{"searchQueries":["Smith Construction"],"includeDetails":true}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per license returned (
resultevent). See the pricing tab for the current per-result price. - Detail enrichment. When
includeDetailsis on and a detail record is actually fetched and merged, a smalldetailsevent is charged in addition to the result. TurnincludeDetailsoff to skip it. - No charge on failure. Failed or empty runs do not charge for records that were not returned.
- Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 records per run. Upgrade for higher
maxLicenses.
FAQ and troubleshooting
A run returned 0 licenses. Why?
The search terms matched nothing, or your filters removed everything. Broaden the terms (a trade keyword like roofing returns many records) or relax the filters. Zero-result runs are not charged.
Why are addressLine, phone or email null?
The Tennessee portal does not publish those values for every licensee. Missing values are returned as null rather than invented. The address, county and dates are only added when includeDetails is on.
How do I target a specific board or county?
Use the boards and counties filters with the exact labels shown on the portal, for example Cosmetology and Davidson.
Why do I see out-of-state licensees?
Tennessee licenses many out-of-state individuals and businesses. Use the states filter to keep only Tennessee records if needed.
Is this an official Tennessee government tool? No. This actor is independent and has no affiliation with the State of Tennessee. It reads only data that is publicly available on the state licensing portal.
Related scrapers
- Texas TDLR License Scraper: Texas occupational and trade licenses.
- Texas PELS Engineers Scraper: Texas professional engineers and firms.
- Texas Comptroller Entities Scraper: Texas registered business entities.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with the State of Tennessee. Accesses only publicly available license data.
