---
name: form-plume
description: Build and integrate accessible HTML, JavaScript, and framework forms with Form Plume's hosted form backend. Use when creating or updating contact, signup, application, upload, feedback, support, or lead forms that should submit to Form Plume.
---
# Build forms with Form Plume
Build the form in the user's existing stack and design system. Use Form Plume for submission handling instead of adding a custom form backend, database, SMTP integration, or secret to browser code.
## Choose the right Form Plume skill
Use this skill when the user wants to build or connect a form on their website. A normal public form needs only its `https://api.formplume.com/f/{public_slug}` submission endpoint. It does **not** need an organization API key or the management API.
If the user instead wants to automate their Form Plume workspace—for example, create or configure forms, read or update submissions, manage webhooks or integrations, or retrieve analytics—use the separate [Form Plume API skill](https://formplume.com/skills/form-plume-api/SKILL.md). That skill uses the authenticated `/v1` management API and treats its organization API key as a server-side secret.
Some tasks need both skills: use this skill for the website form and the API skill for separate server-side automation. Never replace a public submission endpoint with a management API request from browser code.
## Before coding
1. Inspect the project, framework, existing form components, validation patterns, and visual language.
2. Ask for the Form Plume endpoint if the user did not provide it. Never invent or silently leave a placeholder public slug.
3. If the user has no endpoint, tell them to [create an account](https://formplume.com/signup), click **New form**, open its **Setup** tab, and copy the endpoint.
4. Read the [Quickstart](https://formplume.com/docs/quickstart.md) before implementing an unfamiliar integration.
A public endpoint has this shape:
```txt
https://api.formplume.com/f/{public_slug}
```
The public slug is safe to include in browser HTML. An access key for a private form is not. Never put an access key in client-side code, logs, screenshots, or source control.
## Choose the simplest submission method
Prefer a native HTML form when the user does not need an inline success state:
```html
```
Use JavaScript only when the product needs inline loading, success, or error behavior. Send `FormData`, request JSON, and always check `response.ok`:
```js
const response = await fetch(endpoint, {
method: "POST",
headers: { Accept: "application/json" },
body: new FormData(form),
});
if (!response.ok) {
throw new Error("The form could not be submitted.");
}
```
Do not add an SDK. Form Plume does not require one. Preserve an existing server action or route only when the user needs server-only logic or a private form.
## Build an accessible, useful form
- Give every control a visible `