Collect form submissions, without writing the endpoint.
A form is a collection schema with a public endpoint: you define the fields in the console, and any page can submit to it without an API token. Each submission is stored as a record and fires form.submitted, so a workflow can send the confirmation email or post to Slack.
Your app is an organization in BuildBase. Your users sign in and work inside workspaces - one per team or customer.
You set up
In the console and the SDK
- The form's fields, in the console
- Your own form design, or the hosted form page
- What happens next, like a confirmation email
Your users get
Inside their workspace
- A form that works on any page, with no login needed
- Clear errors when a field is missing or wrong
- A reply or follow-up the moment they submit
A form backend you do not have to build
Storage, validation and the submit event are already there. You write the markup, or skip it and share the hosted page.
Fields in the Console
Define the fields and which ones are required once. Your form and the stored answers follow them.
Submit From Any Page
Anyone can submit, with no login and no API key, so it works on your marketing site as well as your app.
Your Design or Ours
Build the form with your own components, or share the hosted form page the console links to.
Checked Before Saved
Required fields, numbers, emails, links and dates are checked, and every problem comes back at once.
Act on Every Submission
Each submission can start a workflow, to send a confirmation email or post to Slack.
Answers in the Console
See every submission in a table, with a chart of how many arrive over time.
One POST, no token
The body is the data, keyed by field slug. A failed check returns every error at once.
'use client';
// Forms are plain HTTP: no SDK import needed.
const BASE = 'https://api.console.buildbase.app/api/forms/public';
export function ContactForm({ orgId, formId }: { orgId: string; formId: string }) {
async function onSubmit(event: React.FormEvent<HTMLFormElement>) {
event.preventDefault();
const data = Object.fromEntries(new FormData(event.currentTarget).entries());
const res = await fetch(`${BASE}/${orgId}/${formId}/submit`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
if (!res.ok) {
const body = await res.json();
alert((body.errors ?? [body.message]).join('\n'));
}
}
return (
<form onSubmit={onSubmit}>
<input name="email" type="email" required />
<textarea name="message" />
<button type="submit">Send</button>
</form>
);
}Works well with
Other modules for automation.
Read more in the docs
Setup guides and reference for Forms & Data Collection.
Overview
Forms on a collection schema, with a public submit endpoint and workflow triggers on submission.
Custom forms
Fetch the field schema and render your own form UI against the public endpoints.
Collections
Define a custom data schema, publish it as a version, and store records against it.
Triggers and actions
The full catalog of workflow triggers, actions, and conditions with their inputs and outputs.
Admin API
Authenticate with an org API token and call the REST API behind the console modules.
Frequently Asked Questions
What people ask about Forms.
Do my users see this?
Yes. Anyone can fill in a form on any page, with no login.
Do I need the SDK?
No. Forms are plain HTTP: fetch the fields, post the answers. There is no SDK component for forms.
How do I stop spam?
Public submissions are rate limited, but there is no CAPTCHA. For a spam check, submit from your own server instead of the browser.
Where do submissions go?
Each one is stored as a record in the form’s collection, which you can read over the collections API.