mailprobe-dev · Schema

VerifyEntry

A verification result, or — when the submitted entry was not a JSON string — an `InvalidEntry` placeholder that keeps the array aligned with the input.

CompanyEmail VerificationAPIReal-timeDeveloper Tools
View JSON Schema on GitHub

JSON Schema

mailprobe-dev-verify-entry-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/mailprobe-dev/json-schema/mailprobe-dev-verify-entry-schema.json",
  "title": "VerifyEntry",
  "description": "A verification result, or — when the submitted entry was not a JSON string — an `InvalidEntry` placeholder that keeps the array aligned with the input.",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/mailprobe-dev-openapi.yml#/components/schemas/VerifyEntry",
  "oneOf": [
    {
      "$ref": "#/$defs/VerifyResult"
    },
    {
      "$ref": "#/$defs/InvalidEntry"
    }
  ],
  "$defs": {
    "InvalidEntry": {
      "type": "object",
      "description": "Returned in place of a result when the submitted entry was not a JSON string. It has no `result` field, and the credit for that slot is still consumed.",
      "required": [
        "error"
      ],
      "properties": {
        "email": {
          "description": "The offending entry, echoed back as submitted — any JSON value, since only strings are verifiable."
        },
        "error": {
          "type": "string",
          "enum": [
            "invalid"
          ]
        }
      }
    },
    "VerifyResult": {
      "type": "object",
      "properties": {
        "email": {
          "type": "string",
          "description": "The submitted address, lower-cased and trimmed."
        },
        "result": {
          "type": "string",
          "description": "Raw verdict from the verification pipeline.",
          "enum": [
            "deliverable",
            "undeliverable",
            "catch-all",
            "unknown"
          ]
        },
        "status": {
          "type": "string",
          "description": "Actionable rollup above `result` — the field most integrations filter on. `valid` = deliverable and clean; `invalid` = bad syntax, no MX, or rejected; `risky` = accepted but uncertain (catch-all, role-based, disposable, or a provider that blocks probing such as Microsoft consumer domains); `unknown` = could not be determined by our probe: transient (network-level failure, unresolved MX, greylisting) or a sender-policy rejection that will recur. Filtering out `risky` discards deliverable Microsoft mailboxes — score them instead.",
          "enum": [
            "valid",
            "risky",
            "invalid",
            "unknown"
          ]
        },
        "score": {
          "type": "integer",
          "description": "Deterministic 0-100 confidence value derived only from the signals in this response — no model, no stored data. Rough bands: 90+ deliverable and clean, ~65 probe-blocking provider (well-formed address on a live major-provider MX), ~55 catch-all, ~50 greylisted, <=15 disposable, 0 invalid. Role-based and suspected-typo addresses are penalised.",
          "minimum": 0,
          "maximum": 100
        },
        "catch_all": {
          "type": "boolean",
          "description": "The domain accepts every address, so the mailbox cannot be confirmed individually."
        },
        "reason": {
          "type": [
            "string",
            "null"
          ],
          "description": "Why the verdict is not a plain `deliverable`, `null` otherwise. `accept_all` = catch-all domain; `greylisting` is a temporary (4xx) deferral at RCPT TO: the server evaluated the recipient and asked us to come back, so the mailbox likely exists. `deferred` is a temporary (4xx) refusal earlier in the conversation (banner, EHLO or MAIL FROM) — the server turned us away before we could ask about the mailbox, so it tells you nothing about the address and scores lower. Both are worth retrying and both carry `retry_after`. `provider_blocks_probe` is a server where probing is structurally impossible, so the address could not be judged: either a provider known in advance to block probes, or any server answering `530 Authentication required` — it accepts no unauthenticated transaction from anyone, which says nothing about our sender and nothing about the mailbox. `no_banner`, `ehlo_rejected` and `mail_from_rejected` mean the server refused our probe permanently (5xx) at that step and will refuse it again; `unexpected_code` is a permanent (5xx) refusal that named no cause, or a reply outside every known class (neither 250/251, nor 4xx, nor 5xx), and is worth reporting to us; `mailbox_full` = the server confirmed the mailbox but it is over quota (4.2.2), so nothing can be delivered today; `policy_rejected` = the receiving server refused the sender (our IP, HELO or MAIL FROM) with a 5.7.x status — it says nothing about the mailbox. The enhanced status decides, not the reply code: a `571` or a non-standard 5xx carrying 5.7.x is the same refusal as a `554 5.7.1`; `mx_unresolved` = the MX host could not be resolved: transient when `result` is `unknown` (our resolver got no answer, retry later), permanent when `result` is `undeliverable` (DNS says the host does not exist or has no address).",
          "enum": [
            "accept_all",
            "connection_error",
            "deferred",
            "ehlo_rejected",
            "greylisting",
            "invalid_syntax",
            "mail_from_rejected",
            "mailbox_full",
            "mx_private_ip",
            "mx_unresolved",
            "no_banner",
            "no_mx",
            "policy_rejected",
            "protocol_error",
            "provider_blocks_probe",
            "timeout",
            "unexpected_code",
            null
          ]
        },
        "retry_after": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Suggested wait, in seconds, whenever the server answered with a temporary (4xx) deferral at any step — greylisting, busy server, temporary sender block. `null` when no retry is advised."
        },
        "smtp_code": {
          "type": [
            "integer",
            "null"
          ],
          "description": "SMTP reply code observed on the RCPT probe, `null` when no handshake took place."
        },
        "smtp_enhanced_code": {
          "type": [
            "string",
            "null"
          ],
          "description": "Enhanced status code (RFC 3463) the server sent alongside the reply, exactly as written — `null` when it sent none. It is what disambiguates `smtp_code`, which cannot: a bare `550` is `5.1.1` when the mailbox does not exist and `5.7.x` when the server refused the sender (our IP, HELO or MAIL FROM) and said nothing about the mailbox. Class `4` values are temporary — `4.2.2` is the over-quota mailbox reported as `mailbox_full`."
        },
        "syntax": {
          "type": "boolean",
          "description": "The address is RFC-valid."
        },
        "mx_found": {
          "type": "boolean",
          "description": "The domain publishes usable MX records."
        },
        "smtp_check": {
          "type": "boolean",
          "description": "An SMTP conversation actually took place (false when the server was unreachable)."
        },
        "disposable": {
          "type": "boolean",
          "description": "Domain listed as disposable / throwaway."
        },
        "role_based": {
          "type": "boolean",
          "description": "Local part is a role alias (info, support, contact…) rather than a person."
        },
        "free_provider": {
          "type": "boolean",
          "description": "Domain belongs to a free consumer mailbox provider."
        },
        "did_you_mean": {
          "type": [
            "string",
            "null"
          ],
          "description": "Suggested correction for a likely typo (e.g. `gmial.com` -> `gmail.com`), `null` when the domain looks intentional."
        },
        "mx_records": {
          "type": "array",
          "description": "MX hostnames found for the domain, in priority order, capped at the first 10. Empty when none.",
          "items": {
            "type": "string"
          }
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/mailprobe-dev-verify-entry"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.