Pro module2 also in Free29 abilities

WPForms ability reference

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

This WPForms ability reference covers how an agent can create, edit and duplicate WPForms forms, manage their fields, notifications and confirmations, and, on WPForms Pro, read, correct, flag, delete and export the entries those forms collect. Form building works on Lite and Pro alike; entry calls require the supported local API available in WPForms Pro. Vendor-held Lite copies are outside this module.

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 WPForms needs before these load

2 of the 29 also ship in GoBuildWP Free 1.18.6 under the same names, marked “Also in GoBuildWP Free” below. They need no GoBuildWP Pro licence, but each retains its own dependency, feature and permission checks. Where Free's copy does less, its own description follows Pro's. When Pro's richer copy passes its gates, it registers first and answers.

WPForms 1.8.0 or newer must be active, Lite or Pro. The gate checks the WPFORMS_VERSION constant and the wpforms() function; 1.8 is the release that settled the form and entry accessors this module calls. Pro is recognised by the WPFORMS_PLUGIN_SLUG constant or the pro/wpforms-pro.php file. Permissions go through wpforms_current_user_can() for the form or entry in question, with checks such as wpforms_view_forms, wpforms_edit_forms, wpforms_view_entries, wpforms_edit_entries and wpforms_delete_entries; a refusal is wpforms_capability_missing (403). Below the floor the wpforms category is not registered at all. The free plugin's wpforms-list-entries answers wpforms_pro_required on Lite just as Pro's does, and withholds email and phone answers with no way to reveal them.

Minimum (base)
1.8.0 WPPILOT_PRO_WPFORMS_MIN_VERSION
WPForms editions
free, pro
Agent skills shipped
wpforms-integration, form-model-schema, form-model-migration

A WPForms form is one post, so edits can be undone

Each form is a post of type wpforms whose post_content holds the whole definition as JSON: fields, settings, notifications, confirmations and payments. Edits check that the stored JSON is unchanged since it was read and fail with wpforms_concurrent_modification (409) if another editor got there in between. A post_content that no longer decodes stops every write with wpforms_form_corrupt instead of being replaced by an empty form.

Because the form is a post, the change ledger takes a before-image of it, and additions, edits, reorders and deletions of fields, notifications, confirmations and settings can be put back with wppilot/rollback-change. Deleting a form trashes it unless force=true is passed, which the ledger records as permanent. The module also refuses to remove a form's last notification or confirmation (wpforms_last_notification, wpforms_last_confirmation); edit it instead.

Why entry calls fail on WPForms Lite

WPForms Lite does not expose locally stored entries through the supported entry API. That is a statement about local storage only: any copy WPForms itself keeps for Lite users elsewhere is outside what this module can read. On Lite the entry calls return wpforms_pro_required, and the export answers wpforms_lite_no_entries, noting that submissions from before Pro was switched on are not available through this local entry API. On Pro, entries live in wpforms_entries, with one row per answer in wpforms_entry_fields and extra data in wpforms_entry_meta.

Entries have no trash. wppilot/wpforms-delete-entry removes the entry and its child rows at once, and the ledger records entry edits, deletions and read or starred flags as irreversible because they land in those tables. Edit-entry is held for confirm=true, refuses payment, signature, captcha and layout fields with wpforms_field_not_editable, and mirrors each change into wpforms_entry_fields so searches find the new value. Searches skip the fields get-entry redacts and never look at the IP, which sits on wpforms_entries; with include_meta, get-entry also redacts card, IP, token, password and signature keys inside the meta blob.

Pro field types such as file upload, payment and signature carry pro_only in the field catalog; on Lite, add-field treats them as unavailable and returns wpforms_unknown_type.

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.

Add a phone field to the contact form, then take it out again after the client changes their mind.

  1. 01 wppilot/wpforms-check-setup Reports whether Pro is present and lists available_field_types, confirming the phone type can be used on this install.
  2. 02 wppilot/wpforms-add-field Appends the field with the form's next sequential field id; the ledger stores the form post as it was before the write.
  3. 03 wppilot/list-changes Shows the add-field write against the form post with rollback available.
  4. 04 wppilot/rollback-change Restores the form post to its before-image and verifies the result, removing the phone field.

Questions about WPForms

Why does the agent say my WPForms site has no entries?

On Lite, these calls cannot use the supported local entries API and return wpforms_pro_required. Check the notification emails and any recovery WPForms offers for earlier submissions; this module does not read email or vendor-held copies.

Can I undo a field the agent deleted from a WPForms form?

Yes, with wppilot/rollback-change, since the form is a wpforms post the ledger captured before the write. Answers already collected for that field stay in the entry tables either way.

Does a duplicated WPForms form go live straight away?

No. The copy starts as a draft unless you pass a status, and it carries the fields, settings, notifications, confirmations and payments but none of the entries.

WPForms reads

AbilityWhat it does
wppilot/wpforms-check-setupCheck WPForms SetupReports the WPForms environment: whether WPForms is active, its version, whether it is the Pro edition, which Pro-gated surfaces are available (entries CRUD and the premium field types need Pro), the list of field types this install can use, and the WP capabilities that gate form/entry management. Call this first before any other WPForms ability.
wppilot/wpforms-export-entriesExport WPForms EntriesExport one form's entries as CSV or JSON with field labels as headers. Filters: status, date_from / date_to, starred, viewed (read), search (any field value; the redacted password, card, file and signature fields are searched only with include_sensitive=true and confirm=true, the IP never). Up to 5000 rows per call (a ~200 KiB budget may stop sooner); pass next_cursor back as cursor until it is null. Password, card, file-upload, signature and IP columns are [REDACTED] unless include_sensitive=true with confirm=true. WPForms Pro only — Lite does not expose entries through this supported local API; vendor-held copies are outside this module.
wppilot/wpforms-get-entryGet WPForms EntryReturn a single submission (entry) with its decoded field values. Required: entry_id. Optional: max_field_bytes (default 4096) caps the per-field value size to bound an individual textarea/richtext/file-upload value - capped fields surface a value_truncated flag plus the original byte length. include_meta=true also returns the entry.meta blob (UA, referer, payment data on payment forms), with sensitive nested keys redacted. Email, phone, password, card, upload, camera, signature and IP values are withheld and listed in redacted_fields unless include_sensitive=true with confirm=true after the person explicitly requests them. Pro only.
wppilot/wpforms-get-field-type-schemaGet WPForms Field Type SchemaDescribe one WPForms field type - the label-text, its edition (lite or pro), the cross-cutting features it supports (label, description, required, css class, conditional logic), and the type-specific options the agent can set (e.g. choices for select / radio / checkbox, format for name / date-time / phone, extensions for file-upload). Call check-setup first for the authoritative list of types this install can use; this ability returns null when the type is unknown or requires Pro on a Lite install.
wppilot/wpforms-get-field-types-schemaList WPForms Field TypesReturn the catalog of every WPForms field type the integration can build via add-field / edit-field on this install. Output is compact: per entry {type, label, category, pro_only}. Use this FIRST when constructing a form, then call wppilot/wpforms-get-field-type-schema for the per-type settings whitelist + supports[]. The catalog ALWAYS includes Pro entries - even on a Lite install - so the agent can learn what would unlock with Pro; add-field rejects unavailable types with wpforms_unknown_type; entry edition gates have separate errors. Categories reflect the WPForms field-editor groupings: standard (text / textarea / select / checkbox / radio / number / hidden / …), structure (layout / pagebreak / divider / html / repeater), and payment (payment-* / credit-card). Mirrors the catalog-vs-detail pattern used by gravityforms-get-field-types-schema, fluentforms-get-field-types-schema, formidable-get-field-types-schema.
wppilot/wpforms-get-formGet WPForms FormReturn the full definition of one WPForms form: fields (array indexed by field id), settings, notifications (settings.notifications), confirmations (settings.confirmations), payments, and form meta. post_content is a JSON blob; this ability decodes it and returns the canonical top-level sections.
wppilot/wpforms-get-form-canonicalGet WPForms Form (Canonical)Reads a single WPForms 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. The 40 WPForms native field types fold onto those 17 - composites (name, address) collapse to canonical group with sub-fields; Pro-only types without a canonical equivalent (signature, rating, credit-card, payment-*, custom-captcha, entry-preview, layout) emit warnings[] with severity. Output keys: fields[] with canonical types, mail_config{} from the first notification, notifications[] from the remaining ones, messages{} (empty - WPForms has no built-in message catalogue), conditional_rules[] from per-field WPForms conditionals (mapped 1:1 when expressible), meta{} (source plugin + version + edition + confirmations / settings echo for round-trip), plus warnings[] for everything that does not fit the canonical shape (multi-page forms, complex conditional logic, payment + signature + rating fields, anti-spam configuration, WPForms {smart_tags} that have no [field-name] equivalent). Honours the same max_field_bytes truncation contract as wpforms-get-form (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 wpforms_form_not_found when the id does not exist or refers to a trashed / auto-draft / non-WPForms post. Use this ability inside the form-model-migration workflow (Phase 2 - read source schema); for ad-hoc inspection outside the migration pipeline, prefer wpforms-get-form which returns the WPForms-native shape.
wppilot/wpforms-list-confirmationsList WPForms ConfirmationsList every confirmation configured on a form, keyed by string-int id. A confirmation is what the user sees after submitting - a thank-you message, a redirect to a WP page, or a redirect to an external URL. Use this before crafting a confirmation mutation.
wppilot/wpforms-list-entriesList WPForms EntriesAlso in GoBuildWP FreeList WPForms form submissions (entries) with compact rows. Filterable by form_id, status (publish | spam | trash | partial), and date range. Paginated with limit (default 50, max 500) and offset. WPForms Pro only: Lite does not expose entries through this supported local API; any vendor-held copies are outside this module. Use get-entry to read a single entry's full field values.

In GoBuildWP Free: List one WPForms form's submissions, newest first, with their answers: entry_id, status, type, viewed, starred, date, date_modified, user_id and answers (field_id, label, type, value). WPForms Pro only: Lite does not expose entries through the supported local API and this returns wpforms_pro_required. Filters: status (publish | spam | trash | partial | any), date_after / date_before (YYYY-MM-DD or YYYY-MM-DD HH:MM:SS, inclusive), starred, viewed. limit defaults to 20 (max 100), offset pages. Contact details and sensitive fields are withheld (names and other answers are not):email and phone answers, passwords, card and payment data, file uploads, signatures and the submitter's IP come back as "[REDACTED]" with a redacted reason, and email addresses or phone numbers typed into any other answer are cut out of it (redacted: "contact_in_text"). There is no option to return them here; the full values need the Pro edition (with the person's explicit approval) or the WPForms Entries screen.

wppilot/wpforms-list-formsList WPForms FormsAlso in GoBuildWP FreeList WPForms forms with a compact row per form (id, title, slug, status, dates, entry count when WPForms Pro is active). Paginated with limit (default 50, max 500) and offset; filterable by status. Use get-form to read a single form's full definition (fields, settings, notifications, confirmations).

In GoBuildWP Free: List WPForms forms with a compact row per form (id, title, slug, status, dates, entry count when WPForms Pro is active). Paginated with limit (default 50, max 500) and offset; filterable by status. Use wppilot/wpforms-list-entries for a form's submissions.

wppilot/wpforms-list-notificationsList WPForms NotificationsList every notification configured on a form, keyed by string-int id (the same id you pass to edit-notification / delete-notification). Use this before crafting a notification mutation so you know what already exists and what id to target.

WPForms writes

AbilityWhat it does
wppilot/wpforms-add-fieldAdd WPForms FieldAppend a field to a WPForms form. Required: form_id, type, label. Type must be in check-setup.available_field_types (a Pro type on a Lite install is rejected). The new field gets the next sequential id; the form's field_id counter is bumped. Pass options for type-specific knobs (choices for select/checkbox/radio, format for name/date-time/phone, extensions for file-upload, etc.) - see get-field-type-schema for the per-type catalog.
wppilot/wpforms-create-confirmationCreate WPForms ConfirmationAppend a confirmation to a form. Required: form_id, name, type. Type-specific required keys: type=message → message; type=page → page (target WP post id); type=redirect → redirect (target URL). Optional: message_scroll (auto-scroll to the message on submit) for type=message.
wppilot/wpforms-create-formCreate WPForms FormCreate a new WPForms form. Required: title. Optional: description, status (publish | draft, default publish), and an initial settings/notifications/confirmations override. The new form starts empty (no fields) - add fields with add-field in a later step. Returns the new form id plus the same compact row list-forms emits.
wppilot/wpforms-create-notificationCreate WPForms NotificationAppend a notification to a form. Required: form_id, notification_name, email. Optional: subject, sender_name, sender_address, replyto, message, file_upload_attachments. Smart tags ({admin_email}, {site_name}, {field_id="N"}, {all_fields}) are accepted verbatim - WPForms resolves them at submission time. The new notification gets the next sequential id.
wppilot/wpforms-duplicate-formDuplicate WPForms FormDuplicate an existing WPForms form. Required: form_id. Optional: title (defaults to "<original title> (Copy)") and status (defaults to "draft" - duplicates start unpublished). The new form copies fields, settings, notifications, confirmations, payments and meta from the source.
wppilot/wpforms-edit-confirmationEdit WPForms ConfirmationPartial merge update of one confirmation. Required: form_id, confirmation_id. Optional: name, message, message_scroll, page, redirect. The confirmation type CANNOT be changed (delete + create to switch type, since the meaningful keys differ). Updating fields that do not match the current type is rejected.
wppilot/wpforms-edit-fieldEdit WPForms FieldPartially update an existing field. Required: form_id, field_id. Optional: label, description, required, size, css, conditional_logic, options (type-specific keys are merged flat into the stored field entry). The field type cannot be changed - delete and re-add to change type.
wppilot/wpforms-edit-formEdit WPForms FormPartially update a WPForms form. Required: form_id. Optional: title, description, status (publish | draft), and merge updates for settings, notifications, confirmations, and meta. Field management is handled by add-field / edit-field / delete-field - fields here is accepted only when explicitly provided and REPLACES the entire fields map (read with get-form first to avoid wiping unrelated fields).
wppilot/wpforms-edit-form-settingsEdit WPForms Form SettingsSharp partial-merge editor for the most-used form-level settings on a single form. Use this instead of edit-form.settings when you only need to tweak common knobs: submit button text, anti-spam toggle, AJAX submission, store-spam-entries, honeypot, dynamic population, form CSS class. Each input field has a typed schema so the agent gets clear validation up front. For anything beyond these keys, fall back to edit-form with a settings merge.
wppilot/wpforms-edit-notificationEdit WPForms NotificationPartial merge update of one notification. Required: form_id, notification_id. Optional: any of notification_name, email, subject, sender_name, sender_address, replyto, message, file_upload_attachments. Keys not in the payload preserve their current value.
wppilot/wpforms-mark-entryMark WPForms EntryToggle a boolean flag on one entry without rewriting its fields. Required: entry_id, flag (read | starred), value (boolean). flag=read maps to the entry.viewed column; flag=starred maps to entry.starred. Use this for quick triage actions (mark as read, star a lead, unstar a duplicate). Pro only.
wppilot/wpforms-reorder-fieldsReorder WPForms FieldsReorder the fields of a form. Required: form_id, order - an array of field ids in the desired sequence. The order list MUST contain every existing field id exactly once (no additions, no removals, no duplicates); otherwise the call is rejected.

Destructive WPForms calls

AbilityWhat it does
wppilot/wpforms-delete-confirmationDelete WPForms ConfirmationRemove a confirmation from a form. Required: form_id, confirmation_id. Refuses to delete the last surviving confirmation - a form must always have at least one confirmation so users get feedback after submitting.
wppilot/wpforms-delete-entryDelete WPForms EntryPermanently delete one submission (entry). Required: entry_id. This call has no trash path: it is an immediate, irreversible delete. Per-field rows in wp_wpforms_entry_fields and per-entry meta in wp_wpforms_entry_meta are also removed. Pro only.
wppilot/wpforms-delete-fieldDelete WPForms FieldPermanently remove a field from a form. Required: form_id, field_id. The form's field_id counter is NOT decremented - new fields keep getting monotonic ids so a deleted id is never reused.
wppilot/wpforms-delete-formDelete WPForms FormDelete a WPForms form. Default behavior trashes the form (status flips to "trash" - restorable from the WPForms admin). Pass force=true to permanently delete the CPT row (irreversible). Returns the previous status so the caller can confirm what was removed.
wppilot/wpforms-delete-notificationDelete WPForms NotificationRemove a notification from a form. Required: form_id, notification_id. Refuses to delete the last surviving notification - a form must keep at least one notification so submissions still trigger an email. Use edit-notification to repurpose the last one instead.
wppilot/wpforms-edit-entryEdit WPForms EntryUpdate one or more field values on an existing submission (entry). Required: entry_id, fields (a map of field_id → new value). Only field types in check-setup → entry_handler.get_editable_field_types() can be edited - passing a non-editable type returns wpforms_field_not_editable with the offending list. Pro only.

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