How it works

How a Better Vetters contractor check works.

A check takes a contractor’s name (and optionally state, city, license number, phone, or website), finds the best match in official license records, attaches insurance, permit, and discipline records where they exist, and returns a verdict, a 0 to 100 trust score, and the reasons behind it. Everything comes from official open-data sources, and every response says when each source was last refreshed.

The steps

From request to verdict.

  1. You send a request. POST /v1/contractor/check with a Bearer API key. name is required; state is strongly recommended.
  2. We normalize the name. Accents are folded, & becomes AND, punctuation and suffixes such as LLC and INC are dropped, and DBA tails are removed.
  3. We find candidates. A typo-tolerant search over the license records finds likely matches, which are then re-scored by name similarity.
  4. We score the match. An exact license number, phone, city, or website-domain agreement raises confidence. A name alone never exceeds 0.95.
  5. We attach the records. Insurance and bond (WA and OR), permits (Seattle, Austin, NYC), and discipline (WA suspension dates, NYC DCWP charges), each with a link to the source record where available.
  6. We score the contractor. A weighted trust score and a verdict, with reason codes that show how the score was built.
  7. You get one JSON response including data_freshness and billing.

Verdicts and score

How the trust score and verdict are built.

The score is a weighted sum, normalized to 100 over only the components that can speak to this contractor.

ComponentWeightNotes
License status and expiry50Active scores full; expiring within 60 days scores less; expired, suspended, or revoked score little or none.
Insurance and bond12Washington and Oregon only. Insurance 8, bond 4.
Discipline13WA suspension on record, or NYC DCWP guilty findings in the last 3 years.
Permit activity25Only counted when permits are found. Zero permits is neutral, because permit coverage is one city per state.

Caps: a suspended or revoked license caps the score at 15, an expired license at 45, and an ambiguous match at 70. A fuzzy name-only match below 0.8 confidence, with no license-number or phone match, returns needs_review and is capped at 50.

VerdictWhat it means
trustedConfident match (confidence 0.8+) with a score of 80 or more. License in good standing in the covered sources.
likely_okMostly clean, score 60 to 79. Worth a glance, not a blocker.
cautionNeeds a human look, score 35 to 59. For example an expired license or enforcement findings.
high_riskLicense suspended or revoked, or a score under 35 in the covered sources.
needs_reviewThe closest record is only a fuzzy name match: confidence below 0.8 with no license-number or phone match. The score is capped at 50. Confirm it is the right business before relying on it.
unknownNo reliable match to score, so no judgment either way.
not_foundNo matching record in the covered sources. A missing record is not proof of a problem.
out_of_coverageThe contractor’s state is outside current coverage (WA, TX, NY, OR, CT, PA). Not charged. In Pennsylvania only Pittsburgh is covered.

Compared with doing it by hand

One call instead of one portal per place.

The issuing agency’s own site is always the authoritative record, and every license result includes a link to it where one exists.

Looking up each source by handOne Better Vetters call
SourcesA separate portal or dataset for each state and cityNine official datasets from WA, TX (with Austin), and NYC behind one endpoint
OutputEach publisher’s own fields and wordingOne JSON shape: verdict, score, reasons, license, insurance and bond, permits, discipline, freshness
Name matchingYou search and compare names yourselfNormalized, typo-tolerant matching with a 0 to 1 confidence and alternate candidates
Use from an agentNeeds browsing or custom parsingREST and MCP, OpenAPI 3.1 spec, and llms.txt
FreshnessCheck each page’s own datePer-source last_refreshed_at and publisher_updated_at in every response
CostFree to look up; your time$0.15 per check; 20 free with a new key

Billing

What a check costs.

$0.15 per check, and every new API key includes 20 free checks with no card. A check that returns not_found or unknown is charged because the search ran. out_of_coverage requests and server errors are not charged. Retries with an Idempotency-Key are free. When credits run out the API returns HTTP 402 with a machine-readable body. Details on the pricing page.

All credit purchases are final and non-refundable, except where applicable law requires a refund, or to correct a duplicate or erroneous charge. Credits do not expire while the account is active.

What it is not

Public records, not a consumer report.

It tells you

  • Whether a license record matches, and its status and expiry
  • Insurance and bond on file (WA and OR)
  • Permits naming the contractor in Seattle, Austin, or NYC
  • WA suspension dates and NYC DCWP charges

It does not tell you

  • Anything outside WA, TX, NYC, OR, CT, and Pittsburgh, PA
  • That a missing record means a problem
  • Anything a consumer report would cover

Do not use results for employment, credit, insurance, or tenant-screening decisions. See the Terms of Service. Where each source comes from: Coverage.

Next

Go deeper.

Run your first 20 checks free.

Create a key and send one request.

create a key
# Get a key (20 free checks, no card). The key is shown once.
curl -s -X POST https://api.bettervetters.com/v1/keys \
  -H 'content-type: application/json' \
  -d '{"label":"my-agent"}'