Skip the hassle of setting up servers or PHP. Your forms just work — simple and code-free.
Forget about managing accounts. Authenticate once with your access key — no login required.
Form submissions are sent directly to your inbox. Nothing is stored on our servers.
We only use your email for authentication. Your data is never shared or sold to third parties.
Choose any URL for success or error redirects. No forced lock-ins, full flexibility.
Clean, professional emails with minimal branding. Pro users unlock full customization.
Free forever — no signup required.
Generate a free one-time access key linked to your email. You can create up to 10 keys and even restrict them by domain for extra security.
Build your contact form using your favorite web technology. VeriContact supports both JSON requests and simple form-POST submissions.
<form action="https://vericontact.xyz/api/contact-api/" method="POST">
<!-- Replace with your Access Key (Step 3) -->
<input type="hidden" name="key" value="YOUR_ACCESS_KEY_HERE">
<!-- Form Inputs (Step 2) -->
<input type="text" name="name" placeholder="Your Name" required>
<input type="email" name="email" placeholder="you@example.com" required>
<textarea name="message" placeholder="Write your message..." required></textarea>
<!-- Honeypot Spam Protection -->
<input type="checkbox" name="botcheck" class="hidden" style="display:none">
<button type="submit">Submit Form</button>
</form>
// Step 1: Create/Load access key (replace generator with your API)
const ACCESS_KEY_STORAGE = "vericontact_access_key";
function getAccessKey() {
let key = localStorage.getItem(ACCESS_KEY_STORAGE);
if (!key) {
// Mock generator (swap for a real fetch to your key endpoint)
key = crypto.randomUUID();
localStorage.setItem(ACCESS_KEY_STORAGE, key);
}
return key;
}
// Step 3: Inject key into a hidden input in your form
document.addEventListener("DOMContentLoaded", () => {
const form = document.querySelector("form[action*='web3forms']");
const keyInput = form?.querySelector("input[name='access_key']");
if (form && keyInput) {
keyInput.value = getAccessKey();
}
});
// Optional: handle submit via fetch (instead of native POST)
async function submitContact(payload) {
const res = await fetch("https://api.web3forms.com/submit", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
});
if (!res.ok) throw new Error("Submit failed");
return await res.json();
}
import { useEffect, useState } from "react";
export default function ContactForm() {
const [accessKey, setAccessKey] = useState("");
useEffect(() => {
const k = localStorage.getItem("vericontact_access_key") || crypto.randomUUID();
localStorage.setItem("vericontact_access_key", k);
setAccessKey(k);
}, []);
return (
<form action="https://api.web3forms.com/submit" method="POST">
<input type="hidden" name="access_key" value={accessKey} />
<input name="name" type="text" placeholder="Your Name" required />
<input name="email" type="email" placeholder="you@example.com" required />
<textarea name="message" placeholder="Write your message..." required /></textarea>
<input type="checkbox" name="botcheck" className="hidden" style='display:none' />
<button type="submit">Submit Form</button>
</form>
);
}
Embed your access key in the form payload. This ensures that every submission is verified, secure, and delivered with built-in success or error handling.
<input type="hidden" name="key" value="YOUR_ACCESS_KEY_HERE" >
Hi, I’m Umair Ashraf, the creator of VeriContact. I built this project to make contact forms secure, simple, and free for everyone. With VeriContact, there’s no need for backend code, logins, or complex setups — just a straightforward way to manage messages with one-time verification keys.
Founder of VeriContact
Everything you need to know about using VeriContact.