Goose-skills orthogonal-verify-email

Verify if an email address is valid and deliverable

install
source · Clone the upstream repo
git clone https://github.com/gooseworks-ai/goose-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/gooseworks-ai/goose-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/capabilities/orthogonal-verify-email" ~/.claude/skills/gooseworks-ai-goose-skills-orthogonal-verify-email && rm -rf "$T"
manifest: skills/capabilities/orthogonal-verify-email/SKILL.md
source content

Email Verification

Setup

Read your credentials from ~/.gooseworks/credentials.json:

export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")

If ~/.gooseworks/credentials.json does not exist, tell the user to run:

npx gooseworks login

All endpoints use Bearer auth:

-H "Authorization: Bearer $GOOSEWORKS_API_KEY"

Check if an email address is valid, exists, and can receive mail. Prevent bounces before sending.

When to Use

  • User wants to verify an email before sending
  • User asks "is this email address real?"
  • Cleaning an email list
  • Before cold outreach to avoid bounces
  • Validating user-provided email addresses

How It Works

Uses Hunter or Tomba APIs to verify email deliverability through multiple checks including syntax, domain, and mailbox verification.

Usage

Verify with Hunter

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"hunter","path":"/v2/email-verifier","query":{"email":"john@example.com"}}'

Verify with Tomba

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"tomba","path":"/v1/email-verifier","query":{"email":"jane@company.com"}}'

Parameters

  • email (required) - The email address to verify

Response

Hunter Response

Returns

data
object:

  • status (string) -
    valid
    ,
    invalid
    ,
    accept_all
    , or
    unknown
  • score (integer) - Confidence score 0-100
  • result (string) -
    deliverable
    ,
    undeliverable
    , or
    risky
    (deprecated — use
    status
    )
  • regexp (boolean) - Syntax is valid
  • gibberish (boolean) - Address looks random
  • disposable (boolean) - Temporary email service
  • webmail (boolean) - Free webmail provider (Gmail, Yahoo, etc.)
  • mx_records (boolean) - Domain has MX records
  • smtp_server (boolean) - SMTP server responds
  • smtp_check (boolean) - Mailbox exists on server
  • accept_all (boolean) - Server accepts all addresses
  • block (boolean) - Email is blocked
  • sources (array) - Web pages where this email was found

Tomba Response

Returns

data.email
object:

  • status (string) -
    valid
    ,
    invalid
    , or
    accept_all
  • result (string) -
    deliverable
    ,
    undeliverable
    , or
    risky
  • score (integer) - Confidence score 0-100
  • smtp_provider (string) - Email provider name (e.g., "Google Workspace")
  • mx (object) -
    records
    array of MX hostnames
  • mx_check, smtp_server, smtp_check (boolean) - Verification checks
  • accept_all, greylisted, block (boolean) - Server behavior flags
  • gibberish, disposable, webmail, regex (boolean) - Address quality checks
  • whois (object) - Domain registration:
    registrar_name
    ,
    referral_url
    ,
    created_date

Also returns

data.sources
array with
uri
,
website_url
,
extracted_on
,
last_seen_on
,
still_on_page
.

Result Types

StatusMeaningAction
validMailbox exists and accepts mailSafe to send
invalidMailbox doesn't exist or domain has no MXDon't send
accept_allServer accepts any address — can't confirm mailboxSend with caution
unknownCouldn't verify (timeout, greylisting)Verify manually

Examples

User: "Check if hello@acme.com is a real email"

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"hunter","path":"/v2/email-verifier","query":{"email":"hello@acme.com"}}'

User: "Verify sarah.jones@startup.io before I send my pitch"

curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
  -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"api":"tomba","path":"/v1/email-verifier","query":{"email":"sarah.jones@startup.io"}}'

Error Handling

  • 400 - Missing or malformed
    email
    parameter
  • 401 - Invalid API key — check
    orth auth
  • 429 - Rate limit exceeded — wait and retry
  • If both APIs return
    unknown
    , the mail server is likely blocking verification — try later
  • Tomba may return
    greylisted: true
    — means the server deferred; retry after a few minutes

Tips

  • Always verify emails before bulk sending to protect sender reputation
  • "Valid" doesn't guarantee delivery - content still matters
  • Role-based emails (info@, sales@) may be valid but less effective for outreach
  • Disposable emails (tempmail, etc.) are detected and flagged
  • Some corporate domains block verification - "unknown" doesn't mean invalid