Verify Professional Licenses via API — Contractors, Nurses, and Healthcare Providers
If you're building a platform that connects people with licensed professionals — contractors, nurses, doctors — you eventually hit the same problem: how do you verify their license is real and active?
Every state has its own licensing board with its own website, its own search interface, and its own data format. California's contractor board returns different fields than Florida's. New York's nurse lookup works completely differently from Texas.
I built an API that unifies all of this behind a single REST interface. One call, structured JSON, real-time data from official state sources.
The Problem With Manual Verification
A typical home services marketplace needs to verify contractor licenses. Here's what that looks like without an API:
- User claims license #1096738 in California
- Your team manually goes to cslb.ca.gov
- Searches for the license number
- Copies the status, expiration date, business name
- Repeat for every contractor, in every state, on every renewal
At scale, this is untenable. And if you're in healthcare, the stakes are even higher — you're verifying that the nurse or doctor treating patients actually has a valid license.
Quick Start: Verify a Contractor License
import requests
API_URL = "https://license-verify-api-production.up.railway.app"
# Verify a California contractor license
response = requests.get(f"{API_URL}/contractor/verify", params={
"state": "CA",
"licenseNumber": "1096738"
})
data = response.json()
result = data["results"][0]
print(f"Business: {result['businessName']}")
print(f"Status: {result['licenseStatus']}")
print(f"Type: {result['licenseType']}")
print(f"Expires: {result['expirationDate']}")
print(f"Source: {result['source']}") # "CSLB"
Output:
Business: NOOR ELECTRIC
Status: Active
Type: General Building Contractor
Expires: 09/30/2026
Source: CSLB
The API hits the actual California State Licensing Board and returns real-time data. Not a cached copy — the actual current status.
Supported States & Search Types
Contractors (4 states):
- CA — California State Licensing Board (CSLB)
- TX — Texas Department of Licensing and Regulation (TDLR)
- FL — Florida DBPR
- NY — NYC Department of Buildings + Consumer Affairs
Nurses (2 states):
- FL — Department of Health MQA
- NY — NYSED Office of the Professions
Healthcare Professionals (50 states + DC):
- 22 profession types: MD, DO, RN, LPN, NP, PA, PT, OT, RPH, DDS, and more
- Uses NPPES NPI Registry for nationwide coverage
- Deep verification via official state boards in FL
You can search by license number, name, or business name:
# Search by person name
response = requests.get(f"{API_URL}/contractor/verify", params={
"state": "FL",
"lastName": "Smith",
"firstName": "John",
"maxResults": 5
})
# Search by business name
response = requests.get(f"{API_URL}/contractor/verify", params={
"state": "TX",
"businessName": "ABC Construction"
})
Healthcare Verification (50 States)
The healthcare endpoint covers all 50 states through the NPI Registry, with deep verification in Florida:
# Verify a doctor in any state via NPI
response = requests.get(f"{API_URL}/healthcare/verify", params={
"state": "CA",
"lastName": "Smith",
"licenseType": "MD",
"maxResults": 10
})
data = response.json()
for doc in data["results"]:
print(f"Dr. {doc['personName']} — {doc['taxonomyDescription']}")
print(f" NPI: {doc['npiNumber']} | Status: {doc['status']}")
print(f" Location: {doc['city']}, {doc['state']}")
# Direct NPI lookup (instant)
npi_resp = requests.get(f"{API_URL}/healthcare/npi/1234567890")
Supported profession types:
| Category | Types |
|---|---|
| Nursing | RN, LPN, NP, APRN, CNA |
| Medicine | MD, DO, PA |
| Therapy | PT, PTA, OT, OTA, SLP |
| Pharmacy | RPH, PHARMD |
| Dental | DDS, DMD |
| Other | DC, OD, DPM, PSYCH |
JavaScript Example: Build a Verification Form
const API_URL = "https://license-verify-api-production.up.railway.app";
async function verifyContractor(state, licenseNumber) {
const params = new URLSearchParams({ state, licenseNumber });
const res = await fetch(`${API_URL}/contractor/verify?${params}`);
const data = await res.json();
if (data.count === 0) {
return { verified: false, message: "License not found" };
}
const license = data.results[0];
return {
verified: license.licenseStatus === "Active",
business: license.businessName,
status: license.licenseStatus,
type: license.licenseType,
expires: license.expirationDate,
source: license.source,
processingMs: data.processingMs
};
}
// Usage
const result = await verifyContractor("CA", "1096738");
if (result.verified) {
console.log(`License verified: ${result.business} (${result.status})`);
} else {
console.log(`License invalid or not found`);
}
Batch Verification
For platforms processing multiple verifications at once, the batch endpoint handles up to 50 concurrent lookups:
import requests
API_URL = "https://license-verify-api-production.up.railway.app"
# Verify multiple licenses in one call
response = requests.post(f"{API_URL}/batch", json={
"verifications": [
{"type": "contractor", "state": "CA", "licenseNumber": "1096738"},
{"type": "contractor", "state": "FL", "licenseNumber": "CBC1263939"},
{"type": "nurse", "state": "FL", "licenseNumber": "RN766302"},
{"type": "healthcare", "state": "NY", "lastName": "Smith", "licenseType": "MD"}
]
})
data = response.json()
print(f"Processed {data['total']} verifications in {data['processingMs']}ms")
for result in data["results"]:
status = "PASS" if result["count"] > 0 else "NOT FOUND"
print(f" [{result['index']}] {status} — {result['count']} results")
Practical Use Cases
Home services platforms: Verify contractors before allowing them to bid on jobs. Auto-flag expired licenses. Show verified badges to homeowners.
Healthcare staffing: Validate nurse credentials during onboarding. Run periodic re-checks for license renewals. Cross-reference NPI numbers.
Insurance underwriting: Confirm active licenses before issuing professional liability policies. Batch-verify during annual renewals.
Background checks: Add license verification as a data point alongside criminal records and employment history.
Compliance automation: Scheduled checks that alert when a provider's license status changes from Active to Expired/Suspended.
Data Sources
All data comes from official government sources — state licensing boards and the federal NPPES registry. Nothing is scraped from aggregator sites. Response times are typically 2-5 seconds for individual lookups (the API queries the source in real-time).
Each response includes a source field so you know exactly which authority provided the data, and a processingMs field for performance monitoring.
Try It
- Direct endpoint: license-verify-api-production.up.railway.app
- RapidAPI: License Verify API on RapidAPI
-
Check supported states:
GET /contractor/statesandGET /nurse/states
Free tier gets you 50 requests/day — enough to prototype and test.
Top comments (0)