Updated March 2026
A form API is a write endpoint. Any time a user sends structured data -- a vote, an answer, a reaction, an application, a complaint -- that's a form submission. Stop thinking of forms as contact pages. Start thinking of them as general-purpose data collection.
Voting boards. Create a form with feature title, description, and a hidden voter_id field. Each submission is a vote. Use uniqueBy to prevent double voting. Query submissions via the API to show vote counts.
Quizzes with leaderboards. Form fields for each question (text for open-ended, select for multiple choice). Frontend or serverless function scores the answers against a key. Scores go to a separate leaderboard form.
Anonymous confession walls. One textarea field, no email or name required. Use page entries with an entryTemplate to display recent posts. Zero backend code.
RSVPs. Name, email, guest count, meal preference. uniqueBy on email prevents duplicates. Query submissions via the API for attendee lists and totals.
Homework submissions. Student name, assignment ID, file upload field. Teachers access via API. File uploads support PDFs, images, documents up to 50MB.
Changelog reactions. Hidden post_id field plus a select for emoji reactions. Query submissions grouped by emoji to show distribution per post.
Community polls. Select field for the vote, optional comment textarea. Use page entries for live results display.
The pattern is always the same: define fields, collect submissions, notify with webhooks, and trigger automations -- confirmation emails, page entries, external API calls. The blueprints at /blueprints/ demonstrate each of these with complete code.
{
"name": "Feature Vote",
"fields": [
{
"name": "feature_id",
"label": "Feature ID",
"type": "hidden"
},
{
"name": "feature_title",
"label": "Feature",
"type": "text",
"required": true
},
{
"name": "priority",
"label": "Priority",
"type": "select",
"options": ["Nice to have", "Important", "Critical"],
"required": true
},
{
"name": "voter_email",
"label": "Your Email",
"type": "email",
"required": true
},
{
"name": "comment",
"label": "Why do you need this?",
"type": "textarea"
}
],
"uniqueBy": "voter_email"
}