Quality scoring

The verdict answers “will mail to this address be delivered?” The quality score answers a different question: “is this address worth sending to?” A deliverable role address at a catch-all domain with a prior complaint is deliverable and low quality. The two are separate axes, and the score never changes, softens or restates the verdict.

How the score is computed

The score is a transparent, deterministic weighted model — not a language model and not a black box. The same inputs always produce the same score, and you can reproduce any score by hand from the published weights below. Scoring reads data already gathered during validation; it performs no new network work, triggers no DNS or SMTP probe, and never costs a credit on any surface.

The score starts from a base determined by the deliverability verdict, then adds or subtracts a fixed weight for each factor that applies. The result is the sum of the factor weights, floored at 0 and capped at 100.

Factors and weights

FactorEffectWhen it applies
verdict_deliverable+75 (base)The mailbox accepts mail (a deliverable verdict).
verdict_risky+45 (base)Delivery is uncertain (a risky verdict, such as a catch-all).
verdict_undeliverable+10 (base)The mailbox does not accept mail (an undeliverable verdict).
corporate_domain+15The domain is not a free consumer provider, on a deliverable or risky address.
role_address−12Addressed to a role (info@, sales@…) rather than a named person.
disposable_domain−25The domain is a disposable / throwaway mail provider.
catch_all_domain−10The domain accepts all mail, so this specific mailbox could not be confirmed.
prior_complaint−15A spam or abuse complaint is on record for this address.
prior_bounce−10This address bounced on a previous send.
typo_suggested−5The address looks like a typo of a more common spelling.
suppression_listedbase +10, then −5The address is on a suppression list (spam trap / abuse / do-not-mail).

Weights are configuration, not code. They are published here and can be tuned by the operator without a code change; changing them is a deliberate, recorded act. The values above are the defaults shipped with the product.

Bands

Every score is also placed in a band, using the same A–F grades and cut-offs as list health, so you see one vocabulary rather than two.

BandScoreReading
A90–100High quality.
B75–89High quality.
C60–74Moderate quality.
D40–59Low quality.
F0–39Low quality.

When a score is not available

Where the evidence is insufficient — an unknown verdict, or an address that has not been validated — the response returns "available": false with a reason, and no number. A default of 50 for “we don’t know” would be a lie with a number attached, so we do not invent one. Likewise, checked in the provenance means the probe ran — not that the answer is certain.

Reproduce a score by hand

Every scored result carries its factors. To check a score, start from the deliverability base and add each factor’s weight; floor the total at 0 and cap it at 100.

  • A deliverable corporate mailbox, no negatives: 75 (deliverable) + 15 (corporate) = 90 → A.
  • A deliverable personal Gmail address: 75 (deliverable) = 75 → B (free provider, so no corporate bonus).
  • A deliverable Gmail role address with a prior complaint: 75 − 12 (role) − 15 (complaint) = 48 → D.
  • hello@stripe.com — a risky, catch-all, corporate role address: 45 (risky) + 15 (corporate) − 12 (role) − 10 (catch-all) = 38 → F.

Where the score appears

  • /v1/validate returns an additive quality_score object alongside the existing fields — nothing else in the response changes.
  • explain_result (MCP) includes the score, its factors and a plain-language explanation.
  • The record detail page shows the score and its factors in plain language.
  • List health shows the score distribution across bands, alongside the verdict distribution.
  • The list view lets you filter and export by band — for example, export only addresses in band B and up.

Scoring is free everywhere. It never deducts a credit and never changes a billing outcome.

← All docs