Skip to main content

Validation Result Categories

GTMAPIs returns one of 5 possible validation results. Each result has specific meaning and recommended action.

Result Types Overview

valid

Personal email, mailbox verifiedCharged: ✅ 1 credit

valid_role_based

Generic business inboxCharged: 🆓 FREE

risky

Catch-all domain, unverifiableCharged: 🆓 FREE

invalid

Doesn’t exist or syntax errorCharged: 🆓 FREE

unknown

Can’t verify due to restrictionsCharged: 🆓 FREE

1. Valid (Personal Email)

Result: valid Meaning: Real personal email that passed all 4 validation layers Validation Status:
  • ✅ Syntax: Valid RFC 5322 format
  • ✅ DNS: MX records found
  • ✅ SMTP: Mailbox verified
  • ✅ Catch-All: Not a catch-all domain
  • ✅ Role-Based: Not a generic inbox
Example Response:
{
  "email": "john@company.com",
  "result": "valid",
  "reason": "",
  "is_role_based": false,
  "is_free_provider": false,
  "is_catch_all": false,
  "b2b_outbound_quality": "high",
  "credits_charged": 1,
  "charge_reason": "Valid personal email with high B2B outbound quality"
}
Recommended Action: ✅ USE IN CAMPAIGNS B2B Outbound Value: 🟢 High
  • Highest deliverability
  • Best engagement rates
  • Direct access to individual
  • Worth the credit charge

2. Valid Role-Based

Result: valid_role_based Meaning: Valid email but it’s a generic business inbox Validation Status:
  • ✅ Syntax: Valid format
  • ✅ DNS: MX records found
  • ✅ SMTP: Mailbox exists
  • ⚠️ Role-Based: Generic inbox (info@, support@, etc.)
Common Patterns:
info@, contact@, hello@, support@, help@, sales@,
marketing@, admin@, office@, team@, hr@, careers@
Example Response:
{
  "email": "info@company.com",
  "result": "valid_role_based",
  "reason": "Role-based email address",
  "is_role_based": true,
  "role_type": "information",
  "b2b_outbound_quality": "low",
  "credits_charged": 0,
  "charge_reason": "Role-based email - free for low B2B value"
}
Recommended Action: ⚠️ USE WITH CAUTION B2B Outbound Value: 🟡 Low
  • Deliverable but shared inbox
  • Lower engagement (3-5x worse than personal)
  • Multiple people may see it (or none)
  • Higher spam report risk
  • Good for: Company inquiries, not cold outreach

3. Risky (Catch-All)

Result: risky Meaning: Domain accepts all emails (can’t verify specific mailbox) Validation Status:
  • ✅ Syntax: Valid format
  • ✅ DNS: MX records found
  • ⚠️ SMTP: Server accepts everything
  • ❌ Catch-All: Detected catch-all configuration
Detection:
# Server accepts random addresses
RCPT TO: <definitely_not_real_8473626@domain.com>
250 OK  # ← This means catch-all
Example Response:
{
  "email": "anyone@catchall.com",
  "result": "risky",
  "reason": "Catch-all domain detected",
  "is_catch_all": true,
  "catch_all_confidence": "high",
  "b2b_outbound_quality": "none",
  "credits_charged": 0,
  "charge_reason": "Catch-all domain - cannot verify individual mailbox"
}
Recommended Action: ❌ AVOID IN CAMPAIGNS B2B Outbound Value: 🔴 None
  • Unknown if mailbox actually exists
  • High bounce risk in practice
  • Damages sender reputation
  • Could be spam trap
  • May accept but not deliver
Confidence Levels:
  • high - Very likely catch-all (avoid completely)
  • medium - Possibly catch-all (use with caution)
  • low - Uncertain (test with small batch first)

4. Invalid

Result: invalid Meaning: Email doesn’t exist or has syntax errors Common Reasons:

Syntax Errors

{
  "email": "invalid@",
  "result": "invalid",
  "reason": "Invalid email format",
  "validation_layer": "syntax"
}

No DNS Records

{
  "email": "john@fakeemail123notreal.com",
  "result": "invalid",
  "reason": "Domain has no MX records",
  "validation_layer": "dns"
}

Mailbox Doesn’t Exist

{
  "email": "notreal@gmail.com",
  "result": "invalid",
  "reason": "Mailbox does not exist (SMTP 550)",
  "validation_layer": "smtp",
  "smtp_response": "550 5.1.1 User unknown"
}
Recommended Action: ❌ REMOVE FROM LIST B2B Outbound Value: 🔴 None
  • Will hard bounce
  • Damages sender reputation
  • Wastes sending credits
  • No chance of delivery

5. Unknown

Result: unknown Meaning: Unable to verify due to server restrictions Common Causes:

Greylisting

{
  "email": "john@greylisted.com",
  "result": "unknown",
  "reason": "Temporary rejection - greylisting (SMTP 451)",
  "smtp_response": "451 4.7.1 Greylisting in action, please try again"
}

SMTP Restrictions

{
  "email": "john@restrictive.com",
  "result": "unknown",
  "reason": "SMTP verification not permitted",
  "smtp_response": "550 5.7.1 Recipient verification not allowed"
}

Timeout

{
  "email": "john@slowserver.com",
  "result": "unknown",
  "reason": "SMTP connection timeout after 5 seconds"
}
Recommended Action: ⚠️ PROCEED WITH CAUTION B2B Outbound Value: 🟡 Unknown
  • Domain exists (passed DNS)
  • Mailbox status uncertain
  • May deliver successfully
  • Test with small batch first
  • Monitor bounce rates

Result Distribution Examples

High-Quality B2B List

valid (personal):        60% ✅ Charged
valid_role_based:        20% 🆓 Free
risky (catch-all):       10% 🆓 Free
invalid:                  8% 🆓 Free
unknown:                  2% 🆓 Free

Low-Quality Scraped List

valid (personal):        15% ✅ Charged
valid_role_based:        30% 🆓 Free
risky (catch-all):       25% 🆓 Free
invalid:                 25% 🆓 Free
unknown:                  5% 🆓 Free

Decision Matrix

ResultDeliverable?CreditsUse in Campaigns?
valid✅ Yes1✅ Primary target
valid_role_based✅ Yes0⚠️ Secondary (low priority)
risky❓ Unknown0❌ Avoid
invalid❌ No0❌ Remove
unknown❓ Maybe0⚠️ Test carefully

Filtering Recommendations

For Maximum Deliverability

// Only use valid personal emails
results.filter(r => r.result === 'valid')

For Budget Campaigns

// Use valid + role-based (accepting lower engagement)
results.filter(r =>
  r.result === 'valid' ||
  r.result === 'valid_role_based'
)

For List Cleaning

// Remove definite invalids and risky
const toRemove = results.filter(r =>
  r.result === 'invalid' ||
  r.result === 'risky'
)

API Response Schema

interface ValidationResult {
  // Core fields
  email: string;
  result: 'valid' | 'valid_role_based' | 'risky' | 'invalid' | 'unknown';
  reason: string;

  // Detection flags
  is_role_based: boolean;
  is_free_provider: boolean;
  is_catch_all: boolean;

  // B2B quality
  b2b_outbound_quality: 'high' | 'low' | 'none';

  // Credits
  credits_charged: 0 | 1;
  charge_reason: string;

  // Optional details
  role_type?: string;
  catch_all_confidence?: 'high' | 'medium' | 'low';
  validation_layer?: 'syntax' | 'dns' | 'smtp' | 'catchall';
  smtp_response?: string;
}

Next Steps