Pro module37 abilities

Fluent Forms ability reference

Reference for the GoBuildWP Pro 1.12.4 source. Installed schemas and policy remain authoritative.

This Fluent Forms ability reference covers how an agent can create and restructure Fluent Forms forms, adjust their settings, confirmation and email notifications, and triage the submissions they receive. When Fluent Forms Pro is loaded the same module also reads payment transactions, subscriptions, save-and-resume drafts, quiz scores and integration feeds, and can cancel a subscription at the payment gateway.

Read-only, write and destructive groups describe the source annotations. They do not establish a minimum safety profile, human approval or undo support. Those controls are separate: check the installed ability, the connected user and the active site policy before calling it. A read can still return sensitive data. These pages are not evidence that every operation passed an end-to-end runtime test.

What Fluent Forms needs before these load

Fluent Forms 6.0.0 or newer must be active. The gate reads the FLUENTFORM_VERSION constant; 6.0 is where the Models ORM facade and the per-form Acl helper this module leans on became stable. The Pro calls register when FLUENTFORMPRO_VERSION is also 6.0.0 or newer, and they run whether or not the Pro licence is active. Permissions are Fluent Forms' own, checked per form through its Acl class so team-mode grants hold: fluentform_forms_manager, fluentform_entries_viewer, fluentform_manage_entries, fluentform_settings_manager, fluentform_view_payments and fluentform_manage_payments. A refusal is fluentforms_forbidden (403).

Minimum (base)
6.0.0 WPPILOT_PRO_FLUENTFORMS_MIN_VERSION
Minimum (pro)
6.0.0 WPPILOT_PRO_FLUENTFORMS_PRO_MIN_VERSION
Fluent Forms editions
free, pro
Agent skills shipped
fluentforms-integration, form-model-schema, form-model-migration

How much of a Fluent Forms submission the agent sees

wppilot/fluentforms-get-submission maps the stored response JSON to field name, label and value; password, file-upload, signature and card answers and the submitter ip come back [REDACTED], each with a redacted reason. The list call leaves the response out entirely, and its search matches source_url and browser, adding the ip once include_sensitive=true and confirm=true are passed.

Export works in smaller steps than the other form modules: up to 100 submissions a call (50 by default), with each value cut at 2048 bytes unless max_field_bytes is raised. When the roughly 200 KiB budget ends a batch early, truncated_at_id names the first submission left out. Resume from next_cursor, never from that id, because the cursor is exclusive and the submission would be skipped.

Tables, meta rows and deletes without a bin

Forms are rows in fluentform_forms with the field list as JSON in form_fields. Settings, the confirmation among them, sit in a formSettings row of fluentform_form_meta, and each email notification is a row of its own in that table, whose row id is the notification id. Submissions are fluentform_submissions rows with children in fluentform_submission_meta and fluentform_entry_details. The ledger records every write here as irreversible, so wppilot/rollback-change has nothing to restore.

wppilot/fluentforms-delete-submission has no trash; to hide a submission reversibly, set status trashed with wppilot/fluentforms-mark-submission. wppilot/fluentforms-delete-form leaves submissions orphaned in the tables unless cascade=true. Passing fields[] to edit-form replaces the whole list, and fields are never renamed in place, because older submissions keep answers under the old name. An unpublished form renders nothing on the front end.

The plural catalog lists buildable field types and filters Pro-only types when Pro is absent. Singular type detail can describe known Pro types, but adding an unavailable one fails with fluentforms_pro_field_not_available. Cancelling a subscription invokes its available gateway handler; fluentforms_pro_integration_missing means the handler is not loaded. Check the returned state and the gateway before reporting that recurring billing stopped.

Before accepting the result

Continue with next_cursor as returned rather than calculating offsets. Inspect truncation and per-item failures before mutation. Gateway cancellation depends on the loaded handler and must be checked separately from local record state.

Safety profiles and human confirmation

Representative call sequence

This sequence describes the documented calls and checks to perform. It is not a recorded result from an installed WordPress site. Inspect returned errors and partial results, then verify the saved values and affected output before proceeding.

Review this month's unread enquiries and move an obvious spam one out of the list.

  1. 01 wppilot/fluentforms-list-submissions Returns compact rows for the form with status unread and a from date, without response data and with the ip redacted.
  2. 02 wppilot/fluentforms-get-submission Reads one submission with a fields whitelist, so the message and name come back as labelled values without the rest of the form.
  3. 03 wppilot/fluentforms-mark-submission Sets status to spam; changed[] is empty if it was already marked.

Questions about Fluent Forms

Why did my Fluent Forms export stop before the last submission?

The batch hit the payload budget or the limit. Call again with next_cursor as cursor until next_cursor is null; truncated_at_id is for information and should not be used as the cursor.

Does deleting a Fluent Forms form remove its submissions?

Not unless cascade=true is passed. Without it the form row goes and the submissions, meta and entry details stay orphaned in Fluent Forms' tables.

Why are the payment, draft and quiz tools missing?

They register when Fluent Forms Pro 6.0.0 or newer is loaded. wppilot/fluentforms-check-setup reports pro_active and supports.* flags so the agent can tell before calling them.

Fluent Forms reads

AbilityWhat it does
wppilot/fluentforms-check-setupCheck Fluent Forms SetupReports the Fluent Forms environment: whether the free plugin is active and at the minimum supported version, whether the Pro add-on is loaded (and its version), the current user's per-form capability map (forms_manager, entries_viewer, manage_entries, settings_manager, view_payments, manage_payments), the supports.* feature flags (payments, conversational_forms, quiz, draft_submissions, file_upload, integrations, pdf_generator), the configured marketing-integration feeds (mailchimp, activecampaign, hubspot, …, plus payment gateways), and the global forms_total / submissions_total counters. Call this first before any other Fluent Forms ability — the supports map lets the agent branch BEFORE invoking a Pro-gated surface that would otherwise return fluentforms_pro_required.
wppilot/fluentforms-export-submissionsExport Fluent Forms SubmissionsExport up to 100 submissions per call as full rows (compact metadata, mapped responses and an optional payment block). Page through with next_cursor until it is null; truncated_at_id is informational only. Password, file-upload, signature and card values and the submitter IP are [REDACTED] unless include_sensitive=true with confirm=true.
wppilot/fluentforms-get-confirmationGet Fluent Forms confirmationFetch the confirmation block for a form (what the user sees after submitting). FF stores ONE confirmation per form under formSettings.confirmation. Keys typically present: messageToShow (HTML success message), redirectTo ('samePage' | 'customPage' | 'customUrl'), customPage (page id when redirectTo=customPage), customUrl (URL when redirectTo=customUrl), samePageFormBehavior ('hide_form' | 'reset_form'). Returns an empty object when the form has no confirmation set yet. Required: form_id. Capability: fluentform_settings_manager.
wppilot/fluentforms-get-field-type-schemaGet a Fluent Forms Field Type DetailDetailed schema for ONE Fluent Forms field type. Returns {type, label, description, category, pro_only, supported_settings[] - the WHITELIST of keys add-field/edit-field accept under settings.*, default_attributes (FF-native), default_settings, example_input - a ready-to-pass {type, label, required, settings:{…}} payload}. Returns fluentforms_invalid_input (400) when the type is absent from the catalog. The catalog ALWAYS includes Pro types - even on a free install - so the agent can learn what would unlock with Pro; add-field still rejects Pro-only types on a free install.
wppilot/fluentforms-get-field-types-schemaList Fluent Forms Field TypesReturn the catalog of every Fluent Forms field type the integration can build via add-field / create-form. Output is compact: per entry {type, label, category, pro_only}. Use this FIRST when constructing a form, then call wppilot/fluentforms-get-field-type-schema for the per-type setting whitelist + example_input. When Pro is absent, entries with pro_only=true are filtered out - the agent never sees a type it cannot use. Categories: general (12 standard inputs + choices), advanced (composite + decorative), pro_advanced (file/image/repeater/NPS/phone/chained-select/post-selection/rich-text/…), pro_container (multi-step form_step), pro_payment (payment_method/coupon/subscription/…).
wppilot/fluentforms-get-formGet a Fluent Forms FormFetch one Fluent Forms form by id. Always returns id, title, status, type, has_payment, has_conversion, created_at, updated_at. The fields[] array, settings blob, notifications list, confirmation block, and meta_keys index are OPT-IN via the include parameter - progressive disclosure keeps the default payload small. Valid include values: "fields" (decoded form_fields.fields[] + submit_button), "settings" (decoded formSettings JSON), "notifications" (decoded notifications JSON), "confirmation" (the formSettings.confirmation sub-block), "meta_keys" (deduplicated list of meta_key column values for this form). Returns fluentforms_form_not_found (404) when the id is absent.
wppilot/fluentforms-get-form-canonicalGet Fluent Forms Form (Canonical)Reads a single Fluent Forms form by id and returns it mapped to the plugin-agnostic form-model-schema vocabulary (17 canonical types: text/email/tel/url/number/textarea/date/time/datetime/select/radio/checkbox/file/hidden/submit/consent/group) used by the form-model-migration skill. Fluent Forms native field elements (~40 including Pro) fold onto those 17 - composites (input_name, address, container, accordion) collapse to canonical group; structural-only types (section_break, custom_html, shortcode, action_hook) drop with informational warnings; anti-spam (recaptcha, hcaptcha, turnstile), multi-page (form_step, save_progress_button), and Pro payment types (payment_method, subscription_payment, item_quantity, multi_payment_component, custom_payment_component, payment_summary_component, coupon) drop with structural warnings. The form fields blob lives at wp_fluentform_forms.form_fields (JSON-encoded {fields:[], submitButton:{}}); notifications live in wp_fluentform_form_meta (one row per notification, meta_key="notifications"); the single confirmation lives at formSettings.confirmation. Output keys: fields[] with canonical types, mail_config{} from the first enabled notification, notifications[] from the remaining ones, messages{} (empty - Fluent has no built-in message catalogue), conditional_rules[] from per-field settings.conditional_logics (mapped 1:1 when expressible), meta{} (source plugin + version + lossless formSettings echo for round-trip), plus warnings[] for everything that does not fit the canonical shape (anti-spam, payments, conversational mode, custom redirects). Smart-tag syntax {inputs.<name>} inside subject / message / recipient is rewritten to [<name>] to match the CF7 / WPForms / Gravity Forms canonical convention. Honours the same max_field_bytes truncation contract as the other canonical readers (default 8192 bytes for mail_config.body, notifications[].body, with *_truncated flags); pass max_field_bytes: 0 to disable truncation when full-fidelity canonical is required before an execute-mode migration. Returns WP_Error fluentforms_form_not_found when the id does not exist. Use this ability inside the form-model-migration workflow (Phase 2 - read source schema); for ad-hoc inspection outside the migration pipeline, prefer fluentforms-get-form which returns the Fluent-native shape.
wppilot/fluentforms-get-form-settingsGet Fluent Forms form settingsFetch the formSettings blob for a form. Returns the decoded JSON object — the same payload the FF admin UI saves to wp_fluentform_form_meta with meta_key='formSettings'. Common keys: restrictions (max submissions, scheduling under restrictions.scheduleForm, login required under restrictions.requireLogin), layout (label placement, error display), submitButton (text, styling), confirmation (the success-page block — also readable via wppilot/fluentforms-get-confirmation), and any add-on-specific keys. Returns an empty object when the form has no formSettings row yet. Required: form_id. Returns fluentforms_form_not_found (404) when the form is absent. Capability: fluentform_settings_manager (falls back to forms_manager).
wppilot/fluentforms-get-notificationGet a Fluent Forms notificationFetch one notification by id. Required: form_id, notification_id. Returns {form_id, notification}. Returns fluentforms_notification_not_found (404) when no matching id exists on the form. Capability: fluentform_settings_manager.
wppilot/fluentforms-get-quiz-reportGet Fluent Forms quiz reportAggregate quiz scoring across every submission of a Fluent Forms Pro quiz form. Returns {form_id, is_quiz, submissions_total, per_question: [{field_name, label, correct_count, wrong_count, accuracy_pct}], overall: {average_score, max_points, score_type}}. Useful for instructor / surveyor dashboards. Required: form_id. Sample size is the count of non-trashed submissions; pass status_filter to restrict (e.g. only 'read'). When the form is not a quiz, is_quiz=false and per_question is empty. Capability: fluentform_entries_viewer.
wppilot/fluentforms-get-submissionGet a Fluent Forms SubmissionFetch one Fluent Forms submission by id. Always returns the compact row PLUS the decoded response mapped to friendly triples [{field_name, label, value, truncated?, full_size?}]. When Pro is loaded AND the submission has payment data, the payment block surfaces (status, method, type, currency, total, paid) - read-only. Optional: fields (whitelist - only return these field names in response[]); max_field_bytes (per-field byte cap, default 4 KiB, capped at 64 KiB). Returns fluentforms_submission_not_found (404) for missing ids.
wppilot/fluentforms-get-subscriptionGet a Fluent Forms subscriptionFetch one Fluent Forms Pro subscription by id. Returns the compact row PLUS note (admin notes), original_plan (raw vendor plan), vendor_response (the vendor's last API payload — opaque JSON). Returns fluentforms_subscription_not_found (404) for missing ids. Capability: fluentform_view_payments.
wppilot/fluentforms-get-transactionGet a Fluent Forms transactionFetch one Fluent Forms Pro transaction by id. Returns the compact row PLUS payment_note (vendor notes / raw payment description) and billing_address / shipping_address (full addresses). Returns fluentforms_transaction_not_found (404) for missing ids. Capability: fluentform_view_payments (per-form when the transaction's form_id is known).
wppilot/fluentforms-list-draft-submissionsList Fluent Forms draft submissionsList save-and-resume draft submissions (partial entries the user has not yet finalised). Filterable by form_id, user_id, used (true = the user resumed and submitted; false = abandoned drafts). Compact rows include id, form_id, hash (resume token), type, step_completed, user_id, source_url, browser, device, used, created_at, updated_at. Per_page capped at 100. Capability: fluentform_entries_viewer (per-form when form_id is supplied).
wppilot/fluentforms-list-formsList Fluent FormsList Fluent Forms forms with optional filters. Returns compact rows (id, title, status, type, has_payment, has_conversion, submissions_total, submissions_unread, created_at, updated_at) plus pagination metadata (page, per_page, total, total_pages). Fields[] and full settings are NOT included - fetch them with wppilot/fluentforms-get-form when needed (progressive disclosure). Filters: search (partial title match), status (published|unpublished), type (form|post), has_payment (bool), page (default 1), per_page (default 25, max 200). Use this before any per-form CRUD ability to discover form ids.
wppilot/fluentforms-list-integrationsList Fluent Forms integration feedsList the marketing-integration / webhook / payment-platform feeds configured on a Fluent Forms form. Each entry returns {feed_id, integration, name, enabled, raw - the decoded feed body}. Required: form_id. The integration vocabulary (mailchimp / activecampaign / hubspot / convertkit / getresponse / mailerlite / google_sheet / slack / discord / zapier / make / webhook / trello / airtable / hubspot / …) is the same surface check-setup advertises under integrations_active.feeds. Empty list when the form has no configured feeds. Capability: fluentform_settings_manager (falls back to forms_manager).
wppilot/fluentforms-list-notificationsList Fluent Forms notificationsList the email notifications configured on a Fluent Forms form. Progressive disclosure: each entry is a COMPACT row {id (the storage row id), name, subject, enabled, recipient (a flat summary of sendTo — the address, or "field:<name>" / the routing type), has_conditionals}. The heavy fields are omitted by default and opted into via include: pass any of ["message","sendTo","conditionals"] to materialise them inline; or fetch one notification in full with wppilot/fluentforms-get-notification. Required: form_id. Returns {form_id, notifications: list}. Capability: fluentform_settings_manager (falls back to forms_manager).
wppilot/fluentforms-list-quiz-questionsList Fluent Forms quiz questionsList the quiz-enabled questions on a Fluent Forms Pro quiz form. Each entry returns {field_name, label, type, answer (correct value), points, weight}. Reads the _quiz_settings form_meta key (set when an admin enables Quiz on a form via Settings → Quiz Settings). Returns is_quiz=false and an empty list when the form has no quiz settings. Required: form_id. Capability: fluentform_settings_manager (falls back to forms_manager).
wppilot/fluentforms-list-submissionsList Fluent Forms SubmissionsList Fluent Forms submissions (entries) with optional filters. Returns compact rows (id, form_id, status, user_id, payment_status, payment_method, currency, payment_total, source_url, ip, browser, device, country, is_favourite, created_at, updated_at) plus pagination metadata (page, per_page, total, total_pages). The submission's full response JSON is NOT included — fetch it with wppilot/fluentforms-get-submission when needed (progressive disclosure). Payment fields are null on submissions without a payment + null on free FF installs. Filters: form_id, status (unread|read|spam|trashed — omit to list all non-trashed entries, matching FF's own entries list; pass status=trashed to see the trash), payment_status (paid|pending|failed|refunded), is_favourite (bool), search (LIKE on source_url + browser; also ip only with include_sensitive=true and confirm=true), from / to (created_at ISO date range), user_id (the WP user who submitted, when logged in). Default order is created_at DESC; pagination is integer page-based, per_page capped at 100.
wppilot/fluentforms-list-subscriptionsList Fluent Forms subscriptionsList recurring-billing subscriptions captured by Fluent Forms Pro. Filterable by form_id, submission_id, status (active|trialing|cancelled|expired|past_due), billing_interval (day|week|month|year). Compact rows include item_name, plan_name, recurring_amount, billing_interval, bill_times, bill_count, vendor_subscription_id, status, expiration_at. Per_page capped at 50. Capability: fluentform_view_payments.
wppilot/fluentforms-list-transactionsList Fluent Forms transactionsList payment transactions captured by Fluent Forms Pro. Filterable by form_id, submission_id, subscription_id, status (paid|pending|failed|refunded|cancelled), payment_method (stripe|paypal|square|razorpay|offline|…), payment_mode (test|live), from / to (ISO date range on created_at). Returns compact rows (no payment_note / billing_address blobs to keep the payload small) plus pagination metadata. Per_page capped at 100. Capability: fluentform_view_payments.

Fluent Forms writes

AbilityWhat it does
wppilot/fluentforms-add-fieldAdd a Field to a Fluent Forms FormAppend a new field to an existing form. Required: form_id, field - the agent-facing descriptor {type, label?, required?, name?, settings?}. The ability resolves the form, decodes form_fields.fields[], appends the new element (or inserts it at the optional position index, 0-based), re-encodes and persists. Unknown field types are rejected with fluentforms_invalid_input. Pro-only field types on a free install are rejected with fluentforms_pro_field_not_available. The name is auto-assigned (collision-safe within the form) when omitted. Returns {form_id, field - the FF-native element row just inserted, position, dropped_settings - keys filtered by the catalog whitelist}. Capability: fluentform_forms_manager.
wppilot/fluentforms-create-formCreate a Fluent Forms FormCreate a new Fluent Forms form. Required: title (non-empty string). Optional: status ("published" | "unpublished", default "published"; an "unpublished" form renders as EMPTY output on the front end, with no message); type ("form" | "post", default "form"); fields[] - list of field descriptors using the agent-facing input shape ({type, label, required, name?, settings?}). Each field is run through ff_build_element so it lands as the native FF {element, attributes, settings, editor_options} structure. Returns the freshly-created form (compact shape) plus optional warnings.dropped_settings_per_field listing settings keys that fell outside the catalog whitelist for each field. Use wppilot/fluentforms-get-field-types-schema first to discover available field types and supported settings.
wppilot/fluentforms-create-notificationCreate a Fluent Forms notificationAppend a new email notification to a form. Required: form_id, notification. The notification object accepts: name (admin label, default 'Notification'), sendTo (recipient string with merge tags, REQUIRED — fluentforms_invalid_input otherwise), subject, message, fromName, fromEmail, replyTo, bcc, enabled (default true), conditionals (per-notification routing). sendTo may be a plain email/merge-tag string (stored as {type:email,email:...}) or the native object. The new entry's id is the storage row id Fluent Forms assigns, echoed in the response. Capability: fluentform_settings_manager.
wppilot/fluentforms-duplicate-formDuplicate a Fluent Forms FormClone an existing Fluent Forms form. Required: form_id. Optional: title - when omitted, the duplicate is titled "{original title} (copy)". Optional: include_meta (default true) - when true, copies every form_meta row so notifications, confirmations, settings, and conditional logic transfer to the clone. Submissions are NEVER copied. Returns the freshly-created form (compact shape). Capability: fluentform_forms_manager.
wppilot/fluentforms-mark-submissionMark a Fluent Forms SubmissionMark one submission. Required: submission_id. Mutually exclusive - pass exactly ONE of: status (unread|read|spam|trashed) - sets the submission status; favourite (bool) - toggles the is_favourite flag. Returns the updated compact row. Idempotent: marking an already-read submission as read is a no-op success. Returns fluentforms_submission_not_found (404) for missing ids; fluentforms_invalid_input (400) when neither (or both) action is passed. Capability: fluentform_manage_entries.

Destructive Fluent Forms calls

AbilityWhat it does
wppilot/fluentforms-cancel-subscriptionCancel a Fluent Forms subscriptionCancel an active Fluent Forms Pro subscription. Required: subscription_id. The ability resolves the subscription, dispatches to the vendor handler (Stripe / PayPal / Square / RazorPay / …) via the payment-method registry, and marks the row status='cancelled' on success. Returns fluentforms_subscription_not_found (404) for missing ids; fluentforms_pro_integration_missing when the vendor handler class isn't loaded; fluentforms_operation_failed when the vendor API rejects the cancel. Capability: fluentform_manage_payments. There is NO undo — once vendor-cancelled the subscription stops billing on the vendor side.
wppilot/fluentforms-delete-draft-submissionDelete a Fluent Forms draft submissionPermanently delete one save-and-resume draft submission. Required: draft_id. There is NO trash — once removed the user's resume link returns a 404 on the FF resume flow. Returns fluentforms_draft_submission_not_found (404) for missing ids. Capability: fluentform_manage_entries (per-form when the draft's form_id is known).
wppilot/fluentforms-delete-fieldDelete a Fluent Forms FieldRemove a field from a form, identified by its name. Required: form_id, name. Returns {form_id, removed_name, fields_remaining: int, warnings?}. When the removed field was the last one, warnings.empty_form flags that the form now has no fields and renders as empty output. Returns fluentforms_field_not_found (404) when the name is absent. NOTE: existing submissions retain the value under the old field name in their response JSON - deleting the field on the form does not retroactively redact entries. Capability: fluentform_forms_manager.
wppilot/fluentforms-delete-formDelete a Fluent Forms FormPermanently delete a Fluent Forms form. Required: form_id. Optional: cascade (default false) - when true, also deletes all submissions, submission_meta, entry_details and form_meta rows associated with the form (irreversible). When false (default) the form row is deleted but related data stays orphaned in the FF tables. Returns {success: true, form_id, cascaded: bool, deleted: {submissions, submission_meta, entry_details, form_meta}}. Returns fluentforms_form_not_found (404) if the id is absent. Capability: fluentform_forms_manager.
wppilot/fluentforms-delete-notificationDelete a Fluent Forms notificationRemove one notification by id. Required: form_id, notification_id. Returns fluentforms_notification_not_found (404) when the id is absent. Other notifications keep their ids — there is no reindexing. Capability: fluentform_settings_manager.
wppilot/fluentforms-delete-submissionDelete a Fluent Forms SubmissionPermanently delete one Fluent Forms submission, including its submission_meta + entry_details rows. Required: submission_id. Returns {success: true, submission_id, form_id, deleted: {submission, submission_meta, entry_details}}. There is NO trash bin - use wppilot/fluentforms-mark-submission with status=trashed for soft-delete semantics. Returns fluentforms_submission_not_found (404) for missing ids. Capability: fluentform_manage_entries.
wppilot/fluentforms-edit-confirmationEdit Fluent Forms confirmationPartial-update the confirmation block. The confirmation payload is shallow-merged into formSettings.confirmation — only whitelisted keys are kept (messageToShow, redirectTo, customPage, customUrl, samePageFormBehavior); unknown keys land in warnings.dropped_keys. Pass null on a whitelisted key to remove it. When redirectTo=customUrl the customUrl must be a valid URL (esc_url_raw is applied). Required: form_id, confirmation. Capability: fluentform_settings_manager.
wppilot/fluentforms-edit-fieldEdit a Fluent Forms FieldPatch one field in an existing form, identified by its name (the FF submission-key under attributes.name). Required: form_id, name. Mutable: label, required, settings (partial merge into the existing settings, NOT a replace - pass null on a key to remove it). Returns {form_id, field - updated FF-native row, dropped_settings}. Returns fluentforms_field_not_found (404) when the name is absent. Renaming a field is NOT supported via this ability (would orphan existing submissions); to rename, delete + add. Capability: fluentform_forms_manager.
wppilot/fluentforms-edit-formEdit a Fluent Forms FormPartial-update a Fluent Forms form. Required: form_id. Mutable attributes (all optional, omitted means "leave as-is"): title, status, type, fields[]. fields[] is REPLACE-semantics (passing it overwrites the entire form_fields array) - for partial field-level changes use wppilot/fluentforms-add-field / edit-field / delete-field instead. Returns the updated compact form plus optional warnings.dropped_settings_per_field. Returns fluentforms_form_not_found (404) for missing ids, fluentforms_invalid_input (400) for bad shapes.
wppilot/fluentforms-edit-form-settingsEdit Fluent Forms form settingsPartial-update the formSettings blob. The settings payload is shallow-merged into the stored blob — only whitelisted top-level keys are accepted (restrictions, layout, submitButton, conditionals); unknown keys land in warnings.dropped_keys. Pass null on a whitelisted key to remove it. Login-required and form scheduling are NOT top-level keys — they live under restrictions (restrictions.requireLogin, restrictions.scheduleForm). Confirmation is NOT mutable here — use wppilot/fluentforms-edit-confirmation for that. Required: form_id, settings. Capability: fluentform_settings_manager (falls back to forms_manager). Returns the updated settings + warnings.dropped_keys.
wppilot/fluentforms-edit-notificationEdit a Fluent Forms notificationPatch one notification by id. Shallow merge — only the keys you pass in notification are touched; pass null on a key to delete it. The id is immutable. Required: form_id, notification_id, notification. Returns fluentforms_notification_not_found (404) on missing id. Capability: fluentform_settings_manager.

For the task-level view of Fluent Forms, with worked requests and what to check afterwards, see Fluent Forms integration page.