Zapier + MailOdds
Connect MailOdds to 5,000+ apps. Validate emails automatically from forms, spreadsheets, CRMs, and more.
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 SnippetsQuick Setup Guide
Get Your MailOdds API Key
Sign up for MailOdds and create an API key from your dashboard.
Go to API KeysCreate a New Zap
In Zapier, create a new Zap and choose your trigger (e.g., "New Form Submission" from Typeform).
Add a Code by Zapier Step
Add "Code by Zapier" as your action and select "Run JavaScript". Paste the validation code below.
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// 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
}; 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"
} Response Fields
| Field | Type | Description |
|---|---|---|
| status | string | valid, invalid, catch_all, unknown, do_not_mail |
| action | string | accept, accept_with_caution, reject, retry_later |
| sub_status | string | Detailed reason (e.g., mailbox_not_found, disposable) |
| is_valid | boolean | true 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
| Field | Type | Description |
|---|---|---|
| event | string | Event type (message.bounced, message.opened, message.clicked, etc.) |
| to | string | Recipient email address |
| message_id | string | Unique message identifier |
| is_bot | boolean | True if event from security scanner/link prefetcher (engagement events only) |
| is_mpp | boolean | True if event from Apple Mail Privacy Protection (engagement events only) |
| link_url | string | Clicked URL (message.clicked only) |
| bounce_type | string | hard or soft (message.bounced only) |
| timestamp | string | ISO 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.
Related Integrations
Ready to Get Started?
Create your free account and start validating emails in minutes.