Integrations
ActiveCampaign integration
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.
- Status: Setup guide
- A sync command and a webhook relay
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 tagsAt 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 made for it, with a daily credit cap; 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
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, which stays the reference when a step does not match what you see.
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.
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.
Clean a list
Set
EV_API_KEY,ACTIVECAMPAIGN_URLandACTIVECAMPAIGN_API_TOKEN, runnode sync.mjs --list 3 --dry-runto count, then run it again without--dry-runto check and tag. A list’s id is the number in its page’s address.Deploy the relay
Deploy
relay.jsto your Cloudflare account with wrangler, with your ActiveCampaign URL, and give it the secretsEV_API_KEY,ACTIVECAMPAIGN_API_TOKENandRELAY_SECRET, at least 32 random letters and digits.Add the webhook
Under Settings, Developer, Webhooks, add the relay’s address followed by
/and yourRELAY_SECRET, choose the list, the type Contact added only and all sources.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.
--suppressalso 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, add
--region euto the sync command and--var EV_REGION:euto the relay’s deploy.
Updated · Maintained by the email-validation.org team