Signup protection recipe
Filter fake form signups in Zapier or n8n
Between the form trigger and the step that adds the person to your list or CRM, add one HTTP request to the SimpleVerifier API with the email, then a filter. Drop rows where action is do_not_send, tag rows where reason_code is role or catch_all, and pass the rest. No code needed.
- Where it runs
- Runs after the form is submitted, before the contact reaches your list or CRM. It can't show an error on the form itself.
- Timeout
- Set the HTTP step's timeout to about 30 seconds; automation runs don't have a person waiting.
You need an API key from the API keys page (Pro, Business or Agency), stored server-side as SIMPLEVERIFIER_KEY. Reviewed 2026-10-31.
Block, warn or allow
- Block: disposable or temporary inbox (reason_code "disposable" (action "do_not_send"))
- Block: invalid: bad format, no mail server, mailbox not found (action "do_not_send" (reason_code "syntax", "no_mx", "mailbox_not_found", "domain_not_hosted"))
- Block: misspelled domain (gmial.com, hotmial.com) (reason_code "typo_domain" (action "do_not_send"))
- Warn: role inbox (info@, sales@, admin@) (reason_code "role")
- Warn: catch-all domain (reason_code "catch_all")
- Warn: looks invented (test@, john.doe@, example.com) (likely_invented true)
- Allow: valid, or the check could not finish (action "send", "send_with_care", "retry_later", or any non-2xx answer or timeout)
The reasoning for each row is on the signup protection overview.
1. Zapier: add a Webhooks by Zapier step
Choose the Custom Request event. Map the email from your form trigger into the body.
Method: POST URL: https://simpleverifier.com/api/v1/verify Data Pass-Through: false Data: {"email": "<map the email field from your form>"} Headers: Authorization | Bearer sv_live_... Content-Type | application/json2. Zapier: filter and route
Add Filter by Zapier (or Paths for a tag branch) after the request. If the webhook step errors, Zapier stops the run by default; to fail open, set the step's error handling to continue.
Only continue if: action (Text) Does not exactly match do_not_send Paths (optional): Tag as "check" if reason_code is in role, catch_all OR likely_invented is true Add normally otherwise3. n8n: HTTP Request node
Store the key as a Header Auth credential so it never sits in the workflow JSON. Under Settings set On Error to Continue, so an outage lets the contact through.
Method: POST URL: https://simpleverifier.com/api/v1/verify Authentication: Generic Credential Type > Header Auth Name: Authorization Value: Bearer sv_live_... Send Body: on, JSON Body: { "email": "{{ $json.email }}" } Options > Timeout: 300004. n8n: Switch node
Route on the decision fields. Connect Block to nothing (or to a log), Warn to a node that tags the contact, Allow to your list.
Mode: Rules Block: {{ $json.action }} is equal to do_not_send Warn: {{ ["role", "catch_all"].includes($json.reason_code) || $json.likely_invented === true }} is true Fallback output: Allow
Common questions
- Which plan do I need for Zapier or n8n?
- Any plan with API access (Pro, Business or Agency). Each check is one API call.
- Can I check a whole sheet of old sign-ups this way?
- You can, but a CSV upload in the dashboard is quicker for a backlog. Use the automation for new sign-ups as they arrive.
- Which plan includes the API?
- Pro ($29.99/month, 10,000 calls a month included), Business and Agency. Each address checked is one call. Starter and Growth have no API access.
- How do I try it without blocking anyone?
- Set SIGNUP_GUARD_DRY_RUN=1. The code logs what it would block and lets everyone through. Read the logs for a few days, then remove the variable.
Other recipes
- Block fake and disposable signups in Supabase Auth
- Block fake and disposable signups in Clerk
- Block fake and disposable signups in Firebase Auth
- Block fake and disposable signups in Next.js
- Express middleware that blocks fake signups
- Block fake signups at the edge with a Cloudflare Worker
- Filter fake Webflow and Framer form signups