Four switches are writable here: demo_mode, skip_mail, subscribers_only and acceptance_as_validation. Anything else is refused.
That refusal is the point. Contact Form 7 does not validate this field at all — it will accept any text you put in it — so a typo’d key would be written happily and do nothing forever.
At a glance
| Ability | contact-form-7/update-additional-settings |
| Toolset | Contact Form 7 — toolset/contact-form-7 |
| Group | Contact Form 7 › Settings & Validation |
| Requires | Contact Form 7, active on the site |
| Capability | manage_options, plus edit_contact_forms |
| Safety | Writes data |
| Repeatable | Idempotent — running it twice leaves the same result |
| Ships in | AcrossAI Abilities Manager 0.0.34 and later |
The gate on this one
Turning on demo_mode or skip_mail requires confirm: true. Both stop the form delivering mail while it continues to show visitors a success message — a site can sit in that state for weeks before anyone notices the enquiries stopped. The other two switches write without a gate.
How it works
Values are strings, matching how Contact Form 7 stores them: "on" and "off" rather than booleans. Pass an empty string to remove a setting entirely.
The response returns the parsed settings and the raw block after the write, so you can confirm what landed rather than assuming.
The write is idempotent — setting a switch to the value it already has reports the same result and changes nothing.
Input
| Name | Type | Required | What it is |
|---|---|---|---|
form_id | integer | Yes | Form post ID, as returned by contact-form-7/list-forms. |
settings | object | Yes | Setting key => value, e.g. { "skip_mail": "off" }. Pass an empty string to remove a setting. |
confirm | boolean | Only for demo_mode and skip_mail | Required when changing either of those two switches. Ignored otherwise. |
What comes back
| Name | Type | What it is |
|---|---|---|
form_id | integer | The form that was written. |
settings | array | The parsed settings after the write. |
updated | array | Which keys actually changed. |
raw | string | The additional-settings block after the write. |
success | boolean | Whether the call completed. |
message | string | A one-line summary of what happened, suitable for showing a human. |
error_code | string | Present only on failure — a stable machine-readable reason, such as a missing field, a wrong field type or an unmet confirmation. |
Example
Ask your assistant:
Turn skip_mail back off on form 42 — someone left it on after testing.
It resolves to one call:
{
"ability": "contact-form-7/update-additional-settings",
"parameters": {
"form_id": 42,
"settings": {
"skip_mail": "off"
},
"confirm": true
}
}Worth knowing
- Only four keys are writable. Anything else is refused rather than written.
- Values are strings —
"on"and"off", nottrueandfalse. - Idempotent, so a retry is safe.
- Leaving
skip_mailon after testing is the single commonest cause of a site silently losing enquiries.
Related abilities
- Get Contact Form Additional Settings — read the current switches
- Validate Contact Form Configuration — confirm the form works after
Get the plugins:
AcrossAI Abilities Manager · AcrossAI MCP Manager
Browse the rest: Every ability, by category