How to use it
- Hit Copy the whole skill.
- Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
ChatGPT: make a Project and paste it into Instructions.
Neither? Paste it at the top of a new chat — it works for that chat. - Describe your job in plain words. The AI follows the skill from there.
npx degit gooseworks-ai/goose-skills/skills/lead-generation/capabilities/verify-email#main ~/.claude/skills/verify-emailFor one project only, change the path to .claude/skills/verify-email.
Not working?
- Check which app you pasted it into — the steps above name the right one.
- Some skills need the paid tier of Claude or ChatGPT.
Paste into Claude, ChatGPT or Cursor.
Show the full text135 lines
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":"[email protected]"}}'
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":"[email protected]"}}'
Parameters
- email (required) - The email address to verify
Response
Hunter Response
Returns data object:
- status (string) -
valid,invalid,accept_all, orunknown - score (integer) - Confidence score 0-100
- result (string) -
deliverable,undeliverable, orrisky(deprecated — usestatus) - 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, oraccept_all - result (string) -
deliverable,undeliverable, orrisky - score (integer) - Confidence score 0-100
- smtp_provider (string) - Email provider name (e.g., "Google Workspace")
- mx (object) -
recordsarray 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
| Status | Meaning | Action |
|---|---|---|
| valid | Mailbox exists and accepts mail | Safe to send |
| invalid | Mailbox doesn't exist or domain has no MX | Don't send |
| accept_all | Server accepts any address — can't confirm mailbox | Send with caution |
| unknown | Couldn't verify (timeout, greylisting) | Verify manually |
Examples
User: "Check if [email protected] 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":"[email protected]"}}'
User: "Verify [email protected] 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":"[email protected]"}}'
Error Handling
- 400 - Missing or malformed
emailparameter - 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
| 1 | |
| 2 | name verify-email |
| 3 | description Verify if an email address is valid and deliverable |
| 4 | source orthogonal |
| 5 | |
| 6 | |
| 7 | |
| 8 | # Email Verification |
| 9 | |
| 10 | ## Setup |
| 11 | |
| 12 | Read your credentials from ~/.gooseworks/credentials.json: |
| 13 | |
| 14 | export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])") |
| 15 | export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))") |
| 16 | |
| 17 | |
| 18 | If ~/.gooseworks/credentials.json does not exist, tell the user to run: `npx gooseworks login` |
| 19 | |
| 20 | All endpoints use Bearer auth: `-H "Authorization: Bearer $GOOSEWORKS_API_KEY"` |
| 21 | |
| 22 | |
| 23 | Check if an email address is valid, exists, and can receive mail. Prevent bounces before sending. |
| 24 | |
| 25 | ## When to Use |
| 26 | |
| 27 | User wants to verify an email before sending |
| 28 | User asks "is this email address real?" |
| 29 | Cleaning an email list |
| 30 | Before cold outreach to avoid bounces |
| 31 | Validating user-provided email addresses |
| 32 | |
| 33 | ## How It Works |
| 34 | |
| 35 | Uses Hunter or Tomba APIs to verify email deliverability through multiple checks including syntax, domain, and mailbox verification. |
| 36 | |
| 37 | ## Usage |
| 38 | |
| 39 | ### Verify with Hunter |
| 40 | |
| 41 | |
| 42 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 43 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 44 | -H "Content-Type: application/json" \ |
| 45 | -d '{"api":"hunter","path":"/v2/email-verifier","query":{"email":"[email protected]"}}' |
| 46 | |
| 47 | |
| 48 | ### Verify with Tomba |
| 49 | |
| 50 | |
| 51 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 52 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 53 | -H "Content-Type: application/json" \ |
| 54 | -d '{"api":"tomba","path":"/v1/email-verifier","query":{"email":"[email protected]"}}' |
| 55 | |
| 56 | |
| 57 | ## Parameters |
| 58 | |
| 59 | **email** (required) - The email address to verify |
| 60 | |
| 61 | ## Response |
| 62 | |
| 63 | ### Hunter Response |
| 64 | Returns `data` object: |
| 65 | **status** (string) - `valid`, `invalid`, `accept_all`, or `unknown` |
| 66 | **score** (integer) - Confidence score 0-100 |
| 67 | **result** (string) - `deliverable`, `undeliverable`, or `risky` *(deprecated — use `status`)* |
| 68 | **regexp** (boolean) - Syntax is valid |
| 69 | **gibberish** (boolean) - Address looks random |
| 70 | **disposable** (boolean) - Temporary email service |
| 71 | **webmail** (boolean) - Free webmail provider (Gmail, Yahoo, etc.) |
| 72 | **mx_records** (boolean) - Domain has MX records |
| 73 | **smtp_server** (boolean) - SMTP server responds |
| 74 | **smtp_check** (boolean) - Mailbox exists on server |
| 75 | **accept_all** (boolean) - Server accepts all addresses |
| 76 | **block** (boolean) - Email is blocked |
| 77 | **sources** (array) - Web pages where this email was found |
| 78 | |
| 79 | ### Tomba Response |
| 80 | Returns `data.email` object: |
| 81 | **status** (string) - `valid`, `invalid`, or `accept_all` |
| 82 | **result** (string) - `deliverable`, `undeliverable`, or `risky` |
| 83 | **score** (integer) - Confidence score 0-100 |
| 84 | **smtp_provider** (string) - Email provider name (e.g., "Google Workspace") |
| 85 | **mx** (object) - `records` array of MX hostnames |
| 86 | **mx_check**, **smtp_server**, **smtp_check** (boolean) - Verification checks |
| 87 | **accept_all**, **greylisted**, **block** (boolean) - Server behavior flags |
| 88 | **gibberish**, **disposable**, **webmail**, **regex** (boolean) - Address quality checks |
| 89 | **whois** (object) - Domain registration: `registrar_name`, `referral_url`, `created_date` |
| 90 | |
| 91 | Also returns `data.sources` array with `uri`, `website_url`, `extracted_on`, `last_seen_on`, `still_on_page`. |
| 92 | |
| 93 | ## Result Types |
| 94 | |
| 95 | | Status | Meaning | Action | |
| 96 | |--------|---------|--------| |
| 97 | | **valid** | Mailbox exists and accepts mail | Safe to send | |
| 98 | | **invalid** | Mailbox doesn't exist or domain has no MX | Don't send | |
| 99 | | **accept_all** | Server accepts any address — can't confirm mailbox | Send with caution | |
| 100 | | **unknown** | Couldn't verify (timeout, greylisting) | Verify manually | |
| 101 | |
| 102 | ## Examples |
| 103 | |
| 104 | **User:** "Check if [email protected] is a real email" |
| 105 | |
| 106 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 107 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 108 | -H "Content-Type: application/json" \ |
| 109 | -d '{"api":"hunter","path":"/v2/email-verifier","query":{"email":"[email protected]"}}' |
| 110 | |
| 111 | |
| 112 | **User:** "Verify [email protected] before I send my pitch" |
| 113 | |
| 114 | curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \ |
| 115 | -H "Authorization: Bearer $GOOSEWORKS_API_KEY" \ |
| 116 | -H "Content-Type: application/json" \ |
| 117 | -d '{"api":"tomba","path":"/v1/email-verifier","query":{"email":"[email protected]"}}' |
| 118 | |
| 119 | |
| 120 | ## Error Handling |
| 121 | |
| 122 | **400** - Missing or malformed `email` parameter |
| 123 | **401** - Invalid API key — check `orth auth` |
| 124 | **429** - Rate limit exceeded — wait and retry |
| 125 | If both APIs return `unknown`, the mail server is likely blocking verification — try later |
| 126 | Tomba may return `greylisted: true` — means the server deferred; retry after a few minutes |
| 127 | |
| 128 | ## Tips |
| 129 | |
| 130 | Always verify emails before bulk sending to protect sender reputation |
| 131 | "Valid" doesn't guarantee delivery - content still matters |
| 132 | Role-based emails (info@, sales@) may be valid but less effective for outreach |
| 133 | Disposable emails (tempmail, etc.) are detected and flagged |
| 134 | Some corporate domains block verification - "unknown" doesn't mean invalid |
| 135 |