A Strapi 5 plugin for building and managing dynamic forms with internationalization support, draft and publish workflows, flexible form configuration, and Content API integration for seamless frontend applications.
released September 8, 2026
npm install strapi-plugin-dynamic-form-builder
A Strapi 5 plugin for building and managing multilingual dynamic forms from the Content Manager. Forms, field components, and Content API routes ship with the package, so a blank Strapi app can install it and start without extra app-level components.
text, textarea, checkbox, radio, select, phone, dateThis plugin does not collect usage data.
^5.16.0>=18>=10@strapi/strapi is a peer dependency. The plugin is compatible with Strapi 5.
Add the package to your Strapi application:
# npm
npm install strapi-plugin-dynamic-form-builder
# yarn
yarn add strapi-plugin-dynamic-form-builder
# pnpm
pnpm add strapi-plugin-dynamic-form-builderStrapi auto-loads packages whose name starts with strapi-plugin-. After install, rebuild the admin panel and start the app:
npm run build
npm run developEnable the plugin in config/plugins.js or config/plugins.ts if you want an explicit entry. This is optional for auto-loaded strapi-plugin-* packages.
module.exports = () => ({
'form-builder': {
enabled: true,
},
});export default () => ({
'form-builder': {
enabled: true,
},
});The plugin id is form-builder (package.json → strapi.name).
No other configuration is required. There is no settings page and no environment variables.
Required form attributes:
| Attribute | Type | Description |
|---|---|---|
FormName | string | Display name of the form |
Slug | uid | Unique identifier |
SenderEmailAddress | From address used when sending mail | |
RecipientEmailAddress | Destination address | |
SuccessMessage | richtext | Message shown after a successful submit |
ErrorMessage | richtext | Message shown after a failed submit |
SubmitButtonLabel | string | Label of the submit button |
Optional attributes:
| Attribute | Type | Description |
|---|---|---|
FormExcerpt | richtext | Intro or helper text |
EmailTemplate | text | Email body template |
Fields | component (repeatable) | Form inputs (form-builder.form-field) |
Each field in Fields uses the plugin component form-builder.form-field:
| Attribute | Required | Description |
|---|---|---|
Name | yes | Field key sent with the submission |
Type | yes | text, textarea, checkbox, radio, select, phone, or date |
Required | yes | Whether the input is required (default false) |
Label | no | Visible label |
Placeholder | no | Placeholder text |
Options | no | Repeatable options for select, radio, or checkbox (form-builder.form-field-option) |
RequiredMessage | no | Message when a required field is empty |
MinLength / MaxLength | no | Length limits |
MinLengthErrorMessage / MaxLengthErrorMessage | no | Length validation messages |
IsPatternValidationEnabled | no | Enable regex validation |
ValidationRules | no | Pattern string |
ValidationErrorMessage | no | Pattern validation message |
Option items (form-builder.form-field-option) have Name, Text, and Required.
Content API prefix:
/api/form-builder/formsTypical requests (permissions must allow them):
GET /api/form-builder/forms
GET /api/form-builder/forms/:id
GET /api/form-builder/forms?locale=enPopulate fields and options when you need the full form definition:
GET /api/form-builder/forms?populate[Fields][populate]=OptionsIn Settings → Users & Permissions plugin → Roles, grant the Public or Authenticated role access to form-builder form actions (find, findOne, and any other actions you need). Until those permissions are set, Content API calls return 403.
Admin users manage forms through Content Manager with their usual admin permissions.
| Kind | UID |
|---|---|
| Plugin id | form-builder |
| Content type | plugin::form-builder.form |
| Form field component | form-builder.form-field |
| Form field option component | form-builder.form-field-option |
| REST path | /api/form-builder/forms |
The plugin is self-contained. You do not need to create layout-component.form-field (or any other host-app component) for it to boot.
Clone the repository and install dependencies:
git clone https://github.com/BrainStation-23/strapi-dynamic-form-builder.git
cd strapi-dynamic-form-builder
npm installBuild and verify the plugin:
npm run build
npm run verifyWatch while developing against a local Strapi app:
npm run watch:linkIn the Strapi app:
npx yalc add strapi-plugin-dynamic-form-builder
npm install
npm run developCreate a local tarball:
npm run packThen install it in a Strapi project:
npm install /path/to/strapi-plugin-dynamic-form-builder-0.1.2-beta.tgz
npm run developThis plugin is maintained by BrainStation-23.
Please report bugs, questions, and feature requests on GitHub:
https://github.com/BrainStation-23/strapi-dynamic-form-builder/issues
Include your Strapi version, Node.js version, and steps to reproduce.
This plugin is licensed under the MIT License.
Share your work with the community and get it listed in the Strapi ecosystem for everyone to discover and use.
Submit
