Documentation
Everything you need to collect form submissions with LazyForms.
Getting started
LazyForms gives you a form endpoint URL that you can use as the action attribute on any HTML form. Submissions are sent to your email and stored in your dashboard.
1. Enter your email on the homepage or sign up to get your dashboard.
2. Create a new form in the dashboard. You'll get an access key.
3. Point your form's action to your endpoint:
<form action="https://api.lazyforms.com/f/YOUR_ACCESS_KEY" method="POST">
<input type="text" name="name" required />
<input type="email" name="email" required />
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>That's it. Every submission goes to your email and dashboard.
Form settings
Each form has configurable settings in your dashboard:
- Name — used as the email subject line and label in the dashboard.
- Email to — the primary recipient for submission notifications.
- Email CC — additional email addresses that receive a copy of each submission.
- Redirect URL — where to send the user after a successful submission.
- Google Sheet ID — auto-append each submission as a row in a Google Sheet.
- Webhook URL — receive a POST request with submission data on every new entry.
- Spam protection — choose between honeypot, Cloudflare Turnstile, or none.
- Domain restriction — restrict submissions to specific domains (CORS).
- Active/Paused — pause a form to stop accepting submissions.
Spam protection
LazyForms supports two spam protection methods:
Honeypot
Add a hidden field to your form. Bots fill it in; real users don't. Submissions with a filled honeypot are stored but marked as spam — no email or webhook is triggered.
<!-- Add this hidden field to your form -->
<input type="text" name="_honey" style="display:none" tabindex="-1" autocomplete="off" />You can also use _gotcha as the field name — both work.
Cloudflare Turnstile
For stronger protection, use Cloudflare Turnstile. Add the Turnstile widget to your form and LazyForms will verify the token server-side.
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<form action="https://api.lazyforms.com/f/YOUR_ACCESS_KEY" method="POST">
<input type="text" name="name" required />
<input type="email" name="email" required />
<!-- Turnstile widget — get your site key from Cloudflare -->
<div class="cf-turnstile" data-sitekey="YOUR_TURNSTILE_SITE_KEY"></div>
<button type="submit">Send</button>
</form>Set your Turnstile secret key via wrangler secret put TURNSTILE_SECRET_KEY and enable Turnstile in your form settings.
Email notifications
Every submission sends an HTML email to your configured email_to address. The email includes a formatted table with all submitted field names and values.
- Subject line:
New submission: Your Form Name - Sent from:
noreply@lazyforms.com - CC recipients receive the same email.
- Spam-flagged submissions do not trigger emails.
- Internal fields (prefixed with
_) are stripped from the email.
Google Sheets
Connect a Google Sheet to auto-append each submission as a new row.
Setup:
- Create a Google Sheet (or use an existing one).
- Share the sheet with your LazyForms service account email (shown in your dashboard).
- Copy the Sheet ID from the URL:
docs.google.com/spreadsheets/d/SHEET_ID/edit - Paste the Sheet ID in your form settings.
Headers are auto-created from the first submission's field names. Subsequent submissions append rows matching the existing header order.
Webhooks
Set a webhook URL in your form settings to receive a POST request on every new submission. The request body is JSON:
{
"form_id": "abc123",
"form_name": "Contact form",
"data": {
"name": "Jane Doe",
"email": "jane@example.com",
"message": "Hello!"
},
"submitted_at": "2025-01-15T10:30:00Z",
"ip": "203.0.113.1"
}Webhooks fire asynchronously and don't block the submission response. Spam-flagged submissions do not trigger webhooks.
AJAX submissions
Submit forms via JavaScript for a seamless no-redirect experience. Send a POST request with FormData or JSON:
// Using FormData
const form = document.querySelector('form');
const data = new FormData(form);
const res = await fetch('https://api.lazyforms.com/f/YOUR_ACCESS_KEY', {
method: 'POST',
body: data,
});
const json = await res.json();
// { success: true, message: "Submission received" }
// Using JSON
const res = await fetch('https://api.lazyforms.com/f/YOUR_ACCESS_KEY', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Jane', email: 'jane@example.com' }),
});When no redirect_url is set, the endpoint returns JSON. When a redirect is configured, AJAX requests still get the JSON response (the 302 redirect only applies to standard form submissions).
Domain restriction
Restrict which domains can submit to your form. Set allowed domains in your form settings (e.g. example.com, app.example.com).
When configured, submissions from unlisted origins receive a 403 Forbidden response. Leave empty to accept submissions from any origin.
Redirects
Set a redirect URL in your form settings to send users to a custom thank-you page after submitting.
<!-- Example: user submits form → redirected to /thank-you -->
<form action="https://api.lazyforms.com/f/YOUR_ACCESS_KEY" method="POST">
<input type="email" name="email" required />
<button type="submit">Subscribe</button>
</form>
<!-- Redirect URL set to: https://yoursite.com/thank-you -->If no redirect URL is set, the endpoint returns a JSON response: { "success": true }
File uploads
File uploads are not currently supported. LazyForms processes text fields only. If your form includes <input type="file">, the file data will be ignored.
For file collection, we recommend using a dedicated file upload service and including the resulting URL as a text field in your form.
Limits
LazyForms is free with generous limits:
- Unlimited forms
- Unlimited submissions
- Email notifications on every submission
- Google Sheets integration
- Webhook integrations
We track monthly usage to prevent abuse. If your usage exceeds fair-use thresholds, we'll reach out before taking any action.
Need help? Email us at support@lazyforms.com