Examples

Basic Setup

The simplest possible setup - validate all email inputs with default settings:

<!DOCTYPE html>
<html>
<head>
  <title>Email Validation Example</title>
</head>
<body>
  <form>
    <label for="email">Email Address</label>
    <input type="email" id="email" name="email" required>
    <button type="submit">Submit</button>
  </form>

  <script src="https://verifyforge.com/widget/verifyforge.min.js"></script>
  <script>
    verifyforge('apiKey', 'your_public_api_key');
  </script>
</body>
</html>

Business Email Only

Block free email providers (Gmail, Yahoo, etc.) to collect only business emails:

<script src="https://verifyforge.com/widget/verifyforge.min.js"></script>
<script>
  verifyforge('apiKey', 'your_public_api_key');

  verifyforge('allow', {
    states: ['deliverable', 'risky'],
    free: false,        // Block free providers
    role: false,        // Block role accounts
    disposable: false   // Block disposable emails
  });

  verifyforge('messages', {
    free: 'Please use your company email address.',
    role: 'Please use your personal work email.',
    disposable: 'Temporary email addresses are not allowed.'
  });
</script>

Newsletter Signup

Allow all valid emails including free providers:

<form id="newsletter">
  <input type="email" name="email" placeholder="Enter your email" required>
  <button type="submit">Subscribe</button>
</form>

<script src="https://verifyforge.com/widget/verifyforge.min.js"></script>
<script>
  verifyforge('apiKey', 'your_public_api_key');

  verifyforge('allow', {
    states: ['deliverable', 'risky'],  // Allow most emails
    free: true,                        // Allow Gmail, Yahoo, etc.
    role: true,                        // Allow info@, contact@
    disposable: false                  // Block temp emails
  });
</script>

Multiple Forms with Different Rules

Validate different forms with different requirements:

<form id="business-form">
  <input type="email" name="work-email" placeholder="Work email">
  <button>Submit</button>
</form>

<form id="newsletter-form">
  <input type="email" name="personal-email" placeholder="Personal email">
  <button>Subscribe</button>
</form>

<script src="https://verifyforge.com/widget/verifyforge.min.js"></script>
<script>
  verifyforge('apiKey', 'your_public_api_key');

  // Business form - strict rules
  document.querySelector('#business-form input[type=email]')
    .addEventListener('verified', function(event) {
      const data = JSON.parse(event.detail.verificationData.body);
      if (data.freeProvider) {
        this.setCustomValidity('Please use your business email');
      }
    });

  // Newsletter form - lenient rules
  verifyforge('ignoredForms', ['newsletter-form']); // Skip widget validation
</script>

Custom Validation UI

Replace the default UI with your own custom styling:

<style>
  .email-field {
    position: relative;
  }
  .email-status {
    margin-top: 8px;
    padding: 8px 12px;
    border-radius: 4px;
    font-size: 14px;
  }
  .email-status.success {
    background: #d1fae5;
    color: #065f46;
  }
  .email-status.error {
    background: #fee2e2;
    color: #991b1b;
  }
  .email-status.loading {
    background: #e0e7ff;
    color: #3730a3;
  }
</style>

<div class="email-field">
  <input type="email" id="email" name="email">
  <div id="email-status" class="email-status" style="display: none;"></div>
</div>

<script src="https://verifyforge.com/widget/verifyforge.min.js"></script>
<script>
  verifyforge('apiKey', 'your_public_api_key');

  const emailInput = document.querySelector('#email');
  const statusDiv = document.querySelector('#email-status');

  // Show custom loading state
  emailInput.addEventListener('input', function() {
    if (this.value.includes('@')) {
      statusDiv.className = 'email-status loading';
      statusDiv.textContent = 'Verifying...';
      statusDiv.style.display = 'block';
    } else {
      statusDiv.style.display = 'none';
    }
  });

  // Show custom validation result
  emailInput.addEventListener('verified', function(event) {
    if (event.detail.accepted) {
      statusDiv.className = 'email-status success';
      statusDiv.textContent = 'Email verified!';
    } else {
      statusDiv.className = 'email-status error';
      statusDiv.textContent = event.detail.message;
    }
    statusDiv.style.display = 'block';
  });

  emailInput.addEventListener('error', function(event) {
    statusDiv.className = 'email-status error';
    statusDiv.textContent = 'Could not verify email';
    statusDiv.style.display = 'block';
  });
</script>

Typo Suggestions

Automatically suggest corrections for common typos:

<div>
  <input type="email" id="email" name="email">
  <div id="suggestion" style="display: none; margin-top: 8px;">
    Did you mean <a href="#" id="suggestion-link"></a>?
  </div>
</div>

<script src="https://verifyforge.com/widget/verifyforge.min.js"></script>
<script>
  verifyforge('apiKey', 'your_public_api_key');

  const emailInput = document.querySelector('#email');
  const suggestionDiv = document.querySelector('#suggestion');
  const suggestionLink = document.querySelector('#suggestion-link');

  emailInput.addEventListener('verified', function(event) {
    const data = JSON.parse(event.detail.verificationData.body);

    if (data.suggestion) {
      // Show clickable suggestion
      suggestionLink.textContent = data.suggestion;
      suggestionDiv.style.display = 'block';

      suggestionLink.onclick = function(e) {
        e.preventDefault();
        emailInput.value = data.suggestion;
        suggestionDiv.style.display = 'none';
        // Trigger validation of corrected email
        emailInput.dispatchEvent(new Event('input'));
      };
    } else {
      suggestionDiv.style.display = 'none';
    }
  });
</script>

Prevent Form Submission

Block form submission until email is validated and accepted:

<form id="signup-form">
  <input type="email" id="email" name="email" required>
  <button type="submit" id="submit-btn">Sign Up</button>
</form>

<script src="https://verifyforge.com/widget/verifyforge.min.js"></script>
<script>
  verifyforge('apiKey', 'your_public_api_key');

  const form = document.querySelector('#signup-form');
  const emailInput = document.querySelector('#email');
  const submitBtn = document.querySelector('#submit-btn');
  let emailVerified = false;

  emailInput.addEventListener('verified', function(event) {
    emailVerified = event.detail.accepted;
    submitBtn.disabled = !emailVerified;
  });

  emailInput.addEventListener('input', function() {
    // Disable submit while typing
    emailVerified = false;
    submitBtn.disabled = true;
  });

  form.addEventListener('submit', function(event) {
    if (!emailVerified) {
      event.preventDefault();
      alert('Please wait for email verification to complete');
    }
  });
</script>

React Integration

Use the widget in a React application:

import { useEffect, useRef, useState } from 'react';

function EmailInput() {
  const inputRef = useRef(null);
  const [status, setStatus] = useState({ type: '', message: '' });

  useEffect(() => {
    const input = inputRef.current;
    if (!input) return;

    const handleVerified = (event) => {
      if (event.detail.accepted) {
        setStatus({ type: 'success', message: 'Email verified!' });
      } else {
        setStatus({ type: 'error', message: event.detail.message });
      }
    };

    const handleError = (event) => {
      setStatus({ type: 'error', message: 'Verification failed' });
    };

    input.addEventListener('verified', handleVerified);
    input.addEventListener('error', handleError);

    return () => {
      input.removeEventListener('verified', handleVerified);
      input.removeEventListener('error', handleError);
    };
  }, []);

  return (
    <div>
      <input
        ref={inputRef}
        type="email"
        name="email"
        className="email-input"
      />
      {status.message && (
        <div className={`status-${status.type}`}>
          {status.message}
        </div>
      )}
    </div>
  );
}

// In your app initialization
useEffect(() => {
  if (window.verifyforge) {
    window.verifyforge('apiKey', 'your_public_api_key');
  }
}, []);

Vue Integration

Use the widget in a Vue application:

<template>
  <div class="email-field">
    <input
      ref="emailInput"
      type="email"
      v-model="email"
      @verified="handleVerified"
      @error="handleError"
    />
    <div v-if="status.message" :class="`status-${status.type}`">
      {{ status.message }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      email: '',
      status: { type: '', message: '' }
    };
  },
  mounted() {
    if (window.verifyforge) {
      window.verifyforge('apiKey', 'your_public_api_key');
    }
  },
  methods: {
    handleVerified(event) {
      if (event.detail.accepted) {
        this.status = { type: 'success', message: 'Email verified!' };
      } else {
        this.status = { type: 'error', message: event.detail.message };
      }
    },
    handleError(event) {
      this.status = { type: 'error', message: 'Verification failed' };
    }
  }
};
</script>

Analytics Tracking

Track email validation results in your analytics:

<script src="https://verifyforge.com/widget/verifyforge.min.js"></script>
<script>
  verifyforge('apiKey', 'your_public_api_key');

  // Track all email validations
  document.addEventListener('verified', function(event) {
    if (event.target.matches('input[type=email]')) {
      const data = JSON.parse(event.detail.verificationData.body);

      // Google Analytics
      gtag('event', 'email_validated', {
        accepted: event.detail.accepted,
        state: data.state,
        is_disposable: data.disposable,
        is_free: data.freeProvider,
        is_role: data.roleAccount
      });

      // Segment
      analytics.track('Email Validated', {
        accepted: event.detail.accepted,
        state: data.state,
        disposable: data.disposable,
        free: data.freeProvider,
        role: data.roleAccount
      });
    }
  });
</script>