Connect MailOdds to 5,000+ apps. Validate emails automatically from forms, spreadsheets, CRMs, and more.
Works with: Google Sheets HubSpot Salesforce Typeform Airtable Mailchimp Slack Gmail Pipedrive Notion +2 more
Automatically validate emails from Typeform, Google Forms, or any form builder before adding to your CRM.
Validate emails from Google Sheets or Airtable and update rows with validation status.
Validate new contacts in HubSpot, Salesforce, or Pipedrive and tag them based on email quality.
Download all code snippets as a JavaScript file for easy reference. Includes single validation, bulk jobs, status checking, and webhook handling.
Download All SnippetsSign up for MailOdds and create an API key from your dashboard.
Go to API KeysIn Zapier, create a new Zap and choose your trigger (e.g., "New Form Submission" from Typeform).
Add "Code by Zapier" as your action and select "Run JavaScript". Paste the validation code below.
Use the validation result (status, action, is_valid) to filter, route, or update records in subsequent steps.
// 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.// 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
}; {
"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"
} | 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) |
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
| 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 |
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.
// 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
}; 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.
// 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 }; // 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
}; 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.
// 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
}; 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%.
// 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'
}; MailOdds goes beyond validation. Use Zapier to automate email sending, manage campaigns, and set up deliverability alerts from 5,000+ connected apps.
Trigger transactional emails from any Zapier event. Send order confirmations, welcome emails, or notifications with full open and click tracking built in.
// Zapier Code Step - Send Transactional Email via MailOdds
const response = await fetch('https://api.mailodds.com/v1/deliver', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
from: 'notifications@yourdomain.com',
to: inputData.email,
subject: inputData.subject,
html: inputData.html_body,
tags: ['zapier-triggered'],
track_opens: true,
track_clicks: true
})
});
const result = await response.json();
return {
message_id: result.message_id,
status: result.status
}; Related: Email Sending API
Create and send email campaigns directly from Zapier. Combine with a Schedule trigger for recurring newsletters, or trigger campaigns based on events from your CRM or e-commerce platform.
// Zapier Code Step - Create and Send Campaign
// Step 1: Create the campaign
const campaign = await fetch('https://api.mailodds.com/v1/campaigns', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: inputData.campaign_name,
subject: inputData.subject,
from_email: 'hello@yourdomain.com',
subscriber_list_id: inputData.list_id,
html_body: inputData.html_body,
track_opens: true,
track_clicks: true
})
});
const data = await campaign.json();
// Step 2: Send the campaign
await fetch('https://api.mailodds.com/v1/campaigns/' + data.id + '/send', {
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
return { campaign_id: data.id, status: 'sending' }; Related: Email Campaigns
Monitor your sender reputation on a schedule and get alerts when it drops. Route notifications to Slack, email, or PagerDuty so your team can act before deliverability degrades.
// Zapier Code Step - Check Sender Health and Alert
const response = await fetch('https://api.mailodds.com/v1/sender-health', {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const health = await response.json();
return {
reputation_score: health.reputation_score,
bounce_rate: health.bounce_rate,
complaint_rate: health.complaint_rate,
needs_attention: health.reputation_score < 70,
alert_message: health.reputation_score < 70
? 'Sender reputation dropped to ' + health.reputation_score + '/100'
: 'Sender health OK (' + health.reputation_score + '/100)'
};
// Use a Filter step after this: only continue if needs_attention is true
// Then send alert to Slack, email, or PagerDuty Related: Email Deliverability Platform
Sync your connected Shopify or WooCommerce store from Zapier. Trigger product imports on a schedule or in response to events, then query your catalog for campaign personalization.
// Zapier Code Step - Trigger Store Sync and Check Products
// Trigger a sync for your connected e-commerce store
await fetch('https://api.mailodds.com/v1/stores/' + inputData.store_id + '/sync', {
method: 'POST',
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
// After sync completes, query products
const products = await fetch('https://api.mailodds.com/v1/store-products?' + new URLSearchParams({
store_id: inputData.store_id,
limit: '10'
}), {
headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const catalog = await products.json();
return {
product_count: catalog.products.length,
synced: true
}; Related: E-commerce Email Integration
Can't find what you're looking for? We're here to help you get Zapier working.
Create your free account and start validating emails in minutes.