Consumer trust is the only moat that matters for home services marketplaces. You can outspend competitors on ads, build a slicker mobile app, or offer lower take rates - but if a consumer hires an unlicensed contractor through your platform who burns their kitchen down, none of that matters. The platform is liable. The brand is damaged. The lawsuit is expensive.
Platforms like Thumbtack and Angi figured this out early. Contractor compliance is not a nice-to-have feature. It is the foundation of the business model. This post lays out the four-tier compliance framework we see working well for home services marketplaces of various sizes, from scrappy regional players to national platforms with hundreds of thousands of contractors.
Why Compliance Matters More Than You Think
The obvious reason to verify contractor licenses is consumer protection. The less obvious reason is platform survival. Consider the liability chain:
- Consumer hires an unlicensed electrician through your platform
- Electrician's work is faulty - causes a fire
- Insurance company investigates - finds contractor was unlicensed
- Insurance denies claim (unlicensed work is often excluded)
- Consumer sues the platform for facilitating a transaction with an unlicensed contractor
- Platform's attorney argues "we're just a marketplace" - court disagrees if you market contractors as "verified" or "licensed"
The FTC has increased scrutiny of marketplace trust signals. If you display a "licensed" badge and the contractor is not actually licensed, that is potentially deceptive advertising - a separate problem entirely from the tort liability above.
Insurance carriers for home services platforms increasingly require documented verification procedures as a condition of coverage. Some E&O policies now explicitly exclude incidents involving contractors whose verification records cannot be produced on request.
Tier 1 - License Verification at Onboarding
License verification before a contractor can accept any job
Hard requirement. No exceptions. No grace periods for "provisional" contractors.
Tier 1 is the simplest to implement and the hardest to enforce culturally. Engineering teams often want to allow provisional accounts. Sales teams want lower friction to hit signup numbers. Resist both pressures. The moment you allow a contractor to accept a job without verified licensing, you have created the liability scenario described above.
The practical implementation: when a contractor completes signup and enters their license number, trigger a verification call immediately. If the license comes back active, the account is approved. If not, the account stays in "pending" status with a clear message explaining what to do next (re-enter the correct license number, contact your state board to check status, etc.).
For detailed integration patterns, see our post on integrating license verification into your onboarding flow.
State-Specific Licensing Thresholds
Not every state requires a license for every type of work, and your verification logic needs to know this. Key examples:
- California: Requires a CSLB license for any project over $500 in labor and materials combined. Under $500, handyman work is unlicensed. This threshold is actually enforced - contractors who exceed it without a license face criminal liability.
- Texas: No general contractor license requirement at the state level, but electrical, HVAC, plumbing, and several other trades have separate state licensing requirements.
- New York: Home improvement contractor registration is separate from trade licenses. A contractor can be licensed as an electrician but still need to register as a home improvement contractor to legally do residential work.
- Florida: One of the most complex - state licenses, county licenses, and municipal licenses can all apply to the same job depending on scope.
Your onboarding flow needs to collect enough information (state, trade category, job types offered) to determine which verifications are required. See our state-by-state license requirements guide for the full breakdown.
Trade-Specific Credentials
Beyond state licenses, some trades have additional certifications that carry legal or liability weight:
- HVAC: EPA Section 608 certification is required by federal law for anyone handling refrigerants. This is a federal credential, not state-specific. An HVAC contractor without an EPA 608 cert cannot legally service refrigerant systems - and you cannot legally facilitate that work.
- Electrical: Most states license electricians at the state level, but many jurisdictions additionally require local permits for specific job types. Verify the state license at onboarding; alert the consumer to check for required permits on the job page.
- Lead paint work (pre-1978 homes): EPA RRP (Renovation, Repair, and Painting) certification is federally required for disturbing lead paint in pre-1978 homes. Critical for any platform servicing older housing stock.
- Mold remediation: Some states (Florida, Texas) have specific mold assessor and remediator licenses. Many platforms miss this one.
Tier 2 - Periodic Re-Verification
Re-verify every active contractor at minimum every 90 days
Automated batch run. Flag expiring licenses 30 days before expiration for proactive outreach.
A license that was valid at onboarding can expire, be suspended for a consumer complaint, or be revoked for code violations at any time. Onboarding verification gives you a point-in-time snapshot. Periodic re-verification keeps your data current.
90-day re-verification is the industry standard for active platforms. Some high-volume platforms run monthly sweeps for their top-tier contractors. The right frequency for you depends on your risk tolerance and your contractor activity level - a contractor who has not accepted a job in 6 months poses lower ongoing risk than one working 5 jobs a week.
Expiration Warning System
The API returns an expiration_date field for most state licenses. Use this to build a proactive warning system:
- 60 days before expiration: Email to contractor - "Your license expires in 60 days. Renew at [state board URL] to maintain your account status."
- 30 days before expiration: Second email, more urgent. Flag the contractor in your internal dashboard for ops review.
- 7 days before expiration: Final warning. Make the expiration visible in the contractor's dashboard. Optionally suppress new job assignments until renewal is confirmed.
- Day of expiration: If API check still shows inactive/expired, automatically suspend job acceptance until re-verification passes.
This proactive approach dramatically reduces the number of contractors who hit the hard suspension point because they forgot to renew. It also generates goodwill - contractors appreciate being reminded rather than suddenly finding their account blocked.
Sample Email Template - 30-Day Warning
Subject: Your contractor license expires in 30 days - action required
Hi [Name],
Your [state] [trade] license (number [XXXX]) expires on [date]. To keep your account active on [Platform], you will need to renew before that date.
Renew at: [state board URL]
Once renewed, your updated status will be automatically detected within 24 hours - no action needed on your part.
Questions? Reply to this email or visit [help URL].
Tier 3 - Real-Time Check for High-Value Jobs
Real-time license check when a contractor accepts a job above $5,000
Force a fresh API lookup, bypassing cache, before confirming the job assignment.
Most verification checks can use cached data - a license verified yesterday is almost certainly still valid today. But for high-value jobs, the cost of acting on stale data is significant enough to justify a real-time lookup.
The $5,000 threshold is a reasonable default for most platforms. Adjust based on your job distribution and your risk tolerance. A roofing marketplace might set it at $10,000 because their average job is already $8,000. A handyman marketplace might set it at $2,500.
The implementation is straightforward: in the job acceptance flow, when the job value exceeds your threshold, trigger a force_fresh=true API call. If it returns active, proceed. If it returns anything else, block the acceptance and trigger the license failure flow described below.
The latency cost of a real-time lookup is 2-8 seconds depending on the state board. This is acceptable for a high-stakes transaction. Use a loading state in your UI - do not leave the contractor staring at a blank screen while the check runs.
Tier 4 - Consumer-Facing Verification Badge
Display "License Verified [date]" on contractor profiles and job confirmation pages
Converts your compliance infrastructure into a competitive advantage.
The work you are doing on tiers 1-3 should be visible to consumers. A "License Verified" badge with the date of the most recent check accomplishes several things:
- Differentiates your platform from competitors who do not verify
- Sets consumer expectations and reduces post-job disputes about contractor qualifications
- Creates a marketing message that is true and auditable
- Provides legal cover - you can demonstrate what you represented was accurate at the time of representation
Be specific about what the badge means. "License Verified on March 15, 2026" is stronger than just "Verified" - it tells the consumer exactly when the check was done and implies ongoing monitoring rather than a one-time check.
Do not show the badge for trades or states where licensing is not required. Showing "License Verified" for a handyman doing $300 of painting in a state with no handyman licensing requirements is misleading - there is nothing to verify. Show "No state license required for this service type" instead.
What to Do When a License Fails
Every platform needs a documented process for what happens when a verification check returns a negative result. Improvising case-by-case creates inconsistency and liability.
The Grace Period Decision
When an active contractor's license check returns expired or suspended, the instinct is to immediately block their account. This is the right call for a new onboarding check. For an existing active contractor, consider a 5-business-day self-cure window:
- Send immediate notification explaining the status and what to do
- Allow existing accepted jobs to be completed (or reassigned if the suspension reason is serious)
- Block new job acceptance immediately
- Auto-run a follow-up verification check on day 3 and day 5
- If still inactive on day 5, move to formal suspension
A 5-day grace period is appropriate for expired licenses (contractor probably just forgot to renew). It is not appropriate for suspended licenses - suspension typically means a disciplinary complaint is active. Distinguish between status_reason: expired and status_reason: suspended in your logic.
Distinguishing Disciplinary Actions
The API returns a disciplinary_actions array when available. Not all violations are equal:
- Administrative violations (missed paperwork, late renewal): Low severity. Grace period appropriate.
- Consumer complaint pending review: Medium severity. Block new job acceptance; allow completion of existing jobs under ops review.
- License suspension - active investigation: High severity. Immediate full suspension. No exceptions.
- License revocation: Permanent removal from platform.
Bond and Insurance Verification
License verification is necessary but not sufficient for full contractor compliance. Consumer protection also depends on bond and insurance coverage.
The API returns a bond_amount field and bond_status field for states that maintain bond records. A contractor bond protects consumers if the contractor abandons a job, causes damage, or commits fraud. Check that:
- The bond amount meets the state minimum requirement for your job types
- The bond is active (bonds can lapse just like licenses)
- For larger jobs, the bond amount is adequate for the job size (a $5,000 bond protecting a $25,000 kitchen remodel is insufficient consumer protection)
For general liability insurance and workers' compensation, the API cannot verify these directly - they are typically maintained by insurance carriers, not state licensing boards. Build a document collection step into your onboarding flow for GL and WC certificates of insurance, and set calendar reminders to request updated COIs when they expire.
Building the Compliance Dashboard
Your ops team needs visibility into the state of contractor compliance across your entire base. Build or buy a dashboard that shows:
- Total active contractors by status (verified, expiring-soon, expired, suspended)
- Contractors with licenses expiring in the next 30/60/90 days
- Recent verification failures with contractor details for ops follow-up
- Verification check history per contractor (audit trail)
- States or trade categories with high failure rates (signals a data issue or a bad-actor pattern)
This dashboard serves two functions: daily ops work and compliance audit response. When a regulator, insurance carrier, or plaintiff's attorney asks "how do you verify your contractors," you want to be able to pull a report that shows every verification check, every result, and every action taken.
Implementation Checklist
- Collect license number, state, and trade category during contractor signup
- Block job acceptance until Tier 1 verification passes
- Store verification results with timestamp in your database
- Set up 90-day re-verification batch job (cron or scheduled task)
- Build expiration warning emails at 60/30/7 days
- Implement Tier 3 real-time check for jobs above your value threshold
- Add "License Verified [date]" badge to contractor profiles and job confirmation
- Document the grace period and suspension policy in your contractor terms
- Build the compliance dashboard with audit trail export
- Test the failure flow - does the contractor actually get notified? Does job acceptance actually block?
- Review state-specific thresholds for trades you support
- Add EPA 608 verification for HVAC contractors
- Collect and refresh GL insurance certificates
The platforms that get compliance right do not treat it as a checkbox exercise. They build systems that run automatically, surface issues before they become incidents, and create paper trails that demonstrate due diligence at every step. The liability exposure from getting this wrong is existential. The cost of getting it right - with API-based automation - is a rounding error in the platform budget.