EmailVerify Pro

Command line interface

The EmailVerify Pro CLI exposes all 152 API endpoints as shell commands. Install with pipx or npm, verify addresses, clean CSV files, script it in CI.

View as Markdown →

A command for every one of the 152 API endpoints, generated from the OpenAPI spec — so the moment an endpoint ships, it has a command. The common operations also get short aliases.

Install

pipx install emailverify
npm install -g @emailverifypro/mcp

Both packages install the same emailverify command with the same behaviour. Pick whichever matches your stack. The Python build has no runtime dependencies; the Node build needs Node 18 or newer.

Run it without installing anything:

uvx --from emailverify emailverify verify someone@example.com
npx -y @emailverifypro/mcp emailverify verify someone@example.com

Authenticate once

emailverify login

Prompts for your key and writes ~/.config/emailverify/config.json with mode 600. Precedence, highest first:

  1. --api-key on the command line
  2. EMAILVERIFY_API_KEY in the environment
  3. the config file
emailverify config     # show which key and base URL are in effect
emailverify logout     # forget the stored key

Verify

emailverify verify someone@example.com
VALID  someone@example.com  (mailbox_verified)  score=96 A+  can_send=yes

The summary line is colourised by status: green VALID, red INVALID, amber ACCEPT_ALL, grey UNKNOWN. Add --json for the full response:

emailverify verify someone@example.com --json

Pipe it straight into jq:

emailverify verify someone@example.com --json | jq -r '.deliverability_score.can_send'

Turn signals on and off:

emailverify verify someone@example.com --smtp false --breach true --enrich true

Verify a file

emailverify bulk --file leads.csv --out results.json

--file accepts:

cut -d, -f3 crm-export.csv | emailverify bulk --file - --out results.json

Bulk calls take as long as their slowest address, so raise the timeout for big batches:

emailverify bulk --file big-list.txt --timeout 600 --out results.json

Discover commands

emailverify list                      # everything, grouped by category
emailverify list --tag Verification   # one category
emailverify list --search catchall    # search paths, names and descriptions
emailverify describe validate:bulk    # parameters for one command

describe prints the method, path, every parameter with its type and default, and whether the command is destructive.

Call anything

Named commands cover every endpoint, but raw bypasses them entirely:

emailverify raw GET /db/stats
emailverify raw GET /validate --query email=a@b.com --query smtp=false
emailverify raw POST /bounce --body '{"email":"a@b.com","bounce_type":"hard"}'

Aliases

CommandEndpointWhat it does
emailverify verifyGET /validateValidate Get
emailverify bulkPOST /validate/bulkValidate Bulk
emailverify bulk-asyncPOST /validate/bulk/asyncValidate Bulk Async
emailverify quickGET /validate/quickValidate Quick
emailverify syntaxGET /validate/syntaxValidate Syntax Only
emailverify scoreGET /scoreGet Deliverability Score
emailverify find-emailPOST /find-emailFind Email Endpoint
emailverify domainGET /domain-intel/{domain}Get Domain Intel
emailverify usageGET /me/usageMe Usage
emailverify statsGET /me/statsMe Stats
emailverify recentGET /me/recent-verificationsMe Recent Verifications
emailverify keysGET /keysList Keys
emailverify create-keyPOST /keysCreate Key
emailverify healthGET /healthHealth
emailverify plansGET /plansGet Plans
emailverify suppressPOST /suppression/addSuppression Add
emailverify suppressedGET /suppression/checkSuppression Check
emailverify dedupPOST /utils/dedupDedup Emails
emailverify catchallPOST /resolve-catchallResolve Catchall Endpoint
emailverify jobGET /jobs/{job_id}Get Job

Everything else follows the endpoint path — /validate/bulk/async becomes validate:bulk:async, /jobs/{job_id} becomes jobs:job-id.

Destructive commands

Deletes and admin operations prompt before running, and refuse outright when not attached to a terminal:

emailverify gdpr:erase someone@example.com
About to call DELETE /gdpr/erase — this is destructive.
Type 'yes' to continue:

Pass --yes in scripts. Without a terminal and without --yes, the command exits 2 rather than guessing.

Scripting

Exit codes are stable, so you can branch on them:

CodeMeaning
0Success
1Unknown command, or the user declined a confirmation
2Bad arguments — a required parameter is missing
3Authentication failed
4API or transport error
#!/usr/bin/env bash
set -euo pipefail

if emailverify verify "$1" --json | jq -e '.deliverability_score.can_send' >/dev/null; then
  echo "safe to send"
else
  echo "do not send"; exit 1
fi

Verify a list and keep only the good ones:

emailverify bulk --file leads.txt --json \
  | jq -r '.results[] | select(.status=="valid") | .email' \
  > clean.txt

Set NO_COLOR=1 to strip ANSI codes when writing to a log.

Global flags

FlagPurpose
--jsonFull JSON instead of the summary line
--out PATHWrite the JSON response to a file
--file PATHRead a list argument from a file (- for stdin)
--yes, -ySkip the confirmation on destructive commands
--api-key KEYOverride the stored key
--base-url URLPoint at staging or a self-hosted instance
--timeout SECONDSPer-request timeout, default 60
--verbose, -vLog the request line to stderr

Environment

VariablePurpose
EMAILVERIFY_API_KEYYour key; overrides the config file
EMAILVERIFY_BASE_URLStaging or self-hosted instance
EMAILVERIFY_CONFIGAlternative config file path
EMAILVERIFY_CA_BUNDLECA bundle, if your Python has none
NO_COLORDisable colour

Troubleshooting

CERTIFICATE_VERIFY_FAILED — your Python has no CA bundle, common on python.org macOS builds. Run Install Certificates.command, or pip install certifi, or set EMAILVERIFY_CA_BUNDLE=/etc/ssl/cert.pem.

error: unknown command 'verifyy' — the CLI suggests the nearest matches. Run emailverify list to see everything.

A command hangs — some verifications take 30 seconds or more. Raise --timeout, or use emailverify bulk-async and poll with emailverify job <job_id>.

401 on a key you just created — keys take up to 2 minutes to replicate to every verification worker. Wait and retry.