Install
openclaw skills install openmerch-email-verifyVerify an email address's deliverability and reputation. Powered by OpenMerch.
openclaw skills install openmerch-email-verifyVerify whether an email address is deliverable, and surface basic reputation signals (disposable / free-provider / role address, a quality score), for a single address.
This skill uses OpenMerch to plan, route, and execute the check. You give it one email address; it returns a normalized result plus the raw provider output.
This skill uses OpenMerch to plan, route, and execute the email check. OpenMerch is an external
paid API: you need an OpenMerch account and an API key, and each verification consumes your
OpenMerch account balance/credits. The exact price is confirmed by the /v1/plan call before
anything runs — that quote is the source of truth for what you pay (currently roughly
$0.006–$0.007 per email, depending on OpenMerch pricing policy). The skill never charges more
than the planned max_cost. ClawHub does not handle this billing and takes no fee — the charge is
between you and OpenMerch.
Get a key from the Developer page in the OpenMerch app and set it as an environment variable:
export OPENMERCH_API_KEY="om_live_xxxxxxxx"
# Optional — defaults to https://api.openmerch.dev:
# export OPENMERCH_BASE_URL="https://api.openmerch.dev"
No hidden network behavior. This skill makes only these OpenMerch HTTP calls, in order:
POST {OPENMERCH_BASE_URL}/v1/plan — confirm the job is executable and get the price.POST {OPENMERCH_BASE_URL}/v1/execute — run the verification (one job).GET {OPENMERCH_BASE_URL}/v1/jobs/{job_id} — only if the job is still executing, to poll
until it finishes.Every request sends the header X-OpenMerch-Key: $OPENMERCH_API_KEY. POST bodies send
Content-Type: application/json. Base URL is OPENMERCH_BASE_URL or https://api.openmerch.dev.
You can run this two ways. Both do exactly the same calls.
Requires Node 18+ (uses built-in fetch; no npm install):
node verify-email.mjs jane@acme.com
It prints a JSON result to stdout (see "Output" below) and exits non-zero on error.
If you (the agent) are running the flow with your own HTTP tools, follow these steps exactly:
1. Plan. POST /v1/plan:
{ "job_type": "email_reputation_v1", "input": { "email": "<EMAIL>" } }
can_execute is not true, stop and report the reason. Do not execute.max_cost = quoted_customer_price_microcents if present, otherwise
estimated_cost.max_microcents. /v1/plan is the source of truth for the price — never hardcode
one.2. Execute. Generate one UUID v4 as idempotency_key for this submission. POST /v1/execute:
{
"job_type": "email_reputation_v1",
"input": { "email": "<EMAIL>" },
"max_cost": <max_cost from step 1>,
"idempotency_key": "<uuid>"
}
idempotency_key if you retry this same submission (e.g. after a timeout).
Generate a new key only for a genuinely new verification. This prevents double charges.3. Poll only if needed. If the execute response status is "executing", poll
GET /v1/jobs/{job_id} every ~1s (cap ~8 tries / ~15s) until status is completed, failed, or
cancelled. Most runs return completed immediately and no polling is needed.
4. Report. On completed, present the normalized result (below). On failed/cancelled,
report error.code and error.message. Always report cost.total_microcents (the actual amount
charged) and the job_id.
BASE="${OPENMERCH_BASE_URL:-https://api.openmerch.dev}"
# 1. Plan
curl -sS -X POST "$BASE/v1/plan" \
-H "X-OpenMerch-Key: $OPENMERCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{"job_type":"email_reputation_v1","input":{"email":"jane@acme.com"}}'
# 2. Execute
# Replace <MAX_COST_FROM_PLAN> with quoted_customer_price_microcents from /v1/plan,
# or estimated_cost.max_microcents if no quote was returned. Do not hardcode a price.
curl -sS -X POST "$BASE/v1/execute" \
-H "X-OpenMerch-Key: $OPENMERCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{"job_type":"email_reputation_v1","input":{"email":"jane@acme.com"},"max_cost":<MAX_COST_FROM_PLAN>,"idempotency_key":"'"$(uuidgen)"'"}'
# 3. Poll only if status was "executing"
# curl -sS "$BASE/v1/jobs/<job_id>" -H "X-OpenMerch-Key: $OPENMERCH_API_KEY"
The skill returns a normalized object. The summary fields are best-effort and appear only when
the underlying provider response contains them; raw is always the full, unmodified OpenMerch job
output and is the source of truth. cost_usd is derived from the actual charged
cost.total_microcents.
{
"email": "jane@acme.com",
"summary": {
"deliverable": true,
"is_disposable": false,
"is_free_email": false,
"quality_score": 0.95
},
"raw": { "...": "verbatim OpenMerch job output" },
"cost_usd": 0.007,
"job_id": "…"
}
cost_usd is cost.total_microcents / 10000000.