Email verification has two operational modes. Real-time fires on every signup form submission, returning a verdict in under a second. Bulk processes a CSV of thousands or millions of addresses, returning a cleaned file minutes to hours later. The same provider can offer both, but the architecture, latency budget, and cost model are completely different.
This guide explains when to use each, the developer trade-offs, and the hybrid approach most teams converge on after a year in production.
Real-Time Verification — What It Is
Real-time verification is an API call made synchronously during a user-facing action — typically signup form submission. The API receives one email address, returns a verdict (valid, invalid, risky, etc.) within ~1 second, and your form either accepts the submission or rejects it.
Typical use cases:
- Newsletter signup forms (block typos, disposables before they enter the list)
- B2B SaaS signup flow (verify business emails, block role/disposable addresses)
- Lead capture forms
- Account creation
- Checkout flow email validation
- Latency budget: 500-1500ms (longer feels broken)
- Volume: 1 email per call
- Sync expectation: response blocks UX
- Failure mode: must degrade gracefully (if API down → allow signup, don't lose users)
Operational characteristics:
Bulk Verification — What It Is
Bulk verification is an asynchronous process for an entire list at once. You upload a CSV (or POST a JSON array), the verification service processes through its pipeline (syntax → DNS → SMTP → ML scoring), and you receive a result file or webhook callback minutes to hours later.
Typical use cases:
- Pre-flight check before a marketing campaign
- One-time list cleanup (post-acquisition, post-merger, post-import)
- Quarterly hygiene runs
- Cleaning a database before migrating ESPs
- Latency budget: minutes to hours (acceptable because no user is waiting)
- Volume: 1K to 10M addresses per batch
- Sync expectation: async, with webhook or polling for completion
- Failure mode: retries are automatic; if the whole job fails, re-run is acceptable
Operational characteristics:
Latency Budget — The Real-Time Constraint
If your signup form takes >2 seconds to respond, users abandon. Real-time verification must fit comfortably within that budget. The challenge: a thorough verification (SMTP RCPT TO probe with timeouts, MX retries, blacklist checks) can take 5-30 seconds.
How real-time APIs solve this:
Good real-time APIs return in <1s on average, <2s p95. If your provider regularly exceeds 2s, it's not real-time.
Bulk Verification — The Deep Pipeline
Bulk has no latency budget, so it can use the deep pipeline:
This produces higher accuracy than real-time can — typically 99.5%+ vs 98% for the same provider's real-time path. The cost is wall-clock time: a 100K-address bulk job typically completes in 30-90 minutes.
Cost Models
Real-time is usually metered per call. Bulk is metered per processed address with the same per-unit cost but volume discounts at scale.
Real-time pricing patterns:
- Per-call cost ($0.005-$0.02 per check)
- Monthly minimums on some providers
- Free tier typically 100-1000/month
- Per-address cost, often discounted vs real-time at volume
- Tiered: 0-10K, 10K-100K, 100K-1M
- Credits-based: buy 1M credits, use across both modes
Bulk pricing patterns:
BounceZero's model: unified credits — 1 credit per verification regardless of mode. Bulk and real-time both pull from the same pool. Credits never expire.
The Hybrid Pattern (What Most Teams End Up Doing)
Mature email programs use both, and the rule of thumb is:
Real-time AT every signup:
- Block invalid emails before they pollute the list
- Block disposables (unless you specifically want them, e.g., free tier with email-throttle)
- Block role addresses for B2C signups
- Auto-correct typo domains (gmial.com → gmail.com)
- Re-verify any address last verified >30 days ago
- Re-verify the entire list before list-of-record events (annual review, post-import)
- Re-verify after any ESP migration
Bulk BEFORE every major campaign:
Why both: real-time catches new entries but doesn't catch existing rot (subscribers whose addresses became invalid after they signed up). Bulk catches existing rot but doesn't prevent new entries. You need both.
Integration Patterns
Real-time integration (typical):
``js
// Frontend: on signup form blur or submit
fetch('https://api.bouncezero.io/v1/verify', {
method: 'POST',
headers: { 'X-API-Key': 'your-key' },
body: JSON.stringify({ email: form.email })
})
.then(r => r.json())
.then(result => {
if (result.status === 'invalid') showError(result.reason);
else proceedWithSignup();
});
`
Bulk integration (typical):
`js
// 1. Submit batch
const batch = await fetch('/v1/batch', {
method: 'POST',
headers: { 'X-API-Key': 'key' },
body: JSON.stringify({ emails: [...listOf100K] })
}).then(r => r.json());
// batch.id = 'batch_abc123'
// 2a. Webhook (preferred): provider POSTs results to your callback
// when complete
// 2b. Polling fallback
let status;
do {
await sleep(60000);
status = await fetch(/v1/batch/${batch.id}).then(r => r.json());
} while (status.state === 'processing');
// 3. Download results
const results = await fetch(status.result_url).then(r => r.json());
``
Webhooks are universally preferred over polling — less load, faster reaction, no rate-limit risk.
Failure Handling — Real-Time vs Bulk
Real-time failures:
- API timeout (>2s) → DEGRADE GRACEFULLY: allow signup. Better to accept a signup than lose a customer over a transient API issue.
- API error (5xx) → same: degrade gracefully, log for investigation.
- Network error → same.
- Result
unknown(provider couldn't determine) → allow signup, mark for re-verification later in bulk. - Batch fails partway → most providers resume from last checkpoint. If yours doesn't, design for idempotent re-runs.
- Individual address fails → result will be
unknownorerror; handle as you would in a real-timeunknown. - Webhook never fires → fallback to polling after 2x expected duration.
Bulk failures:
Key principle: real-time should never block a user. Bulk should never lose data. Both should be designed for retry.
Choosing for Your Use Case
You need ONLY real-time if:
- You're early-stage and don't have an existing list to clean
- Your traffic is signup-driven and your list grows organically
- You can defer the "clean existing list" decision until you have one worth cleaning
- You acquired a list (M&A, partnership, scraped) — never been verified
- You're migrating ESPs and want to clean before importing
- You inherited a list from a predecessor ("please don't email these dead addresses")
- You're a B2B SaaS with signups + marketing
- You're a marketing team with both forms and campaigns
- You're a developer integrating verification into a customer-facing product (where customers expect signup validation AND list-cleaning tools)
You need ONLY bulk if:
You need BOTH if:
Most teams that start with one end up adding the other within 6 months.
Frequently Asked Questions
Can a single API key do both real-time and bulk?
Yes, with most providers including BounceZero. The same API key authenticates against both endpoints (`/verify` for real-time, `/batch` for bulk). Usage is tracked across both — your credit pool is shared. This is convenient for unified billing and unified rate limits.
What latency is 'acceptable' for real-time verification?
Aim for p50 <500ms, p95 <1500ms, p99 <2500ms. Above 2 seconds, signup form perception breaks down — users start clicking submit twice or abandoning. If your provider's p95 is regularly above 2s, it's a degraded experience masquerading as real-time.
When should I re-verify addresses I've already verified?
Industry standard: re-verify after 90 days. Addresses go invalid at ~22.5%/year (job changes, abandoned accounts, deactivated mailboxes), so a 90-day-old verification has roughly 5-6% probability of being stale. For high-stakes sends (large campaigns, cold outreach), re-verify after 30 days. For low-stakes (frequent transactional), 180 days is acceptable.
Does bulk verification cost the same per-address as real-time?
Usually yes — most providers charge per email verified regardless of mode. The exception is providers with separate pricing tiers; BounceZero uses unified credits where 1 verification = 1 credit. The cost lever is volume: bulk discounts apply once you cross ~100K/month, real-time pricing tends to stay flat per-call.
One API, Both Modes
BounceZero gives you real-time + bulk on the same API key, same credits, same accuracy. Start with 100 free credits.
Get Free API Key