MailOdds
Zapier

Zapier + MailOdds

Connect MailOdds to 5,000+ apps. Validate emails automatically from forms, spreadsheets, CRMs, and more.

Setup time: 5-10 min
Difficulty: Beginner
1,000 free validations included

Prerequisites

  • MailOdds account (free tier works)
  • API key from dashboard
  • Zapier account (Starter+ for Code steps)
  • Basic JavaScript knowledge

Works with: Google Sheets HubSpot Salesforce Typeform Airtable Mailchimp Slack Gmail Pipedrive Notion +2 more

Validate Form Submissions

Automatically validate emails from Typeform, Google Forms, or any form builder before adding to your CRM.

Clean Spreadsheet Data

Validate emails from Google Sheets or Airtable and update rows with validation status.

Enrich CRM Contacts

Validate new contacts in HubSpot, Salesforce, or Pipedrive and tag them based on email quality.

Download Code Snippets

Download all code snippets as a JavaScript file for easy reference. Includes single validation, bulk jobs, status checking, and webhook handling.

Download All Snippets

Quick Setup Guide

1

Get Your MailOdds API Key

Sign up for MailOdds and create an API key from your dashboard.

Go to API Keys
2

Create a New Zap

In Zapier, create a new Zap and choose your trigger (e.g., "New Form Submission" from Typeform).

3

Add a Code by Zapier Step

Add "Code by Zapier" as your action and select "Run JavaScript". Paste the validation code below.

4

Use Results in Next Steps

Use the validation result (status, action, is_valid) to filter, route, or update records in subsequent steps.

Validate Single Email

JAVASCRIPT
Try Demo |
// Zapier Code Step - Validate Single Email
const response = await fetch('https://api.mailodds.com/v1/validate', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    email: inputData.email
  })
});

const result = await response.json();

return {
  email: result.email,
  status: result.status,
  action: result.action,
  is_valid: result.action === 'accept',
  reason: result.sub_status || null
};
Input Data: Set up an input field called email and map it to your trigger's email field.

Create Bulk Validation Job

JAVASCRIPT
// Zapier Code Step - Create Bulk Validation Job
const emails = inputData.emails.split(',').map(e => e.trim());

const response = await fetch('https://api.mailodds.com/v1/jobs', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    emails: emails,
    callback_url: 'YOUR_WEBHOOK_URL' // Optional
  })
});

const result = await response.json();

return {
  job_id: result.job.id,
  status: result.job.status,
  email_count: result.job.email_count
};

Webhook Payload (Job Completed)

JSON
{
  "event": "job.completed",
  "job_id": "job_abc123",
  "status": "completed",
  "summary": {
    "valid": 850,
    "invalid": 120,
    "catch_all": 25,
    "unknown": 5
  },
  "results_url": "https://api.mailodds.com/v1/jobs/job_abc123/results"
}
Tip: Use "Webhooks by Zapier" as a trigger to receive job completion events and continue your workflow.

Response Fields

FieldTypeDescription
statusstringvalid, invalid, catch_all, unknown, do_not_mail
actionstringaccept, accept_with_caution, reject, retry_later
sub_statusstringDetailed reason (e.g., mailbox_not_found, disposable)
is_validbooleantrue if action is "accept" (convenience field)

Webhook Configuration

Receive real-time event notifications from MailOdds in your Zaps. Use "Webhooks by Zapier" as a Catch Hook trigger, then configure the webhook URL in your MailOdds dashboard.

Supported events: message.bounced, message.opened, message.clicked, message.delivered, message.deferred

Webhook Event Fields

FieldTypeDescription
eventstringEvent type (message.bounced, message.opened, message.clicked, etc.)
tostringRecipient email address
message_idstringUnique message identifier
is_botbooleanTrue if event from security scanner/link prefetcher (engagement events only)
is_mppbooleanTrue if event from Apple Mail Privacy Protection (engagement events only)
link_urlstringClicked URL (message.clicked only)
bounce_typestringhard or soft (message.bounced only)
timestampstringISO 8601 event timestamp

Understanding is_bot and is_mpp in Webhook Events

is_bot = true when the event came from a security scanner, link prefetcher, or corporate email gateway (not a human). Common with Barracuda, Proofpoint, and Mimecast.

is_mpp = true when the event came from Apple Mail Privacy Protection, which pre-fetches all images and inflates open counts. Affects roughly 50% of iOS/macOS mail users.

Both fields are Booleans on engagement events (opened, clicked). Always guard with == true since they may be absent on non-engagement events.

Handle Webhook Events

JAVASCRIPT
// Zapier Code Step - Handle MailOdds Webhook Event
// Trigger: Webhooks by Zapier (Catch Hook)
const event = inputData.event;
const email = inputData.to;
const messageId = inputData.message_id;

// Filter bot and MPP events for accurate metrics
if (inputData.is_bot === true || inputData.is_mpp === true) {
  return { skip: true, reason: 'bot_or_mpp' };
}

return {
  event: event,
  email: email,
  message_id: messageId,
  link_url: inputData.link_url || null,
  bounce_type: inputData.bounce_type || null,
  timestamp: inputData.timestamp
};

Suppression Management

Automatically suppress hard-bounced emails to protect your sender reputation. Use POST /v1/suppression to add entries and POST /v1/suppression/check to verify before sending.

Add to Suppression List

JAVASCRIPT
// Zapier Code Step - Add to Suppression List
const response = await fetch('https://api.mailodds.com/v1/suppression', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    entries: [
      { type: 'email', value: inputData.email }
    ]
  })
});

const result = await response.json();
return { suppressed: result.added || 0 };

Check Suppression Status

JAVASCRIPT
// Zapier Code Step - Check Suppression Status
const response = await fetch('https://api.mailodds.com/v1/suppression/check', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    email: inputData.email
  })
});

const result = await response.json();
return {
  email: inputData.email,
  is_suppressed: result.suppressed,
  reason: result.reason || null
};

Telemetry Dashboard

Monitor validation metrics on a schedule using GET /v1/telemetry/summary with ETag caching. When data has not changed, the API returns a 304 status with no body, reducing unnecessary processing.

Telemetry with ETag Caching

JAVASCRIPT
// Zapier Code Step - Fetch Telemetry with ETag Caching
// Store ETag in a Zapier Storage step for subsequent runs
const headers = {
  'Authorization': 'Bearer YOUR_API_KEY'
};

// Add ETag from previous run if available
if (inputData.lastETag) {
  headers['If-None-Match'] = inputData.lastETag;
}

const response = await fetch('https://api.mailodds.com/v1/telemetry/summary', {
  method: 'GET',
  headers: headers
});

if (response.status === 304) {
  return { changed: false };
}

const result = await response.json();
return {
  changed: true,
  etag: response.headers.get('etag'),
  deliverable_rate: result.rates?.deliverable,
  total_validations: result.totals?.validations,
  credits_used: result.totals?.creditsUsed
};

Two-Tier Depth Optimization

Save SMTP credits by validating in two tiers. Tier 1 uses depth='standard' (syntax + DNS checks, no SMTP credit cost) to filter obviously invalid emails. Tier 2 uses depth='enhanced' (full SMTP verification) only for leads that pass Tier 1 and meet your qualification criteria. Typical savings: 72%.

Two-Tier Depth Optimization

JAVASCRIPT
// Zapier Code Step - Two-Tier Depth Optimization
// Tier 1: Standard validation (syntax + DNS, no SMTP credit cost)
const tier1Response = await fetch('https://api.mailodds.com/v1/validate', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    email: inputData.email,
    depth: 'standard'
  })
});

const tier1 = await tier1Response.json();

// If Tier 1 rejects, stop here (no SMTP credit spent)
if (tier1.action === 'reject') {
  return { email: inputData.email, action: 'reject', depth_used: 'standard' };
}

// Tier 2: Enhanced validation only for qualified leads
const tier2Response = await fetch('https://api.mailodds.com/v1/validate', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    email: inputData.email,
    depth: 'enhanced'
  })
});

const tier2 = await tier2Response.json();
return {
  email: tier2.email,
  status: tier2.status,
  action: tier2.action,
  depth_used: 'enhanced'
};

Frequently Asked Questions

Troubleshooting

Need more help?

Can't find what you're looking for? We're here to help you get Zapier working.

Ready to Get Started?

Create your free account and start validating emails in minutes.