DEV Community

lulzasaur
lulzasaur

Posted on

Verify Professional Licenses via API — Contractors, Nurses, and Healthcare Providers

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:

  1. User claims license #1096738 in California
  2. Your team manually goes to cslb.ca.gov
  3. Searches for the license number
  4. Copies the status, expiration date, business name
  5. 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"
Enter fullscreen mode Exit fullscreen mode

Output:

Business: NOOR ELECTRIC
Status: Active
Type: General Building Contractor
Expires: 09/30/2026
Source: CSLB
Enter fullscreen mode Exit fullscreen mode

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"
})
Enter fullscreen mode Exit fullscreen mode

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")
Enter fullscreen mode Exit fullscreen mode

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`);
}
Enter fullscreen mode Exit fullscreen mode

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")
Enter fullscreen mode Exit fullscreen mode

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

Free tier gets you 50 requests/day — enough to prototype and test.

Top comments (0)