Update one or more fields on an existing element. Only the fields provided will be overwritten; omitted fields are left unchanged. The element's `type` cannot be changed. This tool can also set `forEventItems` to control checkout-based visibility on order forms. To move a element between the buyer and attendee sections, use `move_element` instead.
AuthorizationRequiredBearer <token>API key as Bearer token
In: header
application/jsonRequiredpromptstringFor question elements, the question text; for static elements, a label shown above the element.
promptHiddenbooleanIf true, the element's prompt will not be shown to respondents.
helperTextstringOptional subtle helper text to display below the element.
placeholderstringOnly for questions with text inputs or drop-down lists, this is the placeholder shown when the input is empty
requiredbooleanFor all non-static questions except 'Select Multiple' and 'Select Multiple with "Other"', this is true if the question is required to submit the form.
propertyIdstringID of a CRM property that will be set by the answer to this question.
The CRM property's data type must align with the question's type.
For standalone forms, only Contact properties can be used.
For order forms, Ticket properties can be used for ticket-holder questions,
Order properties can be used for buyer-only questions, and Contact properties
can be used in either section.
For multiple-choice questions, the custom property also provides the
selectable options, and exactly one of propertyId or options must be
specified.
contactFieldstringoptionsarray<string>If the question is not linked to a CRM property, this array will contain the question's options. If the question is linked to a CRM property, the options are derived from the CRM property, and this field will be undefined.
dropdownbooleanOnly for 'Select One' questions (not including 'Select One or "Other"'), if this is true, the question will be shown as a dropdown list. Otherwise, it will be shown as a group of radio buttons.
yesRequiredbooleanOnly for 'Yes/No' questions. If true, respondents must answer "Yes" to this question to submit their response.
otherPromptstringOnly allowed (and required) for 'Select One or "Other"' and 'Select Multiple with "Other"' questions, this is the label used for the "other" option's radio/checkbox.
minChoicesnumberRequired for 'Select Multiple' and 'Select Multiple with "Other"'. The minimum number of choices that must be selected (set to 0 to make the question optional).
maxChoicesnumberFor 'Select Multiple' and 'Select Multiple with "Other"', this is an optional maximum number of choices that can be selected.
minstringFor 'Date' questions, the optional minimum allowed date, as a string in YYYY-MM-DD format.
maxstringFor 'Date' questions, the optional maximum allowed date, as a string in YYYY-MM-DD format.
acceptarray<string>For 'File' questions, determines the types of file that are allowed to be uploaded for the question. This array must be present and contain at least one element for 'File' questions.
logicGroupsarray<Any properties in object,object>Allows questions with fixed options (select one/multiple, yes/no) to conditionally reveal other questions in the form. Any question referenced by a conditional logic group will be hidden until one of the groups referencing it is satisfied.
contentstringFor 'Static Text' elements, this is the content displayed in the text block. Required for 'Static Text' elements.
imageUrlstringFor 'Static Image' elements, this is the URL of the image to display. Required for 'Static Image' elements.
imageWidthnumberFor 'Static Image' elements, this is the width as a percentage of of the containing element (the column in the form's layout). Defaults to 100.
forEventItemsarray<object | object | object>For order forms only. Restricts this element to only appear when at least one of the referenced event items or products is in the cart. If present (even if empty), the element is hidden by default.
formIdRequiredstringThe ID of the form.
elementIdRequiredstringThe ID of the element.
curl -X PATCH "https://api.3common.com/v1/forms/string/elements/string" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"prompt": "string",
"promptHidden": true,
"helperText": "string",
"placeholder": "string",
"required": true,
"propertyId": "string",
"contactField": "email",
"options": [
"string"
],
"dropdown": true,
"yesRequired": true,
"otherPrompt": "string",
"minChoices": 0,
"maxChoices": 0,
"min": "string",
"max": "string",
"accept": [
"images"
],
"logicGroups": [
{
"revealedElementIndex": 0,
"optionIndices": [
0
],
"operator": "all_of"
}
],
"content": "string",
"imageUrl": "string",
"imageWidth": 0,
"forEventItems": [
{
"type": "eventItem",
"eventId": "string",
"itemId": "string"
}
]
}'{
"data": {
"id": "string",
"prompt": "string",
"promptHidden": true,
"helperText": "string",
"type": "Text",
"required": true,
"propertyId": "string",
"propertyData": {
"type": "Text",
"objectType": "contact",
"status": "active"
},
"contactField": "firstName",
"placeholder": "string"
}
}export interface Response {
data:
| (
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Text";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Text";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Instead of setting a custom CRM property, text questions may set the
* built-in `firstName` and `lastName` fields on contacts.
* Questions may set a CRM property, a contact field, or neither; but not both.
*/
contactField?: "firstName" | "lastName";
/**
* Placeholder text to show when the input is empty.
*/
placeholder?: string;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Multi-line Text";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Multi-line Text";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Placeholder text to show when the input is empty.
*/
placeholder?: string;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Select One";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* If the question is not linked to a CRM property, this array will contain the question's options. If the question is linked to a CRM property, the options are derived from the CRM property, and this field will be undefined.
*/
options?: string[];
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
* If specified, the property also provides the selectable options, and exactly
* one of `propertyId` or `options` must be specified.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database. If a question is linked to a CRM property, its options are used instead of unique options being defined in the question.
*/
propertyData?: {
options: {
/**
* The value stored when this option is selected.
*/
value: string;
/**
* The display label for this option.
*/
label: string;
}[];
type: "Select One";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* If true, renders as a dropdown list instead of radio buttons.
*/
dropdown?: boolean;
/**
* Only visible when `dropdown` is true.
*/
placeholder?: string;
/**
* Conditional logic groups that reveal other elements based on selected options
*/
logicGroups?: {
/**
* The index of the element in the form's `elements` array which is revealed
* when this logic group's condition is satisfied.
*/
revealedElementIndex: number;
/**
* The indices of the options in the question's `options` array, or its
* custom property's options. The way these options are used depends on the
* `operator` property.
* An index of -1 specifies the "Other" option, for applicable question types.
*/
optionIndices: number[];
/**
* The operator applied to the options specified by the `optionIndices` property
*/
operator: "all_of" | "any_of" | "none_of";
}[];
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: 'Select One or "Other"';
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* If the question is not linked to a CRM property, this array will contain the question's options. If the question is linked to a CRM property, the options are derived from the CRM property, and this field will be undefined.
*/
options?: string[];
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
* If specified, the property also provides the selectable options, and exactly
* one of `propertyId` or `options` must be specified.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database. If a question is linked to a CRM property, its options are used instead of unique options being defined in the question.
*/
propertyData?: {
options: {
/**
* The value stored when this option is selected.
*/
value: string;
/**
* The display label for this option.
*/
label: string;
}[];
type: "Select One";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* The label for the freeform "Other" option.
*/
otherPrompt: string;
/**
* Conditional logic groups that reveal other elements based on selected options
*/
logicGroups?: {
/**
* The index of the element in the form's `elements` array which is revealed
* when this logic group's condition is satisfied.
*/
revealedElementIndex: number;
/**
* The indices of the options in the question's `options` array, or its
* custom property's options. The way these options are used depends on the
* `operator` property.
* An index of -1 specifies the "Other" option, for applicable question types.
*/
optionIndices: number[];
/**
* The operator applied to the options specified by the `optionIndices` property
*/
operator: "all_of" | "any_of" | "none_of";
}[];
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Select Multiple";
/**
* If the question is not linked to a CRM property, this array will contain the question's options. If the question is linked to a CRM property, the options are derived from the CRM property, and this field will be undefined.
*/
options?: string[];
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
* If specified, the property also provides the selectable options, and exactly
* one of `propertyId` or `options` must be specified.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database. If a question is linked to a CRM property, its options are used instead of unique options being defined in the question.
*/
propertyData?: {
options: {
/**
* The value stored when this option is selected.
*/
value: string;
/**
* The display label for this option.
*/
label: string;
}[];
type: "Select Multiple";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Reserved for future use, must not be set to true
*/
dropdown?: false;
/**
* Minimum number of options that must be selected. Set to 0 to make the question optional.
*/
minChoices: number;
/**
* Maximum number of options that can be selected, or no limit if omitted
*/
maxChoices?: number;
/**
* Conditional logic groups that reveal other elements based on selected options
*/
logicGroups?: {
/**
* The index of the element in the form's `elements` array which is revealed
* when this logic group's condition is satisfied.
*/
revealedElementIndex: number;
/**
* The indices of the options in the question's `options` array, or its
* custom property's options. The way these options are used depends on the
* `operator` property.
* An index of -1 specifies the "Other" option, for applicable question types.
*/
optionIndices: number[];
/**
* The operator applied to the options specified by the `optionIndices` property
*/
operator: "all_of" | "any_of" | "none_of";
}[];
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: 'Select Multiple with "Other"';
/**
* If the question is not linked to a CRM property, this array will contain the question's options. If the question is linked to a CRM property, the options are derived from the CRM property, and this field will be undefined.
*/
options?: string[];
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
* If specified, the property also provides the selectable options, and exactly
* one of `propertyId` or `options` must be specified.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database. If a question is linked to a CRM property, its options are used instead of unique options being defined in the question.
*/
propertyData?: {
options: {
/**
* The value stored when this option is selected.
*/
value: string;
/**
* The display label for this option.
*/
label: string;
}[];
type: "Select Multiple";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Minimum number of options that must be selected. Set to 0 to make the question optional.
*/
minChoices: number;
/**
* Maximum number of options that can be selected, or no limit if omitted
*/
maxChoices?: number;
/**
* The label for the freeform "Other" option.
*/
otherPrompt: string;
/**
* Conditional logic groups that reveal other elements based on selected options
*/
logicGroups?: {
/**
* The index of the element in the form's `elements` array which is revealed
* when this logic group's condition is satisfied.
*/
revealedElementIndex: number;
/**
* The indices of the options in the question's `options` array, or its
* custom property's options. The way these options are used depends on the
* `operator` property.
* An index of -1 specifies the "Other" option, for applicable question types.
*/
optionIndices: number[];
/**
* The operator applied to the options specified by the `optionIndices` property
*/
operator: "all_of" | "any_of" | "none_of";
}[];
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Yes/No";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Yes/No";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Reserved for future use, must be set to true
*/
dropdown: true;
/**
* Instead of setting a custom CRM property, yes/no questions may set the
* built-in `status` fields on contacts, which represents whether the contact
* wants to receive communications from the host. The two values that can be
* set by a yes/no question are "opted-in" for "yes"/true, or "unsubscribed"
* for "no"/false.
* Questions may set a CRM property, a contact field, or neither; but not both.
*/
contactField?: "status";
/**
* Conditional logic groups that reveal other elements based on the yes/no value.
*/
logicGroups?: {
/**
* The index of the element in the form's `elements` array which is revealed
* when this logic group's condition is satisfied.
*/
revealedElementIndex: number;
/**
* Determines whether the question's value must be strictly equal to the logic
* group's `value` property, or not strictly equal to it. Note that
* `undefined` (no answer) is treated differently from an explicit `false`
* answer.
*/
selectionType: "is" | "is_not";
/**
* Determines the value which is compared to the form answer's value for this
* logic group (the type of comparison depends on the `selectionType` property).
*/
value: boolean;
}[];
/**
* If true, respondents must answer "Yes" to this question to submit their response.
*/
yesRequired?: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Date";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* Earliest selectable date in YYYY-MM-DD format
*/
min?: string;
/**
* Latest selectable date in YYYY-MM-DD format
*/
max?: string;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Date";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "File";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* File categories allowed to be uploaded. Must contain at least one element.
*
* @minItems 1
*/
accept: [
"images" | "documents" | "data" | "audio" | "video",
...("images" | "documents" | "data" | "audio" | "video")[]
];
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "File";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Email";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Email";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Placeholder text to show when the input is empty.
*/
placeholder?: string;
/**
* Instead of setting a custom CRM property, email questions may set the
* built-in `email` field on contacts. A question which sets this contact
* field is required if any other questions in the form use a `contactField`
* or a Contact CRM property, since email is how contacts are identified.
* Questions may set a CRM property, a contact field, or neither; but not both.
*/
contactField?: "email";
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Phone";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Phone";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Placeholder text to show when the input is empty.
*/
placeholder?: string;
/**
* Instead of setting a custom CRM property, phone questions may set the
* built-in `phone` field on contacts (i.e. the contact's phone number).
* Questions may set a CRM property, a contact field, or neither; but not both.
*/
contactField?: "phone";
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Static Text";
/**
* The text content displayed in the block
*/
content: string;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Static Image";
/**
* URL of the image to display
*/
imageUrl: string;
/**
* Display width as a percentage of the container (1-100). Defaults to 100.
*/
imageWidth?: number;
}
)
| (
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Text";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Text";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Instead of setting a custom CRM property, text questions may set the
* built-in `firstName` and `lastName` fields on contacts.
* Questions may set a CRM property, a contact field, or neither; but not both.
*/
contactField?: "firstName" | "lastName";
/**
* Placeholder text to show when the input is empty.
*/
placeholder?: string;
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Multi-line Text";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Multi-line Text";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Placeholder text to show when the input is empty.
*/
placeholder?: string;
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Select One";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* If the question is not linked to a CRM property, this array will contain the question's options. If the question is linked to a CRM property, the options are derived from the CRM property, and this field will be undefined.
*/
options?: string[];
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
* If specified, the property also provides the selectable options, and exactly
* one of `propertyId` or `options` must be specified.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database. If a question is linked to a CRM property, its options are used instead of unique options being defined in the question.
*/
propertyData?: {
options: {
/**
* The value stored when this option is selected.
*/
value: string;
/**
* The display label for this option.
*/
label: string;
}[];
type: "Select One";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* If true, renders as a dropdown list instead of radio buttons.
*/
dropdown?: boolean;
/**
* Only visible when `dropdown` is true.
*/
placeholder?: string;
/**
* Conditional logic groups that reveal other elements based on selected options
*/
logicGroups?: {
/**
* The index of the element in the form's `elements` array which is revealed
* when this logic group's condition is satisfied.
*/
revealedElementIndex: number;
/**
* The indices of the options in the question's `options` array, or its
* custom property's options. The way these options are used depends on the
* `operator` property.
* An index of -1 specifies the "Other" option, for applicable question types.
*/
optionIndices: number[];
/**
* The operator applied to the options specified by the `optionIndices` property
*/
operator: "all_of" | "any_of" | "none_of";
}[];
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: 'Select One or "Other"';
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* If the question is not linked to a CRM property, this array will contain the question's options. If the question is linked to a CRM property, the options are derived from the CRM property, and this field will be undefined.
*/
options?: string[];
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
* If specified, the property also provides the selectable options, and exactly
* one of `propertyId` or `options` must be specified.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database. If a question is linked to a CRM property, its options are used instead of unique options being defined in the question.
*/
propertyData?: {
options: {
/**
* The value stored when this option is selected.
*/
value: string;
/**
* The display label for this option.
*/
label: string;
}[];
type: "Select One";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* The label for the freeform "Other" option.
*/
otherPrompt: string;
/**
* Conditional logic groups that reveal other elements based on selected options
*/
logicGroups?: {
/**
* The index of the element in the form's `elements` array which is revealed
* when this logic group's condition is satisfied.
*/
revealedElementIndex: number;
/**
* The indices of the options in the question's `options` array, or its
* custom property's options. The way these options are used depends on the
* `operator` property.
* An index of -1 specifies the "Other" option, for applicable question types.
*/
optionIndices: number[];
/**
* The operator applied to the options specified by the `optionIndices` property
*/
operator: "all_of" | "any_of" | "none_of";
}[];
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Select Multiple";
/**
* If the question is not linked to a CRM property, this array will contain the question's options. If the question is linked to a CRM property, the options are derived from the CRM property, and this field will be undefined.
*/
options?: string[];
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
* If specified, the property also provides the selectable options, and exactly
* one of `propertyId` or `options` must be specified.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database. If a question is linked to a CRM property, its options are used instead of unique options being defined in the question.
*/
propertyData?: {
options: {
/**
* The value stored when this option is selected.
*/
value: string;
/**
* The display label for this option.
*/
label: string;
}[];
type: "Select Multiple";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Reserved for future use, must not be set to true
*/
dropdown?: false;
/**
* Minimum number of options that must be selected. Set to 0 to make the question optional.
*/
minChoices: number;
/**
* Maximum number of options that can be selected, or no limit if omitted
*/
maxChoices?: number;
/**
* Conditional logic groups that reveal other elements based on selected options
*/
logicGroups?: {
/**
* The index of the element in the form's `elements` array which is revealed
* when this logic group's condition is satisfied.
*/
revealedElementIndex: number;
/**
* The indices of the options in the question's `options` array, or its
* custom property's options. The way these options are used depends on the
* `operator` property.
* An index of -1 specifies the "Other" option, for applicable question types.
*/
optionIndices: number[];
/**
* The operator applied to the options specified by the `optionIndices` property
*/
operator: "all_of" | "any_of" | "none_of";
}[];
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: 'Select Multiple with "Other"';
/**
* If the question is not linked to a CRM property, this array will contain the question's options. If the question is linked to a CRM property, the options are derived from the CRM property, and this field will be undefined.
*/
options?: string[];
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
* If specified, the property also provides the selectable options, and exactly
* one of `propertyId` or `options` must be specified.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database. If a question is linked to a CRM property, its options are used instead of unique options being defined in the question.
*/
propertyData?: {
options: {
/**
* The value stored when this option is selected.
*/
value: string;
/**
* The display label for this option.
*/
label: string;
}[];
type: "Select Multiple";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Minimum number of options that must be selected. Set to 0 to make the question optional.
*/
minChoices: number;
/**
* Maximum number of options that can be selected, or no limit if omitted
*/
maxChoices?: number;
/**
* The label for the freeform "Other" option.
*/
otherPrompt: string;
/**
* Conditional logic groups that reveal other elements based on selected options
*/
logicGroups?: {
/**
* The index of the element in the form's `elements` array which is revealed
* when this logic group's condition is satisfied.
*/
revealedElementIndex: number;
/**
* The indices of the options in the question's `options` array, or its
* custom property's options. The way these options are used depends on the
* `operator` property.
* An index of -1 specifies the "Other" option, for applicable question types.
*/
optionIndices: number[];
/**
* The operator applied to the options specified by the `optionIndices` property
*/
operator: "all_of" | "any_of" | "none_of";
}[];
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Yes/No";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Yes/No";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Reserved for future use, must be set to true
*/
dropdown: true;
/**
* Instead of setting a custom CRM property, yes/no questions may set the
* built-in `status` fields on contacts, which represents whether the contact
* wants to receive communications from the host. The two values that can be
* set by a yes/no question are "opted-in" for "yes"/true, or "unsubscribed"
* for "no"/false.
* Questions may set a CRM property, a contact field, or neither; but not both.
*/
contactField?: "status";
/**
* Conditional logic groups that reveal other elements based on the yes/no value.
*/
logicGroups?: {
/**
* The index of the element in the form's `elements` array which is revealed
* when this logic group's condition is satisfied.
*/
revealedElementIndex: number;
/**
* Determines whether the question's value must be strictly equal to the logic
* group's `value` property, or not strictly equal to it. Note that
* `undefined` (no answer) is treated differently from an explicit `false`
* answer.
*/
selectionType: "is" | "is_not";
/**
* Determines the value which is compared to the form answer's value for this
* logic group (the type of comparison depends on the `selectionType` property).
*/
value: boolean;
}[];
/**
* If true, respondents must answer "Yes" to this question to submit their response.
*/
yesRequired?: boolean;
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Date";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* Earliest selectable date in YYYY-MM-DD format
*/
min?: string;
/**
* Latest selectable date in YYYY-MM-DD format
*/
max?: string;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Date";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "File";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* File categories allowed to be uploaded. Must contain at least one element.
*
* @minItems 1
*/
accept: [
"images" | "documents" | "data" | "audio" | "video",
...("images" | "documents" | "data" | "audio" | "video")[]
];
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "File";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Email";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Email";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Placeholder text to show when the input is empty.
*/
placeholder?: string;
/**
* Instead of setting a custom CRM property, email questions may set the
* built-in `email` field on contacts. A question which sets this contact
* field is required if any other questions in the form use a `contactField`
* or a Contact CRM property, since email is how contacts are identified.
* Questions may set a CRM property, a contact field, or neither; but not both.
*/
contactField?: "email";
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Phone";
/**
* If true, the respondent must answer this question to submit the form.
*/
required: boolean;
/**
* ID of a CRM property that will be set by the answer to this question.
* The CRM property's data type must align with the question's type.
* For standalone forms, only Contact properties can be used.
* For order forms, Ticket properties can be used for ticket-holder questions,
* Order properties can be used for buyer-only questions, and Contact properties
* can be used in either section.
*/
propertyId?: string;
/**
* If propertyId is specified, this will contain additional data about the CRM property linked to this question. Populated by the backend when fetching the form, not saved to the database.
*/
propertyData?: {
type: "Phone";
/**
* The kind of object that a form-linked CRM property writes to.
* - contact: properties on customer contact records
* - order: properties on orders (buyer-level)
* - ticket: properties on individual products within an order
*/
objectType: "contact" | "order" | "ticket";
/**
* Determines where this property can be used. "archived" properties are
* soft-deleted (any existing reference to them remains valid) but only "active"
* properties should be used in new workflows, forms, etc.
*/
status: "active" | "archived";
};
/**
* Placeholder text to show when the input is empty.
*/
placeholder?: string;
/**
* Instead of setting a custom CRM property, phone questions may set the
* built-in `phone` field on contacts (i.e. the contact's phone number).
* Questions may set a CRM property, a contact field, or neither; but not both.
*/
contactField?: "phone";
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Static Text";
/**
* The text content displayed in the block
*/
content: string;
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
| {
/**
* The unique ID of this element. Present on existing elements returned from the backend, omitted when creating new ones.
*/
id?: string;
/**
* For question elements, the question text; for static elements, a label shown above the element.
*/
prompt: string;
/**
* If true, the element's prompt will not be shown to respondents.
*/
promptHidden?: boolean;
/**
* Optional subtle helper text to display below the element.
*/
helperText?: string;
type: "Static Image";
/**
* URL of the image to display
*/
imageUrl: string;
/**
* Display width as a percentage of the container (1-100). Defaults to 100.
*/
imageWidth?: number;
/**
* For order forms only. Restricts this element to only appear when at least one
* of the referenced event items or products is in the cart. If present (even if
* empty), the element is hidden by default.
*/
forEventItems?: (
| {
type: "eventItem";
eventId: string;
itemId: string;
}
| {
type: "eventProduct";
eventId: string;
productId: string;
}
| {
type: "checkoutProduct";
/**
* The ID of the standalone checkout containing the product.
*/
checkoutId: string;
productId: string;
}
)[];
/**
* For order forms only. If true, the element must be in a row greater than or
* equal to `attendeeRowsStart`, and an instance of the element will appear for
* every ticket in the cart. Otherwise, the element must be in a row less than
* `attendeeRowsStart`, and only a single instance of the element will appear.
*/
askAllAttendees: boolean;
}
);
}
Add Form Element
Add a new element to a form. For order forms, the element is appended to the buyer section. Otherwise, it is appended to the end of the form. A layout row for the element is created automatically, and the form is saved after the element is added. The new element is returned.
Delete Element
Remove an element from a form. The element's layout row is also removed, and any conditional logic groups referencing the deleted element are cleaned up. This operation cannot be undone.