Microsoft Excel + VerifyAnyEmail
API recipeVerify email addresses right inside Excel. The easiest way on Microsoft 365 is an Office Script (Excel on the web or desktop) that reads a column and writes the status back. Power Query and VBA options are shown below for older/desktop setups. All integrations call POST https://api.verifyany.email/v1/verify with an Authorization: Bearer <API_KEY> header and a JSON body of {"email":"..."}. The response includes result.status (deliverable / undeliverable / risky / unknown) and result.score.
Setup
- 1Add the Office Script
In Excel (365) go to Automate → New Script, paste the script below, and set YOUR_API_KEY. It reads the “Email” column and writes Status/Score columns.
- 2Run it
Select your table/sheet and press Run. Each address is verified via the API; results are written next to it.
- 3Power Query alternative
For a refreshable query, use Data → Get Data → From Web / a custom function with Web.Contents to POST each email to /v1/verify and expand result.status. Good for large sheets you re-verify on a schedule.
- 4VBA alternative (desktop)
On desktop Excel, an MSXML2.XMLHTTP call in a VBA macro can POST each cell to the API — useful when Office Scripts aren’t available. Add your key in the macro and loop the range.
async function main(workbook: ExcelScript.Workbook) {
const API_KEY = "YOUR_API_KEY";
const sheet = workbook.getActiveWorksheet();
const used = sheet.getUsedRange();
const values = used.getValues();
// Assume column A = email; write Status to B, Score to C.
for (let r = 1; r < values.length; r++) {
const email = String(values[r][0] || "").trim();
if (!email) continue;
const res = await fetch("https://api.verifyany.email/v1/verify", {
method: "POST",
headers: {
"Authorization": "Bearer " + API_KEY,
"Content-Type": "application/json",
"X-VAE-Source": "excel"
},
body: JSON.stringify({ email })
});
const data = await res.json();
const result = (data && data.result) || {};
sheet.getCell(r, 1).setValue(result.status || "unknown");
sheet.getCell(r, 2).setValue(result.score ?? "");
}
}Handling the result
Every verification returns a result object with a status, a 0–100 score and a “did you mean” suggestion for typos. Branch on the status:
| status | Meaning | Recommended action |
|---|---|---|
| deliverable | Mailbox exists and accepts mail | Accept |
| undeliverable | Invalid syntax, no MX, or rejected mailbox | Block / reject |
| risky | Accepts but low quality (catch-all, role, disposable) | Allow with caution, or challenge |
| unknown | Couldn’t determine (greylist, timeout, blocked port) | Allow (fail-open) or retry later |
For sign-up and checkout forms, the safe default is to block only undeliverable so you never turn away a real customer, and to surface the suggestion (“did you mean gmail.com?”) inline to recover typos.
Security & reliability
- Keep your API key server-side. Never expose it in client-side JavaScript. In Microsoft Excel, store it in the integration’s credential/secret store, not in a shared script.
- Fail open. If the API errors or times out, let the address through rather than blocking a real user over a transient issue.
- Retry transient errors. Back off and retry on
429(rate limit) and5xx; don’t retry4xxvalidation errors. - Cache per address. One credit is spent per unique verification — cache results (e.g. 12–24h) so re-submits don’t re-charge.
- Tag the source. This recipe sends
X-VAE-Source: excelso your dashboard shows where verifications come from.
Troubleshooting
| Response | Cause & fix |
|---|---|
| 401 | Missing or wrong API key — check the Authorization header is Bearer YOUR_API_KEY. |
| 402 | Out of credits — top up in the dashboard. (The plugin fails open in this case.) |
| 429 | Rate limited — slow down or upgrade your plan; back off and retry. |
| No result written | Confirm you’re reading result.status, and that the request body is { "email": "…" } as JSON. |
This is an API recipe, not a one-click app — you wire it up once with the steps above. See the full API reference for every field and error code.