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.
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.
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).
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.
Publish
Click "Publish". Your form gets a shareable link and an embed snippet. Paste the embed code anywhere on your site.
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.
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.
Update your form's action attribute
Replace your existing action= value with your PaceForms endpoint. That's it — no other changes needed.
Submit a test
Fill out and submit your form. Verify the submission appears in your PaceForms Submissions Inbox within seconds.
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-6Ww88ETEndpoint behaviour
| Property | Value |
|---|---|
| Method | POST |
| Content types accepted | application/x-www-form-urlencoded, multipart/form-data, application/json |
| CORS | Allowed from any origin |
| Default redirect | PaceForms thank-you page (customisable) |
| Rate limit (free) | 100 submissions/month |
| Max payload | 10 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 name | Type | Description |
|---|---|---|
| _redirect | URL | Redirect user to this URL after submission |
| _honeypot | text | Hidden spam trap — must be empty |
| _recaptcha | string | reCAPTCHA v3 token |
| _subject | string | Custom email notification subject line |
| _replyto | Reply-to address for notification emails | |
| _next | URL | Alias 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 Sheets | Append a row to a sheet on every new submission |
| Slack | Post a message to a channel with submission details |
| Airtable | Create a new record in an Airtable base |
| Notion | Add a new page to a Notion database |
| Zapier | Trigger any Zap via the PaceForms Zapier app |
Something not covered here? Reach us at support@paceforms.com
Get started free