API Documentation

Complete guide to integrating FastSubmit with your website or application.

Overview

FastSubmit provides a simple REST API for collecting form submissions. No backend code required!

Public Endpoint: The form submission endpoint is public and doesn't require authentication. Perfect for static websites, landing pages, and client-side applications.

Submit Form Data

POST/api/submit/:formId

Submit form data to your FastSubmit form. Accepts both JSON and form-encoded data.

Parameters

formIdrequired

Your unique form ID from the dashboard

Request Body

Send your form fields as key-value pairs. Field names must match your form configuration.

HTML Form

<form action="https://yourapp.com/api/submit/YOUR_FORM_ID" method="POST">
  <input type="text" name="name" placeholder="Your name" required />
  <input type="email" name="email" placeholder="your@email.com" required />
  <textarea name="message" placeholder="Your message"></textarea>
  
  <!-- Honeypot spam protection (keep hidden) -->
  <input type="text" name="_honeypot" style="display:none" />
  
  <button type="submit">Submit</button>
</form>

JavaScript (Fetch API)

const formData = {
  name: "John Doe",
  email: "john@example.com",
  message: "Hello!"
};

fetch("https://yourapp.com/api/submit/YOUR_FORM_ID", {
  method: "POST",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify(formData)
})
.then(response => response.json())
.then(data => {
  if (data.success) {
    alert("Form submitted successfully!");
  }
})
.catch(error => console.error("Error:", error));

React Example

import { useState } from 'react';

function ContactForm() {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    message: ''
  });
  const [status, setStatus] = useState('');

  const handleSubmit = async (e) => {
    e.preventDefault();
    setStatus('sending');

    try {
      const response = await fetch(
        'https://yourapp.com/api/submit/YOUR_FORM_ID',
        {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify(formData)
        }
      );

      const data = await response.json();
      
      if (data.success) {
        setStatus('success');
        setFormData({ name: '', email: '', message: '' });
      } else {
        setStatus('error');
      }
    } catch (error) {
      setStatus('error');
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        value={formData.name}
        onChange={(e) => setFormData({...formData, name: e.target.value})}
        placeholder="Name"
        required
      />
      <input
        type="email"
        value={formData.email}
        onChange={(e) => setFormData({...formData, email: e.target.value})}
        placeholder="Email"
        required
      />
      <textarea
        value={formData.message}
        onChange={(e) => setFormData({...formData, message: e.target.value})}
        placeholder="Message"
      />
      <button type="submit" disabled={status === 'sending'}>
        {status === 'sending' ? 'Sending...' : 'Submit'}
      </button>
      {status === 'success' && <p>Thank you! We'll be in touch.</p>}
      {status === 'error' && <p>Oops! Something went wrong.</p>}
    </form>
  );
}

cURL

curl -X POST https://yourapp.com/api/submit/YOUR_FORM_ID \
  -H "Content-Type: application/json" \
  -d '{
    "name": "John Doe",
    "email": "john@example.com",
    "message": "Hello from cURL!"
  }'

Responses

200 OK

Success

{
  "success": true,
  "message": "Submission received"
}
400 Bad Request

Validation Error

{
  "error": "Validation failed",
  "errors": [
    "Name is required",
    "Email is required"
  ]
}
403 Forbidden

Unauthorized Domain

{
  "error": "Domain not authorized. Please verify your domain in form settings."
}

This error occurs when domain verification is enabled and the request comes from an unauthorized domain.

404 Not Found

Form Not Found

{
  "error": "Form not found"
}
429 Too Many Requests

Rate Limit Exceeded

{
  "error": "Too many submissions. Please try again later."
}

Rate limit: 10 submissions per minute per IP address.

Features

🛡️ Spam Protection

Add a hidden honeypot field to catch spam bots:

<input 
  type="text" 
  name="_honeypot" 
  style="display:none" 
  tabindex="-1" 
  autocomplete="off" 
/>

If this field is filled, the submission is silently rejected (returns success but doesn't save).

🔒 Domain Verification

Restrict form submissions to verified domains only. Enable in your form settings and add DNS TXT records to verify domain ownership.

Note: Localhost and development domains (127.0.0.1, 192.168.x.x) bypass domain verification for testing.

🌐 CORS Enabled

The submit endpoint has CORS enabled, allowing submissions from any origin. Perfect for static sites, SPAs, and cross-origin requests.

⏱️ Rate Limiting

To prevent abuse, submissions are rate limited:

  • 10 submissions per minute per IP address
  • Rate limit headers included in response
  • Automatic reset after time window

✅ Field Validation

FastSubmit validates submissions based on your form configuration:

  • Required fields must be present
  • Email fields are validated for proper format
  • Returns detailed error messages for failed validations

Best Practices

✓

Always include honeypot field

Protects against spam bots without requiring CAPTCHA

✓

Match field names exactly

Field names in your HTML must match the field IDs in your form configuration

✓

Handle errors gracefully

Show user-friendly error messages when validation fails

✓

Use domain verification for production

Prevent unauthorized usage by restricting to your verified domains

✓

Test with different content types

Ensure your form works with both JSON and form-encoded submissions

Need Help?

Check out our other documentation pages for more detailed information: