Google Sheets email verification
Clean email lists from Google Sheets
Use Verifly when a spreadsheet has to become a safe CRM import, campaign audience, or enrichment queue without sending bad addresses downstream.
UrlFetchApp.fetch("https://verifly.email/api/v1/verify?email=" + encodeURIComponent(email), {
headers: { Authorization: "Bearer vf_your_api_key" }
})Real-time SMTP mailbox checks
Single, batch, and async bulk verification
Disposable, role account, and catch-all detection
Pay-as-you-go credits with no subscription lock-in
Search fit
Built for Google Sheets email verification searches
Use Verifly when you need a simple API, predictable pricing, and clean JSON results before emails hit your product, CRM, or campaign tool.
Verify a sheet without leaving the sheet
A Google Sheet is where lists get born and where they get messy — pasted from a webinar signup, typed by an intern, merged from three tabs. Operations teams live in Sheets, so the most useful place to verify addresses is right there in the grid, not after an export-import round trip through some other tool.
Google Apps Script makes that possible: it can call an external HTTPS API with UrlFetchApp and write the result back into a neighbouring column. You write a custom function or a menu button once, and anyone on the team can select a range of emails and get a deliverable / undeliverable / risky verdict written next to each row.
The one thing to get right is not to fire a fetch per cell in a loop — Apps Script has quotas and Sheets throttles rapid UrlFetchApp calls. For anything beyond a handful of rows, gather the column and send it to Verifly's batch endpoint in a single request, then write the verdicts back in one pass.
Batch-verify a column with Apps Script
- Get a key at verifly.email/api/v1/autonomous/register and store it in Script Properties (Project Settings) rather than hardcoding it.
- Read the email column into an array with getValues().
- POST the whole array to /verify/batch in one UrlFetchApp call — do not loop one request per cell.
- Map the returned verdicts back to a status column and write them with setValues() in a single pass.
- Filter or conditionally format the sheet on the status column to hide or flag undeliverable rows.
function verifyColumn() {
const sheet = SpreadsheetApp.getActiveSheet();
const key = PropertiesService.getScriptProperties().getProperty('VERIFLY_API_KEY');
const range = sheet.getRange('A2:A');
const emails = range.getValues().flat().filter(String);
const res = UrlFetchApp.fetch('https://verifly.email/api/v1/verify/batch', {
method: 'post',
contentType: 'application/json',
headers: { Authorization: 'Bearer ' + key },
payload: JSON.stringify({ emails }),
});
const results = JSON.parse(res.getContentText()).results;
const out = results.map(r => [r.result]);
sheet.getRange(2, 2, out.length, 1).setValues(out); // write verdict to column B
}FAQ
Frequently asked questions
Do I need to export to CSV first?
No. Google Apps Script can call Verifly directly from the sheet with UrlFetchApp and write verdicts back into a column, so there is no export-import round trip.
Why not fetch once per cell?
Apps Script has execution quotas and Sheets throttles rapid UrlFetchApp calls. Gather the whole column and send it to /verify/batch in one request, then write results back in a single setValues() pass.
Where should I keep the API key?
In Script Properties (Project Settings), read via PropertiesService — not hardcoded in the script or a cell, so it is not shared when the sheet is.
Can a non-developer run it?
Yes. Wrap the function in a custom menu item so operations teammates can select the sheet and click Verify without touching code.
How many rows can I verify this way?
For very large sheets, prefer the async bulk endpoint (up to 1,000,000 addresses) over a single Apps Script call, which is bound by the script execution time limit.
What does each row's verdict include?
A deliverable / undeliverable / risky result plus disposable, role, and catch-all flags, which you can write to extra columns for filtering.