Update Form

Update any part of a form — fields, settings, theme, or metadata. Only include the fields you want to change.

forms.edit
PUT/v1/forms/:id

Request Body

All fields are optional. Only include what you want to change.

ParameterTypeDescription
namestringForm name
titlestringPublic-facing title
descriptionstringForm description
fieldsarrayComplete fields array (replaces existing)
conditionsarrayConditional logic rules
settingsobjectForm settings (deep-merged — safe to send partial updates)
themeobject | nullTheme overrides (merged with existing; send null to reset)
customCssstringCustom CSS for the form. Use this top-level field — it is the canonical source and is synced automatically with settings.advanced.customCss.
embedModestringEmbed mode: "isolated" (Shadow DOM) or "open" (inherits site CSS)
siteIdstringMove form to a different site
⚠️
The fields array is replaced entirely, not merged. Always send the complete fields array when updating fields.
💡
The settings object is deep-merged with the existing settings. You can safely update just settings.thankYou without affecting settings.security, settings.tracking, etc.

Settings Object Reference

The settings object contains all form behavior configuration. Each sub-object is independently mergeable.

settings.thankYou

Controls what happens after form submission — show a message or redirect to a URL.

ParameterTypeDescription
type*string"message" to show a thank you page, or "redirect" to send the user to a URL
messagestringHTML content for the thank you message. Supports merge tags like {name}, {email}, {company}, etc. Only used when type is "message".
redirectUrlstringURL to redirect to after submission. Only used when type is "redirect".
redirectDelaynumberSeconds to wait before redirecting (0-10). Default: 0.
showSubmitAnotherbooleanShow a "Submit Another Response" button on the thank you page. Default: false.
iconSizenumberSize in pixels of the success checkmark icon (32-96). Default: 48.

settings.security

Spam protection and submission limits.

ParameterTypeDescription
honeypotbooleanEnable honeypot field for bot detection. Default: true.
rateLimitPerHournumberMax submissions per IP per hour. Default: 10.
recaptchaEnabledbooleanEnable reCAPTCHA v3 for this form. Default: false. The site key used is determined by the site's reCAPTCHA configuration — custom key if set, otherwise the platform global key.
recaptchaThresholdnumberreCAPTCHA v3 score threshold (0.0–1.0). Submissions scoring below this are rejected. Default: 0.5. Higher values (e.g. 0.7) are stricter; lower values (e.g. 0.3) allow more traffic through.
maxSubmissionsnumberTotal submission limit (0 = unlimited). Default: 0.
maxPerIpnumberMax submissions per IP total (0 = unlimited). Default: 0.
allowedDomainsstring[]Restrict form to specific domains (empty = allow all).
recaptchaBadgeModestring"text" (default) — hides the floating badge and shows a centered attribution line at the bottom of the form. "badge" — shows Google's default floating corner badge. "none" — hides both (you handle compliance).
💡
settings.security.recaptchaEnabled is the canonical reCAPTCHA toggle. The API keeps a flat settings.recaptchaEnabled in sync automatically — you can use either path and the value will always match.

settings.tracking

Analytics and conversion tracking.

ParameterTypeDescription
gaIdstringGoogle Analytics measurement ID (e.g. G-XXXXXXXXXX).
fbPixelIdstringFacebook Pixel ID.
headScriptsstringCustom scripts injected into the form head.
submitScriptsstringScripts executed on form submission.
captureUtmbooleanCapture UTM parameters from the page URL. Default: true.

settings.emailNotifications

Email notification configuration for new submissions.

ParameterTypeDescription
enabledbooleanEnable email notifications. Default: false.
recipientsstring[]Email addresses to notify.
fromNamestringSender display name (e.g. "ProForms").
subjectstringEmail subject line. Supports merge tags like {form_name}, {name}, {site_name}.
bodyHtmlstringCustom HTML email body. Supports merge tags.
includeSummaryTablebooleanInclude a table of all submitted fields. Default: true.
metadataobjectToggle submission details in email footer. All default to true.
metadata.showTimestampbooleanInclude submission date/time.
metadata.showIpAddressbooleanInclude submitter IP address.
metadata.showDevicebooleanInclude parsed device/browser info.
metadata.showReferrerbooleanInclude referrer URL.
metadata.showPageUrlbooleanInclude form host page URL.
metadata.showUtmParamsbooleanInclude UTM parameters (source, medium, campaign, etc).

settings.confirmationEmail

Auto-responder confirmation email sent to the form submitter.

ParameterTypeDescription
enabledbooleanEnable confirmation email. Default: false.
emailFieldKeystringThe field key of the email field to send the confirmation to.
subjectstringEmail subject line. Supports merge tags. Default: "Thank you for contacting {site_name}".
bodyHtmlstringCustom HTML body (used when templateStyle is "custom"). Supports merge tags.
templateStylestring"html" (default thank-you template), "plain" (plain text), or "custom" (use bodyHtml).
replyTostringReply-to email address for the confirmation.
includeSummarybooleanInclude a summary of the submission data. Default: true.
attachmentsarrayStatic file attachments. Each: { name: string, url: string }.

settings.integrations

Webhook and third-party integrations.

ParameterTypeDescription
webhooksarrayArray of webhook configurations. Each: { url, method, headers, events, enabled }.

settings.advanced

Advanced form configuration.

ParameterTypeDescription
customCssstringAdditional CSS scoped to this form.
customJsstringCustom JavaScript executed in the form context.
internalNamestringInternal name for organization (not shown to users).
descriptionstringInternal description/notes.
tagsstring[]Tags for organizing forms.
autoDeleteDaysnumberAuto-delete submissions after N days (0 = never).

Top-level settings

ParameterTypeDescription
submitButtonTextstringSubmit button label. Default: "Submit".
buttonIconstringIcon to show on the submit button (e.g. "arrow", "send", "check").
buttonIconPositionstring"left" or "right". Default: "right".
honeypotEnabledbooleanLegacy honeypot toggle (prefer security.honeypot).
multiStepbooleanEnable multi-step form mode.
closedMessagestringMessage shown when form is archived/closed.

Email Field Validation

Email fields support configurable validation strictness set via the validation object on the field.

ParameterTypeDescription
validation.emailValidationstring"standard" (default) — basic format check (x@x.x). "strict" — format check plus blocks common disposable/temporary email domains. "none" — no format validation, accepts any input.
💡
Both client-side (live) and server-side (on submit) validation respect the emailValidation setting — they stay in sync automatically.

Phone Field Validation

Phone fields support auto-formatting, digit-only enforcement, and country-based digit validation. These are set per-field inside the validation object on each field.

ParameterTypeDescription
validation.phoneFormatstring"us" — exactly 10 digits (US/Canada, default). "international" — 7–15 digits. "any" — no digit limit.
validation.phoneDisplayFormatstring"parens" — (480) 555-5555 (default). "dashes" — 480-555-5555. "dots" — 480.555.5555. "none" — 4805555555 (raw digits, no mask).
💡
Auto-formatting kicks in as the user types — digits are masked in real time to the chosen format. Letters are blocked. Paste is sanitized to digits only. The placeholder automatically matches the display format if no custom placeholder is set.
curl — phone field with auto-formatting
curl -X PUT "https://proforms.io/api/v1/forms/f_abc123" \
  -H "Authorization: Bearer pf_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "fields": [
      {
        "key": "phone",
        "type": "phone",
        "label": "Phone Number",
        "required": true,
        "width": "full",
        "order": 0,
        "validation": {
          "phoneFormat": "us",
          "phoneDisplayFormat": "parens"
        }
      }
    ]
  }'

Examples

Set redirect after submission

curl
curl -X PUT "https://proforms.io/api/v1/forms/f_abc123" \
  -H "Authorization: Bearer pf_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "settings": {
      "thankYou": {
        "type": "redirect",
        "redirectUrl": "https://example.com/thank-you",
        "redirectDelay": 3
      }
    }
  }'

Custom thank you message with merge tags

curl
curl -X PUT "https://proforms.io/api/v1/forms/f_abc123" \
  -H "Authorization: Bearer pf_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "settings": {
      "thankYou": {
        "type": "message",
        "message": "<h2>Thanks, {name}!</h2><p>We received your request and will reach out to <strong>{email}</strong> within 24 hours.</p>",
        "showSubmitAnother": true,
        "iconSize": 64
      }
    }
  }'

Update embed mode and button text

curl
curl -X PUT "https://proforms.io/api/v1/forms/f_abc123" \
  -H "Authorization: Bearer pf_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "embedMode": "open",
    "settings": {
      "submitButtonText": "Get My Free Quote"
    }
  }'

Configure security settings

curl
curl -X PUT "https://proforms.io/api/v1/forms/f_abc123" \
  -H "Authorization: Bearer pf_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "settings": {
      "security": {
        "rateLimitPerHour": 20,
        "maxSubmissions": 500,
        "allowedDomains": ["example.com", "app.example.com"]
      }
    }
  }'

Enable reCAPTCHA with custom threshold

curl
curl -X PUT "https://proforms.io/api/v1/forms/f_abc123" \
  -H "Authorization: Bearer pf_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "settings": {
      "security": {
        "recaptchaEnabled": true,
        "recaptchaThreshold": 0.7
      }
    }
  }'

The reCAPTCHA site key is resolved automatically — uses the site's custom key if configured, otherwise falls back to the ProForms platform key. The threshold (0.0–1.0) determines how strict scoring is; 0.5 is Google's recommended default.

Disable reCAPTCHA

curl
curl -X PUT "https://proforms.io/api/v1/forms/f_abc123" \
  -H "Authorization: Bearer pf_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "settings": {
      "security": {
        "recaptchaEnabled": false
      }
    }
  }'

Apply custom CSS

curl
curl -X PUT "https://proforms.io/api/v1/forms/f_abc123" \
  -H "Authorization: Bearer pf_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "customCss": ".proform { border-radius: 16px; } .proform-submit { background: #1a1a1a; }"
  }'

Response

200 OK
{
  "success": true,
  "data": {
    "id": "f_abc123",
    "name": "Updated Contact Form",
    "version": 4,
    "updatedAt": "2026-02-17T11:00:00.000Z"
  }
}
💡
The version number increments with every update, which is useful for conflict detection.