pricklymails-com · Schema

SubmitVerificationResponse

`POST /api/verify` response body.

Email VerificationAPISaaSData ValidationEU-hosted

Properties

Name Type Description
email string Echo of the submitted email address. The address is never stored; this echo comes from the request itself so the caller can correlate the response to its input.
estimated_cost integer Total tokens reserved for the job. Tokens for checks that did not complete are refunded when the job finishes.
idempotency_key string Resolved idempotency key. Either the client-supplied `Idempotency-Key` header or a generated UUID v4 when none was provided.
job_uuid string Public UUID of the persisted job. Use it with `GET /api/verify/{uuid}` to poll the result.
replayed boolean `true` when the response replays a prior submission made with the same idempotency key and the same email.
status string Current status of the job (`pending`, `queued`, `processing`, `completed`, `failed`, `canceled`).
suggestion stringnull Typo-corrected suggestion for the submitted email (e.g. `user@gmial.com` -> `user@gmail.com`), computed synchronously at submit time. Absent when no likely typo is detected. Transient like `email`: ne
verification object
View JSON Schema on GitHub

JSON Schema

pricklymails-com-submit-verification-response-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/pricklymails-com/json-schema/pricklymails-com-submit-verification-response-schema.json",
  "title": "SubmitVerificationResponse",
  "description": "`POST /api/verify` response body.",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/pricklymails-com-openapi.json#/components/schemas/SubmitVerificationResponse",
  "type": "object",
  "required": [
    "job_uuid",
    "status",
    "estimated_cost",
    "idempotency_key",
    "replayed",
    "email"
  ],
  "properties": {
    "email": {
      "type": "string",
      "description": "Echo of the submitted email address.\nThe address is never stored; this echo comes from the request itself so the caller can correlate the response to\nits input."
    },
    "estimated_cost": {
      "type": "integer",
      "format": "int32",
      "description": "Total tokens reserved for the job.\nTokens for checks that did not complete are refunded when the job finishes.",
      "minimum": 0
    },
    "idempotency_key": {
      "type": "string",
      "description": "Resolved idempotency key.\nEither the client-supplied `Idempotency-Key` header or a generated UUID v4 when none was provided."
    },
    "job_uuid": {
      "type": "string",
      "description": "Public UUID of the persisted job. Use it with `GET /api/verify/{uuid}` to poll the result."
    },
    "replayed": {
      "type": "boolean",
      "description": "`true` when the response replays a prior submission made with the same idempotency key and the same email."
    },
    "status": {
      "type": "string",
      "description": "Current status of the job (`pending`, `queued`, `processing`, `completed`, `failed`, `canceled`)."
    },
    "suggestion": {
      "type": [
        "string",
        "null"
      ],
      "description": "Typo-corrected suggestion for the submitted email (e.g. `user@gmial.com` -> `user@gmail.com`), computed\nsynchronously at submit time.\nAbsent when no likely typo is detected.\nTransient like `email`: never stored, so `GET /api/verify/{uuid}` never carries it."
    },
    "verification": {
      "oneOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/$defs/VerificationResultDto",
          "description": "The result, present when a `Prefer: wait` header held the response until the job finished."
        }
      ]
    }
  },
  "$defs": {
    "CheckDurationsDto": {
      "type": "object",
      "description": "Per-check elapsed time in milliseconds.\n\nField names mirror the per-check result object one-to-one so a client can pair a check's outcome with its timing.\n`null` means the check did not run (disabled, or short-circuited by an earlier step), never that it took zero\nmilliseconds.",
      "properties": {
        "catchall": {
          "type": [
            "integer",
            "null"
          ],
          "format": "int64",
          "minimum": 0
        },
        "disposable": {
          "type": [
            "integer",
            "null"
          ],
          "format": "int64",
          "minimum": 0
        },
        "free": {
          "type": [
            "integer",
            "null"
          ],
          "format": "int64",
          "minimum": 0
        },
        "mx": {
          "type": [
            "integer",
            "null"
          ],
          "format": "int64",
          "minimum": 0
        },
        "role": {
          "type": [
            "integer",
            "null"
          ],
          "format": "int64",
          "minimum": 0
        },
        "smtp": {
          "type": [
            "integer",
            "null"
          ],
          "format": "int64",
          "minimum": 0
        },
        "syntax": {
          "type": [
            "integer",
            "null"
          ],
          "format": "int64",
          "minimum": 0
        },
        "typo": {
          "type": [
            "integer",
            "null"
          ],
          "format": "int64",
          "minimum": 0
        }
      }
    },
    "ChecksDto": {
      "type": "object",
      "description": "Individual check results for a verified email address.",
      "required": [
        "syntax",
        "mx",
        "disposable",
        "role",
        "free",
        "typo",
        "smtp",
        "catchall"
      ],
      "properties": {
        "catchall": {
          "$ref": "#/$defs/ProviderFlagDto",
          "description": "Whether the domain is a catch-all server (accepts any address)."
        },
        "disposable": {
          "$ref": "#/$defs/ProviderFlagDto",
          "description": "Whether the domain is from a known disposable provider."
        },
        "free": {
          "$ref": "#/$defs/ProviderFlagDto",
          "description": "Whether the domain is a known free webmail provider (gmail, yahoo, etc.). Free providers are informational and\ndo not change the quality score."
        },
        "mx": {
          "$ref": "#/$defs/MxCheckDto",
          "description": "MX record check result."
        },
        "role": {
          "$ref": "#/$defs/ProviderFlagDto",
          "description": "Whether the local-part is a known role-based address (info@, support@, etc.). Role addresses are a risk factor\nand reduce the quality score."
        },
        "smtp": {
          "$ref": "#/$defs/SmtpCheckDto",
          "description": "SMTP deliverability probe result."
        },
        "syntax": {
          "type": "boolean",
          "description": "Whether the email syntax is valid."
        },
        "typo": {
          "$ref": "#/$defs/TypoCheckDto",
          "description": "Typo detection result."
        }
      }
    },
    "MxCheckDto": {
      "oneOf": [
        {
          "type": "object",
          "description": "The check ran.",
          "required": [
            "valid",
            "records"
          ],
          "properties": {
            "records": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "MX record hostnames found for the domain."
            },
            "valid": {
              "type": "boolean",
              "description": "Whether the domain publishes at least one usable mail exchanger.\n`false` even when `records` is non-empty for an RFC 7505 null MX, exchangers that resolve to no address, or\na known parking placeholder; the `reason` names which."
            }
          }
        },
        {
          "type": "object",
          "description": "The check was not run.",
          "required": [
            "status"
          ],
          "properties": {
            "status": {
              "type": "string",
              "description": "Always `\"skipped\"`."
            }
          }
        }
      ],
      "description": "MX record check result.\n\nRenders as `{ \"status\": \"skipped\" }` when the MX check did not run (excluded from the caller's check set), the same\nshape the `smtp` check uses for its own skipped state, so an unrun check never reads as a negative `valid: false`\nresult. When the check did run, it renders as `{ \"valid\": bool, \"records\": [...] }`."
    },
    "ProviderFlagDto": {
      "oneOf": [
        {
          "type": "boolean",
          "description": "The check ran; carries the real boolean result."
        },
        {
          "type": "object",
          "description": "The check was not run.",
          "required": [
            "status"
          ],
          "properties": {
            "status": {
              "type": "string",
              "description": "Always `\"skipped\"`."
            }
          }
        }
      ],
      "description": "A boolean provider or risk-flag check result (`disposable`, `role`, `free`, `catchall`).\n\nRenders as a bare `true`/`false` when the check ran, or as `{ \"status\": \"skipped\" }` when it did not run (excluded\nfrom the caller's check set), the same skipped shape the `mx` and `smtp` checks use, so an unrun check never reads\nas a definitive negative result."
    },
    "SmtpCheckDto": {
      "type": "object",
      "description": "SMTP deliverability probe result.",
      "required": [
        "status"
      ],
      "properties": {
        "status": {
          "$ref": "#/$defs/SmtpStatusDto",
          "description": "SMTP probe outcome: `deliverable` (the server accepted the `RCPT TO` command), `undeliverable` (the server\npermanently rejected the recipient, 5xx), `unknown` (no definitive answer: a temporary refusal, a timeout, a\nconnection failure, or a server that refused the probe itself), or `skipped` (not requested, or not\nneeded because the answer was already known)."
        }
      }
    },
    "SmtpStatusDto": {
      "type": "string",
      "description": "Outcome of the SMTP probe.",
      "enum": [
        "deliverable",
        "undeliverable",
        "unknown",
        "skipped"
      ]
    },
    "TypoCheckDto": {
      "type": "object",
      "description": "Typo detection result.",
      "required": [
        "detected"
      ],
      "properties": {
        "detected": {
          "type": "boolean",
          "description": "Whether a domain typo was detected."
        },
        "suggested_domain": {
          "type": [
            "string",
            "null"
          ],
          "description": "Corrected domain only (e.g. `\"gmail.com\"`), present on `GET /api/verify/{uuid}` when a typo was detected.\nOnly the domain is returned (zero-retention policy); the caller already has the local part to combine it with."
        },
        "suggestion": {
          "type": [
            "string",
            "null"
          ],
          "description": "Full corrected address (e.g. `\"user@gmail.com\"`), only ever present on the synchronous submit response where the\nraw email is available in-request.\nAlways absent on `GET /api/verify/{uuid}`, because the submitted address is never stored (zero-retention\npolicy); `suggested_domain` is that path's equivalent."
        }
      }
    },
    "VerificationResultDto": {
      "type": "object",
      "description": "Per-email verification projection.\n\nEmail addresses are never stored (zero-retention policy); only keyed hashes are kept and returned here. The `checks`\nobject carries the per-step breakdown.\n`checks.typo.suggestion` (the full corrected address) is always absent on this path;\n`checks.typo.suggested_domain` (the corrected domain only) is present instead when a typo was detected.",
      "required": [
        "email_hash",
        "domain_hash",
        "status",
        "reason",
        "score",
        "recommendation",
        "verified_at",
        "checks",
        "durations"
      ],
      "properties": {
        "checks": {
          "$ref": "#/$defs/ChecksDto",
          "description": "Per-check breakdown of the verification result."
        },
        "domain_hash": {
          "type": "string",
          "description": "Keyed hash of the email domain."
        },
        "duration_ms": {
          "type": [
            "integer",
            "null"
          ],
          "format": "int64",
          "minimum": 0
        },
        "durations": {
          "$ref": "#/$defs/CheckDurationsDto",
          "description": "Per-check elapsed time in milliseconds."
        },
        "email_hash": {
          "type": "string",
          "description": "Keyed hash of the normalized email address."
        },
        "reason": {
          "type": "string"
        },
        "recommendation": {
          "type": "string",
          "description": "Deterministic list-cleaning action derived from `status`, `reason`, and the typo flag: one of `\"remove\"`,\n`\"send\"`, or `\"review\"`. A presentation layer on top of the honest verdict above, not a replacement for it."
        },
        "score": {
          "type": "integer",
          "format": "int32",
          "minimum": 0
        },
        "status": {
          "type": "string"
        },
        "verified_at": {
          "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/pricklymails-com-submit-verification-response"
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.