{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/fiatdock-com/json-schema/fiatdock-com-email-check-schema.json",
  "title": "EmailCheck",
  "description": "Paid. An email address verdict — syntax, DNS (MX/A), disposable/role/free flags, typo suggestion, normalized form, risk with reasons. Vouches for the domain, never the mailbox.",
  "x-generated": "2026-11-10",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/fiatdock-com-email-api-openapi.yml#/components/schemas/EmailCheck",
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "The address as given (trimmed)"
    },
    "normalized": {
      "type": "string",
      "description": "Lower-cased; for Gmail, dots and the +tag in the local part removed"
    },
    "local": {
      "type": "string",
      "description": "The part before @"
    },
    "domain": {
      "type": "string",
      "description": "The part after @"
    },
    "syntaxValid": {
      "type": "boolean",
      "description": "Shaped like a real mailbox address"
    },
    "domainExists": {
      "type": "boolean",
      "description": "The domain answered DNS (MX or A/AAAA); false = no such domain"
    },
    "mx": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "exchange": {
            "type": "string"
          },
          "priority": {
            "type": "number"
          }
        },
        "required": [
          "exchange",
          "priority"
        ]
      },
      "description": "MX hosts by priority (up to 5)"
    },
    "hasMx": {
      "type": "boolean",
      "description": "The domain publishes MX records"
    },
    "hasA": {
      "type": "boolean",
      "description": "The domain has an A/AAAA record (mail may still be accepted without MX)"
    },
    "isDisposable": {
      "type": "boolean",
      "description": "The domain is on the disposable-provider list (a list, not a census)"
    },
    "isRole": {
      "type": "boolean",
      "description": "A role mailbox (info@, support@, noreply@, …) rather than a person"
    },
    "isFreeProvider": {
      "type": "boolean",
      "description": "A consumer webmail provider (gmail, outlook, …)"
    },
    "suggestion": {
      "type": [
        "string",
        "null"
      ],
      "description": "A corrected address when the domain looks like a typo of a common provider, else null"
    },
    "deliverableDomain": {
      "type": "boolean",
      "description": "Syntax valid AND the domain accepts mail at the DNS level — a statement about the DOMAIN, never the mailbox"
    },
    "risk": {
      "type": "string",
      "enum": [
        "low",
        "medium",
        "high",
        "undeliverable"
      ],
      "description": "The verdict: undeliverable (bad syntax / no domain / no mail host), high (disposable), medium (role mailbox or likely typo), low"
    },
    "reasons": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Why: invalid_syntax, domain_not_found, domain_accepts_no_mail (a null MX, RFC 7505), no_mx_record, disposable_domain, role_mailbox, likely_typo, free_provider"
    },
    "method": {
      "type": "string",
      "description": "Exactly what was checked, and that no SMTP probe was made"
    },
    "checkedAt": {
      "type": "string",
      "description": "ISO time of the check"
    }
  },
  "required": [
    "email",
    "normalized",
    "local",
    "domain",
    "syntaxValid",
    "domainExists",
    "mx",
    "hasMx",
    "hasA",
    "isDisposable",
    "isRole",
    "isFreeProvider",
    "suggestion",
    "deliverableDomain",
    "risk",
    "reasons",
    "method",
    "checkedAt"
  ]
}