# ActiveCampaign Integration for Email Validation

URL: https://email-validation.org/integrations/activecampaign/
Updated: 2026-11-06

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

Tag each ActiveCampaign contact with its validation result, so one segment on ev:remove leaves out every address you should not mail. A sync command checks a whole list as one bulk list, and a webhook relay on your own Cloudflare account checks each new contact within seconds.

[Read the full setup guide](https://email-validation.org/docs/guides/activecampaign/) [Get an API key](https://email-validation.org/signin/)

- Status: Setup guide
- A sync command and a webhook relay

**Clean a list** Node 22.18 or later

Terminal

```bash
export EV_API_KEY=…                # your API key, with Bulk lists
export ACTIVECAMPAIGN_URL=…        # Settings, Developer: URL
export ACTIVECAMPAIGN_API_TOKEN=…  # Settings, Developer: Key

node sync.mjs --list 3 --dry-run   # counts what it would check
node sync.mjs --list 3             # checks and tags
```

## At a glance.

- **Status**: **Setup guide.** Not listed on a marketplace yet: you set it up yourself in a few steps, below and in the full guide.
- **For**: ActiveCampaign users who want bad addresses kept out of their campaigns and automations: a list cleaned before a send, and each new contact checked as it arrives.
- **You need**: The URL and Key shown under Settings, Developer in ActiveCampaign, for a user who can view and edit contacts and manage tags, and an [API key](https://email-validation.org/app/api-keys/) made for it, with a [daily credit cap](https://email-validation.org/docs/authentication/#limits); the sync command also needs its Bulk lists permission, which is off by default. The sync command runs on Node 22.18 or later, the relay on a Cloudflare account of yours.
- **Costs**: 1 credit = 1 validated address, as with any API request. Free: unknown results, API errors, malformed addresses and test addresses on sandbox.email-validation.org.
- **Full guide**: [Read the full setup guide](https://email-validation.org/docs/guides/activecampaign/)

## Typical uses.

- **Clean a list before a send**: Run the sync command on a list: it checks every contact that has no result yet in one bulk list and tags each one ev:valid, ev:invalid, ev:catch\_all, ev:unknown or ev:disposable.
- **Check new contacts**: The relay receives ActiveCampaign’s Contact added webhook, reads the contact by its id, checks the address stored on it and tags it within a few seconds.
- **Segment on ev:remove**: Every contact whose action is remove gets ev:remove, spam traps and complainers included, so the segment Tag is ev:remove holds everyone you should not mail, and an automation can start when the tag is added.

## Set it up. 6 steps.

The short version of the [full setup guide](https://email-validation.org/docs/guides/activecampaign/), which stays the reference when a step does not match what you see.

1. **Create a key**: Create an API key with Validate addresses, plus Bulk lists for the sync command, and a daily credit cap. Download the three files the guide links: sync.mjs, relay.js and webhook.json.
2. **Copy your ActiveCampaign details**: In ActiveCampaign, open Settings, Developer and copy the URL exactly as it is shown there, and the Key. Keep the Key secret: it can do what your user can do.
3. **Clean a list**: Set `EV_API_KEY`, `ACTIVECAMPAIGN_URL` and `ACTIVECAMPAIGN_API_TOKEN`, run `node sync.mjs --list 3 --dry-run` to count, then run it again without `--dry-run` to check and tag. A list’s id is the number in its page’s address.
4. **Deploy the relay**: Deploy `relay.js` to your Cloudflare account with wrangler, with your ActiveCampaign URL, and give it the secrets `EV_API_KEY`, `ACTIVECAMPAIGN_API_TOKEN` and `RELAY_SECRET`, at least 32 random letters and digits.
5. **Add the webhook**: Under Settings, Developer, Webhooks, add the relay’s address followed by `/` and your `RELAY_SECRET`, choose the list, the type Contact added only and all sources.
6. **Test it**: Add a test contact with `no_mailbox@sandbox.email-validation.org`: within a few seconds it has the tags ev:invalid and ev:remove, at no cost. Then delete the test contact.

## Good to know.

- If a sync run stops for any reason, such as no credits or a closed laptop, run the same command again: it keeps the bulk job’s id in a small state file, ids only, and resumes that job, so a list is never paid for twice.
- `--suppress` also unsubscribes the contacts whose action is remove from the list you passed, and ActiveCampaign runs that list’s unsubscribe automations and notifications: check them before the first run. Nothing is ever deleted.
- ActiveCampaign never delivers a webhook again after a failure and sends none for contact imports, so run the sync command after an import, and on a schedule if you rely on the relay.
- The secret in the relay’s address is what proves a delivery comes from your webhook: keep request logs that record URLs off for the Worker, and change the secret if it leaks.
- ActiveCampaign allows 5 API requests a second per account and the sync command uses 4 by default, so a large account takes time. For [EU data residency](https://email-validation.org/docs/eu-data-residency/), add `--region eu` to the sync command and `--var EV_REGION:eu` to the relay’s deploy.

## Related

- [The full ActiveCampaign setup guide](https://email-validation.org/docs/guides/activecampaign/)
- [The six tags and what each one means](https://email-validation.org/docs/guides/activecampaign/#tags)
- [What each relay answer means, and what to do](https://email-validation.org/docs/guides/activecampaign/#errors)
- [Bulk lists](https://email-validation.org/docs/bulk/)
- [Statuses and actions](https://email-validation.org/docs/statuses/)
- [All integrations](https://email-validation.org/integrations/)
