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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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:

FactorWeightSource
License status
Active state license verified within the last 24 hours. 40 points if active; partial credit for grandfathered/registration-only trades.
40Ohio 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.
20County 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).
15Google Places API
BBB rating
BBB letter grade (A+ = 10, A = 9, B+ = 8, …). 0 if not BBB-listed.
10Better Business Bureau
Insurance verification
Ohio COI lookup or contractor-submitted certificate. All-or-nothing for v1; partial weights coming.
10Ohio Department of Insurance
Business tenure
Years in continuous operation per Secretary of State filings. 1 pt per year, capped at 5.
5Ohio Secretary of State
Total100

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.

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.

Methodology version 1.0 · published 2026-05-17 · last updated 2026-07-05

Maintained by ProFix Editorial Team. Spot an issue? Report it.

Emergency