Documentation

Everything you need to add 000form to your website. Try it in the Playground →

Quick Start

Get a working contact form in under 2 minutes. No backend code needed — just HTML.

Step 1

Create a free account

Sign up at 000form.com

Step 2

Create a form

create form & copy your unique endpoint.

Step 3

Point your form to it

Set your HTML form's action to your endpoint URL and method to POST.

Step 4

You're done!

Every submission goes straight to your email and shows up in your dashboard.

Not ready to sign up yet? Try the Playground — test everything right now with no account needed.

Basic HTML Form

The simplest setup — just point your form's action to your endpoint URL and you're ready to go.

HTML
<form action="https://000form.com/f/YOUR_FORM_ID" method="POST">

  <input type="text"  name="name"    placeholder="Your name"    required>
  <input type="email" name="email"   placeholder="Your email"   required>
  <textarea           name="message" placeholder="Your message"></textarea>

  <button type="submit">Send</button>

</form>
Name your email field email and we'll automatically set it as the reply-to address — so you can reply directly to the person from your inbox.
Special Fields

Add these as hidden inputs to your form to turn on extra features. All of them are optional — only use the ones you need.

_subject Optional

Set a custom subject line on the email you receive. If you don't add this, the subject will be New Form Submission from 000form.

HTML
<input type="hidden" name="_subject" value="New contact from website">

_replyto Optional

Name your email field email and we'll automatically set it as the reply-to address — so you can reply directly to the person from your inbox.

HTML
<input type="email" name="email" placeholder="Your email">

_cc Optional

Send a copy of the notification email to one or more extra addresses. Good for when more than one person needs to see each submission.

HTML
<!-- One address -->
<input type="hidden" name="_cc" value="team@yourcompany.com">

<!-- Multiple addresses — separate with commas -->
<input type="hidden" name="_cc" value="sales@co.com, support@co.com">

_template 3 options

Choose how your notification email looks. If you don't pick one, basic is used by default.

ValueWhat it looks like
basic Simple list — one field per row. Clean and easy to read. Used by default.
box Each field gets its own bordered box. Images show as previews inside the email.
table Two-column table — field name on the left, value on the right.
HTML
<input type="hidden" name="_template" value="basic">   <!-- default -->
<input type="hidden" name="_template" value="box">
<input type="hidden" name="_template" value="table">

_auto-response Optional

Send an automatic reply to the person who filled in your form. Your form needs an email field for this to work.

HTML — message only
<!-- A default subject line is added for you -->
<input type="hidden" name="_auto-response"
       value="Thanks for getting in touch! We'll get back to you shortly.">
HTML — with your own subject line (use a pipe | to separate)
<input type="hidden" name="_auto-response"
       value="Hi {name}, we got your message on {date}.|We received your message!">
PlaceholderGets replaced with
{name}What the user typed in the name field
{email}What the user typed in the email field
{date}Today's date (YYYY-MM-DD)
If a submission gets blocked by _blacklist, the auto-response is still sent — so the user always gets a confirmation.

_blacklist Spam filter

Block submissions that contain certain words. If any field in the form has a banned word, the email is dropped before it reaches your inbox. The person still sees a success message, so they won't know it was blocked.

HTML
<!-- Separate banned words or phrases with commas -->
<input type="hidden" name="_blacklist"
       value="buy now, click here, casino, free money">
Upper and lower case don't matter — BUY NOW, buy now, and Buy Now are all caught.
Features

Spam Protection (Honeypot)

Add a hidden field that spam bots fill in on their own. Real people never see it, so only bots trigger it. Any submission with this field filled in gets dropped.

HTML
<!-- Hidden from people — bots fill it in, which triggers the block -->
<input type="text" name="_gotcha"
       style="display:none;">
Using both _gotcha and _blacklist together stops most spam before it reaches you.

File Uploads

Let people attach files when they submit. Files are sent as email attachments. With the box template, images also show up as previews inside the email.

HTML — one file
<input type="file" name="upload">
HTML — multiple files
<input type="file" name="uploads[]" multiple>
HTML — full form with file upload
<!-- Add enctype="multipart/form-data" whenever you use file inputs -->
<form action="https://000form.com/f/YOUR_FORM_ID"
      method="POST"
      enctype="multipart/form-data">

  <input type="text"  name="name"      required>
  <input type="email" name="email"     required>
  <input type="file"  name="uploads[]" multiple>

  <button type="submit">Send</button>
</form>
LimitValue
Per file10 MB max
Per submissionUp to 5 files
enctypeMust be multipart/form-data — required for file inputs to work

AJAX / JavaScript

Submit the form without reloading the page. Add Accept: application/json to your request and you'll get a JSON response back instead of a page redirect.

JavaScript
const form = document.getElementById('YOUR-FORM-ID');
const responseBox = document.getElementById('form-response');

form.addEventListener('submit', async (e) => {
  e.preventDefault();

  const btn = form.querySelector('button[type="submit"]');
  btn.disabled = true;
  btn.textContent = 'Sending...';

  try {
    const res  = await fetch(form.action, {
      method:  'POST',
      body:    new FormData(form),
      headers: { 'Accept': 'application/json' }
    });
    const data = await res.json();

    if (res.ok && data.success) {
      responseBox.innerHTML = '<span style="color:#00ff88">✓ Message sent!</span>';
      form.reset();
      // If _next is set, send the user there
      if (data.redirect) location.href = data.redirect;
    } else {
      throw new Error(data.message || 'Something went wrong');
    }
  } catch (err) {
    responseBox.innerHTML = `<span style="color:#ef4444">✗ ${err.message}</span>`;
  } finally {
    btn.disabled = false;
    btn.textContent = 'Send Message';
  }
});
Add <div id="form-response"></div> inside your form HTML — that's where the success or error message will show. The JSON response always has success (true/false) and message (text).

Limits

Everything included on the free plan.

  • Email notification on every submission
  • Submission history stored in your dashboard
  • Export submissions as CSV
  • Up to 5 file attachments per submission (10 MB each)