# Validate Emails in Pipedream

URL: https://email-validation.org/docs/guides/pipedream/
Updated: 2026-11-06

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

Validate email addresses in any Pipedream workflow with Pipedream's own **HTTP / Webhook** app: one step sends the
address to the API with your key, and later steps use the answer's `status`, `reason` and `action`.

**Status: setup guide.** Our own Pipedream app (actions such as Validate Email and Create Bulk Job, and an instant
trigger when a bulk list finishes) is not listed on Pipedream yet: Pipedream has to add the app first. Until then,
use the steps below.

## Store your API key

1. Create a key on the [API keys page](https://email-validation.org/app/api-keys/), with a [daily credit cap](https://email-validation.org/docs/authentication/#limits) so a
   looping workflow cannot spend more than you expect.
2. In Pipedream, open **Settings > Environment Variables** and click **New Variable**: name `EV_API_KEY`, value your
   key. Keep it secret (the default): its value is then never shown again.

Steps read it as `{{process.env.EV_API_KEY}}`, so the key never sits in the workflow itself.

## Validate an address

Add a step from the **HTTP / Webhook** app and choose **Send any HTTP Request**:

| Setting | Value |
|---|---|
| Method | `POST` |
| URL | `https://api.email-validation.org/v1/validate` (or `https://api-eu.email-validation.org/v1/validate` for [EU data residency](https://email-validation.org/docs/eu-data-residency/)) |
| Header | `Authorization`: `Bearer {{process.env.EV_API_KEY}}` |
| Header | `Content-Type`: `application/json` |
| Body | `{"email": "<the address from an earlier step>"}` |

Test the step with `accepted@sandbox.email-validation.org`: it returns `valid` and costs nothing (every
[test address](https://email-validation.org/docs/test-addresses/) is free). The step's return value holds the answer: `status`, `reason`,
`action`, `did_you_mean` and the [other fields](https://email-validation.org/docs/api/validate/#response). Continue with a **Filter** step, for
example "continue only when `action` is `send`".

Never put the key in the URL: such requests are refused. An `unknown` result and an error cost nothing; if the step
fails with `429` (`rate_limited`), run it again after the number of seconds in the `Retry-After` header.

## Bulk lists

For many addresses at once, send one **Send any HTTP Request** step with method `POST`, URL `https://api.email-validation.org/v1/bulk`, the
same two headers, and the body `{"emails": [...]}` (up to 100,000 addresses, 4 MB). The
answer is the new job; its `id` starts with `job_`. Then read `GET https://api.email-validation.org/v1/bulk/<id>` until its `status` is
`completed`, and download the results from `GET https://api.email-validation.org/v1/bulk/<id>/results`.

A create request sent twice is two lists: do not turn on automatic retries for that step. If it fails with a server
error or a timeout, check the [bulk page](https://email-validation.org/app/bulk/) of the dashboard before running it again. More:
[bulk jobs API](https://email-validation.org/docs/api/bulk/).

## Start a workflow when a list finishes

1. Create a workflow with the **HTTP / Webhook** trigger **New Requests** and copy its endpoint URL.
2. In the dashboard, open **Webhooks > Add webhook**, paste the URL and tick **Bulk list completed**.
3. For a list created through the API, pass that endpoint's id as `webhook_endpoint_id` when you create it. A list
   uploaded in the dashboard notifies every endpoint subscribed to the event.

Without code, the workflow cannot check our [signature](https://email-validation.org/docs/webhooks/), so treat a delivery only as a hint: read the
job with `GET https://api.email-validation.org/v1/bulk/<job_id>` (the `job_id` from the delivery) and act on that answer.
