← Health board

TN DOCI

Tennessee Contractor License Lookup & Verify (TN DOCI)

Verify any Tennessee contractor by license number or name, or export the whole TN DOCI contractor roster filtered by status, license type, county and city.

98%golden-diff pass
Run it on Apify → verified nightly

Verification

98%golden-diff success
45canary runs
0days since last canary run

Output fields

Authoritative field set from the dataset schema.

FieldType
statestring|null
license_numberstring|null
business_namestring|null
person_namestring|null
license_typestring|null
statusstring|null
issue_datestring|null
expiration_datestring|null
citystring|null
countystring|null
addressstring|null
zip_codestring|null
phonestring|null
bond_amountstring|null
bond_companystring|null
insurance_companystring|null
matched_bystring|null
source_urlstring|null

Sample row

{
  "state": "TN",
  "license_number": "56787",
  "business_name": "JOHNSON PLUMBING",
  "person_name": null,
  "license_type": "Contractor",
  "status": "Expired",
  "issue_date": null,
  "expiration_date": "03/31/2016",
  "city": "JOHNSON CITY",
  "county": "Washington",
  "address": null,
  "zip_code": "37605",
  "phone": null,
  "bond_amount": null,
  "bond_company": null,
  "insurance_company": null,
  "matched_by": "business_name",
  "source_url": "https://search.cloud.commerce.tn.gov/search/C49031/detail"
}

Inputs

FieldTypeReqDefaultDescription
query string no "Johnson Construction" A TN contractor license number (numeric, e.g. '56787') OR a business/person name. A numeric query is looked up by license number; anything else is searched against the licensee/business name index. Leave this and 'Search query (batch)' empty to export the statewide roster instead, narrowed by the status / licence type / county / city filters below.
queries array no ["Johnson Construction"] Look up many in ONE run instead of starting a run per lookup. Takes the same values as 'Search query'. Combined with 'Search query' if you fill both, and duplicates are removed. Billing is unchanged: you are charged per record returned, not per entry submitted.
board string no "Contractors and Ltd Licensed Plumbers" The TN DOCI board to search. Defaults to 'Contractors and Ltd Licensed Plumbers' (the main contractor board), which is also used when this is left blank.
status string no "active" Used only when no search query is given (statewide export). One of TN DOCI's statuses: Active, Expired, Applicant, Application Expired, Application Denied, Application Withdrawn, Closed, Retired, Revoked, Failure to Renew, Suspended — or 'all'. Defaults to active. An unrecognised value is ignored with a log line; if nothing you gave is recognised, the run returns a free row saying so instead of the whole state.
statuses array no [] Several statuses in ONE statewide run, e.g. Active and Expired. Combined with 'Licence status' if you fill both.
licenseType string no — Used only in statewide mode: Contractor, Limited Licensed Plumbers (or 'plumber'), or Pre-Licensing Course Provider. Leave empty for all types.
licenseTypes array no [] Several licence types in ONE statewide run. Combined with 'Licence type' if you fill both.
county string no — Used only in statewide mode: a Tennessee county, e.g. 'Davidson' or 'Knox County' (any of the 95). Sent to TN DOCI as its own county filter, limited to Tennessee holders.
counties array no [] Several Tennessee counties in ONE statewide run. Combined with 'County' if you fill both.
city string no — Used only in statewide mode: the licensee's city, exact match ignoring case and punctuation, e.g. 'Nashville' (does not also match 'Johnson City' for 'City').
cities array no [] Several cities in ONE statewide run. Combined with 'City' if you fill both.
maxResults integer no — With a search query: cap PER ENTRY, not per run (empty = 50), so a batch cannot silently return only the first rows overall. In statewide mode (no query): cap for the WHOLE run, a spend control (empty = 500); the active contractor board is about 24,000 records and the whole board about 72,000, so 100000 returns everything that matches. The run log states how many matched when the cap cuts it short.
proxyConfiguration object no {"useApifyProxy":false} Optional. The TN portal is usually reachable directly, but its edge returns 403 to some datacenter IPs. If a run returns a 'TN portal unavailable' row, enable Apify Proxy with the RESIDENTIAL group.

Pricing

Pay per result (dataset-item) — no charge for empty runs.
Example: 100 verified license records at $0.004/result ≈ $0.40.

FAQ

Where does the data come from?

The official Tennessee Department of Commerce and Insurance public licensee registry, via the Tyler entellitrak REST API.

What can I search by?

A TN DOCI license number (numeric, e.g. 56787) or a business/licensee name. Both return matching licenses, deduped by license number. Leave the search empty to export the roster instead (next question).

Can I export every contractor in Tennessee, or in one county?

Yes. With no search query the actor exports the board's roster, filtered by status (default Active, or 'all'), license type (Contractor, Limited Licensed Plumbers, Pre-Licensing Course Provider), Tennessee county and city. Each filter takes one value or a list. On 2026-10-07 the Contractors and Ltd Licensed Plumbers board held 72,118 records, 23,955 of them Active; the whole active board took about 2 minutes and the whole board about 6. maxResults caps the whole export (default 500); set 100000 to take everything that matches.

What fields do I get?

License number, business/licensee name, license type, status, expiration date, city, county, and ZIP code.

How am I charged?

Pay-per-result — per license record returned. No charge for searches with no results, or for a row explaining a source problem or an unusable input. At $0.004 per record, a default statewide export of 500 costs $2.00 and the whole active board (23,955 on 2026-10-07) about $95.82.

Is this personal data?

It's public professional-license data (business and license-holder records as TN DOCI publishes them); we add no personal/PII enrichment.

How current is it?

It reflects the live TN DOCI registry at the moment of lookup. The state does not publish an update schedule for the registry, so treat each record as current as of its run.

Can I filter by board or license type?

Yes — the 'board' input defaults to 'Contractors and Ltd Licensed Plumbers' (also used when left blank); set it to another TN DOCI board name to search that board. In a statewide export you can also filter by status, license type, county and city.

Guides & use cases

Related actors