{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/connections-icu/json-schema/connections-icu-workspace-form-write-input-schema.json",
  "title": "WorkspaceFormWriteInput",
  "description": "Form update input. PATCH updates only supplied fields.",
  "x-generated": "2026-11-04",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/connections-icu-product-openapi.yml#/components/schemas/WorkspaceFormWriteInput",
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "slug": {
      "type": "string",
      "description": "Public form slug."
    },
    "description": {
      "type": "string"
    },
    "fields_json": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "fieldKey",
          "fieldType"
        ],
        "properties": {
          "fieldKey": {
            "type": "string"
          },
          "fieldType": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "isRequired": {
            "type": "boolean"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "publicTally": {
            "type": "boolean",
            "description": "On a select (one choice) question: true lets anyone read the running count of each option at /public/forms/{formSlug}/tally?field={fieldKey}, one counted answer per voter (the email they gave), a new answer replaces the old. Use it for a vote on a site."
          }
        }
      },
      "description": "The questions, in order. fieldType is a form question type such as short_text, long_text, email, phone, select (one choice), multi_select, checkbox, number, date or rating; a wrong one is refused with the full list. Choice types need options. Needs an email or phone question: every answer must give one, except on a form with a publicTally choice question (a vote), where the email question may be optional (isRequired false) and a vote without one is counted by visitor. A website of your own can post to the form from a plain <form action=\"/_connections/form/<formSlug>\" method=\"post\">."
    },
    "success_message": {
      "type": "string"
    },
    "theme": {
      "type": "string",
      "enum": [
        "light",
        "dark",
        "paper",
        "skyline",
        "glass",
        "minimal",
        "confetti",
        "graphite",
        "neon",
        "luxe",
        "ink",
        "afterglow"
      ],
      "description": "Shared public page theme.",
      "x-setting": {
        "id": "connections.form_theme",
        "label": "Form theme",
        "synonyms": [
          "form style",
          "form look",
          "page theme",
          "dark mode form"
        ],
        "scope": "form",
        "group": "Appearance",
        "scopeParam": "id"
      }
    },
    "self_notification_email": {
      "type": [
        "string",
        "null"
      ],
      "description": "Email a copy of every submission to this address. Empty string or null stops it.",
      "x-setting": {
        "id": "connections.form_self_notification_email",
        "label": "Email me each submission",
        "synonyms": [
          "notify me",
          "submission alerts",
          "copy of responses"
        ],
        "scope": "form",
        "group": "Notifications",
        "scopeParam": "id"
      }
    },
    "send_respondent_confirmation": {
      "type": "boolean",
      "description": "Email the respondent a receipt of their answers after they submit.",
      "x-setting": {
        "id": "connections.form_send_respondent_confirmation",
        "label": "Send respondents a confirmation",
        "synonyms": [
          "receipt email",
          "confirmation email",
          "thank you email"
        ],
        "scope": "form",
        "group": "Notifications",
        "scopeParam": "id"
      }
    },
    "slack_webhook_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "https incoming-webhook URL that receives a summary of every submission.",
      "x-setting": {
        "id": "connections.form_slack_webhook_url",
        "label": "Slack notifications",
        "synonyms": [
          "slack webhook",
          "post to slack",
          "slack channel"
        ],
        "scope": "form",
        "group": "Notifications",
        "scopeParam": "id"
      }
    },
    "logo_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "https URL of the logo shown at the top of the public form.",
      "x-setting": {
        "id": "connections.form_logo_url",
        "label": "Form logo",
        "synonyms": [
          "brand logo",
          "form header image",
          "company logo"
        ],
        "scope": "form",
        "group": "Appearance",
        "scopeParam": "id"
      }
    },
    "cover_image_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "https URL of the cover image above the public form.",
      "x-setting": {
        "id": "connections.form_cover_image_url",
        "label": "Form cover image",
        "synonyms": [
          "banner image",
          "header photo",
          "background picture"
        ],
        "scope": "form",
        "group": "Appearance",
        "scopeParam": "id"
      }
    },
    "color_settings": {
      "type": [
        "object",
        "null"
      ],
      "description": "Page colors, merged over the saved ones: a color sent replaces it, an empty string clears it, a color left out keeps its saved value. null clears every color. Each a CSS color of at most 32 characters.",
      "properties": {
        "background": {
          "type": "string",
          "maxLength": 32,
          "description": "A CSS color, or an empty string to clear it.",
          "x-setting": {
            "id": "connections.form_color_background",
            "label": "Form background color",
            "synonyms": [
              "page background",
              "backdrop color",
              "background colour"
            ],
            "scope": "form",
            "group": "Appearance",
            "scopeParam": "id"
          }
        },
        "text": {
          "type": "string",
          "maxLength": 32,
          "description": "A CSS color, or an empty string to clear it.",
          "x-setting": {
            "id": "connections.form_color_text",
            "label": "Form text color",
            "synonyms": [
              "font color",
              "text colour",
              "writing color"
            ],
            "scope": "form",
            "group": "Appearance",
            "scopeParam": "id"
          }
        },
        "accent": {
          "type": "string",
          "maxLength": 32,
          "description": "A CSS color, or an empty string to clear it.",
          "x-setting": {
            "id": "connections.form_color_accent",
            "label": "Form accent color",
            "synonyms": [
              "highlight color",
              "brand color",
              "accent colour"
            ],
            "scope": "form",
            "group": "Appearance",
            "scopeParam": "id"
          }
        },
        "button": {
          "type": "string",
          "maxLength": 32,
          "description": "A CSS color, or an empty string to clear it.",
          "x-setting": {
            "id": "connections.form_color_button",
            "label": "Form button color",
            "synonyms": [
              "submit button color",
              "button colour",
              "button background"
            ],
            "scope": "form",
            "group": "Appearance",
            "scopeParam": "id"
          }
        },
        "buttonText": {
          "type": "string",
          "maxLength": 32,
          "description": "A CSS color, or an empty string to clear it.",
          "x-setting": {
            "id": "connections.form_color_button_text",
            "label": "Form button text color",
            "synonyms": [
              "button label color",
              "button font color"
            ],
            "scope": "form",
            "group": "Appearance",
            "scopeParam": "id"
          }
        }
      },
      "x-merge": true
    },
    "submit_button_label": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 80,
      "x-setting": {
        "id": "connections.form_submit_button_label",
        "label": "Submit button text",
        "synonyms": [
          "send button",
          "submit label",
          "button wording"
        ],
        "scope": "form",
        "group": "Wording",
        "scopeParam": "id"
      }
    },
    "next_button_label": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 80,
      "x-setting": {
        "id": "connections.form_next_button_label",
        "label": "Next button text",
        "synonyms": [
          "continue button",
          "next label"
        ],
        "scope": "form",
        "group": "Wording",
        "scopeParam": "id"
      }
    },
    "back_button_label": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 80,
      "x-setting": {
        "id": "connections.form_back_button_label",
        "label": "Back button text",
        "synonyms": [
          "previous button",
          "back label"
        ],
        "scope": "form",
        "group": "Wording",
        "scopeParam": "id"
      }
    },
    "capture_partial_responses": {
      "type": "boolean",
      "description": "Keep half-finished answers for analytics. Off by default.",
      "x-setting": {
        "id": "connections.form_capture_partial_responses",
        "label": "Save partial responses",
        "synonyms": [
          "abandoned forms",
          "incomplete submissions",
          "drop-off tracking"
        ],
        "scope": "form",
        "group": "Responses",
        "scopeParam": "id"
      }
    },
    "search_indexing_enabled": {
      "type": "boolean",
      "description": "false asks search engines not to list the public form page. Default true.",
      "x-setting": {
        "id": "connections.form_search_indexing_enabled",
        "label": "Show in search engines",
        "synonyms": [
          "hide from google",
          "noindex",
          "search visibility",
          "hide from search engines"
        ],
        "scope": "form",
        "group": "Privacy",
        "scopeParam": "id"
      }
    },
    "opens_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time",
      "description": "ISO 8601 time the form starts accepting submissions. Null or empty clears it.",
      "x-setting": {
        "id": "connections.form_opens_at",
        "label": "Form opens at",
        "synonyms": [
          "start date",
          "open date",
          "schedule form"
        ],
        "scope": "form",
        "group": "Schedule",
        "scopeParam": "id"
      }
    },
    "closes_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time",
      "description": "ISO 8601 time the form stops accepting submissions. Null or empty clears it.",
      "x-setting": {
        "id": "connections.form_closes_at",
        "label": "Form closes at",
        "synonyms": [
          "end date",
          "deadline",
          "close date",
          "stop accepting"
        ],
        "scope": "form",
        "group": "Schedule",
        "scopeParam": "id"
      }
    },
    "submission_limit": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 1,
      "description": "Stop accepting submissions after this many. Null removes the limit.",
      "x-setting": {
        "id": "connections.form_submission_limit",
        "label": "Submission limit",
        "synonyms": [
          "max responses",
          "cap submissions",
          "response limit"
        ],
        "scope": "form",
        "group": "Responses",
        "scopeParam": "id"
      }
    },
    "prevent_duplicate_submissions": {
      "type": "string",
      "enum": [
        "off",
        "per_browser"
      ],
      "description": "per_browser allows one submission per browser; off allows repeats.",
      "x-setting": {
        "id": "connections.form_prevent_duplicate_submissions",
        "label": "Prevent duplicate submissions",
        "synonyms": [
          "one response per person",
          "block repeat submissions",
          "single submission"
        ],
        "scope": "form",
        "group": "Responses",
        "scopeParam": "id"
      }
    },
    "contact_list_folder_id": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid",
      "description": "Contacts folder every submitter joins. Null or empty means no list.",
      "x-setting": {
        "id": "connections.form_contact_list_folder_id",
        "label": "Add submitters to a contact list",
        "synonyms": [
          "mailing list",
          "contacts folder",
          "subscribe respondents"
        ],
        "scope": "form",
        "group": "Responses",
        "scopeParam": "id"
      }
    },
    "closed_message": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 2000,
      "description": "Shown instead of the form while it is closed. Empty string or null clears it.",
      "x-setting": {
        "id": "connections.form_closed_message",
        "label": "Message when the form is closed",
        "synonyms": [
          "closed notice",
          "form closed text",
          "not accepting responses message"
        ],
        "scope": "form",
        "group": "Completion",
        "scopeParam": "id"
      }
    },
    "is_active": {
      "type": "boolean",
      "description": "false takes the public form offline.",
      "x-setting": {
        "id": "connections.form_is_active",
        "label": "Form accepts responses",
        "synonyms": [
          "publish form",
          "turn form on",
          "unpublish form",
          "form live"
        ],
        "scope": "form",
        "group": "Availability",
        "scopeParam": "id"
      }
    },
    "show_form_title": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "false hides the title and description on the public page.",
      "x-setting": {
        "id": "connections.form_show_form_title",
        "label": "Show the form title",
        "synonyms": [
          "hide title",
          "form heading",
          "form description visible"
        ],
        "scope": "form",
        "group": "Appearance",
        "scopeParam": "id"
      }
    },
    "redirect_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "https URL the respondent is sent to after submitting. Empty string or null clears it.",
      "x-setting": {
        "id": "connections.form_redirect_url",
        "label": "Redirect after submit",
        "synonyms": [
          "thank you page",
          "redirect link",
          "after submission url"
        ],
        "scope": "form",
        "group": "Completion",
        "scopeParam": "id"
      }
    },
    "company_id": {
      "type": "string",
      "description": "PATCH only. Puts the form into the workspace this key is bound to, so its public page presents the company. Only the key workspace id is accepted."
    }
  }
}