Skip to content

Documentation

Everything you need to collect form submissions — whether you're using the visual builder or dropping one line of HTML into your own form.

No-Code Quickstart

Build and publish a form in under 5 minutes — no code, no backend, no configuration.

1

Create an account

Sign up at app.paceforms.com. The free plan lets you create up to 3 forms and receive 100 submissions per month.

2

Create a new form

Click "New Form" from your dashboard. Choose a blank form or start from a template (Contact, Survey, Waitlist, Job Application, NPS).

3

Add fields

Drag fields from the panel on the left: Text, Email, Number, Dropdown, Checkbox, Date, File Upload, Signature, Rating, and more. Drag to reorder.

4

Publish

Click "Publish". Your form gets a shareable link and an embed snippet. Paste the embed code anywhere on your site.

5

View submissions

All responses appear instantly in your Submissions Inbox. Click any row to see the full submission. Export to CSV any time.

Developer Quickstart

Already have an HTML form? Point its action attribute at your PaceForms endpoint. No SDK, no npm install.

1

Create an account and get your endpoint

Sign up at app.paceforms.com. Go to "New Form" → "Use my own HTML". Copy your unique endpoint URL.

2

Update your form's action attribute

Replace your existing action= value with your PaceForms endpoint. That's it — no other changes needed.

3

Submit a test

Fill out and submit your form. Verify the submission appears in your PaceForms Submissions Inbox within seconds.

4

Set up notifications (optional)

Configure email notifications in your form settings to receive an alert for every new submission.

Your Endpoint

Each form you create gets a unique, permanent API endpoint. All submissions to that URL are stored in your database.

Endpoint format

https://app.paceforms.com/api/f/{YOUR_FORM_ID}

Example:

https://app.paceforms.com/api/f/NR-6Ww88ET

Endpoint behaviour

PropertyValue
MethodPOST
Content types acceptedapplication/x-www-form-urlencoded, multipart/form-data, application/json
CORSAllowed from any origin
Default redirectPaceForms thank-you page (customisable)
Rate limit (free)100 submissions/month
Max payload10 MB (including file uploads)

Plain HTML

The simplest integration — works on any website, static site, or CMS.

Minimal contact form

<form action="https://app.paceforms.com/api/f/NR-6Ww88ET" method="POST">
  <input type="text" name="name" placeholder="Your name" required />
  <input type="email" name="email" placeholder="Email address" required />
  <textarea name="message" placeholder="Your message"></textarea>
  <button type="submit">Send</button>
</form>

Every name attribute becomes a field in your submissions inbox. No configuration required.

With honeypot spam protection

<form action="https://app.paceforms.com/api/f/NR-6Ww88ET" method="POST">
  <input type="text" name="name" required />
  <input type="email" name="email" required />
  <textarea name="message"></textarea>

  <!-- Honeypot: hidden from real users, filled by bots -->
  <input type="text" name="_honeypot" style="display:none" tabindex="-1" autocomplete="off" />

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

With custom redirect

<form action="https://app.paceforms.com/api/f/NR-6Ww88ET" method="POST">
  <input type="hidden" name="_redirect" value="https://yoursite.com/thank-you" />
  <input type="email" name="email" required />
  <button type="submit">Subscribe</button>
</form>

AJAX & Fetch

Submit forms asynchronously and handle the response in JavaScript — no page redirect.

Fetch API (JSON body)

const response = await fetch(
  'https://app.paceforms.com/api/f/NR-6Ww88ET',
  {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      name: 'Alice',
      email: 'alice@example.com',
      message: 'Hello from fetch!',
    }),
  }
);

const data = await response.json();

if (response.ok) {
  console.log('Submitted:', data);  // { id: 'sub_abc123', status: 'ok' }
} else {
  console.error('Error:', data.error);
}

Fetch API (FormData — includes file uploads)

const form = document.getElementById('my-form');

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

  const formData = new FormData(form);

  const response = await fetch(
    'https://app.paceforms.com/api/f/NR-6Ww88ET',
    { method: 'POST', body: formData }
  );

  const data = await response.json();

  if (response.ok) {
    form.innerHTML = '<p>Thanks! We'll be in touch.</p>';
  } else {
    alert('Something went wrong. Please try again.');
  }
});

React & Next.js

Use PaceForms from any React application — no SDK needed, just fetch.

React component

import { useState } from 'react';

const ENDPOINT = 'https://app.paceforms.com/api/f/NR-6Ww88ET';

export default function ContactForm() {
  const [status, setStatus] = useState('idle');

  async function handleSubmit(e) {
    e.preventDefault();
    setStatus('loading');

    const res = await fetch(ENDPOINT, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(
        Object.fromEntries(new FormData(e.target))
      ),
    });

    setStatus(res.ok ? 'success' : 'error');
  }

  if (status === 'success') return <p>Thanks! We'll be in touch.</p>;

  return (
    <form onSubmit={handleSubmit}>
      <input name="name" placeholder="Name" required />
      <input name="email" type="email" placeholder="Email" required />
      <textarea name="message" placeholder="Message" />
      <button type="submit" disabled={status === 'loading'}>
        {status === 'loading' ? 'Sending...' : 'Send Message'}
      </button>
      {status === 'error' && <p>Something went wrong.</p>}
    </form>
  );
}

Next.js Server Action (App Router)

'use server';

export async function submitForm(formData) {
  const res = await fetch(
    'https://app.paceforms.com/api/f/NR-6Ww88ET',
    {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        name: formData.get('name'),
        email: formData.get('email'),
        message: formData.get('message'),
      }),
    }
  );

  if (!res.ok) throw new Error('Submission failed');
  return await res.json();
}

Response Format

All API responses return JSON. Use the status code and body to handle success and error states in your UI.

Success — 200 OK

{
  "status": "ok",
  "id": "sub_NR6Ww88ET_1746612345",
  "message": "Submission received"
}

Validation error — 422 Unprocessable Entity

{
  "status": "error",
  "error": "validation_failed",
  "fields": {
    "email": "Must be a valid email address"
  }
}

Spam blocked — 400 Bad Request

{
  "status": "error",
  "error": "spam_detected"
}

Rate limit exceeded — 429 Too Many Requests

{
  "status": "error",
  "error": "rate_limit_exceeded",
  "message": "Monthly submission limit reached. Upgrade your plan."
}

Spam Protection

PaceForms includes built-in spam filtering. Combine techniques for the best protection.

Honeypot field Automatic

Add a hidden field named _honeypot. Real users never fill it; bots do. Any submission with a filled honeypot is silently rejected.

<!-- Hidden from users via CSS, filled by bots -->
<input
  type="text"
  name="_honeypot"
  style="display:none"
  tabindex="-1"
  autocomplete="off"
/>

Time-based check Automatic

PaceForms checks how quickly a form was submitted after the page loaded. Submissions under 2 seconds are flagged as likely bot activity. No configuration needed.

reCAPTCHA v3 Optional

Pass a reCAPTCHA v3 token with the field name _recaptcha. Configure your site key in your form settings.

// Get token before submission
const token = await grecaptcha.execute(SITE_KEY, { action: 'submit' });

const res = await fetch('https://app.paceforms.com/api/f/NR-6Ww88ET', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ ...fields, _recaptcha: token }),
});

Custom Redirect

By default, PaceForms shows a generic thank-you page after submission. Override this with a hidden field or via AJAX.

Hidden _redirect field

<form action="https://app.paceforms.com/api/f/NR-6Ww88ET" method="POST">
  <input
    type="hidden"
    name="_redirect"
    value="https://yoursite.com/thank-you"
  />
  <input type="email" name="email" required />
  <button type="submit">Subscribe</button>
</form>

AJAX — handle redirect yourself

When submitting via fetch, no redirect happens — you control what shows next based on the response.

const res = await fetch('https://app.paceforms.com/api/f/NR-6Ww88ET', {
  method: 'POST',
  body: formData,
});

if (res.ok) {
  window.location.href = '/thank-you';  // your own redirect
}

Field Reference

Reserved field names used to control PaceForms behaviour. Any other field name is stored as a submission field.

Field nameTypeDescription
_redirectURLRedirect user to this URL after submission
_honeypottextHidden spam trap — must be empty
_recaptchastringreCAPTCHA v3 token
_subjectstringCustom email notification subject line
_replytoemailReply-to address for notification emails
_nextURLAlias for _redirect

Submissions Inbox

Every submission is stored in your built-in database, accessible from your dashboard at app.paceforms.com.

Read / Unread tracking

New submissions are marked unread. Click to open and mark as read. Filter by read/unread status.

Search and filter

Search by any field value. Filter by date range, form, or read status. Sort by newest or oldest.

Submission detail

Click any submission to see all fields, metadata (IP address, submission time, user agent), and any attached files.

Delete submissions

Delete individual submissions or bulk-delete by selection. Deletion is permanent — export first if needed.

Export & Integrations

Get your data out in the format and destination you need.

CSV Export

From your Submissions Inbox, click Export → CSV. The file includes all fields, submission IDs, and timestamps. Use the date filter to export a specific range.

Webhooks

Configure a webhook URL in your form settings. PaceForms sends a POST request to your URL for every new submission:

{
  "event": "submission.created",
  "form_id": "NR-6Ww88ET",
  "submission_id": "sub_NR6Ww88ET_1746612345",
  "submitted_at": "2026-05-07T12:34:56Z",
  "fields": {
    "name": "Alice",
    "email": "alice@example.com",
    "message": "Hello!"
  }
}

Webhooks are available on Builder and Developer plans.

Native integrations

Google SheetsAppend a row to a sheet on every new submission
SlackPost a message to a channel with submission details
AirtableCreate a new record in an Airtable base
NotionAdd a new page to a Notion database
ZapierTrigger any Zap via the PaceForms Zapier app

Something not covered here? Reach us at support@paceforms.com

Get started free