# No-code recipes

URL: https://email-validation.org/docs/guides/no-code/
Updated: 2026-10-20

> Documentation index: https://email-validation.org/llms.txt

Zapier, Make, n8n and Google Sheets can all call the API through their HTTP request steps. The recipe is the same
everywhere: `POST` to `https://api.email-validation.org/v1/validate` with a JSON body, the API key in the **`Authorization` header**, and the
JSON answer mapped into later steps. Never paste the key into a URL or a query parameter: such requests are refused.

| Setting | Value |
|---|---|
| Method | `POST` |
| URL | `https://api.email-validation.org/v1/validate` |
| Header | `Authorization: Bearer ev_live_…` |
| Header | `Content-Type: application/json` |
| Body (JSON) | `{"email": "<the address from an earlier step>"}` |
| Fields to use | `status`, `reason`, `action`, `did_you_mean`, `credits_used` |

Use a dedicated API key for each tool, with a [daily credit cap](https://email-validation.org/docs/authentication/#limits), so a looping
automation cannot spend more than you expect. Test with `accepted@sandbox.email-validation.org` and the other
[test addresses](https://email-validation.org/docs/test-addresses/): they are free.

## Zapier

1. Add an action step with the **Webhooks by Zapier** app and choose **Custom Request** (or **POST**).
2. Method `POST`, URL `https://api.email-validation.org/v1/validate`.
3. Data: `{"email": "…"}`, inserting the email field from your trigger.
4. Headers: `Authorization` = `Bearer ev_live_…` and `Content-Type` = `application/json`.
5. Test the step, then use the returned `status` and `action` in a **Filter** or **Paths** step, for example "only
   continue when `status` is `deliverable`".

## Make

1. Add the **HTTP** app's **Make a request** module.
2. URL `https://api.email-validation.org/v1/validate`, method `POST`.
3. Headers: `Authorization` = `Bearer ev_live_…`.
4. Body type **Raw**, content type **JSON (application/json)**, request content `{"email": "…"}` with the address
   mapped in.
5. Turn on **Parse response** so `status`, `reason` and `action` can be mapped in later modules or a router filter.

## n8n

1. Add an **HTTP Request** node with method `POST` and URL `https://api.email-validation.org/v1/validate`.
2. Authentication: **Generic Credential Type** → **Header Auth**, with name `Authorization` and value
   `Bearer ev_live_…`. Storing the key as a credential keeps it out of the workflow itself.
3. Send Body: **JSON**, with a field `email` set to an expression such as `{{ $json.email }}`.
4. Follow with an **If** or **Switch** node on `status` or `action`.

## Google Sheets

Spreadsheet formulas cannot send an `Authorization` header, so use a small Apps Script that runs from a menu and
writes the results next to your addresses.

1. In your sheet, open **Extensions → Apps Script** and paste the script below.
2. Under **Project Settings → Script properties**, add `EV_API_KEY` with your key. It stays out of the sheet.
3. Reload the sheet, select the cells with addresses, and choose **Email validation → Validate selected cells**.
   Status, reason and action appear in the three columns to the right.

```js
const API_URL = 'https://api.email-validation.org/v1/validate';

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('Email validation')
    .addItem('Validate selected cells', 'validateSelection')
    .addToUi();
}

function validateSelection() {
  const key = PropertiesService.getScriptProperties().getProperty('EV_API_KEY');
  if (!key) throw new Error('Add EV_API_KEY under Project Settings > Script properties.');
  const range = SpreadsheetApp.getActiveRange();
  const rows = range.getValues().map(([email]) => {
    if (!email) return ['', '', ''];
    const res = UrlFetchApp.fetch(API_URL, {
      method: 'post',
      contentType: 'application/json',
      headers: { Authorization: 'Bearer ' + key },
      payload: JSON.stringify({ email: String(email).trim() }),
      muteHttpExceptions: true,
    });
    const body = JSON.parse(res.getContentText());
    if (res.getResponseCode() !== 200) return ['error', body.error.code, ''];
    return [body.status, body.reason, body.action];
  });
  range.offset(0, 1, rows.length, 3).setValues(rows);
}
```

Run it from the menu rather than as a cell formula: formulas recalculate often, and each recalculation would check
(and pay for) the addresses again. Apps Script also limits how long a run may take and how many requests a day it may
send, so for long lists upload the file as a [bulk job](https://email-validation.org/docs/bulk/) instead.

## Bulk lists from automations

For lists, send one request to `POST https://api.email-validation.org/v1/bulk` with `{"emails": [...]}` (up to 100,000
addresses), then poll `GET https://api.email-validation.org/v1/bulk/{id}` or receive a [webhook](https://email-validation.org/docs/webhooks/) when the job is done. See
the [bulk jobs API](https://email-validation.org/docs/api/bulk/).
