Engineering16 min read

Email Verification REST API: Integration Patterns That Work

Build with an email verification REST API the right way: validate signups, handle risky results, cache checks, and reduce bounces before sending.

B
The Bounceable Team
Email verification API workflow from checks to inbox

An email verification REST API should help you make a sending decision, not just tell you whether an address “looks valid.” In production, you need enough signal to decide when to accept, challenge, suppress, retry, or review an email address.

What an Email Verification REST API Should Return

A useful email verification REST API returns a decision plus context, so your application can take the right action.

A single true or false response looks simple. It breaks down fast in real systems. You will see catch-all domains, temporary SMTP failures, disposable domains, typos, role accounts, and mailboxes that cannot be confirmed in one request.

A stronger response includes these fields.

Core fields you should expect

A good email validation API should return signals like these:

FieldWhat it tells youCommon production use
verdictOverall result such as deliverable, risky, undeliverable, or unknownDrives your main accept, block, or review logic
risk_scoreA numeric or categorical bounce riskHelps you tune thresholds by workflow
is_disposableWhether the domain belongs to a burner or throwaway providerBlocks abuse in signup and free trial flows
is_role_accountWhether the address is a shared inbox like info@, sales@, or support@Changes lead routing and outreach behavior
is_catch_allWhether the domain appears to accept mail for any local partMarks the address as harder to confirm
suggested_correctionA likely typo fix such as gmial.com → gmail.comLets you prompt the user before submission
is_free_providerWhether the address uses Gmail, Yahoo, Outlook, or another free providerUseful for B2B qualification and segmentation
checksLower-level validation resultsUseful for debugging and audit trails

Here is an illustrative response shape:

{
  "email": "alex@gmial.com",
  "verdict": "risky",
  "risk_score": 72,
  "is_disposable": false,
  "is_role_account": false,
  "is_catch_all": false,
  "is_free_provider": true,
  "suggested_correction": "alex@gmail.com",
  "checks": {
    "syntax": "pass",
    "domain": "pass",
    "mx": "pass",
    "smtp": "inconclusive"
  }
}

Do not copy this schema blindly. Providers use different names. What matters is that you get enough detail to build policy.

Syntax, domain, SMTP, and scoring are different checks

Email verification is not one test. It is a set of checks with different confidence levels.

Syntax validation checks whether the address follows a valid format. It catches obvious issues like missing @, invalid characters, or malformed domains. It does not prove the mailbox exists.

Domain checks confirm that the domain exists and has mail records. If a domain has no usable MX records, you usually cannot deliver mail there. Domain checks still do not prove that person@example.com is a real mailbox.

SMTP email verification attempts to validate the mailbox with the receiving mail server. This can provide stronger evidence, but it is not perfect. Some servers block probes. Some accept all recipients. Some defer answers with temporary failures.

Risk scoring combines these signals with known patterns. It can include disposable email detection, catch-all email detection, role account detection, typo analysis, and provider behavior.

Treat verification as evidence, not prophecy. Mail servers can change behavior, mailboxes can be deleted, and some domains intentionally hide mailbox-level answers.

Why true/false is not enough

Binary responses force bad tradeoffs.

If the API returns false for a catch-all domain, you may block real business users. If it returns true for every syntactically valid address, you may accept disposable addresses and typoed mailboxes. If it returns false for a temporary SMTP timeout, you may break signup during a provider outage.

Production systems need policy. Policy needs context.

For example:

  • undeliverable because the domain has no MX records can be blocked.
  • risky because the domain is catch-all may be allowed, but marked for lower-volume sending.
  • risky because the address is disposable may be blocked in free trial signup.
  • unknown because SMTP timed out may be accepted, then rechecked later.
  • deliverable but role_account may be accepted for billing, but excluded from personalized cold outreach.

That is why the response model matters as much as the API call.

Where to Call the API in Your Product

You should call the API at points where a better email decision prevents bounces, abuse, or bad user experience.

The right place depends on the flow. A signup form needs a different policy than a newsletter form, checkout page, or CRM import.

Signup forms

Signup is the highest-value real-time use case.

You want to catch:

  • Typos before account creation.
  • Disposable emails used for trial abuse.
  • Undeliverable addresses that would block activation or password reset.
  • High-risk domains that may hurt onboarding deliverability.

For consumer signup, call a real-time email verification API after the user enters their email and before you create the account. Keep the experience fast. If you can verify in a few hundred milliseconds, you can show inline feedback.

Use different actions by result:

  • Show typo suggestions inline.
  • Block known disposable domains if your product policy requires a durable email.
  • Block clearly undeliverable addresses.
  • Allow unknown results if the rest of the flow is critical, then recheck later.

Do not make users solve your deliverability uncertainty. If the API times out, avoid a hard failure unless the risk is severe.

Lead capture forms

Lead capture usually benefits from lower friction.

If you block too aggressively, you lose valid leads. If you accept everything, you pollute your CRM and waste sales time.

A common pattern works well:

  1. Accept the form submission.
  2. Verify the email in the background.
  3. Store the result on the lead record.
  4. Route or suppress based on risk.

For example, you might allow the form submit for a catch-all business domain, but mark the lead as email_risk = high. You might suppress a disposable address from automated nurture. You might route a valid corporate email to sales faster than a free provider address.

This pattern gives marketing and RevOps clean data without adding friction to every form.

CRM and lifecycle systems

CRM data decays. People change jobs. Domains shut down. Mailboxes get deleted.

Call an email deliverability API before:

  • Starting a sales sequence.
  • Sending a lifecycle campaign to an old segment.
  • Importing a CSV from an event or partner.
  • Re-enabling dormant users.
  • Syncing leads from enrichment tools.

You do not need to verify every record on every page load. Queue the work. Store the result. Recheck records before high-volume sends.

Checkout and transactional flows

Checkout needs special care.

A typoed email can break receipts, license delivery, account recovery, and shipping updates. But checkout friction costs money.

Use verification to help, not punish.

Good checkout patterns:

  • Show a typo prompt for obvious domain mistakes.
  • Warn on undeliverable addresses before payment.
  • Avoid blocking catch-all or unknown results unless you see fraud risk.
  • Recheck in the background after purchase if the flow must continue.

For transactional systems, think in terms of consequence. A bad email for a receipt is painful. A bad email for password reset can lock out the user. A bad email for a shipment notice can increase support volume.

Real-Time vs Batch Verification Patterns

Use real-time verification when the user can fix the address now, and use batch verification when you need to clean or score many records.

These patterns solve different problems.

PatternBest forMain benefitMain tradeoff
Real-time verificationSignup, checkout, account settings, typo promptsPrevents bad data before it enters your systemAdds latency to user-facing flows
Batch verificationCRM imports, old lists, campaign prep, dormant usersHandles volume efficientlyResults arrive later
Queued verificationLead forms, webhook-driven systems, enrichment workflowsKeeps UX fast while still scoring riskRequires async state handling
Hybrid verificationHigh-value forms and lifecycle systemsBalances UX and data qualityMore implementation work

Real-time checks

Real-time checks work best when the user is present.

That includes:

  • Account signup.
  • Email change flows.
  • Free trial registration.
  • Checkout contact fields.
  • Newsletter forms with typo correction.

The main advantage is correction. If someone types sarah@gmial.com, you can ask:

Did you mean sarah@gmail.com?

That prompt saves the user from a broken account and saves you from a bounce.

Real-time checks also help with abuse prevention. A disposable email detection API can stop burner domains before they create accounts, request coupons, or start trials.

Keep the request path simple:

curl -X POST "https://api.your-verification-provider.example/verify" \
  -H "Authorization: Bearer $EMAIL_VERIFY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"alex@example.com"}'

This is only a sketch. Use your provider’s actual endpoint, authentication method, and response schema.

Batch and queued checks

Batch verification works better when the user is not waiting.

Use it for:

  • Existing customer lists.
  • Sales prospect imports.
  • Dormant subscriber segments.
  • Pre-campaign list cleanup.
  • CRM hygiene jobs.

A queue gives you better control. You can spread requests across time, respect rate limits, retry transient failures, and avoid blocking core application flows.

A typical flow:

  1. User uploads a CSV.
  2. You normalize and deduplicate emails.
  3. You enqueue verification jobs.
  4. Workers call the API.
  5. You store results on each contact.
  6. The UI shows import status and suppression counts.

Latency and UX tradeoffs

Every API integration adds failure modes. Plan for them.

For user-facing flows:

  • Set a short timeout.
  • Show inline feedback only when you have a clear result.
  • Do not block on slow unknown outcomes.
  • Log enough metadata to debug without storing sensitive data everywhere.

For background flows:

  • Use exponential backoff for transient failures.
  • Cap retry attempts.
  • Mark records as verification_pending or verification_unknown.
  • Build dashboards for verification volume and outcome rates.

If a verification call sits directly in a signup path, set a user-experience timeout. You can always re-verify after account creation.

How to Handle API Responses Safely

Map each verification result to a specific application action before you ship the integration.

Do not let engineers, marketers, and sales reps interpret raw API fields differently in each system. Define the policy once. Then implement it consistently.

A practical response mapping

Start with a simple policy table.

API resultMeaningSuggested action
deliverableStrong evidence the address can receive mailAccept and send normally
riskySome signals increase bounce or abuse riskAccept, challenge, suppress, or throttle based on context
undeliverableStrong evidence the address cannot receive mailBlock in forms or suppress from sends
unknownVerification could not reach a confident resultAllow in critical flows, queue recheck, limit nonessential sends

Then add modifiers.

SignalDo not assumeSafer action
DisposableThe user is always maliciousBlock for trials or abuse-sensitive flows
Role accountThe address is invalidAllow for billing or support, avoid personalized outreach
Catch-allThe mailbox existsTreat as risky, not automatically bad
Free providerThe user is low qualityUse for segmentation, not hard rejection
Typo suggestionThe suggestion is guaranteed correctAsk the user to confirm

Catch-all domains need careful handling

Catch-all email detection tells you that the domain may accept mail for any local part. That makes mailbox-level verification harder.

It does not mean the address is fake.

Many legitimate company domains use catch-all behavior. Some do it for security. Some do it for routing. Some servers appear catch-all during probing but still reject later during delivery.

A safe policy:

  • Do not block every catch-all address.
  • Combine catch-all status with risk score and other signals.
  • Suppress catch-all addresses from high-volume cold campaigns if your bounce tolerance is low.
  • Allow catch-all addresses for signup when the domain and other signals look normal.
  • Recheck catch-all addresses before major sends.

Use typo correction as a prompt

Email typo correction can reduce support tickets and failed confirmations. Use it carefully.

Never silently rewrite a user’s email.

If someone enters jamie@hotnail.com, you can suggest jamie@hotmail.com. But the original might still be intentional, or your correction might be wrong.

Use copy like:

Did you mean jamie@hotmail.com?

Then let the user choose.

For backend imports, store both the original and the suggestion. Ask for review if the record matters. Do not mutate CRM data silently.

Caching, Rate Limits, and Retries

Cache recent verification results, but re-verify before high-impact sends because email validity changes.

Caching reduces latency, cost, and duplicate API calls. It also prevents your system from hammering a provider when many workflows touch the same address.

What to cache

Cache by normalized email address.

A common normalization step:

  • Trim whitespace.
  • Lowercase the domain.
  • Lowercase the local part only if your policy allows it.
  • Remove obvious copy/paste artifacts.
  • Preserve the original submitted value for display and audit.

Store:

  • Verdict.
  • Risk score.
  • Key flags.
  • Verification timestamp.
  • Provider response ID if available.
  • Your internal policy decision.

Avoid storing every raw response forever unless you have a clear need.

How long to cache

Use different freshness windows by use case.

Use caseSuggested cache behavior
Signup typo promptMinutes to days
Disposable domain statusDays to weeks, depending on provider updates
CRM enrichmentWeeks to a few months
Pre-campaign sendingRecheck if older than a few weeks or before large sends
Dormant listsAlways re-verify before reactivation

Mailbox validity changes. A result from six months ago may not protect your next campaign.

Rate limits

Your integration should expect rate limits.

Design for:

  • Bounded concurrency.
  • Queue workers with configurable throughput.
  • Backoff on 429 responses.
  • Dead-letter queues for repeated failures.
  • Partial completion on large imports.

Do not build a CSV import that starts 500,000 synchronous HTTP requests from one web request. Put it on a job queue.

Timeouts and unknowns

Timeouts happen. DNS gets slow. Mail servers defer. APIs have incidents.

Your app should not collapse when verification cannot complete.

Use a pattern like this:

async function verifyWithFallback(email) {
  try {
    const result = await verifyEmail(email, { timeoutMs: 1500 });

    if (result.verdict === "undeliverable") {
      return { action: "block", reason: "undeliverable" };
    }

    if (result.is_disposable) {
      return { action: "challenge", reason: "disposable" };
    }

    if (result.verdict === "unknown") {
      return { action: "allow_and_recheck", reason: "unknown" };
    }

    return { action: "allow", reason: "verified" };
  } catch (err) {
    return { action: "allow_and_recheck", reason: "verification_timeout" };
  }
}

The exact action depends on your risk tolerance. The important part is that failure has a planned path.

Security and Privacy Considerations

Send only the email address and metadata required for verification.

Email addresses are personal data in many contexts. Treat them that way.

Minimize what you send

Most verification calls only need the email address.

Avoid sending:

  • Full user profiles.
  • Names.
  • IP addresses unless needed for fraud workflows.
  • CRM notes.
  • Purchase history.
  • Internal user IDs that expose business context.

If you need a correlation ID, use a random request ID that has no meaning outside your system.

Avoid unnecessary logging

Logs create long-lived copies of data.

Be careful with:

  • Frontend console logs.
  • Server access logs with query strings.
  • Error tracking tools.
  • Reverse proxy logs.
  • Analytics events.
  • Debug dumps of API responses.

Prefer POST bodies over query strings when possible, because URLs often land in logs. Redact or hash email addresses in application logs unless you need the full value for a specific operational reason.

A safe log line might look like:

{
  "event": "email_verification_completed",
  "email_hash": "sha256:...",
  "verdict": "risky",
  "is_disposable": false,
  "is_catch_all": true,
  "duration_ms": 384
}

Protect API keys

Do not call a paid email verification API directly from browser code if it exposes your secret key.

Call it from your backend when possible. Your backend can:

  • Protect credentials.
  • Apply rate limits.
  • Normalize inputs.
  • Cache results.
  • Enforce policy.
  • Redact logs.

If you must call from an edge or frontend-adjacent environment, use scoped credentials where available and restrict usage tightly.

Also rotate keys on a schedule and after employee offboarding or vendor changes.

Example Decision Rules for Production

Good decision rules combine the verdict, risk score, and specific signals for your workflow.

There is no universal policy. A consumer app fighting trial abuse should be stricter than a B2B lead form. A cold outreach system should be stricter than a receipt workflow.

Consumer signup

Goal: prevent abuse and make sure users can receive account email.

Example rules:

  1. If syntax or domain checks fail, block and ask for a different email.
  2. If the API returns undeliverable, block account creation.
  3. If suggested_correction exists, prompt the user before submission.
  4. If is_disposable is true, block or require a stronger challenge.
  5. If result is unknown, allow signup but require email confirmation.
  6. If result is risky only because of catch-all, allow but monitor.

This flow keeps friction focused on high-risk cases.

B2B lead capture

Goal: preserve conversion while improving CRM quality.

Example rules:

  1. Accept the form submission unless the email is clearly malformed.
  2. Verify in the background.
  3. If undeliverable, mark the lead invalid and suppress nurture.
  4. If is_role_account, route to a general queue or lower-priority workflow.
  5. If is_free_provider, keep the lead but avoid assuming company identity.
  6. If is_catch_all, allow sales review but reduce automated send volume.
  7. If risk_score is high, require enrichment or manual review before outreach.

This approach avoids blocking legitimate buyers because one signal looked imperfect.

Cold outreach and sales sequences

Goal: protect sender reputation and reduce bounces.

Cold outreach needs stricter controls because recipients did not ask for your message. Your tolerance for bounce risk should be low.

Example rules:

  1. Suppress undeliverable addresses.
  2. Suppress disposable addresses.
  3. Avoid role accounts for personalized sequences.
  4. Segment catch-all addresses into lower-volume sends or manual review.
  5. Re-verify any address older than your freshness window.
  6. Start with small batches when sending to newly verified lists.
  7. Monitor actual bounces and feed results back into your CRM.

Do not use verification as permission. It only tells you about deliverability risk. You still need lawful basis, consent rules where applicable, and good sending practices.

A simple policy matrix

You can encode policy like this:

WorkflowDeliverableRiskyUndeliverableUnknown
Consumer signupAllowChallenge if disposable or high riskBlockAllow + confirm
B2B lead formAcceptAccept + flagAccept form, suppress automationAccept + recheck
CheckoutAllowWarn only for clear issuesAsk user to correctAllow + recheck
Cold outreachSend if freshReview or throttleSuppressRecheck before send
CRM importImport + mark validImport + flagImport + suppressImport + pending

Putting it together with an API integration

A production API integration usually has four layers:

  1. Request layer
    Normalizes the email and calls the provider.

  2. Result layer
    Stores the raw verdict, risk score, and key flags.

  3. Policy layer
    Converts verification signals into your internal action.

  4. Workflow layer
    Applies the action in signup, CRM, checkout, or sending systems.

Keep those layers separate. It makes provider changes easier. It also lets you tune policy without rewriting every form.

Bounceable’s REST API fits this pattern: you can verify deliverability, detect disposable domains, flag catch-all and role accounts, get risk signals, and use typo suggestions where they help the user. Start with one workflow, measure the outcomes, then expand to imports and lifecycle sends.

Catch bad addresses before they bounce.
Verify your list free

Frequently asked questions

Keep reading