Custom form

Custom forms provide a flexible, integrated way to manage app setup and configuration during the authorization process. The information in the custom_form section of the manifest JSON represents the values on the Custom Form page of the app build flow.

Manifest JSON

{
    "features": {
        ……,
        "custom_form": {
            "enable":true,
            "pre_auth": {
              "app_level": [
                {
                  "action_id": "api_key_field",
                  "type": "plain_text_input",
                  "widgets": "{\"text\":\"API Key\",\"placeholder\":\"Enter your API key\",\"description\":\"Your application API key\",\"data_type\":\"String\",\"setting_level\":\"appLevel\"}"
                },
                {
                  "action_id": "api_endpoint",
                  "type": "plain_text_input",
                  "widgets": "{\"text\":\"API Endpoint\",\"placeholder\":\"https://api.example.com\",\"description\":\"Your API endpoint URL\",\"data_type\":\"String\",\"required\":true,\"setting_level\":\"appLevel\"}"
                },
                {
                  "action_id": "max_retries",
                  "type": "plain_text_input",
                  "widgets": "{\"text\":\"Max Retries\",\"placeholder\":\"3\",\"description\":\"Maximum number of retry attempts\",\"data_type\":\"Number\",\"required\":true,\"multiple\":false,\"setting_level\":\"appLevel\"}"
                },
                {
                  "action_id": "region",
                  "type": "select",
                  "widgets": "{\"text\":\"Region\",\"description\":\"Select your deployment region\",\"dependent_fields\":[],\"setting_level\":\"appLevel\",\"dynamic_widget_populate\":null,\"options\":[{\"value\":\"us-east-1\",\"label\":\"US East\"},{\"value\":\"eu-west-1\",\"label\":\"EU West\"},{\"value\":\"ap-south-1\",\"label\":\"Asia Pacific\"}],\"data_type\":\"String\"}"
                },
                {
                  "action_id": "features",
                  "type": "checkboxes",
                  "widgets": "{\"text\":\"Enabled Features\",\"description\":\"Select features to enable\",\"setting_level\":\"appLevel\",\"dynamic_widget_populate\":null,\"options\":[{\"value\":\"1\",\"label\":\"Feature A\"},{\"value\":\"2\",\"label\":\"Feature B\"},{\"value\":\"3\",\"label\":\"Feature C\"}],\"data_type\":\"Integer\"}"
                }
              ],
              "connection_level": [
                {
                  "action_id": "connection_name",
                  "type": "plain_text_input",
                  "widgets": "{\"text\":\"Connection Name\",\"placeholder\":\"My Connection\",\"description\":\"Friendly name for this connection\",\"data_type\":\"String\",\"setting_level\":\"connectionLevel\"}"
                },
                {
                  "action_id": "auth_token",
                  "type": "plain_text_input",
                  "widgets": "{\"text\":\"Authentication Token\",\"placeholder\":\"Enter your auth token\",\"description\":\"User-specific authentication token\",\"data_type\":\"String\",\"required\":true,\"setting_level\":\"connectionLevel\"}"
                },
                {
                  "action_id": "timeout",
                  "type": "select",
                  "widgets": "{\"text\":\"Request Timeout\",\"description\":\"Maximum request timeout in seconds\",\"dependent_fields\":[],\"setting_level\":\"connectionLevel\",\"dynamic_widget_populate\":null,\"options\":[{\"value\":\"30\",\"label\":\"30 seconds\"},{\"value\":\"60\",\"label\":\"1 minute\"},{\"value\":\"120\",\"label\":\"2 minutes\"}],\"data_type\":\"Number\"}"
                },
                {
                  "action_id": "enable_logging",
                  "type": "radio_buttons",
                  "widgets": "{\"text\":\"Enable Logging\",\"description\":\"Enable detailed request logging\",\"setting_level\":\"connectionLevel\",\"dynamic_widget_populate\":null,\"options\":[{\"value\":\"true\",\"label\":\"Enabled\"},{\"value\":\"false\",\"label\":\"Disabled\"}],\"data_type\":\"Boolean\"}"
                }
              ]
            }
          }
        ……
    }
}

Field Description

FieldDescriptionRequired
custom_formRoot object containing all custom field configurationsNo
enableTo mark the usage of custom fields in app manifest creation. Defaulted to false.No
custom_form.pre_authPre-authentication custom fields (configured before user connects)Yes (if custom_form exists)
custom_form.pre_auth.app_levelArray of app-level fields (configured once per app, applies to all users)No
custom_form.pre_auth.connection_levelArray of connection-level fields (configured per user connection)No
action_idUnique identifier for the fieldYes
typeWidget type: plain_text_input, select, checkboxes, radio_buttonsYes
widgetsJSON string with field configuration (label, validation, options, etc.)Yes
new_action_idUsed when renaming a field to preserve data (contains old action_id)No
widgets.textLabel displayed to user (e.g., "API Key", "Region")Yes
widgets.descriptionHelp text explaining the field purposeNo
widgets.data_typeData type: String, Number, Integer, Boolean, PasswordYes
widgets.setting_levelMust match array level: appLevel or connectionLevelYes
widgets.requiredWhether field is mandatory (default: false)No
widgets.placeholderPlaceholder text for plain_text_input (e.g., "Enter your API key")No
widgets.multipleAllow multiple values for plain_text_input (default: false)No
widgets.optionsArray of {value, label} for select / checkboxes / radio_buttonsYes (for select types)