Skip to main content
Glama

create_form

Create a new form page for lead capture or submissions.

Use this tool when a merchant wants to publish a form that collects customer information, optionally shows custom confirmation copy, and can deliver downloadable files after submission.

Prefer a minimal request when the user is vague, and only add optional fields like custom copy, redirects, images, files, or tracking when requested.

For the page's design and customer-facing labels (including translations), set themeOverrides and hostedLayoutType; list_theme_properties lists what can be set. Set themeId (from list_themes) to use a theme.

After creation, return:

  • data.id: the form page ID

  • data.name: the internal page name

  • data.hostedUrl: the live form URL

  • data.dashboardUrl: the dashboard edit URL

If the user is building or editing a website, call add_to_website next with pageId set to data.id and pageType: "form", and put the returned code in the site. Do not wait for the user to ask for this step.

Input Schema

NameRequiredDescriptionDefault
nameYesInternal page name used in your dashboard and API responses.
slugNoPage URL slug. For events and forms the slug defaults to the slugified version of your `title`. For checkouts the slug defaults to the slugified version of your `productData.title`.
titleNoPublic title shown to customers on the page.
fieldsNoCustom checkout fields to create. When provided, at least one field must be an `email` element with `type` `email` and `required` `true`. When omitted, the page gets Name and Email address fields, plus a required billing Address on checkout and event pages. Forms get Name and Email address only.
localeNo
fileIdsNoArray of file IDs for downloadable files. All file IDs must exist and belong to your account.
themeIdNoThe theme the page uses: one of your themes or a built-in one (see List themes). `themeOverrides` apply on top. Leave it out to use your store's default theme.
imageIdsNoArray of images for the page gallery. All referenced file IDs must exist and belong to your account.
redirectNoIf enabled, redirects the customer to the specified URL before the page loads.
testmodeNoPuts the page in test mode. While it is on, every purchase on this page is a test purchase: no money is taken, the buyer still receives everything the page delivers, and the records are created with `livemode: false`. Turn it off to take real payments again.
formLayoutNoHow to arrange the page's form, top to bottom. Reference a field by `fieldKey`: the `key` you gave it in `fields` in this request. Each item is one of: `field` (`fieldKey`), `heading` (`id`, `text`, `level` `heading` or `subheading`), `divider` (`id`), `discount-code` (no other properties) and `group` (`id`, optional `name`, `columns` 1 to 4, and `items` holding fields, headings, dividers or the discount code; groups never nest). You choose the `id` of each heading, divider and group: 1 to 64 characters, unique in the layout. Fields the layout leaves out are added after it, in their current order. `formLayout` on the page decides the form's order. Each field's `order` is its position among the page's fields and follows the layout: saving a layout (in the dashboard or through the API) rewrites every field's `order`. On a page that has never saved a layout, setting `order` moves the field; once a layout is saved, move fields with `formLayout` instead. A `discount-code` item only places the discount code box: the box shows while `showCouponCodeField` is on, and the item does not switch it on. Forms have no discount code, so a form layout must leave it out. More item types may be added later. When reading a layout, skip any item type you do not recognise. When updating, send every item back as you received it, including those.
descriptionNoPage description shown to customers. Accepts HTML or plain text.
formDetailsNoForm behaviour settings.
funnelStepsNoOrdered funnel configuration for this page. Supports intermediate checkout steps, one-click upsells, and confirmation behavior.
googleIndexNoAllow Google to index this page for search results. Defaults to `true`.
notifyEmailNoEmail addresses to send notifications to. Supports comma separated emails.
redirectUrlNoURL to redirect to after payment. Applies if `afterPaymentAction` is `redirect`.
trackingCodesNoCustom tracking scripts to include on the page. Supports HTML `<script>` tags.
redirectPageIdNoID of the page (checkout, event or form) to redirect to after payment. Applies when `afterPaymentAction` is `checkout`.
themeOverridesNoThe page's design and labels, set on top of its theme and nested by theme property path: `tokens.colorPrimary` is sent as `{ "tokens": { "colorPrimary": { "light": "#1A73E8" } } }`. Keys you leave out keep their current value, and `null` resets a property, or everything under a key, to the theme default. Call `list_theme_properties` for the supported properties, their value formats and, where a property has a fixed one, its default.
invoiceSettingsNo
redirectUrlPathNoAdditional path parameters appended to the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url)
hostedLayoutTypeNo
redirectUrlQueryNoQuery parameters for the `redirectUrl`. Applies if `afterPaymentAction` is `redirect` and `redirectUrl` is set. [Learn more](https://checkoutpage.com/docs/articles/add-field-and-variant-data-to-redirect-url)
allowDynamicTitleNoAllow page title to be overridden via URL query parameters.
afterPaymentActionNoBehavior after checkout. `confirmation` shows the confirmation page. `checkout` redirects to `redirectPageId`. `redirect` sends the customer to `redirectUrl`. Defaults to `confirmation`.
sendEmailConfirmationNoSend an email confirmation to the customer. Defaults to `true`.
redirectUrlInsideEmbedNoIf the page is embedded, redirect the customer within the embed instead of redirecting the main browser window. Defaults to `false`.
allowDynamicDescriptionNoAllow page description to be overridden via URL query parameters.
sendPaymentNotificationNoSend payment/submission notification emails to the store owner.
closePopupOnClickOutsideNoWhether a popup embed closes when clicking outside the container. Defaults to `false`.
confirmationEmailMessageNoCustom confirmation email message. Accepts HTML or plain text. Write `{{id}}` where a customer's own details go, and it is filled in for each customer: `{{field_<field id>}}` for their answer to one of the page's fields, `{{variant_<variant id>}}` and `{{variant_<variant id>_sku}}` for their variant choice, or one of `price` (Amount), `amountDue` (Payment amount due), `amountPaid` (Payment amount paid), `currentPeriodEnd` (Next payment date), `planIterations` (No. of payments), `createdAt` (Created date), `status` (Status), `payment_method` (Payment method), `orderId` (Order ID), `product_title` (Product title), `order_summary` (Order summary), `variant_breakdown` (Variant selection), `license_key` (License key), `sku` (SKU), `form_title` (Form title), `event_name` (Event name), `event_date` (Event date/time), `event_location` (Event location), `event_tickets` (Tickets purchased), `booking_fee` (Booking fee), `event_meeting_link` (Virtual meeting link), `customer_portal_link` (Customer portal link), `coupon_code` (Coupon code), `coupon_discount` (Coupon discount). Product, variant, license key and billing variables apply to checkout pages, event variables to events, `form_title` to forms; a variable that does not apply is left blank. To show paragraphs only to some customers, wrap them in `<if variable="<id>" operator="<operator>" value="<value>">...</if>`, with operator one of equals, not_equals, contains, not_contains, starts_with, ends_with, greater_than, less_than, greater_than_or_equal, less_than_or_equal.
confirmationEmailSubjectNoCustom confirmation email subject.
confirmationCheckoutTitleNoConfirmation title.
confirmationEmailShowLogoNoShow store logo in confirmation email.
customizeEmailConfirmationNoUse a custom email confirmation template. If enabled, provide `confirmationEmailSubject` and `confirmationEmailMessage`.
confirmationCheckoutMessageNoConfirmation message. Accepts HTML or plain text. Write `{{id}}` where a customer's own details go, and it is filled in for each customer: `{{field_<field id>}}` for their answer to one of the page's fields, `{{variant_<variant id>}}` and `{{variant_<variant id>_sku}}` for their variant choice, or one of `price` (Amount), `amountDue` (Payment amount due), `amountPaid` (Payment amount paid), `currentPeriodEnd` (Next payment date), `planIterations` (No. of payments), `createdAt` (Created date), `status` (Status), `payment_method` (Payment method), `orderId` (Order ID), `product_title` (Product title), `order_summary` (Order summary), `variant_breakdown` (Variant selection), `license_key` (License key), `sku` (SKU), `form_title` (Form title), `event_name` (Event name), `event_date` (Event date/time), `event_location` (Event location), `event_tickets` (Tickets purchased), `booking_fee` (Booking fee), `event_meeting_link` (Virtual meeting link), `customer_portal_link` (Customer portal link), `coupon_code` (Coupon code), `coupon_discount` (Coupon discount). Product, variant, license key and billing variables apply to checkout pages, event variables to events, `form_title` to forms; a variable that does not apply is left blank. To show paragraphs only to some customers, wrap them in `<if variable="<id>" operator="<operator>" value="<value>">...</if>`, with operator one of equals, not_equals, contains, not_contains, starts_with, ends_with, greater_than, less_than, greater_than_or_equal, less_than_or_equal.
customizeCheckoutConfirmationNoIf set to true `confirmationCheckoutMessage` and `confirmationCheckoutTitle` will be displayed on the confirmation page. Defaults to `false`.
confirmationEmailShowStoreNameNoShow store name in confirmation email.

Output Schema

NameRequiredDescriptionDefault
dataYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / $defs / FormLayoutDivider / properties / disabled
      Added value: +{
      +  "description": "`true` keeps the divider in the layout but hides it from customers. Defaults to `false`.",
      +  "type": "boolean"
      +}
    • addedInput schema / $defs / FormLayoutHeading / properties / disabled
      Added value: +{
      +  "description": "`true` keeps the heading in the layout but hides it from customers. Defaults to `false`.",
      +  "type": "boolean"
      +}
    • addedOutput schema / $defs / FormLayoutDivider / properties / disabled
      Added value: +{
      +  "description": "`true` keeps the divider in the layout but hides it from customers. Defaults to `false`.",
      +  "type": "boolean"
      +}
    • addedOutput schema / $defs / FormLayoutHeading / properties / disabled
      Added value: +{
      +  "description": "`true` keeps the heading in the layout but hides it from customers. Defaults to `false`.",
      +  "type": "boolean"
      +}
  2. Changed4 schema fields changed
    • changedInput schema / properties / confirmationCheckoutMessage / description
      Previous value: -"Confirmation message. Accepts HTML or plaintext."New value: +"Confirmation message. Accepts HTML or plain text. Write `{{id}}` where a customer's own details go, and it is filled in for each customer: `{{field_<field id>}}` for their answer to one of the page's fields, `{{variant_<variant id>}}` and `{{variant_<variant id>_sku}}` for their variant choice, or one of `price` (Amount), `amountDue` (Payment amount due), `amountPaid` (Payment amount paid), `currentPeriodEnd` (Next payment date), `planIterations` (No. of payments), `createdAt` (Created date), `status` (Status), `payment_method` (Payment method), `orderId` (Order ID), `product_title` (Product title), `order_summary` (Order summary), `variant_breakdown` (Variant selection), `license_key` (License key), `sku` (SKU), `form_title` (Form title), `event_name` (Event name), `event_date` (Event date/time), `event_location` (Event location), `event_tickets` (Tickets purchased), `booking_fee` (Booking fee), `event_meeting_link` (Virtual meeting link), `customer_portal_link` (Customer portal link), `coupon_code` (Coupon code), `coupon_discount` (Coupon discount). Product, variant, license key and billing variables apply to checkout pages, event variables to events, `form_title` to forms; a variable that does not apply is left blank. To show paragraphs only to some customers, wrap them in `<if variable=\"<id>\" operator=\"<operator>\" value=\"<value>\">...</if>`, with operator one of equals, not_equals, contains, not_contains, starts_with, ends_with, greater_than, less_than, greater_than_or_equal, less_than_or_equal."
    • changedInput schema / properties / confirmationEmailMessage / description
      Previous value: -"Custom confirmation email message. Accepts HTML or plain text."New value: +"Custom confirmation email message. Accepts HTML or plain text. Write `{{id}}` where a customer's own details go, and it is filled in for each customer: `{{field_<field id>}}` for their answer to one of the page's fields, `{{variant_<variant id>}}` and `{{variant_<variant id>_sku}}` for their variant choice, or one of `price` (Amount), `amountDue` (Payment amount due), `amountPaid` (Payment amount paid), `currentPeriodEnd` (Next payment date), `planIterations` (No. of payments), `createdAt` (Created date), `status` (Status), `payment_method` (Payment method), `orderId` (Order ID), `product_title` (Product title), `order_summary` (Order summary), `variant_breakdown` (Variant selection), `license_key` (License key), `sku` (SKU), `form_title` (Form title), `event_name` (Event name), `event_date` (Event date/time), `event_location` (Event location), `event_tickets` (Tickets purchased), `booking_fee` (Booking fee), `event_meeting_link` (Virtual meeting link), `customer_portal_link` (Customer portal link), `coupon_code` (Coupon code), `coupon_discount` (Coupon discount). Product, variant, license key and billing variables apply to checkout pages, event variables to events, `form_title` to forms; a variable that does not apply is left blank. To show paragraphs only to some customers, wrap them in `<if variable=\"<id>\" operator=\"<operator>\" value=\"<value>\">...</if>`, with operator one of equals, not_equals, contains, not_contains, starts_with, ends_with, greater_than, less_than, greater_than_or_equal, less_than_or_equal."
    • changedOutput schema / properties / data / properties / confirmationCheckoutMessage / description
      Previous value: -"Confirmation page message."New value: +"Confirmation page message. Variables read as `{{id}}` and conditional paragraphs as `<if variable=\"...\" operator=\"...\" value=\"...\">` blocks; send them back unchanged to keep them."
    • changedOutput schema / properties / data / properties / confirmationEmailMessage / description
      Previous value: -"Custom confirmation email message."New value: +"Custom confirmation email message. Variables read as `{{id}}` and conditional paragraphs as `<if variable=\"...\" operator=\"...\" value=\"...\">` blocks; send them back unchanged to keep them."
  3. Changed2 schema fields changed
    • changedInput schema / $defs / FieldInput / properties / reference / description
      Previous value: -"External reference ID for integration purposes. Generated from the field type or label when omitted."New value: +"Stable key that exports, Zapier, Google Sheets and webhooks use for this field's answers. Generated from the field type or label when omitted, and not updated when the label changes. Changing it breaks integrations that match on the old key, so only send it when the seller asks."
    • changedOutput schema / $defs / Field / properties / reference / description
      Previous value: -"External reference ID for mapping this field in downstream systems."New value: +"Stable key that exports, Zapier, Google Sheets and webhooks use for this field's answers. Not updated when the label changes."
  4. Changed16 schema fields changed
    • changedInput schema / $defs / FieldInput / properties / order / description
      Previous value: -"Display order of this field. When omitted, order is determined by the position of the field in the array."New value: +"Position of this field among the page's fields, from 0. When omitted, a new field goes after the current ones, or follows its position in `fields` when a page is created. `formLayout` on the page decides the form's order. Each field's `order` is its position among the page's fields and follows the layout: saving a layout (in the dashboard or through the API) rewrites every field's `order`. On a page that has never saved a layout, setting `order` moves the field; once a layout is saved, move fields with `formLayout` instead."
    • addedInput schema / $defs / FormLayoutDiscountCode
      Added value: +{
      +  "description": "Where the discount code box sits. This item only places the box: the box shows while the page has `showCouponCodeField` on. Checkout pages and events only.",
      +  "properties": {
      +    "type": {
      +      "const": "discount-code",
      +      "description": "Always `discount-code`.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / FormLayoutDivider
      Added value: +{
      +  "description": "A line that separates parts of the form.",
      +  "properties": {
      +    "id": {
      +      "description": "The divider's id, chosen by you: 1 to 64 characters, unique in the layout.",
      +      "maxLength": 64,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "type": {
      +      "const": "divider",
      +      "description": "Always `divider`.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type",
      +    "id"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / FormLayoutFieldInput
      Added value: +{
      +  "description": "A field on the page, shown where it sits in the layout.",
      +  "properties": {
      +    "fieldKey": {
      +      "description": "The `key` you gave the field in `fields` in this request. A key that matches no field is rejected.",
      +      "maxLength": 200,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "type": {
      +      "const": "field",
      +      "description": "Always `field`.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type",
      +    "fieldKey"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / FormLayoutGroupInput
      Added value: +{
      +  "description": "Items shown side by side in columns.",
      +  "properties": {
      +    "columns": {
      +      "description": "How many items sit side by side, 1 to 4. On phones the group stacks by default.",
      +      "maximum": 4,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "id": {
      +      "description": "The group's id, chosen by you: 1 to 64 characters, unique in the layout.",
      +      "maxLength": 64,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "items": {
      +      "description": "What the group holds, filled row by row: fields, headings, dividers and the discount code. Groups never nest.",
      +      "items": {
      +        "oneOf": [
      +          {
      +            "$ref": "#/$defs/FormLayoutFieldInput"
      +          },
      +          {
      +            "$ref": "#/$defs/FormLayoutHeading"
      +          },
      +          {
      +            "$ref": "#/$defs/FormLayoutDivider"
      +          },
      +          {
      +            "$ref": "#/$defs/FormLayoutDiscountCode"
      +          }
      +        ]
      +      },
      +      "maxItems": 200,
      +      "type": "array"
      +    },
      +    "name": {
      +      "description": "A name for the group, seen only in the dashboard. Up to 100 characters.",
      +      "maxLength": 100,
      +      "type": "string"
      +    },
      +    "type": {
      +      "const": "group",
      +      "description": "Always `group`.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type",
      +    "id",
      +    "columns",
      +    "items"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / FormLayoutHeading
      Added value: +{
      +  "description": "A heading or subheading shown above the items after it.",
      +  "properties": {
      +    "id": {
      +      "description": "The heading's id, chosen by you: 1 to 64 characters, unique in the layout.",
      +      "maxLength": 64,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "level": {
      +      "description": "`heading` for a section title, `subheading` for a smaller one.",
      +      "enum": [
      +        "heading",
      +        "subheading"
      +      ],
      +      "type": "string"
      +    },
      +    "text": {
      +      "description": "The text shown, up to 200 characters.",
      +      "maxLength": 200,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "type": {
      +      "const": "heading",
      +      "description": "Always `heading`.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type",
      +    "id",
      +    "text",
      +    "level"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / $defs / FormLayoutItemInput
      Added value: +{
      +  "description": "More item types may be added later. When reading a layout, skip any item type you do not recognise. When updating, send every item back as you received it, including those.",
      +  "oneOf": [
      +    {
      +      "$ref": "#/$defs/FormLayoutFieldInput"
      +    },
      +    {
      +      "$ref": "#/$defs/FormLayoutHeading"
      +    },
      +    {
      +      "$ref": "#/$defs/FormLayoutDivider"
      +    },
      +    {
      +      "$ref": "#/$defs/FormLayoutDiscountCode"
      +    },
      +    {
      +      "$ref": "#/$defs/FormLayoutGroupInput"
      +    }
      +  ]
      +}
    • addedInput schema / properties / formLayout
      Added value: +{
      +  "description": "How to arrange the page's form, top to bottom. Reference a field by `fieldKey`: the `key` you gave it in `fields` in this request. Each item is one of: `field` (`fieldKey`), `heading` (`id`, `text`, `level` `heading` or `subheading`), `divider` (`id`), `discount-code` (no other properties) and `group` (`id`, optional `name`, `columns` 1 to 4, and `items` holding fields, headings, dividers or the discount code; groups never nest). You choose the `id` of each heading, divider and group: 1 to 64 characters, unique in the layout. Fields the layout leaves out are added after it, in their current order. `formLayout` on the page decides the form's order. Each field's `order` is its position among the page's fields and follows the layout: saving a layout (in the dashboard or through the API) rewrites every field's `order`. On a page that has never saved a layout, setting `order` moves the field; once a layout is saved, move fields with `formLayout` instead. A `discount-code` item only places the discount code box: the box shows while `showCouponCodeField` is on, and the item does not switch it on. Forms have no discount code, so a form layout must leave it out. More item types may be added later. When reading a layout, skip any item type you do not recognise. When updating, send every item back as you received it, including those.",
      +  "items": {
      +    "$ref": "#/$defs/FormLayoutItemInput"
      +  },
      +  "maxItems": 500,
      +  "type": "array"
      +}
    • changedOutput schema / $defs / Field / properties / order / description
      Previous value: -"Display order of the field within the form."New value: +"Position of the field among the page's fields, from 0. `formLayout` on the page decides the form's order. Each field's `order` is its position among the page's fields and follows the layout: saving a layout (in the dashboard or through the API) rewrites every field's `order`. On a page that has never saved a layout, setting `order` moves the field; once a layout is saved, move fields with `formLayout` instead."
    • addedOutput schema / $defs / FormLayoutDiscountCode
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Where the discount code box sits. This item only places the box: the box shows while the page has `showCouponCodeField` on. Checkout pages and events only.",
      +  "properties": {
      +    "type": {
      +      "const": "discount-code",
      +      "description": "Always `discount-code`.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / $defs / FormLayoutDivider
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "A line that separates parts of the form.",
      +  "properties": {
      +    "id": {
      +      "description": "The divider's id, chosen by you: 1 to 64 characters, unique in the layout.",
      +      "maxLength": 64,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "type": {
      +      "const": "divider",
      +      "description": "Always `divider`.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type",
      +    "id"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / $defs / FormLayoutField
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "A field on the page, shown where it sits in the layout.",
      +  "properties": {
      +    "fieldId": {
      +      "description": "The `id` of a field in the page's `fields`.",
      +      "pattern": "^[0-9a-fA-F]{24}$",
      +      "type": "string"
      +    },
      +    "type": {
      +      "const": "field",
      +      "description": "Always `field`.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type",
      +    "fieldId"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / $defs / FormLayoutGroup
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Items shown side by side in columns.",
      +  "properties": {
      +    "columns": {
      +      "description": "How many items sit side by side, 1 to 4. On phones the group stacks by default.",
      +      "maximum": 4,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    "id": {
      +      "description": "The group's id, chosen by you: 1 to 64 characters, unique in the layout.",
      +      "maxLength": 64,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "items": {
      +      "description": "What the group holds, filled row by row: fields, headings, dividers and the discount code. Groups never nest.",
      +      "items": {
      +        "oneOf": [
      +          {
      +            "$ref": "#/$defs/FormLayoutField"
      +          },
      +          {
      +            "$ref": "#/$defs/FormLayoutHeading"
      +          },
      +          {
      +            "$ref": "#/$defs/FormLayoutDivider"
      +          },
      +          {
      +            "$ref": "#/$defs/FormLayoutDiscountCode"
      +          }
      +        ]
      +      },
      +      "maxItems": 200,
      +      "type": "array"
      +    },
      +    "name": {
      +      "description": "A name for the group, seen only in the dashboard. Up to 100 characters.",
      +      "maxLength": 100,
      +      "type": "string"
      +    },
      +    "type": {
      +      "const": "group",
      +      "description": "Always `group`.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type",
      +    "id",
      +    "columns",
      +    "items"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / $defs / FormLayoutHeading
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "A heading or subheading shown above the items after it.",
      +  "properties": {
      +    "id": {
      +      "description": "The heading's id, chosen by you: 1 to 64 characters, unique in the layout.",
      +      "maxLength": 64,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "level": {
      +      "description": "`heading` for a section title, `subheading` for a smaller one.",
      +      "enum": [
      +        "heading",
      +        "subheading"
      +      ],
      +      "type": "string"
      +    },
      +    "text": {
      +      "description": "The text shown, up to 200 characters.",
      +      "maxLength": 200,
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "type": {
      +      "const": "heading",
      +      "description": "Always `heading`.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type",
      +    "id",
      +    "text",
      +    "level"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / $defs / FormLayoutItem
      Added value: +{
      +  "description": "More item types may be added later. When reading a layout, skip any item type you do not recognise. When updating, send every item back as you received it, including those.",
      +  "oneOf": [
      +    {
      +      "$ref": "#/$defs/FormLayoutField"
      +    },
      +    {
      +      "$ref": "#/$defs/FormLayoutHeading"
      +    },
      +    {
      +      "$ref": "#/$defs/FormLayoutDivider"
      +    },
      +    {
      +      "$ref": "#/$defs/FormLayoutDiscountCode"
      +    },
      +    {
      +      "$ref": "#/$defs/FormLayoutGroup"
      +    }
      +  ]
      +}
    • addedOutput schema / properties / data / properties / formLayout
      Added value: +{
      +  "description": "How the page's form is arranged, top to bottom: fields, headings, dividers, groups of fields shown side by side in columns, and where the discount code box sits. Always returned, even for a page that was never arranged: every field on the page is listed, and `fieldId` matches the `id` of an entry in `fields`. A `discount-code` item only places the box, which shows while `showCouponCodeField` is on. A placement you saved is returned whether the box is on or off; when none was saved and the box is on, the item is at the end, where the box shows. Forms never have one. Each item is one of: `field` (`fieldId`), `heading` (`id`, `text`, `level` `heading` or `subheading`), `divider` (`id`), `discount-code` (no other properties) and `group` (`id`, optional `name`, `columns` 1 to 4, and `items` holding fields, headings, dividers or the discount code; groups never nest). You choose the `id` of each heading, divider and group: 1 to 64 characters, unique in the layout. `formLayout` on the page decides the form's order. Each field's `order` is its position among the page's fields and follows the layout: saving a layout (in the dashboard or through the API) rewrites every field's `order`. On a page that has never saved a layout, setting `order` moves the field; once a layout is saved, move fields with `formLayout` instead. More item types may be added later. When reading a layout, skip any item type you do not recognise. When updating, send every item back as you received it, including those.",
      +  "items": {
      +    "$ref": "#/$defs/FormLayoutItem"
      +  },
      +  "type": "array"
      +}
  5. Changed2 schema fields changed
    • addedInput schema / $defs / FieldInput / properties / disabled
      Added value: +{
      +  "description": "Whether this field is switched off. A disabled field keeps its settings but is removed from the page entirely: it is not rendered, cannot be revealed with `show_fields`, is not prefilled and is never submitted.",
      +  "example": false,
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / $defs / Field / properties / disabled
      Added value: +{
      +  "description": "Whether this field is switched off. A disabled field keeps its settings but is removed from the page entirely.",
      +  "example": false,
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
  6. First observed

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false and openWorldHint=true, so safety profile is partly covered; the description adds real behavioural context no annotation carries: the concrete return fields, and the mandatory follow-up with add_to_website that should not wait for the user. It omits permission/authorization requirements and publication state, keeping it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the minimal-request rule, followed by design pointers and the required follow-up step. Well organised, though the return-field list is partially redundant with the output schema and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 39-parameter creation tool with an output schema, the description supplies the missing workflow context (next step, minimal request, theme lookup) that the schema cannot. It stops short of discussing the formLayout/fields relationship and form-specific constraints, which is a modest gap given the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 92%, so per-field documentation is already done. The description adds only light guidance, pointing agents at themeOverrides/hostedLayoutType, saying to consult list_theme_properties and list_themes for themeId. Useful cross-references, but most parameter meaning comes from the schema, so the baseline 3 holds.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new form page for lead capture or submissions') and frames the artifact's role, which separates it from create_checkout_page and create_event. The follow-up instruction naming add_to_website makes the tool's place in the workflow unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context ('when a merchant wants to publish a form...') and an explicit minimal-request policy plus when to add optional fields. It never explicitly excludes sibling alternatives such as create_checkout_page ('use that instead for payments'), so the routing guidance is strong but not fully comparative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources