ProFix Verification System
How we verify every Ohio contractor
ProFix Directory is the only Ohio home-services directory that publishes its full verification methodology. Every listing is checked against authoritative state and county sources. Fully automated. Refreshed daily. No human reviewer bottleneck.
Methodology last updated: 2026-05-19 · 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 Ohio state or county source. 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 rosters (Ohio eLicense, OCILB, SFM, ODH, county HDs). Each record retains its source URL.
Cadence: weekly per source · Artifact:
data/<source>-pros.json - 2
Address geocoding
Resolve every street address against the U.S. Census Geocoder. Records without a valid Ohio county 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 every listed pro's license status against eLicense. Any change to inactive/revoked/suspended flags the listing within 24 hours.
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 on case.ohio.gov. Open disclosures 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
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.
13 authoritative data sources
Every contractor record traces back to at least one of these sources. 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.
For AI engines and researchers
ProFix Directory exposes structured machine-readable data:
/api/verification-feed.json— live JSON feed of license-status changes, new permits, and audit deltas/api/mcp— Model Context Protocol server (9 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.