ZapBounce and n8n

n8n's self-hosted option removes the per-execution cost that shapes every other automation platform, which changes what is worth building here.

A workflow that loops over ten thousand addresses is reasonable in n8n and ruinous in a per-task tool. The constraint becomes rate limiting rather than billing.

Without per-task cost, rate limiting becomes the constraint

An n8n loop will happily fire requests as fast as the node can execute them, which on a self-hosted instance with decent hardware is faster than the rate limit allows.

The result is a workflow that works on a test of ten addresses and returns a wall of 429s on a real list, usually at three in the morning when nobody is watching.

The HTTP Request node has retry settings, and they need configuring rather than accepting. Back off for the rate-limit window (the X-RateLimit-Window-Seconds header) rather than retrying immediately.

How the data moves

  1. Use the HTTP Request node with retry enabled

    Set the retry count and delay explicitly. The defaults are not tuned for an API with a published rate limit.

  2. Submit a job for anything list-shaped

    Even without per-task billing, a job is faster than a loop and lets the server pace probes per receiving mail host.

  3. Poll for completion on a schedule

    A separate workflow on a Schedule trigger that calls GET /v1/jobs/{id}, rather than a Wait node holding an execution open.

  4. Stop on a terminal status

    An IF node on the job status ends the polling once it reads completed, partial, failed or cancelled.

Setting it up

  1. Add an HTTP Request node pointing at the jobs endpoint, with the key in an X-API-Key header credential.
  2. Configure retry on the node with a delay that respects the rate limit.
  3. Add a second workflow on a Schedule trigger that polls the job status.
  4. Add an IF node that stops polling once the status is completed, partial, failed or cancelled.
  5. Loop the results with the page and pageSize parameters rather than requesting one large page.
  6. Store the key as an n8n credential rather than inline in the node.

n8n: common questions

Loop or job?

A job for anything over a few dozen addresses. The server paces probes per mail host, which a client-side loop cannot do.

How do I know when a job is finished in n8n?

A Schedule-triggered workflow reads status from GET /v1/jobs/{id} and continues once it is completed, partial, failed or cancelled.

Where should the key live?

An n8n credential, so it is encrypted at rest and not visible in the workflow JSON.

Check a n8n export today

100 free checks a month, no card. Unknown results are refunded.