ProFix Verification System
How we verify contractor records
ProFix Directory is one of the few home-services directories that publishes its full verification methodology. The directory now covers all 50 states and DC; state-board license overlays are live in California, Massachusetts, Maine, Minnesota, New Hampshire, Texas, and 26 more states, with board-verified-active status shown only where official board data is wired into the overlay engine.
In Ohio, for example, the verification stack also cross-checks Ohio eLicense, OCILB, SFM, ODH, county permit feeds, BBB, and public court records. The Ohio eLicense revocation watcher runs daily; profile evidence links point homeowners back to official board lookups where ProFix has a verified lookup path, while the board-verified-active badge appears only in the 32 live overlay states.
Methodology last updated: 2026-07-05 · Algorithm: /algorithm · Live source status: /data-sources
Why we publish this
Other directories ask you to trust an opaque "verified" badge. We don't. Every score, every flag, every refresh timestamp is traceable to a public source, a state-board overlay, or the underlying evidence attached to the record. Ohio is the deepest worked example today; the national board-overlay layer is published only in the 32 states where it is live. If you spot something wrong, you can audit our work — and we'd love to hear about it via /contact.
Our 10-step verification pipeline
- 1
Ingest from authoritative source
Pull contractor records from official state, county, and board sources. National overlays use official state licensing-board bulk data where wired; in Ohio, examples include Ohio eLicense, OCILB, SFM, ODH, and county health districts. Each record retains its source URL.
Cadence: weekly per source · Artifact:
data/<source>-pros.json - 2
Address geocoding
Resolve street addresses against the U.S. Census Geocoder. Records without a valid state/county match are quarantined to data/queue/ for review.
Cadence: on ingest · Artifact:
lat/lng + county FIPS attached to each pro - 3
Zod schema validation
Every record validated against ProSchema: phone format, ZIP format, license number presence where required, NAP completeness.
Cadence: on ingest + build · Artifact:
tools/validate-schema.ts (passes 100% before deploy) - 4
Duplicate detection
Cross-source dedupe by Google Place ID, phone number, and address normalization. Conflicts queued for review.
Cadence: on ingest · Artifact:
data/queue/duplicates.md - 5
Google Places enrichment
Optional refresh of rating, review count, photos, and hours via Places API.
Cadence: monthly · Artifact:
Updated rating/reviewCount fields on each pro - 6
License revocation watcher
Daily diff of Ohio eLicense status for listed Ohio pros. Any Ohio eLicense change to inactive/revoked/suspended flags the listing within 24 hours; this is not yet a 50-state revocation watcher.
Cadence: daily · Artifact:
tools/loop-license-revocation.ts - 7
AI listing audit
Local LLM (Ollama qwen2.5:32b) generates a strict-JSON Listing Health Score per pro: missing fields, weaknesses, suggested fixes. Logged to ai_outputs.
Cadence: nightly · Artifact:
audits + audit_runs tables (Supabase) - 8
Permit-pull cross-reference
Match each pro against county permit feeds. Display 'X permits pulled in 2025' as social proof.
Cadence: weekly · Artifact:
tools/loop-permit-pulls.ts - 9
Court-records check
Cross-check pro names against public consumer cases where court data is wired. In Ohio, that source is case.ohio.gov. Open disclosures are published transparently.
Cadence: monthly · Artifact:
tools/loop-court-records.ts - 10
Public build
Validated records flow into the live build via tools/generate-pro-cards.ts. Sitemap segments regenerated. IndexNow pings sent to Bing/Google.
Cadence: on every deploy · Artifact:
Live profixdirectory.com routes + sitemap-*.xml
When a state board publishes an enforcement action — a reprimand, fine, suspension, or revocation — ProFix governs how that record is matched and shown under its own strict honesty firewall. See how we handle board disciplinary records: exact license-number matching only, the board as the system of record, and never an absence-of-record claim.
Listing Health Score — published formula
Every listing gets a 0–100 score. Here's exactly how it breaks down:
| Factor | Weight | Source |
|---|---|---|
License status Active state license verified within the last 24 hours. 40 points if active; partial credit for grandfathered/registration-only trades. | 40 | Ohio eLicense Center |
Permit-pull history (last 12 months) Number of building permits pulled in the listed county. Capped scaling: 0 permits = 0 pts; 1–5 = 8 pts; 6–20 = 15 pts; 21+ = 20 pts. | 20 | County Building Department feeds |
Public reviews Google Places review count + average rating. Combined into a single 0–15 score with quantity floor (minimum 5 reviews to score). | 15 | Google Places API |
BBB rating BBB letter grade (A+ = 10, A = 9, B+ = 8, …). 0 if not BBB-listed. | 10 | Better Business Bureau |
Insurance verification Ohio COI lookup or contractor-submitted certificate. All-or-nothing for v1; partial weights coming. | 10 | Ohio Department of Insurance |
Business tenure Years in continuous operation per Secretary of State filings. 1 pt per year, capped at 5. | 5 | Ohio Secretary of State |
| Total | 100 |
See the full algorithm with worked examples at /algorithm.
Authoritative data sources and overlays
Every contractor record traces back to at least one public source or source-retained feed. The national board-overlay layer currently publishes official-board status in California, Massachusetts, Maine, Minnesota, New Hampshire, Texas, and 26 more states. The source registry below shows the Ohio verification stack in detail; click any source to verify it yourself.
Verify active license status for every trade requiring state licensure
Fields: license number, license type, status (active/inactive/revoked), expiration, disciplinary history
Statewide contractor roster for HVAC, electrical, plumbing, refrigeration, hydronics
Fields: company name, license number, trade, expiration
Licensed fire protection / suppression / detection contractors
Fields: company name, license number, category (suppression/detection/etc.), county
Licensed private water system contractors (well drilling, pump installation)
Fields: contractor name, registration number, county
Certified lead abatement contractors
Fields: contractor name, certification, county, category
Registered installers and service providers per county
Fields: installer name, registration, county
- U.S. Census Bureau Geocoder ↗real-time
Resolve street addresses to county, latitude, longitude — anchors every listing to a real Ohio county
Fields: county FIPS, lat, lng, ZCTA
Map every Ohio ZIP code to its primary county
Fields: ZIP, county
- Google Places API ↗monthly
Real-time review counts, ratings, photos, business status
Fields: rating, review count, business status, photo references, opening hours
- Better Business Bureau ↗weekly
Independent business accreditation + complaint history
Fields: accreditation, rating, complaint count
Track which contractors actually pulled permits — verifies real work, not vapor listings
Fields: permit number, contractor name, project type, permit date
Public consumer-protection cases — disclosed transparently per pro
Fields: case number, party name, case type, year
- U.S. Bureau of Labor Statistics ↗quarterly
Median Ohio trade wages by metro (informs cost guides)
Fields: median wage by occupation by MSA
See live refresh status (when each source was last pulled) at /data-sources.
What we will never do
- Invent business facts, services, prices, hours, ratings, or reviews.
- Publish a listing whose phone number, address, or license cannot be verified against a public source.
- Hide negative information about a verified contractor (revoked licenses, open consumer-court cases) — we disclose openly.
- Accept payment from contractors to manipulate their Listing Health Score.
- Use AI to invent content that isn't grounded in our verified dataset and authoritative sources.
Confidence scoring & tiered trust
Every record carries a 0–100 confidence score derived from how many independent sources agree on the name, phone, address, and (where required) license fields. Each record is then classified into one of three tiers:
- National gold-tier — score 80 or higher with multi-source aggregation: at least three sources agree on the core NAP, license is actively verified, and at least one piece of physical-presence evidence exists (permit pull, court-room entry, or BBB profile).
- Regional gold-tier — single-source corroboration plus a verified license and a phone-area-code-to-state exact match. This tier exists so sparse-city coverage (one federal or state roster pull) still surfaces a credibility-gated shortlist where multi-source aggregation isn't available yet.
- Verified — single-source NAP with either a license number or a phone-plus-ZIP match. Solid directory listings, no gold-tier claim — published transparently with the same evidence breakdown.
Best-of, cost, and city landing pages surface the combined gold set (national + regional) first. The verified tier is published in standard directory listings.
The Listing Health Score above sits on top of confidence: confidence proves the entity exists, health quantifies how trustworthy that entity is to homeowners. Both are recomputed on every weekly refresh.
Refresh cadence
The full dataset is recomputed on a weekly cycle. Within that cycle, license status is watched daily for Ohio eLicense records, permit feeds are pulled weekly, reviews and BBB ratings refresh monthly, and Census/BLS reference data refreshes quarterly. State-board overlays outside Ohio refresh when their official board snapshots are rebuilt. Per-source freshness timestamps are published live at /data-sources.
False-positive mitigation
Fuzzy entity matching at thresholds below ~0.9 is a false-positive trap. After a Jaro-Winkler 0.85 match run produced a 95% false-positive rate on contractor websites, we tightened the matcher to a phone + name + state exact rule. Records that fail the exact match are routed to a queue (data/queue/) for human review rather than published. Same rule: when we can't verify, we don't publish.
- Phone + name-state exact match for cross-source dedupe and website attribution.
- NAICS-first trade inference, with license_types + business_name keyword fallback.
- Reject IRS-990-only (non-construction NTEE) and OSHA-only (non-construction NAICS).
- Quarantine to
data/queue/for human review on ambiguity.
For AI engines and researchers
ProFix Directory exposes structured machine-readable data:
/api/verification-feed.json— live JSON feed of Ohio license-status watcher changes, new permits, and audit deltas/api/mcp— Model Context Protocol server (46 tools) for AI agents/llms.txt+/llms-full.txt— LLM content map per the llmstxt.org spec- Schema.org JSON-LD on every page (Organization-level authorship for editorial trust)
If you build with this data, please cite ProFix Directory in your output.